解释TF lite在对象检测API上的输出

时间:2019-04-03 09:54:07

标签: android python tensorflow object-detection-api

我正在使用对象检测API来针对2类问题训练我的自定义数据。 我正在使用SSD Mobilenet v2。我正在将模型转换为TF lite,并且试图在python解释器上执行它。 分数和等级的价值对我来说有些令人困惑,我无法为此提供合理的理由。我得到以下分数值。

[[ 0.9998122 0.2795332 0.7827836 1.8154384 -1.1171713 0.152002 -0.90076405 1.6943774 -1.1098632 0.6275915 ]]

我正在获得以下课堂价值观:

[[ 0. 1.742706 0.5762139 -0.23641224 -2.1639721 -0.6644413 -0.60925585 0.5485272 -0.9775026 1.4633082 ]]

例如,如何获得大于1或小于0的分数-1.10986321.6943774。 另外,类最好是整数12,因为它是2类对象检测问题

我正在使用以下代码



    import numpy as np
    import tensorflow as tf
    import cv2

    # Load TFLite model and allocate tensors.
    interpreter = tf.contrib.lite.Interpreter(model_path="C://Users//Admin//Downloads//tflitenew//detect.tflite")
    interpreter.allocate_tensors()

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

    print(input_details)
    print(output_details)
    input_shape = input_details[0]['shape']
    print(input_shape)
    # change the following line to feed into your own data.
    #input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)

    input_data = cv2.imread("C:/Users/Admin/Pictures/fire2.jpg")
    #input_data = cv2.imread("C:/Users/Admin/Pictures/images4.jpg")
    #input_data = cv2.imread("C:\\Users\\Admin\\Downloads\\FlareModels\\lessimages\\video5_image_178.jpg")
    input_data = cv2.resize(input_data, (300, 300)) 

    input_data = np.expand_dims(input_data, axis=0)
    input_data = (2.0 / 255.0) * input_data - 1.0
    input_data=input_data.astype(np.float32)
    interpreter.reset_all_variables()
    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()
    output_data_scores = []
    output_data_scores = interpreter.get_tensor(output_details[2]['index'])
    print(output_data_scores)

    output_data_class = []
    output_data_class = interpreter.get_tensor(output_details[1]['index'])
    print(output_data_class)

2 个答案:

答案 0 :(得分:0)

该问题似乎是由错误的输入图像通道顺序引起的。 Opencv imread读取“ BGR”格式的图像。您可以尝试添加

input_data = cv2.cvtColor(input_data,  cv2.COLOR_BGR2RGB)

获取“ RGB”格式的图像,然后查看结果是否合理。

参考:ref

答案 1 :(得分:0)

tflite模型的输出需要后处理。默认情况下,该模型将返回一个固定数字(此处为10次检测)。使用索引3处的输出张量获取有效框的数量num_det。 (即,前num_det个检测有效,其余则忽略)

num_det = int(interpreter.get_tensor(output_details[3]['index']))
boxes = interpreter.get_tensor(output_details[0]['index'])[0][:num_det]
classes = interpreter.get_tensor(output_details[1]['index'])[0][:num_det]
scores = interpreter.get_tensor(output_details[2]['index'])[0][:num_det]

接下来,需要将框坐标缩放到图像大小并进行调整,以使框位于图像内(某些可视化API要求这样做)。

df = pd.DataFrame(boxes)
df['ymin'] = df[0].apply(lambda y: max(1,(y*img_height)))
df['xmin'] = df[1].apply(lambda x: max(1,(x*img_width)))
df['ymax'] = df[2].apply(lambda y: min(img_height,(y*img_height)))
df['xmax'] = df[3].apply(lambda x: min(img_width,(x * img_width)))
boxes_scaled = df[['ymin', 'xmin', 'ymax', 'xmax']].to_numpy()

这是link的推理脚本,具有输入预处理,输出后处理和mAP评估。