Эта тема связана с этим вопросом на форуме Intel ==> Здесь <== </a>
Я хочу запустить тензор потока MaskRCNN для сегментации некоторого дефекта, но у меня есть некоторые ограничения:
- Без аппаратных изменений (i5-64bit, без GPU)
- Время вывода должно быть меньше времени получения (3 с / изображения)
Для этого я использовал mask_rcnn_inception_v2_coco из зоопарка обнаружения объектов Tensorflow.
- Модель Retrain с моими собственными функциями => ОК
- Создать замороженный_инференционный_граф => ОК
- Создание Watchdog для обработки изображений => OK
Проблема, с которой я сталкиваюсь, заключается в том, что операция по обработке изображения занимает 12 секунд. Чтобы решить эту проблему, я попытался использовать OpenVINO Модель оптимизатора:
После установки библиотеки я использовал эту команду:
python .\mo_tf.py --input_model "<path>\frozen_inference_graph.pb"
--tensorflow_use_custom_operations_config
extensions/front/tf/mask_rcnn_support_api_v1.11.json
--tensorflow_object_detection_api_pipeline_config
'<path>\mask_rcnn_inception_v2_coco.config'
[ SUCCESS ] Generated IR model.
[ SUCCESS ] XML file: <path>\frozen_inference_graph.xml
[ SUCCESS ] BIN file: <path>\frozen_inference_graph.bin
[ SUCCESS ] Total execution time: 24.00 seconds.
Затем я хотел создать свой собственный механизм вывода на Python.
Я сделал это так:
# Loading Network :
network=IENetwork(model=MODEL_XML,weights=MODEL_BIN)
network.add_outputs("detection_output")
input_wrapper = next(iter(network.inputs))
n, c, h, w = network.inputs[input_wrapper].shape
out_wrapper = next(iter(network.outputs))
plugin=IEPlugin(device="CPU")
log.info("Loading CPU Extension...")
plugin.add_cpu_extension(CPU_EXTPATH)
supported_layers = plugin.get_supported_layers(network)
not_supported_layers = [l for l in network.layers.keys() if l not in supported_layers]
if len(not_supported_layers) != 0:
log.error("Not Supported Layers : "+str(not_supported_layers))
Execution_Network=plugin.load(network=network)
del network
log.info("Network Loaded")
# Inference :
image_np = cv2.imread(imagepath)
im = cv2.cvtColor(image_np,cv2.COLOR_BGR2RGB)
image_org=image_np.copy()
#used to resize image with good dimensions
i0=image_to_tensor(im,c,h,w)
res=Execution_Network.infer(inputs={input_wrapper: i0})
Чтобы сгенерировать тензор, я использую эту функцию:
def image_to_tensor(image,channels,h,w,info=""):
print(image[0])
image_tensor=np.zeros(shape=(1,channels,h,w),dtype=np.float32)
if image.shape[:-1]!=(h,w):
log.warning("Image {} is resized from {} to {}".format(info, image.shape[:-1],(h,w)))
image=cv2.resize(image,(w,h))
image = image.transpose((2, 0, 1))
image_tensor[0]=image
return image_tensor
После этого я собрал свои собственные пользовательские функции для обработки Boundingbox и масок (как обертка с методами Tensorflow ObjectDetectionAPI).
Все это, похоже, работает как шарм.
Проблема в том, что по сравнению с Tensorflow вероятность ниже, а классы ошибочны.
Openvino:
Тензор потока:
Когда я использую OpenVINO maskrcnn_demo с той же сетью, это похоже на работу:
Average running time of one iteration: 6774.36 ms
[ INFO ] Processing output blobs
[ INFO ] Detected class 16 with probability 0.98652: [2043.3, 1104.9], [2412.87, 1436.52]
[ INFO ] Image out.png created!
[ INFO ] Execution successful
Тогда проблема в двигателе python, а не в экспорте модели. enter code here
Кто-нибудь уже сталкивался с таким поведением?
Это нормально и из-за оптимизаций OpenVINO или у меня проблемы с этим?
Спасибо!