本教程基于RK3399pro开发板,使用fedora 28系统,另需u***鼠标、u***键盘、hdmi显示器、u***摄像头、网线连接开发板 1. 搭建开发环境 1.安装rknn-toolkit及其依赖库,[url=http://t.rock-chips.com/wiki.php?mod=view&id=36]按照wiki教程安装环境 2.验证模型转换、推理 cd rknn-toolkit/example/mobilenet_v1 python3 test.py 3.安装matplotlib sudo dnf install freetype-devel pkg-config libpng-devel pkg-config pip3 install --user matplotlib 4.此时应该可以正常显示图片及打开摄像头,但无法打开视频文件,需安装gstreamer sudo dnf install $(rpm -E %fedora).noarch.rpm sudo dnf install gstreamer1-libav 2.快速上手,运行yolov3 rknn模型 1.下载附件解压到PC Linux系统上(Windows, Mac不支持预编译)用于转化模型(也可以在板子上转模型,但不推荐,速度慢且不支持预编译) 2.进入yolov3_demo目录,并从darknet官网下载权重 cd yolov3_demo wget wget 修改data/目录下图片大小,用于后续模型转化 python3 rknn_resize.py 转为rknn模型,转化非常消耗内存,请先设置swap虚拟内存(建议大于2g),转化比较慢,请耐心等待 python3 rknn_transform_320x320.py python3 rknn_transform_416x416.py python3 rknn_transform_608x608.py python3 rknn_transform_tiny.py 有用户反馈,使用rknn-toolkit1.0.0及以上版本,跑yolov3模型会卡在init_runtime,这是由于原脚本没有开启预编译导致的,现已修改转化脚本默认开启预编译,开启预编译后得到的模型不能在PC模拟器上运行,只能在板子上运行 在PC上转模型成功后,拷贝PC上的yolov3_demo到开发板,在开发板操作以下步骤 预测一张图片 python3 rknn_picture_320x320.py python3 rknn_picture_416x416.py python3 rknn_picture_608x608.py python3 rknn_picture_tiny.py 打开摄像头,预测视频,若没有摄像头也可以修改脚本打开视频文件 python3 rknn_camera_320x320.py python3 rknn_camera_416x416.py python3 rknn_camera_608x608.py python3 rknn_camera_tiny.py 之前一直忙其他项目没空搞多线程,论坛上有人发多进程版本跑20帧,我在其基础上做了优化,光线充足条件下可以跑到30帧,昏暗条件下稍慢这是摄像头曝光的原因,与模型无关;感谢该开发者分享代码,也希望论坛能有更多这样的开发者 python3 rknn_camera_tiny_multiProcess.py 除了python接口的demo外,我们还提供了c接口的demo,该demo基于论坛开发者分享修改而来,感谢该名开发者 sudo dnf install libcurl-devel cd yolov3_demo/C-yolov3/build cmake 。。 make 打开摄像头预测 。/yolov3-320 c 0 。/yolov3-416 c 0 。/yolov3-608 c 0 。/yolov3-tiny c 0 打开视频文件预测 。/yolov3-320 v 。。/。。/video/3.mp4 。/yolov3-416 v 。。/。。/video/3.mp4 。/yolov3-608 v 。。/。。/video/3.mp4 。/yolov3-tiny v 。。/。。/video/3.mp4 3.训练自己的数据 1.训练建议在用户PC机上训练,请先下载编译安装darknet工程,详见官网 2.下载附件,解压并拷贝到darknet/目录下 3.进入train_my_data目录,并下载权重数据 cd train_my_data wget 拷贝你的图片到train_images目录和validate_images目录 下载编译安装打标签工具,该工具用于给你的图片打标签 git clone 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文件 python3 list_image_files.py 得到图片路径生成trainImagePath.txt和validateImagePath.txt文件,并把train_imageXML目录和validate_imageXML目录下的标签转成.txt格式存在train_labels和validate_labels目录下 python3 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边界框的中心坐标,长宽,对象置信度 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是我们保留下来的第二个矩形框。
|