openvino:yolov3转换成tenserflow模型再转换成openvino模型,并用神经计算棒一代加速树莓派3b+

在转换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/88760618

原文地址:https://www.cnblogs.com/cloudrivers/p/11756347.html

时间: 2024-10-14 18:58:00

openvino:yolov3转换成tenserflow模型再转换成openvino模型,并用神经计算棒一代加速树莓派3b+的相关文章

java文件转成jar包再转成exe文件

[本文简介] 本文将介绍如何把一个跑在eclipse的java应用,导出成jar文件,再变成exe可执行文件. 下面以一个跑在MyEcplise上的GUI应用程序为例子,一步步转化成exe可执行文件. [具体步骤] 1.安装Fat jar(小应用可不用,直接导出普通jar包即可) 如果你在程序开发的时候用到了第三方提供的API或者其它附属资源,在你导出生成jar文件时你必须将第三方的文件一并导出,不然你的程序运行将达不到你想要的结果. 所以我们使用 Fat jar插件 来生成jar包: (1)F

Java 把long 转换成 日期 再转换成String类型

1 /** 2 * 把long 转换成 日期 再转换成String类型 3 */ 4 public String transferLongToDate(String dateFormat, Long millSec) { 5 SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 6 Date date = new Date(millSec); 7 return sdf.format(date); 8 } 上面是方法   第一个参数:da

OSX: diskutil命令-转换成自由空间并再对其分区

声明:本文涉及的操作很可能会破坏你的系统文件,造成数据丢失,请慎重模仿,一切后果作者均不承担任何责任. 目的: 虽然说比较熟悉diskutil命令和它的GUI前端程序磁盘工具(Disk Utility),因为有时需要对磁盘分区进行操作,那么在前端使用磁盘工具比较方便,而且不容易出错.可是有时需要远程或者通过诸如ssh来处理,特别是对多个机器同时操作的情况下,总不能显得自己那么的笨手笨脚的吧.每个公司甚至是每个办公室,总有那么一个人难对付,那老兄要求帮忙,顺便给你来一句:要是给我管理员权限,这个我

Javascript-自定义对象转换成JSon后如何再转换回自定义对象

man是自定义的对象,使用var tim = JSON.stringify(man); var newman=JSON.parse(tim)后newman的类型是"object"并不是一个Man,怎么才能变回一个Man呢? function Man() { this._type = "man"; this.name=""; this.run = function () { alert("run!!"); alert(this.

js字符串转换成数字,数字转换成字符串

js字符串转换成数字   将字符串转换成数字,得用到parseInt函数. parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt('123') : 返回 123(int): parseInt('1234xxx') : 返回 1234(int): 如果解析不到数字,则将返回一个NaN的值,可以用isNaN()函数来检测: 举例 : var i = parseInt('abc'); if (isNaN(i)) { alert('NaN value

金额转换,阿拉伯数字的金额转换成中国传统输出。

1 package sfbc; 2 3 import java.text.DecimalFormat; 4 import java.util.HashMap; 5 import java.util.Map; 6 /** 7 * 金额转换,阿拉伯数字的金额转换成中国传统输出. 8 * @author trfizeng 9 * 10 */ 11 public class FormateMoneyCN { 12 // 阿拉伯数字对应的大写汉字 13 public static final Map<St

PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM

从SQL文件逆向工程到PDM: ①选择file -> Reverse Engineer - > Database ②在General选项卡中选择MySQL数据库,点击确定. ③using script file 选择你的sql文件,最后选择确定. 从PDM转成CDM: ①选择工具 -> General CDM (Ctrl + Shift + C) ②点击确定 PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM,布布扣,bubuko.com

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

C#字母转换成数字/数字转换成字母 - ASCII码转换

字母转换成数字 byte[] array = new byte[1];   //定义一组数组arrayarray = System.Text.Encoding.ASCII.GetBytes(string); //string转换的字母int asciicode = (short)(array[0]); ASCII码 = Convert.ToString(asciicode); //将转换一的ASCII码转换成string型 数字转换成字母byte[] array = new byte[1];ar