在轉換yolo3是時遇到了問題:
[ ERROR ] List of operations that cannot be converted to IE IR:
[ ERROR ] LeakyRelu (72)
[ ERROR ] detector/darknet-53/Conv/LeakyRelu
........
[ ERROR ] Part of the nodes was not translated to IE. Stopped.
For more information please refer to Model Optimizer FAQ (<INSTALL_DIR>/deployment_tools/documentation/docs/MO_FAQ.html), question #24.
File "object_detection_demo_yolov3.py", line 73, in __init__(這個好像是numpy問題)
assert False, "Invalid output size. Only 13, 26 and 52 sizes are supported for output spatial dimensions"
AssertionError: Invalid output size. Only 13, 26 and 52 sizes are supported for output spatial dimensions
論壇上的結果是,多是tensorflow版本的問題,可是我隨之加上以後也是類似的結果。因而我準備從新安裝openvino,在安裝以前先配好基本環境要求
A Linux build environment needs these components:
OpenCV 3.4 or higher
GNU Compiler Collection (GCC) 3.4 or higher
CMake* 2.8 or higher
Python* 3.5 or higher
ubuntu16.04上安裝有python3.5.2符合要求,而後由sudo apt-get install cmake安裝cmake3.5.1,而後由sudo apt-get install python3-pip 安裝pip3 8.1.1 千萬不要更新pip,否則後面也會出問題,好像是什麼找不到mian。而後用pip3 install tensorflow==1.12.0安裝,最好是這個版本吧,不少人都是用這個版本成功的,我也是。最後經過pip3 install install opencv_python安裝opencv。而後再安裝openvino,此後將一路順風。
我也選擇過windows版本的,而後在將tf模型轉換成IR模型的時候遇到了問題:
[ ERROR ] Cannot infer shapes or values for node "detector/yolo-v3/Conv_14/BiasAdd/YoloRegion".
[ ERROR ] 'coords'
[ ERROR ]
[ ERROR ] It can happen due to bug in custom shape infer function <function RegionYoloOp.regionyolo_infer at 0x7f290119b488>.
[ ERROR ] Or because the node inputs have incorrect values/shapes.
[ ERROR ] Or because input shapes are incorrect (embedded to the model or passed via --input_shape).
[ ERROR ] Run Model Optimizer with --log_level=DEBUG for more information.
[ ERROR ] Stopped shape/value propagation at "detector/yolo-v3/Conv_14/BiasAdd/YoloRegion" node.
For more information please refer to Model Optimizer FAQ (<INSTALL_DIR>/deployment_tools/documentation/docs/MO_FAQ.html), question #38.
找了好久也沒有找到解決辦法,而我在論壇上看到的討論基本是基於ubuntu16.04的。因此我便在ubuntu上安裝的openvino,因此到目前爲止我也不知道以上錯誤的緣由,若是有知道的人,看到了個人筆記,還望不吝賜教。
darknet模型轉換成tensorflow模型
因爲openvino不支持darknet轉換,因此先要進行模型轉換,這裏選擇轉換成tf模型,再轉換成IR模型。 打開OpenVINO-YoloV3工程,把下載好的權重放在OpenVINO-YoloV3-master\weights目錄下,而後按照OpenVINO-YoloV3-master\script.txt的指示轉換成tf模型。
#============================================
python3 convert_weights.py \
--class_names coco.names \
--weights_file weights/yolov3.weights \
--data_format NHWC
python3 convert_weights_pb.py \
--class_names coco.names \
--weights_file weights/yolov3.weights \
--data_format NHWC \
--output_graph pbmodels/frozen_yolo_v3.pb
#============================================
執行這兩個命令以後,在OpenVINO-YoloV3-master\pbmodels目錄下就能夠生成你想要的tf模型,很是方便。默認輸入是416*416,若是須要其餘大小,能夠到代碼裏面改。我也用過mystic123/tensorflow-yolo-v3這個工程,可是多是因爲操做緣由,最終IR轉換沒有成功。其間在轉換tf時要用 NHWC方式。
tf模型轉換成IR模型
要想在openvino上使用yolo3,還須要轉換成它的模型,即生成IR模型,包括bin和xml文件。一樣按照OpenVINO-YoloV3-master\script.txt的指示將tf模型轉換成IR模型,按照需求執行如下任意一個生成FP32,或FP16的模型,樹莓派只支持後者。在openvino默認安裝的狀況下,全部的路徑都不須要改。
#==================================================================================
sudo python3 /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/mo_tf.py \
--input_model pbmodels/frozen_yolo_v3.pb \
--output_dir lrmodels/YoloV3/FP32 \
--data_type FP32 \
--batch 1 \
--tensorflow_use_custom_operations_config yolo_v3_changed.json
sudo python3 /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/mo_tf.py \
--input_model pbmodels/frozen_yolo_v3.pb \
--output_dir lrmodels/YoloV3/FP16 \
--data_type FP16 \
--batch 1 \
--tensorflow_use_custom_operations_config yolo_v3_changed.json
#==================================================================================
進行到這裏,按理說就會獲得幾個振奮人心的success,這就代表模型轉換完成啦,生成的xml和bin文件已經靜靜的呆在某個位置,等待着你的使用了。。
測試
模型轉換成功以後,就能夠測試啦。進入OpenVINO-YoloV3-master文件夾,而後python3 openvino_yolov3_test.py。這時電腦的攝像頭會被打開,而後你美麗臉會出如今其中,周圍會框出人,而且會寫xxx%person,原來咱們只是像人的生物。
後續
後面我把它運行在樹莓派3b+上,結合神經計算棒一代,結果剛一運行就直接黑屏了,增長了swap分區也沒有救。OpenVINO-YoloV3裏也有運行在計算棒上的程序,這真是一個很棒的程序,不過我在電腦上沒有成功,結果是找不到設備,暫時尚未解決。OpenVINO-YoloV3工程做者也說樹莓派上應該不能跑yolo3,不過網上有人好像說成功了,不知道他們是怎麼作到的。可是yolo3tiny是能夠的。yolo2能夠直接在樹莓派上跑,測試過,須要300秒,真的是等到花兒都謝了。
更新1:在筆記本+神經計算棒一代平臺運行yolo3
1.像在樹莓派上同樣,在電腦上使用神經計算棒也要添加USB規則,並且要複雜一些,否則就會找不到設備。
首先執行它
sudo usermod -a -G users "$(whoami)"
2. 而後新建一個叫97-myriad-usbboot.rules的文件,而後把如下三個代碼拷貝到文件裏。
2 SUBSYSTEM=="usb", ATTRS{idProduct}=="2150", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
3 SUBSYSTEM=="usb", ATTRS{idProduct}=="2485", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
4 SUBSYSTEM=="usb", ATTRS{idProduct}=="f63b", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
3.最後依次執行如下代碼
sudo cp 97-myriad-usbboot.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo ldconfig
rm 97-myriad-usbboot.rules
至此,usb規則就已經配好,接下來,python3 OpenVINO-YoloV3-master/openvino_yolov3_MultiStick_test.py,將不會出現找不到設備的錯誤。結果以下。
更新2:樹莓派+神經計算棒一代+yolov3
事實證實,樹莓派上能夠運行yolov3。以前在跑的時候先出現了黑屏現象,而後在終端上出現瞭如下的問題,最後如NCS論壇上所說,是電源的緣由。(樹莓派的USB接口有電流限制,默認只能達到600mA。這給外接一些對電流要求較高的設備時會遇到電流不足的問題,致使沒法工做或工做不穩定。)
Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files
E: [xLink] [ 807609] dispatcherEventReceive:308 dispatcherEventReceive() Read failed -1 | event 0x644fee20 USB_READ_REL_RESP
E: [xLink] [ 807609] eventReader:256 eventReader stopped
E: [xLink] [ 808064] dispatcherEventSend:908 Write failed event -1
E: [ncAPI] [ 808069] ncGraphQueueInference:3538 Can't send trigger request
E: [watchdog] [ 808312] sendPingMessage:164 Failed send ping message: X_LINK_ERROR
.................
E: [watchdog] [ 809319] sendPingMessage:164 Failed send ping message: X_LINK_ERROR
解決辦法就是找一個自供電hub,而後連上自供電的線,而後就能夠順利運行。若是懶得找,能夠訪問此連接(記得客服說要線,否則不會送): https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-4331626625. 13.7e1156e8BoB79 J&id= 5841 85230094
#==================================================================================
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/pi/OpenVINO-YoloV3-master/openvino_yolov3_MultiStick_test.py", line 346, in inferencer
thworker = threading.Thread(target=async_infer, args=(NcsWorker(devid, frameBuffer, results, camera_width, camera_height, number_of_ncs, vidfps),))
File "/home/pi/OpenVINO-YoloV3-master/openvino_yolov3_MultiStick_test.py", line 259, in __init__
self.exec_net = self.plugin.load(network=self.net, num_requests=self.num_requests)
File "ie_api.pyx", line 389, in openvino.inference_engine.ie_api.IEPlugin.load
File "ie_api.pyx", line 400, in openvino.inference_engine.ie_api.IEPlugin.load
RuntimeError: Can not init USB device: NC_DEVICE_NOT_FOUND
#==================================================================================
若是出現這個錯誤,試試把神經計算棒插到其餘usb口。
修改.py裏的此處,能夠改變輸入的方式,此處使用的是本地視頻,默認是使用攝像頭。
#cam = cv2.VideoCapture(0)
#if cam.isOpened() != True:
# print("USB Camera Open Error!!!")
# sys.exit(0)
#cam.set(cv2.CAP_PROP_FPS, vidfps)
#cam.set(cv2.CAP_PROP_FRAME_WIDTH, camera_width)
#cam.set(cv2.CAP_PROP_FRAME_HEIGHT, camera_height)
#window_name = "USB Camera"
#wait_key_time = 1
cam = cv2.VideoCapture("data/input/testvideo4.mp4")
camera_width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
camera_height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_count = int(cam.get(cv2.CAP_PROP_FRAME_COUNT))
window_name = "Movie File"
wait_key_time = int(1000 / vidfps)
yolo3-tiny本地視頻結果:因爲視頻幀率明顯大於檢測幀率,因此如下結果會出現錯位,檢測的是前面某幀,可是顯示已經到了其餘畫面。
yolo3本地視頻結果:
yolo3攝像頭採集處理結果:
更新3
若是在用其餘圖片而不是用攝像頭採集的圖片進行測試時,會出現邊框徹底錯誤的狀況,這是由於該程序默認的尺寸是320*240,最後恢復也是按照這個尺寸來的,若是用本身的圖片不是這個尺寸,就會出現錯位狀況。
更新4
轉換好的YOLO3模型,FP16和FP32格式。
連接:https://pan.baidu.com/s/1Y9zVBIbsB9rEdmIPNy0MfA
提取碼:ds2t
————————————————
版權聲明:本文爲CSDN博主「意疏」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/sinat_35907936/article/details/88760618html