Toybrick

标题: 人工智能开发系列(3) YOLOV3开发与实现 [打印本页]

作者: hisping    时间: 2019-2-28 16:57
标题: 人工智能开发系列(3) YOLOV3开发与实现
本帖最后由 hisping 于 2019-5-5 20:12 编辑

[attach]143[/attach]



本教程视频直播回看:http://www.yizhibo.com/l/yYPsgbJSwsb9S3vR.html

本教程基于RK3399pro开发板,使用fedora 28系统,另需usb鼠标、usb键盘、hdmi显示器、usb摄像头、网线连接开发板

1. 搭建开发环境
1.安装rknn-toolkit及其依赖库,按照wiki教程安装环境

2.#切换到python 3.x,系统同时安装python 2.7和3.x版本时,默认使用3.x
  1. sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
复制代码

3..验证模型转换、推理
  1. cd rknn-toolkit/example/mobilenet_v1
  2. python3 test.py
复制代码

4.安装matplotlib
  1. sudo dnf install freetype-devel pkg-config libpng-devel pkg-config
  2. pip3 install --user matplotlib
复制代码

5.此时应该可以正常显示图片及打开摄像头,但无法打开视频文件,需安装gstreamer
  1. sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
  2. sudo dnf install gstreamer1-libav
复制代码


2.快速上手,运行yolov3 rknn模型
1.下载附件[attach]144[/attach],解压并拷贝到板子
2.#进入yolov3_demo目录
cd yolov3_demo
#从darknet官网下载权重
wget https://pjreddie.com/media/files/yolov3-tiny.weights
wget https://pjreddie.com/media/files/yolov3.weights
#resize data/目录下图片,用于后续模型转化
python rknn_resize.py
#转为rknn模型,得到yolov3.rknn和yolov3_tiny.rknn,转化非常消耗内存,请先设置swap虚拟内存(建议大于2g),转化比较慢,请耐心等待
python rknn_transform.py
python rknn_transform_tiny.py
#预测一张图片
python rknn_picture.py
python rknn_picture_tiny.py
#打开摄像头,预测视频,若没有摄像头也可以修改脚本打开视频文件
python rknn_camera.py
python rknn_camera_tiny.py
#上诉脚本使用单线程预测,所以帧数只有十几帧,耗时为前处理耗时10ms,npu耗时20ms,后处理耗时26-35ms,显示7ms;
#所以用户可以修改脚本为多线程,让npu与cpu同时运行,可以轻松达到30fps以上,理论上最高可以达到50fps

#之前一直忙其他项目没空搞多线程,论坛上有人发多进程版本跑20帧,我在其基础上做了优化,光线充足条件下可以跑到30帧,昏暗条件下稍慢这是摄像头曝光的原因,与模型无关;感谢该开发者分享代码,也希望论坛能有更多这样的开发者
[attach]242[/attach]
[attach]245[/attach]
#yolov3_demo中跑的是yolov3-608, 若客户想跑yolov3-416可以按照以下步骤修改脚本
1. 修改yolov3.cfg文件中width=416 height=416
2. 修改rknn_transform.py中dataset='./dataset.txt',指向416x416x3的图片进行量化
3. python3 rknn_transform.py重新转化模型
4. 修改rknn_picture.py和rknn_camera.py中resize图片为416x416, 修改GRID0 = 13 GRID1 = 26 GRID2 = 52

#若客户想跑yolov3-320可以按照以下步骤修改脚本
1. 客户自行获取320x320x3的图片用于量化,也可以修改rknn_resize.py获取
2. 修改yolov3.cfg文件中width=320 height=320
3. 修改rknn_transform.py中dataset='./dataset_320x320.txt',指向320x320x3的图片进行量化
4. python3 rknn_transform.py重新转化模型
5. 修改rknn_picture.py和rknn_camera.py中resize图片为320x320, 修改GRID0 = 10 GRID1 = 20 GRID2 = 40

