Я пытаюсь специально обучить 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, я в процессе проверки этого.
Дайте мне знать, если я делаю что-то не так или я должен исследовать что-то еще. Некоторые подсказки или помощь будут высоко оценены.