Toybrick

人工智能开发系列(3) YOLOV3开发与实现

 

hisping

管理员

积分
617
楼主
发表于 2019-2-28 16:57:01    查看: 249341|回复: 119 | [复制链接]    打印 | 显示全部楼层



本教程视频直播回看:

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

1. 搭建开发环境
1.安装rknn-toolkit及其依赖库,[url=http://t.rock-chips.com/wiki.php?mod=view&id=36]按照wiki教程安装环境


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

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

4.此时应该可以正常显示图片及打开摄像头,但无法打开视频文件,需安装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.下载附件解压到PC Linux系统上(Windows, Mac不支持预编译)用于转化模型(也可以在板子上转模型,但不推荐,速度慢且不支持预编译)
2.进入yolov3_demo目录,并从darknet官网下载权重
  1. cd yolov3_demo
  2. wget https://pjreddie.com/media/files/yolov3-tiny.weights
  3. wget https://pjreddie.com/media/files/yolov3.weights
复制代码

修改data/目录下图片大小,用于后续模型转化
  1. python3 rknn_resize.py
复制代码

转为rknn模型,转化非常消耗内存,请先设置swap虚拟内存(建议大于2g),转化比较慢,请耐心等待
  1. python3 rknn_transform_320x320.py
  2. python3 rknn_transform_416x416.py
  3. python3 rknn_transform_608x608.py
  4. python3 rknn_transform_tiny.py
复制代码
有用户反馈,使用rknn-toolkit1.0.0及以上版本,跑yolov3模型会卡在init_runtime,这是由于原脚本没有开启预编译导致的,现已修改转化脚本默认开启预编译,开启预编译后得到的模型不能在PC模拟器上运行,只能在板子上运行

在PC上转模型成功后,拷贝PC上的yolov3_demo到开发板,在开发板操作以下步骤
预测一张图片
  1. python3 rknn_picture_320x320.py
  2. python3 rknn_picture_416x416.py
  3. python3 rknn_picture_608x608.py
  4. python3 rknn_picture_tiny.py
复制代码

打开摄像头,预测视频,若没有摄像头也可以修改脚本打开视频文件
  1. python3 rknn_camera_320x320.py
  2. python3 rknn_camera_416x416.py
  3. python3 rknn_camera_608x608.py
  4. python3 rknn_camera_tiny.py
复制代码


之前一直忙其他项目没空搞多线程,论坛上有人发多进程版本跑20帧,我在其基础上做了优化,光线充足条件下可以跑到30帧,昏暗条件下稍慢这是摄像头曝光的原因,与模型无关;感谢该开发者分享代码,也希望论坛能有更多这样的开发者
  1. python3 rknn_camera_tiny_multiProcess.py
复制代码

除了python接口的demo外,我们还提供了c接口的demo,该demo基于论坛开发者分享修改而来,感谢该名开发者
  1. sudo dnf install libcurl-devel
  2. cd yolov3_demo/C-yolov3/build
  3. cmake ..
  4. make
复制代码

打开摄像头预测
  1. ./yolov3-320 c 0
  2. ./yolov3-416 c 0
  3. ./yolov3-608 c 0
  4. ./yolov3-tiny c 0
复制代码
打开视频文件预测
  1. ./yolov3-320 v ../../video/3.mp4
  2. ./yolov3-416 v ../../video/3.mp4
  3. ./yolov3-608 v ../../video/3.mp4
  4. ./yolov3-tiny v ../../video/3.mp4
复制代码


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

3.进入train_my_data目录,并下载权重数据
  1. cd train_my_data
  2. wget https://pjreddie.com/media/files/yolov3-tiny.weights
复制代码

拷贝你的图片到train_images目录和validate_images目录
下载编译安装打标签工具,该工具用于给你的图片打标签
  1. git clone https://github.com/tzutalin/labelImg
  2. cd labelImg
  3.     sudo apt-get install pyqt5-dev-tools
  4.     sudo pip3 install -r requirements/requirements-linux-python3.txt
  5.     make qt5py3
  6.     python3 labelImg.py
  7. #使用工具给你的图片打标签,并把标签保存到train_imageXML目录和validate_imageXML目录
  8. cd ..
复制代码

遍历train_images目录和validate_images目录下所有图片,得到trainImageId.txt和validateImageId.txt文件
  1. python3 list_image_files.py
复制代码

得到图片路径生成trainImagePath.txt和validateImagePath.txt文件,并把train_imageXML目录和validate_imageXML目录下的标签转成.txt格式存在train_labels和validate_labels目录下
  1. python3 trans.py
复制代码

修改voc.names文件,写入你要训练的物体名称
  1. vi voc.names
  2.     class_1
  3.     class_2
  4.     class_3
复制代码

修改voc.data文件,N是你训练的物体种类
  1. vi voc.data
  2.     classes = N      # N is your class num
  3.     train = /home/XXX/darknet/train_my_data/trainImagePath.txt
  4.     valid = /home/XXX/darknet/train_my_data/validateImagePath.txt
  5.     names = train_my_data/voc.names
  6.     backup = train_my_data/backup
复制代码

修改yolov3-tiny-modify.cfg,修改所有yolo层的classes参数,修改yolo层前一层的filters参数
  1. vi yolov3-tiny-modify.cfg
  2.     1. modify classes = N in [yolo] layer
  3.     2. modify filters = 3*(N+1+4) ahead [yolo] layer
  4.     3. modify max_batches = your-max-train-times

  5. cd ..
复制代码

提取卷积层数据
  1. ./darknet partial train_my_data/yolov3-tiny.cfg train_my_data/yolov3-tiny.weights train_my_data/yolov3-tiny.conv.15 15
复制代码

开始训练
  1. ./darknet detector train train_my_data/voc.data train_my_data/yolov3-tiny-modify.cfg train_my_data/yolov3-tiny.conv.15
复制代码

验证训练
  1. ./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边界框的中心坐标,长宽,对象置信度




2.YOLOV3神经网络图

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后处理

对数空间变换:

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是我们保留下来的第二个矩形框。









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

hisping

管理员

积分
617
沙发
 楼主| 发表于 2019-3-1 09:17:40 | 显示全部楼层
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再检测以提高精度
回复

使用道具 举报

hisping

管理员

积分
617
板凳
 楼主| 发表于 2019-3-4 15:32:10 | 显示全部楼层
111223 发表于 2019-3-1 17:35
android 端的demo有提供吗?就是用c或者java推理取值的那种

c接口的没有实现,用户可以参考python接口的自行实现
回复

使用道具 举报

hisping

管理员

积分
617
地板
 楼主| 发表于 2019-3-5 19:08:14 | 显示全部楼层
qiaoqiang126 发表于 2019-3-5 10:05
Yolov3 608: 我用了4s,这是怎么回事?

你应该是没有开启量化
回复

使用道具 举报

hisping

管理员

积分
617
5#
 楼主| 发表于 2019-3-12 17:46:02 | 显示全部楼层
vlsida2019 发表于 2019-3-12 17:04
請問可以做一個yolov2的示範和直播嗎?

yolov3是3个输出,yolov3-tiny是两个输出,yolov2输出是一个大数组,请先理解yolo算法的输出含义,帖子里都有
回复

使用道具 举报

hisping

管理员

积分
617
6#
 楼主| 发表于 2019-7-25 16:04:11 | 显示全部楼层
asher 发表于 2019-7-5 10:47
如何用yolov3而不是yolov3-tiny,怎么提取特征呢,
也是用./darknet partial train_my_data/yolov3.cfg tra ...

参考darknet官网,上面有使用COCO数据集训练yolov3的过程
回复

使用道具 举报

hisping

管理员

积分
617
7#
 楼主| 发表于 2019-7-25 16:08:27 | 显示全部楼层
toytoybreak 发表于 2019-6-23 17:04
我也遇到这个问题,请问你找到原因或者解决了么?

在0.9.9版本是正常的,1.0.0版本确实有速度极慢的问题,我们将尽快解决该问题
回复

使用道具 举报

hisping

管理员

积分
617
8#
 楼主| 发表于 2019-7-25 16:10:19 | 显示全部楼层
xiaqing10 发表于 2019-7-15 15:04
请问我用608的v2,  发现分类都是对的, score也是对的. 就是box框不准,都是非常非常小的框
...

这种情况很有可能是你后处理使用的anchord选取不对
回复

使用道具 举报

hisping

管理员

积分
617
9#
 楼主| 发表于 2019-8-5 09:25:38 | 显示全部楼层
17708867778 发表于 2019-8-3 06:45
您好,我在启动摄像头进行识别的时候,出现错误
libv4l2:error reading :invalid argument
video error : V ...

1.先确认你按照wiki--人工智能安装了开发板的环境
2.脚本默认打开/dev/video0这个节点,查看下你的摄像头是不是这个节点
回复

使用道具 举报

hisping

管理员

积分
617
10#
 楼主| 发表于 2019-8-8 08:57:53 | 显示全部楼层
abcehac 发表于 2019-8-7 21:33
看了一下多线程的版本,有点小问题想请问版主和各路大神:
1、建立了6个进程:p_cap1\p_cap2\p_infer1\p_in ...

1.是的
2.npu不是双核的,去掉一个infer帧率会明显下降,原因是infer除了调用npu还要传递数据,当一个infer调用npu完成后在传递数据时,另一个infer就可以调用npu了
3.这个数不一定非要1,3的,demo只是告诉你怎么去优化,不是说我这个已经是最优的了,demo还有很多优化的地方,用户可以自己试试,效果比较好的话可以上传到论坛分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表