3.训练自己的数据
1.训练建议在用户pc机上训练,请先下载编译安装darknet工程,详见官网https://pjreddie.com/darknet/yolo/
2.下载附件[attach]145[/attach],解压并拷贝到darknet/目录下
[attach]146[/attach]

3.#进入train_my_data目录
cd train_my_data
#下载权重数据
wget https://pjreddie.com/media/files/yolov3-tiny.weights
拷贝你的图片到train_images目录和validate_images目录
#下载编译安装打标签工具,该工具用于给你的图片打标签
git clone https://github.com/tzutalin/labelImg
cd labelImg
    sudo apt-get install pyqt5-dev-tools
    sudo pip3 install -r requirements/requirements-linux-python3.txt
    make qt5py3
    python3 labelImg.py
    使用工具给你的图片打标签,并把标签保存到train_imageXML目录和validate_imageXML目录
cd ..
#遍历train_images目录和validate_images目录下所有图片,得到trainImageId.txt和validateImageId.txt文件
python list_image_files.py
#得到图片路径生成trainImagePath.txt和validateImagePath.txt文件,并把train_imageXML目录和validate_imageXML目录下的标签转成.txt格式存在train_labels和validate_labels目录下
python trans.py
#修改voc.names文件,写入你要训练的物体名称
vi voc.names
    class_1
    class_2
    class_3
#修改voc.data文件,N是你训练的物体种类
vi voc.data
    classes = N      # N is your class num
    train = /home/XXX/darknet/train_my_data/trainImagePath.txt
    valid = /home/XXX/darknet/train_my_data/validateImagePath.txt
    names = train_my_data/voc.names
    backup = train_my_data/backup
#修改yolov3-tiny-modify.cfg,修改所有yolo层的classes参数,修改yolo层前一层的filters参数
vi yolov3-tiny-modify.cfg
    1. modify classes = N in [yolo] layer
    2. modify filters = 3*(N+1+4) ahead [yolo] layer
    3. modify max_batches = your-max-train-times

cd ..
#提取卷积层数据
./darknet partial train_my_data/yolov3-tiny.cfg train_my_data/yolov3-tiny.weights train_my_data/yolov3-tiny.conv.15 15
#开始训练
./darknet detector train train_my_data/voc.data train_my_data/yolov3-tiny-modify.cfg train_my_data/yolov3-tiny.conv.15
#验证训练
./darknet detector test train_my_data/voc.data train_my_data/yolov3-tiny-modify.cfg train_my_data/backup/yolov3-tiny-modify_900.weights train_my_data/train_images/000937.jpg -thresh 0.1
4.拷贝你自己训练的.weight文件和yolov3-tiny-modify.cfg文件到rk3399pro开发板,修改rknn_transform_tiny.py,转成rknn模型
5.修改rknn_picture_tiny.py文件中数据,N是物体种类
    LISTSIZE=85        =>        LISTSIZE=(N+5)
    NUM_CLS=80        =>        NUM_CLS=N
    CLASSES{...}        =>        CLASSES{“class_1”, “class_2”, “class_3”}

4.YOLOV3理论分析
1.YOLO的全名是:You Only Look Once.
YOLO算法的基本思想是:首先将输入图像分成S*S个格子,如果某个预测对象的中心坐标落在某个格子中,那么就由该格子来预测该对象,每个格子都会预测B个边界框,每个边界框输出为(5+C)长度参数
SxS: 在yolov3-416中会切割成13x13, 26x26, 52x52
B: 在yolov3中该值为3, 由anchors决定
C: 模型可预测分类, VOC数据集为20,coco数据集为80,也可以自己训练
5: bounding box边界框的中心坐标,长宽,对象置信度
[attach]147[/attach][attach]148[/attach]




2.YOLOV3神经网络图
[attach]149[/attach]

