Trouble with Inference in Tensorflow Lite model

Viewed 29

I've trained a Tensorflow Lite (TFLite) model saved as a *.tflite file.

I'm writing code that lets me pick a tflite file, and a folder containing images, and then runs inference on this images using that model.

Here is what I have written:

def testModel(self, testData):

        #Test any model on any dataset
        model = "**path to model file**"

        #Loading TFLite model and allocating tensors.
        interpreter = tf.lite.Interpreter(model_path=model)
        interpreter.allocate_tensors()

        # Get input and output tensors.
        input_details = interpreter.get_input_details()
        output_details = interpreter.get_output_details()

        rawImg = "**path to test images folder**"

        imgNameList = glob.glob(os.path.join(os.getcwd(), rawImg) + os.sep + '*') # gets list of image names in dir

        #creates dataset and dataloader from images

        testDataset = SalObjDataset(img_name_list = imgNameList,lbl_name_list = [], transform=transforms.Compose([RescaleT(224),ToTensorLab(flag=0)]))
        testDataloader = DataLoader(testDataset,batch_size=1,shuffle=False)
        
        #loops through dataloader (goes through each image file)
        for _, data in enumerate(testDataloader):
            inputImg = data['image']

            if torch.cuda.is_available():
                inputImg = Variable(inputImg.cuda())
            else:
                inputImg = Variable(inputImg)
            
            #rearranges dimensions in image file to match the expected input dimensions
            #also changes the type to uint8 as expected
            inputImg = tf.transpose(inputImg.cpu(), perm = [0,2,3,1])
            inputImg = tf.cast(inputImg, tf.uint8)

            interpreter.set_tensor(input_details[0]['index'], inputImg)

            interpreter.invoke()

            output_data = interpreter.get_tensor_details()
            print(output_data)

if __name__ == '__main__':

    #initialise object with the modelID of the model you want to test
    #pass the testing data folder name to testModel()
    #this is the folder where the model is
    modelID = "model_1"
    tester = ModelTrainer(modelID)
    #this is the folder where the testing images are
    tester.testModel("model_1/model_1/plant")

The way our it's setup, the images for each label are stored in their own subdirectory, so all images of a 'plant' would be in folder/plant/image-1.jpg.

I'm not sure if I'm using 'interpreter.set_tensor' correctly, I've gone through the documentation quite intensively and I'm still a bit confused.

I'm also not sure how to make sense of the output, I would like to somehow get a loss/accuracy value, how do I go about doing this?

My output is currently just [[255]] for each image.

Thanks!

1 Answers

I'm assuming you have trained a object detection Have you added necessary metadata needed for interpreter to get the Outputs according to image given below Outputs

if not make sure to use metadata writer API use this notebook for writing metadata in which pass the labels and model which does not have any metadata in it https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/models/convert/metadata_writer_tutorial.ipynb

TensorFlow Lite Metadata Writer API provides an easy-to-use API to create Model Metadata for popular ML tasks supported by the TFLite Task Library. This notebook shows examples on how the metadata should be populated for the following tasks below:

  1. Image classifiers
  2. Object detectors
  3. Image segmenters
  4. Natural language classifiers
  5. Audio classifiers

https://www.tensorflow.org/lite/models/convert/metadata_writer_tutorial

Related