11bd4fe43Sopenharmony_ci### 4.2.4.检测网 21bd4fe43Sopenharmony_ci 31bd4fe43Sopenharmony_ci检测网作为人工智能训练的常用网络,NNIE支持的检测网有FasterRcnn、SSD、Yolov1、Yolov2、Yolov3、RFCN等,本文采用darknet框架,以Yolov2网络为例,来对检测网进行阐述。 41bd4fe43Sopenharmony_ci 51bd4fe43Sopenharmony_ci#### 4.2.4.1 数据集制作和标注 61bd4fe43Sopenharmony_ci 71bd4fe43Sopenharmony_ci数据集制作可以采用开源的数据或者自研数据集,若采用自研数据集,视频录制的方法、数据集的制作请参考[《分类网》的4.2.3.2章](4.2.3.%E5%88%86%E7%B1%BB%E7%BD%91.md#4232-%E8%A7%86%E9%A2%91%E5%BD%95%E5%88%B6)节和[《分类网》的4.2.3.3章节](4.2.3.%E5%88%86%E7%B1%BB%E7%BD%91.md#4233-%E6%95%B0%E6%8D%AE%E9%9B%86%E5%88%B6%E4%BD%9C%E5%92%8C%E6%A0%87%E6%B3%A8)的内容,这里不再赘述。 81bd4fe43Sopenharmony_ci 91bd4fe43Sopenharmony_ci* 本文公开数据集为例,讲述如何进行检测网的数据集制作和标注,具体步骤请参考《[hand_dataset开源数据集的处理及标注](https://blog.csdn.net/Wu_GuiMing/article/details/123718854)》。 101bd4fe43Sopenharmony_ci 111bd4fe43Sopenharmony_ci* 若是自己的数据集,可通过**labelme**开源工具进行标注,将标注生成的.json格式或者其他格式通过脚本转成dartnet框架支持的数据集标注方式,进行训练即可,该方式参考开源代码自行实现即可。 121bd4fe43Sopenharmony_ci 131bd4fe43Sopenharmony_ci#### 4.2.4.2 本地模型训练 141bd4fe43Sopenharmony_ci 151bd4fe43Sopenharmony_ci**(1)训练环境搭建** 161bd4fe43Sopenharmony_ci 171bd4fe43Sopenharmony_ci使用目前较为流行的yolo检测框架,其训练环境名为darknet。下载地址为https://github.com/pjreddie/darknet 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_ci如果需要使用cuda、opencv,可以在Makefile中勾选,前提是环境中已经配置好。若需要使用NIVIDIA显卡驱动,需要装好NIVIDIA显卡驱动,并按照跟显卡类型相匹配的CUDA和CUDNN,如果仅仅需要cpu,且不需要使用opencv,可以直接编译,若使用CUDA,操作步骤如下图所示: 201bd4fe43Sopenharmony_ci 211bd4fe43Sopenharmony_ci 221bd4fe43Sopenharmony_ci 231bd4fe43Sopenharmony_cicd darknet-master目录下,make即可,如下图所示: 241bd4fe43Sopenharmony_ci 251bd4fe43Sopenharmony_ci 261bd4fe43Sopenharmony_ci 271bd4fe43Sopenharmony_ci编译成功后,即可生成相应的库文件,如下图所示: 281bd4fe43Sopenharmony_ci 291bd4fe43Sopenharmony_ci 301bd4fe43Sopenharmony_ci 311bd4fe43Sopenharmony_ci**(2)模型训练** 321bd4fe43Sopenharmony_ci 331bd4fe43Sopenharmony_ci* 训练指令如下: 341bd4fe43Sopenharmony_ci 351bd4fe43Sopenharmony_ci````sh 361bd4fe43Sopenharmony_ci./darknet detector train hand.data cfg/resnet18.cfg 371bd4fe43Sopenharmony_ci```` 381bd4fe43Sopenharmony_ci 391bd4fe43Sopenharmony_ci* 针对上述指令进行解读: 401bd4fe43Sopenharmony_ci * darknet为可执行文件 411bd4fe43Sopenharmony_ci * detector为必选参数,直接沿用即可 421bd4fe43Sopenharmony_ci * train指定当前模式为训练模式,测试时候需要改成test或者valid。 431bd4fe43Sopenharmony_ci * hand.data是一个文件,文件中指定了训练中数据、类别、模型存储路径等信息。 441bd4fe43Sopenharmony_ci * resnet18.cfg是一个文件,文件中指定了训练的模型。 451bd4fe43Sopenharmony_ci * -gpus指定使用GPU的序号。 461bd4fe43Sopenharmony_ci 471bd4fe43Sopenharmony_ci* 接下来针对hand.data进行讲解,如下图所示: 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci 501bd4fe43Sopenharmony_ci 511bd4fe43Sopenharmony_ci* 分析上图,其中: 521bd4fe43Sopenharmony_ci 531bd4fe43Sopenharmony_ci * classes:为指定类别数量,手部检测模型为1,其他模型需根据实际场景进行填写 541bd4fe43Sopenharmony_ci * train:指定训练数据list的路径 551bd4fe43Sopenharmony_ci * valid:指定测试数据list的路径 561bd4fe43Sopenharmony_ci * names:指定类别的名字 571bd4fe43Sopenharmony_ci * backup:指定训练后权重的保存路径 581bd4fe43Sopenharmony_ci 591bd4fe43Sopenharmony_ci  601bd4fe43Sopenharmony_ci 611bd4fe43Sopenharmony_ci* 对hand.names进行讲解,如下图所示: 621bd4fe43Sopenharmony_ci 631bd4fe43Sopenharmony_ci 641bd4fe43Sopenharmony_ci 651bd4fe43Sopenharmony_ci 661bd4fe43Sopenharmony_ci 671bd4fe43Sopenharmony_ci* 上述文件配置好后,放到darknet-master目录下,如下图所示: 681bd4fe43Sopenharmony_ci 691bd4fe43Sopenharmony_ci 701bd4fe43Sopenharmony_ci 711bd4fe43Sopenharmony_ci* 将/cfg目录下的resnet18.cfg按照如下方式进行修改,具体修改方式参考附录[yolov2 resnet18.cfg网络](./6.1.yolov2%20resnet18.cfg%E7%BD%91%E7%BB%9C.md)。 721bd4fe43Sopenharmony_ci 731bd4fe43Sopenharmony_ci* 上述步骤修改完成后,输入./darknet detector train hand.data cfg/resnet18.cfg即可进行训练。 741bd4fe43Sopenharmony_ci 751bd4fe43Sopenharmony_ci**注:以上训练指令路径需在Linux环境下进行修改,并确保resnet18.cfg已经参考[yolov2 resnet18.cfg网络](./6.1.yolov2%20resnet18.cfg%E7%BD%91%E7%BB%9C.md)修改正确。可参考 https://netron.app/ 查看网络结构和参数,部分网络结构截图如下图所示:** 761bd4fe43Sopenharmony_ci 771bd4fe43Sopenharmony_ci 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci* 接下来输入下面的命令,即可开始训练,如下图所示: 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_ci``` 821bd4fe43Sopenharmony_ci./darknet detector train hand.data cfg/resnet18.cfg 831bd4fe43Sopenharmony_ci``` 841bd4fe43Sopenharmony_ci 851bd4fe43Sopenharmony_ci 861bd4fe43Sopenharmony_ci 871bd4fe43Sopenharmony_ci* 训练过程如下图所示: 881bd4fe43Sopenharmony_ci 891bd4fe43Sopenharmony_ci 901bd4fe43Sopenharmony_ci 911bd4fe43Sopenharmony_ci* 对终端输出的一个截图做如下解释: 921bd4fe43Sopenharmony_ci 931bd4fe43Sopenharmony_ci * Region Avg IOU:表示当前的subdivision内图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比,若为100%,表示我们已经拥有了完美的检测,即我们的矩形框跟目标完美重合,若为其他值较小值,表示这个模型需要进一步训练。 941bd4fe43Sopenharmony_ci 951bd4fe43Sopenharmony_ci  961bd4fe43Sopenharmony_ci 971bd4fe43Sopenharmony_ci * Class:标注物体分类的正确率,期望该值趋近于1。 981bd4fe43Sopenharmony_ci * Obj:越接近1越好。 991bd4fe43Sopenharmony_ci * No Obj:期望该值越来越小,但不为零。 1001bd4fe43Sopenharmony_ci * Avg Recall:在recall/count中定义的,是当前模型在所有subdivision图片中检测出的正样本与实际的正样本的比值。 1011bd4fe43Sopenharmony_ci * count:count后的值是所有的当前subdivision图片中包含正样本的图片的数量。 1021bd4fe43Sopenharmony_ci 1031bd4fe43Sopenharmony_ci由于检测网训练时间较长,请耐心等待。 1041bd4fe43Sopenharmony_ci 1051bd4fe43Sopenharmony_ci**(3)模型结果** 1061bd4fe43Sopenharmony_ci 1071bd4fe43Sopenharmony_ci训练成功后,即可在/backup目录下查看.weights文件,若出现resnet18_new_final.weights表示最终训练完成,如下图所示: 1081bd4fe43Sopenharmony_ci 1091bd4fe43Sopenharmony_ci 1101bd4fe43Sopenharmony_ci 1111bd4fe43Sopenharmony_ci#### 4.2.4.3 Darknet模型转caffe方案 1121bd4fe43Sopenharmony_ci 1131bd4fe43Sopenharmony_ci##### 4.2.4.3.1 Caffe环境搭建 1141bd4fe43Sopenharmony_ci 1151bd4fe43Sopenharmony_ci关于Caffe环境的搭建,请参考[2.4、Caffe环境搭建](2.4.Caffe环境搭建.md)章节,这里不再论述。 1161bd4fe43Sopenharmony_ci 1171bd4fe43Sopenharmony_ci##### 4.2.4.3.2 Darknet2caffe模型转换 1181bd4fe43Sopenharmony_ci 1191bd4fe43Sopenharmony_ci* 步骤1:在Ubuntu系统下,分步执行下面的命令,安装编译darknet2caffe时需要的torch环境 1201bd4fe43Sopenharmony_ci 1211bd4fe43Sopenharmony_ci``` 1221bd4fe43Sopenharmony_cipip3 install torchvision==0.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 1231bd4fe43Sopenharmony_cipip3 install torch==1.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 1241bd4fe43Sopenharmony_ci``` 1251bd4fe43Sopenharmony_ci 1261bd4fe43Sopenharmony_ci* 步骤2:执行下面的命令,下载darknet2caffe的代码到Ubuntu系统的code目录下 1271bd4fe43Sopenharmony_ci 1281bd4fe43Sopenharmony_ci``` 1291bd4fe43Sopenharmony_cicd code 1301bd4fe43Sopenharmony_cigit clone https://github.com/ChenYingpeng/darknet2caffe 1311bd4fe43Sopenharmony_ci``` 1321bd4fe43Sopenharmony_ci 1331bd4fe43Sopenharmony_ci* 步骤3:由于python的本地版本是python3.6,开源代码为 python2.X,因此需要对代码语法做适当调整 1341bd4fe43Sopenharmony_ci 1351bd4fe43Sopenharmony_ci * 将 darknet2caffe.py 中的**所有的** if block.has_key('name'):替换成 if 'name' in block: 1361bd4fe43Sopenharmony_ci 1371bd4fe43Sopenharmony_ci  1381bd4fe43Sopenharmony_ci 1391bd4fe43Sopenharmony_ci * 再将caffe_root修改为caffe的实际的绝对路径,如:/home/hispark/code/caffe/ 1401bd4fe43Sopenharmony_ci 1411bd4fe43Sopenharmony_ci ```sh 1421bd4fe43Sopenharmony_ci # 将 1431bd4fe43Sopenharmony_ci caffe_root='/home/chen/caffe/' 1441bd4fe43Sopenharmony_ci # 改为 1451bd4fe43Sopenharmony_ci caffe_root='/home/hispark/code/caffe/' # /home/hispark/code/caffe/是本地caffe的路径 1461bd4fe43Sopenharmony_ci ``` 1471bd4fe43Sopenharmony_ci 1481bd4fe43Sopenharmony_ci * 将prototxt.py 按照如下方式进行修改,适配python3版本的print。 1491bd4fe43Sopenharmony_ci 1501bd4fe43Sopenharmony_ci  1511bd4fe43Sopenharmony_ci 1521bd4fe43Sopenharmony_ci  1531bd4fe43Sopenharmony_ci 1541bd4fe43Sopenharmony_ci 修改后的protxt.py如附录[修改后的darknet2caffe 中prototxt.py代码](./6.3.%E4%BF%AE%E6%94%B9%E5%90%8E%E7%9A%84darknet2caffe%20%E4%B8%ADprototxt.py%E4%BB%A3%E7%A0%81.md)所示: 1551bd4fe43Sopenharmony_ci 1561bd4fe43Sopenharmony_ci **注:请通过对比工具仔细核对源码和附录[修改后的darknet2caffe 中prototxt.py代码](./6.3.%E4%BF%AE%E6%94%B9%E5%90%8E%E7%9A%84darknet2caffe%20%E4%B8%ADprototxt.py%E4%BB%A3%E7%A0%81.md)中的更改点,这里不逐一列举。** 1571bd4fe43Sopenharmony_ci 1581bd4fe43Sopenharmony_ci * l 进入darknet2caffe目录,执行下面的命令,将三个文件拷贝到caffe目录下 1591bd4fe43Sopenharmony_ci 1601bd4fe43Sopenharmony_ci ```sh 1611bd4fe43Sopenharmony_ci cp caffe_layers/upsample_layer/upsample_layer.hpp ../caffe/include/caffe/layers/ 1621bd4fe43Sopenharmony_ci cp caffe_layers/upsample_layer/upsample_layer.c* ../caffe/src/caffe/layers/ 1631bd4fe43Sopenharmony_ci ``` 1641bd4fe43Sopenharmony_ci 1651bd4fe43Sopenharmony_ci * 进入caffe的 src/caffe/proto/目录下,修改caffe.proto文件 1661bd4fe43Sopenharmony_ci 1671bd4fe43Sopenharmony_ci ```sh 1681bd4fe43Sopenharmony_ci cd ../caffe/src/caffe/proto/ 1691bd4fe43Sopenharmony_ci ``` 1701bd4fe43Sopenharmony_ci 1711bd4fe43Sopenharmony_ci * 在 message LayerParameter {}中新增 optional UpsampleParameter upsample_param = 150; 1721bd4fe43Sopenharmony_ci 1731bd4fe43Sopenharmony_ci  1741bd4fe43Sopenharmony_ci 1751bd4fe43Sopenharmony_ci * 在caffe.proto最后添加UpsampleParameter参数,如下图所示: 1761bd4fe43Sopenharmony_ci 1771bd4fe43Sopenharmony_ci ```python 1781bd4fe43Sopenharmony_ci message UpsampleParameter { 1791bd4fe43Sopenharmony_ci optional int32 scale = 1 [default = 1]; 1801bd4fe43Sopenharmony_ci } 1811bd4fe43Sopenharmony_ci ``` 1821bd4fe43Sopenharmony_ci 1831bd4fe43Sopenharmony_ci  1841bd4fe43Sopenharmony_ci 1851bd4fe43Sopenharmony_ci * l 在caffe目录下,执行下面的命名,重新编译caffe环境,命令如下。 1861bd4fe43Sopenharmony_ci 1871bd4fe43Sopenharmony_ci ``` 1881bd4fe43Sopenharmony_ci make clean 1891bd4fe43Sopenharmony_ci make -j4 1901bd4fe43Sopenharmony_ci make pycaffe 1911bd4fe43Sopenharmony_ci ``` 1921bd4fe43Sopenharmony_ci 1931bd4fe43Sopenharmony_ci 若无任何报错,证明darknet2caffe环境和代码已经适配成功。 1941bd4fe43Sopenharmony_ci 1951bd4fe43Sopenharmony_ci* 步骤3:模型转换 1961bd4fe43Sopenharmony_ci 1971bd4fe43Sopenharmony_ci * 将训练生成的文件存放到darknet2caffe目录下,如:resnet18_new_final.weights 1981bd4fe43Sopenharmony_ci 1991bd4fe43Sopenharmony_ci  2001bd4fe43Sopenharmony_ci 2011bd4fe43Sopenharmony_ci * 在Ubuntu系统的darknet2caffe目录下,执行下面的命令,创建一个resnet18.cfg文件,将本文附《[6.1.yolov2 resnet18.cfg网络.md](./6.1.yolov2 resnet18.cfg网络.md)》中的内容都复制到resnet18.cfg文件中。 2021bd4fe43Sopenharmony_ci 2031bd4fe43Sopenharmony_ci  2041bd4fe43Sopenharmony_ci 2051bd4fe43Sopenharmony_ci * 执行下面的命令,将darknet模型转换为caffe模型。 2061bd4fe43Sopenharmony_ci 2071bd4fe43Sopenharmony_ci ```sh 2081bd4fe43Sopenharmony_ci # 转换命令遵循: 2091bd4fe43Sopenharmony_ci python cfg[in] weights[in] prototxt[out] caffemodel[out] 2101bd4fe43Sopenharmony_ci # 本文转换命令如下: 2111bd4fe43Sopenharmony_ci python3.6 darknet2caffe.py resnet18.cfg resnet18_new_final.weights resnet18.prototxt resnet18.caffemodel 2121bd4fe43Sopenharmony_ci ``` 2131bd4fe43Sopenharmony_ci 2141bd4fe43Sopenharmony_ci 如下图所示: 2151bd4fe43Sopenharmony_ci 2161bd4fe43Sopenharmony_ci  2171bd4fe43Sopenharmony_ci 2181bd4fe43Sopenharmony_ci * 当转换成功后,会在darknet2caffe目录生成一个resnet18.caffemodel和一个resnet18.prototxt文件,如下图所示。 2191bd4fe43Sopenharmony_ci 2201bd4fe43Sopenharmony_ci  2211bd4fe43Sopenharmony_ci 2221bd4fe43Sopenharmony_ci  2231bd4fe43Sopenharmony_ci 2241bd4fe43Sopenharmony_ci#### 4.2.4.4 模型量化 2251bd4fe43Sopenharmony_ci 2261bd4fe43Sopenharmony_ci**注:nnie_mapper配置概念请阅读源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中《HiSVP 开发指南.pdf》3.5.2章节配置文件说明** 2271bd4fe43Sopenharmony_ci 2281bd4fe43Sopenharmony_ci* 由于yolo2网络的最后一层需要通过AI CPU推理,转换之前,需要手工将其删除,如下图所示: 2291bd4fe43Sopenharmony_ci 2301bd4fe43Sopenharmony_ci 2311bd4fe43Sopenharmony_ci 2321bd4fe43Sopenharmony_ci* 接下来通过RuyiStudio进行模型的量化,首先新建一个NNIE工程,点击File-New-NNIE Project,如下图所示: 2331bd4fe43Sopenharmony_ci 2341bd4fe43Sopenharmony_ci 2351bd4fe43Sopenharmony_ci 2361bd4fe43Sopenharmony_ci* 输入Project name,选择SOC Version为Hi3516DV300,如下图所示: 2371bd4fe43Sopenharmony_ci 2381bd4fe43Sopenharmony_ci 2391bd4fe43Sopenharmony_ci 2401bd4fe43Sopenharmony_ci* 点击Next,其余按照默认配置即可,创建成功后,如下图所示: 2411bd4fe43Sopenharmony_ci 2421bd4fe43Sopenharmony_ci 2431bd4fe43Sopenharmony_ci 2441bd4fe43Sopenharmony_ci* 通过RuyiStudio进行模型转化,配置文件如下图所示: 2451bd4fe43Sopenharmony_ci 2461bd4fe43Sopenharmony_ci 2471bd4fe43Sopenharmony_ci 2481bd4fe43Sopenharmony_ci注:关于模型量化imageList.txt制作,请仔细参考4.2.3.7章节内容 2491bd4fe43Sopenharmony_ci 2501bd4fe43Sopenharmony_ci其中:本模型image_type为YVU420SP,RGB_order为RGB,norm_type选择data_scale 2511bd4fe43Sopenharmony_ci 2521bd4fe43Sopenharmony_cidata_scale = 1/255=0.0039215686274509803921568627451 2531bd4fe43Sopenharmony_ci 2541bd4fe43Sopenharmony_ci点击转换按钮,稍等片刻,即可完成转换,如下图所示: 2551bd4fe43Sopenharmony_ci 2561bd4fe43Sopenharmony_ci 2571bd4fe43Sopenharmony_ci 2581bd4fe43Sopenharmony_ci转换成功后,如下图所示: 2591bd4fe43Sopenharmony_ci 2601bd4fe43Sopenharmony_ci 2611bd4fe43Sopenharmony_ci 2621bd4fe43Sopenharmony_ci#### 4.2.4.5 模型部署板端和调试 2631bd4fe43Sopenharmony_ci 2641bd4fe43Sopenharmony_ci* [检测网部署及板端推理](4.2.4.5.%E6%A3%80%E6%B5%8B%E7%BD%91%E9%83%A8%E7%BD%B2%E5%8F%8A%E6%9D%BF%E7%AB%AF%E6%8E%A8%E7%90%86.md) 2651bd4fe43Sopenharmony_ci 2661bd4fe43Sopenharmony_ci 2671bd4fe43Sopenharmony_ci 2681bd4fe43Sopenharmony_ci 2691bd4fe43Sopenharmony_ci 2701bd4fe43Sopenharmony_ci 2711bd4fe43Sopenharmony_ci 272