yolov3-416: 输入参数416x416x3, 输出3个数组13x13x(3x(5+80))          26x26x(3x(5+80)) 52x52x(3x(5+80))
yolov3-608: 输入参数608x608x3, 输出3个数组19x19x(3x(5+80))          38x38x(3x(5+80)) 76x76x(3x(5+80))
tiny-yolov3: 输入参数416x416x3, 输出2个数组13x13x(3x(5+80))  26x26x(3x(5+80))

3.Yolov3后处理

对数空间变换:
[attach]150[/attach]
tx, ty, tw, th为模型输出
cx, cy是物体中心所在格子索引
6()是sigmoid函数,变量映射到(0, 1)
pw, ph为对应anchors box的宽高

基于对象置信度的阈值,首先,我们根据对象分数过滤框。 通常,具有低于阈值分数的框被忽略


非最大抑制(NMS)
    NMS打算解决同一图像的多重检测问题。
     A、B、C、D、E、F
从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

[attach]151[/attach]











作者: qiaoqiang126    时间: 2019-2-28 17:57
608*608 的yolov3不能在Android上跑吗?
作者: chuyee    时间: 2019-3-1 08:37
rknn_inference 20ms is for 416x416 tiny-yolov3, right? I measured 608x608 yolov3 inference time is about 440ms. Is the number correct? That's only 2.5 FPS.
作者: hisping    时间: 2019-3-1 09:17
chuyee 发表于 2019-3-1 08:37
rknn_inference 20ms is for 416x416 tiny-yolov3, right? I measured 608x608 yolov3 inference time is a ...

是的,yolov3-608耗时比较长,在移动设备端还是建议使用tiny-yolov3对视频进行检查。你可以使用tiny-yolov3检查视频,当检查到重点对象时,可以把这一帧数据发给yolov3-608再检测以提高精度
作者: qiaoqiang126    时间: 2019-3-1 14:07
opencv-python>=3.4.3.18无法安装,找不到包怎么办?
作者: chuyee    时间: 2019-3-1 14:28
hisping 发表于 2019-3-1 09:17
是的,yolov3-608耗时比较长,在移动设备端还是建议使用tiny-yolov3对视频进行检查。你可以使用tiny-yolo ...

试了一下608x608的Yolov2,rknn_inference()可以达到80ms。同样大小的Yolov3为什么会慢5倍这么多呢?是不是有些Yolov3的算子还没有优化好啊?
作者: someone9388    时间: 2019-3-1 15:47
qiaoqiang126 发表于 2019-3-1 14:07
opencv-python>=3.4.3.18无法安装,找不到包怎么办?

同问,
如果是安装在板子上,是否因该安装opencv-python-aarch64,但是pip 中的whl 只有3.3.0.1 的。这个包是否可以?
作者: chuyee    时间: 2019-3-1 16:14
someone9388 发表于 2019-3-1 15:47
同问,
如果是安装在板子上,是否因该安装opencv-python-aarch64,但是pip 中的whl 只有3.3.0.1 的。这个 ...
sudo dnf install -y python3-devel python3-opencv python3-numpy-f2py python3-scipy python3-h5py python3-lmdb opencv-devel


Use dnf instead of pip. See the original post.
作者: someone9388    时间: 2019-3-1 16:46
chuyee 发表于 2019-3-1 16:14
Use dnf instead of pip. See the original post.

是的 ,多谢!
作者: chuyee    时间: 2019-3-1 17:13
Tried Yolov3 416. All my results are as follow. Do they algin with RK's internal testing?

Yolov3 608: 440ms
Yolov3 416: 210ms
Yolov2 608: 80ms
Yolov3 tiny: 20ms

