Специально обученная модель SsdliteMobileNetV2, преобразованная в tflite, не дает правильных результатов - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь специально обучить SsdliteMobileNetV2 для 2 классов. Я взял контрольные точки и преобразовал его в tflite-совместимый замороженный график, используя следующий код

python /content/models/research/object_detection/export_tflite_ssd_graph.py \
    --input_type=image_tensor \
    --pipeline_config_path={pipeline_fname} \
    --output_directory={output_directory} \
    --add_postprocessing_op=true \
    --trained_checkpoint_prefix={last_model_path}

Затем я преобразовал tflite_frozen_graph в модель tflite, используя следующий код

    --output_file="my_model.tflite" \
    --graph_def_file="tflite_graph.pb" \
    --input_shapes="1,300, 300,3" \
    --input_arrays=normalized_input_image_tensor \
    --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
    --inference_type=QUANTIZED_UINT8 \
    --mean_values=128 \
    --std_dev_values=128 \
    --default_ranges_min=0 \
    --default_ranges_max=6 \
    --change_concat_input_ranges=false \
    --allow_custom_ops

После этого я пытаюсь сделайте вывод из этой модели, преобразованной в tflite, используя следующий код

def detect_from_image(input_image):

    # prepare input image
    img_org = cv2.imread(input_image)
    img = cv2.cvtColor(img_org, cv2.COLOR_BGR2RGB)
    print(img.shape[0])
    print(img.shape[1])
    print(img.shape[2])


    img = cv2.resize(img, (300, 300))
    img = img.reshape(1, img.shape[0], img.shape[1], img.shape[2]) # (1, 300, 300, 3)

    #img = img.astype(np.float32)
    img = img.astype(np.uint8)


    # load model
    interpreter = tflite.Interpreter(model_path="my_model.tflite")

    interpreter.allocate_tensors()
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    # set input tensor
    interpreter.set_tensor(input_details[0]['index'], img)

    # run
    interpreter.invoke()

    boxes = interpreter.get_tensor(output_details[0]['index'])


    labels = interpreter.get_tensor(output_details[1]['index'])
    scores = interpreter.get_tensor(output_details[2]['index'])
    num = interpreter.get_tensor(output_details[3]['index'])
    print(boxes)

    for i in range(boxes.shape[1]):
        if scores[0, i] > 0.75:
            print('marking box')
            box = boxes[0, i, :]
            x0 = int(box[1] * img_org.shape[1])
            y0 = int(box[0] * img_org.shape[0])
            x1 = int(box[3] * img_org.shape[1])
            y1 = int(box[2] * img_org.shape[0])

            box = box.astype(np.int)
            cv2.rectangle(img_org, (int(x0), int(y0)), (int(x1), int(y1)), (255, 0, 0), 1)
            #cv2.rectangle(img1, (x0, y0), (x0 + 100, y0 - 30), (255, 0, 0), -1)


    cv2_imshow(img_org)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Но вывод, который она дает, очень странный. Я получаю много вертикальных и горизонтальных полей в качестве вывода, и я не получаю желаемый вывод.

Вот некоторые интересные наблюдения -

  • Я пытался запустить то же самое Преобразованная модель TFlite на Android, и она работает.
  • Предварительно обученная модель SsdLiteMobileNetV1 при преобразовании в TFlite работает нормально.
  • Специально обученная модель SsdLiteMobileNetV1 при преобразовании в TFlite, я в процессе проверки этого.
  • SsdLiteMobileNetV2 предварительно обученная модель при преобразовании в TFlite, я в процессе проверки этого.

Дайте мне знать, если я делаю что-то не так или я должен исследовать что-то еще. Некоторые подсказки или помощь будут высоко оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...