BTW, I met below warnings during running rknn_tranform.py. Does it mean the rknn model is not best optimized (i.e. some high efficiency OP's are ignored due to accuracy loss)?

--> Building model
W extend add_13 to add will cause accuracy loss, do not extend.
W extend add_23 to add will cause accuracy loss, do not extend.
W extend add_30 to add will cause accuracy loss, do not extend.
W extend add_40 to add will cause accuracy loss, do not extend.
W extend add_47 to add will cause accuracy loss, do not extend.
W extend add_54 to add will cause accuracy loss, do not extend.
W extend add_61 to add will cause accuracy loss, do not extend.
W extend add_68 to add will cause accuracy loss, do not extend.
W extend add_75 to add will cause accuracy loss, do not extend.
W extend add_82 to add will cause accuracy loss, do not extend.
W extend add_89 to add will cause accuracy loss, do not extend.
W extend add_99 to add will cause accuracy loss, do not extend.
W extend add_106 to add will cause accuracy loss, do not extend.
W extend add_113 to add will cause accuracy loss, do not extend.
W extend add_120 to add will cause accuracy loss, do not extend.
W extend add_127 to add will cause accuracy loss, do not extend.
W extend add_134 to add will cause accuracy loss, do not extend.
W extend add_141 to add will cause accuracy loss, do not extend.
W extend add_148 to add will cause accuracy loss, do not extend.
W extend add_158 to add will cause accuracy loss, do not extend.
W extend add_165 to add will cause accuracy loss, do not extend.
W extend add_172 to add will cause accuracy loss, do not extend.
W extend add_179 to add will cause accuracy loss, do not extend.
done
作者: 111223    时间: 2019-3-1 17:35
android 端的demo有提供吗?就是用c或者java推理取值的那种
作者: hisping    时间: 2019-3-4 15:32
111223 发表于 2019-3-1 17:35
android 端的demo有提供吗?就是用c或者java推理取值的那种

c接口的没有实现,用户可以参考python接口的自行实现
作者: qiaoqiang126    时间: 2019-3-5 10:05
chuyee 发表于 2019-3-1 17:13
Tried Yolov3 416. All my results are as follow. Do they algin with RK's internal testing?

Yolov3 60 ...

Yolov3 608: 我用了4s,这是怎么回事?
作者: hisping    时间: 2019-3-5 19:08
qiaoqiang126 发表于 2019-3-5 10:05
Yolov3 608: 我用了4s,这是怎么回事?

你应该是没有开启量化
作者: administer    时间: 2019-3-7 21:20
hisping 发表于 2019-3-5 19:08
你应该是没有开启量化

请教一下如何量化鸭
作者: Ess    时间: 2019-3-11 15:27
单线程修改为多线程的教程有吗?
作者: vlsida2019    时间: 2019-3-12 13:36
chuyee 发表于 2019-3-1 14:28
试了一下608x608的Yolov2,rknn_inference()可以达到80ms。同样大小的Yolov3为什么会慢5倍这么多呢?是不 ...

我想請問一下 你是如何把yolov2弄進去的

作者: vlsida2019    时间: 2019-3-12 14:00
想請問一下  我使用作者提供的python load我的yolov2-tiny的模型 會出現 out_boxes, out_boxes2 = rknn.inference(inputs=[mat]) ValueError: not enough values to unpack (expected 2, got 1) 的問題 請問是哪裡有問題?
作者: 程子    时间: 2019-3-12 15:10
vlsida2019 发表于 2019-3-12 14:00
想請問一下  我使用作者提供的python load我的yolov2-tiny的模型 會出現 out_boxes, out_boxes2 = rknn.inf ...

输出节点只有一个,而你试图把它赋值给两个变量。
作者: chuyee    时间: 2019-3-12 15:17
程子 发表于 2019-3-12 15:10
输出节点只有一个,而你试图把它赋值给两个变量。

Yeah, yolov3 has 3 dimensions output while yolov2 has only one.
作者: vlsida2019    时间: 2019-3-12 16:40
程子 发表于 2019-3-12 15:10
输出节点只有一个,而你试图把它赋值给两个变量。

那請問要如何改 會比較好 我使用的是rknn_picture_tiny.py這程式出現此問題
作者: vlsida2019    时间: 2019-3-12 17:04
請問可以做一個yolov2的示範和直播嗎?
作者: hisping    时间: 2019-3-12 17:46
vlsida2019 发表于 2019-3-12 17:04
請問可以做一個yolov2的示範和直播嗎?

yolov3是3个输出,yolov3-tiny是两个输出,yolov2输出是一个大数组,请先理解yolo算法的输出含义,帖子里都有
作者: vlsida2019    时间: 2019-3-13 16:53
想請問如果要使用的是yolov2的cfg和weights 帖子裡的那些python檔案 需要做哪些修改 才有辦法load進去yolov2的檔案
作者: Aries699    时间: 2019-3-21 21:46
本帖最后由 Aries699 于 2019-3-21 22:08 编辑

运行rknn_picture.py和rknn_picture_tiny.py脚本时出现以下错误:
No XVisualInfo for format QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize 1, greenBufferSize 1, blueBufferSize 1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(SingleBuffer), swapInterval 1, colorSpace QSurfaceFormat::ColorSpace(DefaultColorSpace), profile  QSurfaceFormat::OpenGLContextProfile(NoProfile))
Falling back to using screens root_visual.
qt.qpa.xcb: QXcbConnection: XCB error: 145 (Unknown), sequence: 175, resource id: 0, major code: 139 (Unknown), minor code: 20请问是什么地方出了问题?

作者: ronyuzhang    时间: 2019-3-22 17:28
为什么官方提供的mobilenet-ssd的后处理时间高达1s呢?请问这块如何优化?
作者: hscoder    时间: 2019-3-22 23:53
hisping 发表于 2019-3-5 19:08
你应该是没有开启量化

请问怎么开启量化呢 ?
作者: 程子    时间: 2019-3-23 09:25
hscoder 发表于 2019-3-22 23:53
请问怎么开启量化呢 ?
  1. rknn.build(do_quantization=True)
复制代码

作者: Aries699    时间: 2019-3-25 22:33
本帖最后由 Aries699 于 2019-3-27 21:34 编辑

现在已经安装0.9.9版本的rknn_toolkit,我在运行yolov3_dome中的rknn_picture.py时,inference函数用时45秒,初步推断是没有用上npu,请问如何使用npu以及如何在cpu和npu之间进行切换?
作者: cloudboy08    时间: 2019-3-26 19:15
感谢楼主的文章!

我在实验类似的场景。但是安装tensorflow出现了错误。

pip3 install --user tensorflow-1.10.1-cp36-cp36m-linux_aarch64.whl

出现的错误是 “MemoryError"

期待解决方案。谢谢

作者: cloudboy08    时间: 2019-3-26 21:42
cloudboy08 发表于 2019-3-26 19:15
感谢楼主的文章!

我在实验类似的场景。但是安装tensorflow出现了错误。

添加了3G swap后,错误解决了。
作者: vlsida2019    时间: 2019-3-28 16:34
请问如何把脚本从单线程修改为多线程执行?
作者: momo    时间: 2019-4-20 16:15
干货满满,谢谢楼主分享,赞一个
作者: zyxking    时间: 2019-5-15 09:40
第三部分:
    sudo apt-get install pyqt5-dev-tools     出现“apt-get command not found ”错误怎么解决?

作者: 程子    时间: 2019-5-15 19:31
zyxking 发表于 2019-5-15 09:40
第三部分:
    sudo apt-get install pyqt5-dev-tools     出现“apt-get command not found ”错误怎么 ...

训练是在开发机上做的,而不是RK3399Pro上。
作者: 迷雪空空    时间: 2019-5-17 14:25
我试了yolov3, init_runtime()这个函数执行的时间非常非常非常长,都快1个小时了,是不是因为更新的toolkit有bug?我当前的toolkit是1.0.0版本
作者: chky    时间: 3 天前
不错,bd。正在找yolov3的帖子




欢迎光临 Toybrick (http://t.rock-chips.com/) Powered by Discuz! X3.3