点击我爱计算机视觉标星,更快获取CVML新技术


本文转载自飞桨PaddlePaddle。基于PaddleDetection,详细描述了一个完整目标检测项目流程,非常值得收藏。

【飞桨开发者说】:余志良,菲特(天津)智能科技有限公司项目经理,百度黄埔学院二期学员

PaddleDetection 是百度飞桨推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNe等主干网络。针对不同的业务场景(性能、目标大小、准确率等)可以选择框架中的不同模块组合得到最适合的模型,实现任务。相比于tensorflow的Object_Detection,优势之一就是将YOLOv3这一目标检测的快速算法融合到了框架下。

文章将以一个Yolov3识别水果的例子为说明,详解如何利用PaddleDetection完成一个项目。

项目用到的工具 硬件:Win10(RTX2060)笔记本、某品牌服务器(4*T4)工业相机(Hikvision)软件:pycharm、VS2019。

目录:

1、环境部署

2、数据集准备

3、训练

4、训练过程可视化

5、模型导出

6、python进行单张/多张图片的预测

7、python+qt(给客户的演示demo)

8、C++进行单张预测(含编译简介)

9、C++预测代码封装成DLL、配合C#完成一个整体项目

10、扩展:关于PaddlePaddle代码数据读取的方式。

01

环境部署

1.1 安装PaddlePaddle

利用anaconda创建一个名字叫做paddle-detection的Paddle环境(备注:下文中命令提示窗口出现的(paddle)是指该项目环境的名称叫做paddle)。安装链接如下:

https://www.paddlepaddle.org.cn/install/quick

1.2 安装COCO-API

pip install Cython
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

1.3 选择一个文件夹,下载PaddleDetection

第一种方式:直接从github官网上进行下载:
https://github.com/PaddlePaddle/PaddleDetection
 
第二种方式:使用git进行下载:
git clone https://github.com/PaddlePaddle/PaddleDetection.git

1.4 安装所需的Python其他依赖库

依赖库文档在requirements.txt中给出,可使用

pip install -r requirements.txt

如下图所示是requirements.txt文档中的内容。

如图为requirements文件中的内容,图中所示的均为PaddleDetection的依赖库。

在下图所示内容中打“cmd”,然后出现在该路径的命令提示符。

激活环境,并且 pip install -r requirements.txt

然后运行

当显示Successfully…… ,基本上表示安装完成了,具体是否成功,下一步的测试验证。

1.5 确认测试通过

set PYTHONPATH=`pwd`:$PYTHONPATH
python ppdet/modeling/tests/test_architectures.py
备注:在paddle自带的文档中为export PYTHONPATH=`pwd`:$PYTHONPATH
export是Linux下的用法,在Windows下将exoprt改成set。
但是发现运行报错,报错内容如下:
错误提示发现缺少“ppdet”这个模块,ppdet(其实就是paddle detection的一个缩写),但是我们在项目的路径里面可以发现有这个模块,原因就是,我们的代码所在的路径无法读取到该文件下的代码,因此,我们需要在代码中进行改进一下。

找到 ppdet/modeling/tests/test_architectures.py这个文件,然后添加红框所示的代码。备注,第二个红框里面的路径是我的项目路径。
出现如图所示的代码,表示运行成功。
至此,所有的运行环境已经配置成功。02
数据集的准备

2.1 数据标注:


目前项目使用的数据集格式是VOC数据格式,使用labelimg作为标注工具,标注工具的下载安装见链接:
https://zhuanlan.zhihu.com/p/97807042
特别说明:项目中使用的数据集是PaddleDetection提供的演示示例数据集,下文将通过使用该数据集来说明。
首先,下载该数据集,下载地址:https://pan.baidu.com/wap/init?surl=ZO8OlqvWuMk_sqOwlo56rg
提取码:vw3b
下载后如下图所示:
标注方式如下:
打开软件,并导入图片:
选取标注文件的保存路径:点击Change Save Dir ,然后将标注文件保存在某一个路径下。开始标注:点击Create\nRectBo---框选目标--命名(下图中命名为apple)--点击OK---点击Save(完成一张)--点击Next Image 标注下一张。
所有标注完成以后会生成很多的xml文件。
打开一个xml文件:
具体信息如下:

2.2 创建VOC数据集格式

 
其中Annotations存放标注生成的xml文件,JPEGImage存放图片,ImageSets存放对训练集和数据集的划分。ImageSet下有Main文件,Mian下需要建立一个label_list.txt。label_list.txt是指标注的目标的名称。其内容如下:
 

备注:train.txt、val.txt是根据下文中代码(该代码会命名为:get_list.py,放置在了数据集链接的文件里面)生成,分别是对训练集和验证集的划分:
接上文所述,是生成生成train.txt、val.txt的代码,该代码会将300张水果图片分成240张训练集和60张验证集。
import osimport random
train_precent=0.7xml="C:/Users/zhili/Desktop/fruit-detection/Annotations"save="C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main"total_xml=os.listdir(xml)
num=len(total_xml)tr=int(num*train_precent)train=range(0,tr)
ftrain=open("C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main/train.txt","w")ftest=open("C:/Users/zhili/Desktop/fruit-detection/ImageSets/Main/test.txt","w")
for i in range(num):    name=total_xml[i][:-4]+"\n"    if i in train:        ftrain.write(name)    else:        ftest.write(name)ftrain.close()ftest.close()
如下图是生成的train文件。
备注:在Main文件夹中生成的train.txt文件和val.txt文件仅仅是对数据集的划分,还需要进一步的利用如下代码(create_list.py,该代码是paddle提供的)生成含有路径信息以及图像和xml文件一一对应的文件。

import os
import os.path as osp
import re
import randomdevkit_dir = './'
years = ['2007', '2012']def get_dir(devkit_dir,  type):return osp.join(devkit_dir, type)def walk_dir(devkit_dir):filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')annotation_dir = get_dir(devkit_dir, 'Annotations')img_dir = get_dir(devkit_dir, 'JPEGImages')trainval_list = []test_list = []added = set()for _, _, files in os.walk(filelist_dir):for fname in files:img_ann_list = []if re.match('train\.txt', fname):img_ann_list = trainval_listelif re.match('val\.txt', fname):img_ann_list = test_listelse:continuefpath = osp.join(filelist_dir, fname)for line in open(fpath):name_prefix = line.strip().split()[0]if name_prefix in added:continueadded.add(name_prefix)ann_path = osp.join(annotation_dir, name_prefix + '.xml')img_path = osp.join(img_dir, name_prefix + '.jpg')assert os.path.isfile(ann_path), 'file %s not found.' % ann_pathassert os.path.isfile(img_path), 'file %s not found.' % img_pathimg_ann_list.append((img_path, ann_path))return trainval_list, test_listdef prepare_filelist(devkit_dir, output_dir):trainval_list = []test_list = []trainval, test = walk_dir(devkit_dir)trainval_list.extend(trainval)test_list.extend(test)random.shuffle(trainval_list)with open(osp.join(output_dir, 'train.txt'), 'w') as ftrainval:for item in trainval_list:ftrainval.write(item[0] + ' ' + item[1] + '\n')with open(osp.join(output_dir, 'val.txt'), 'w') as ftest:for item in test_list:ftest.write(item[0] + ' ' + item[1] + '\n')if __name__ == '__main__':prepare_filelist(devkit_dir, '.')

这个时候的新生成的train.txt的内容如下:
 
最终生成如下所示的数据集格式如下,其中label_list.txt和Mian中的label_list.txt一致。train.txt文件和val.txt是新生成的图像-xml的名称路径对应文件。
该完成后的数据集作者放置在了项目文件夹下:dataset/fruit下,并命名为该文件夹为fruit-detection,如下图所示。
数据集生成后就可以根据如下的命令进行训练。
03
训练
在训练之前,首先了解模型的配置文件,如文章开头所述:PaddleDetection 是飞桨推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。而实现我们如何快速的完成不同模型的训练体验,就是需要依靠配置文件的切换。
如下所示就是该项目配置文件(config文件)的路径:

如图下图就是我们选取的深度学习的配置文件,我们选取yolov3_mobilenet_v1_fruit.yml做为本项目的训练配置文件。该配置文件是使用YOLO v3的模型结构,同时主干网络为 Mobilenrt V1。
这些参数可以根据我们自己的数据情况进行设计。
如设置:最大迭代步数:max_iters
       预训练模型的来源:pretrain_weights
       数据路径:dataset_dir
       Batch_size的大小:batch_size
       数据集类别:num_classes
需要着重关注点如下:需要根据自己的不同数据集进行训练。

在将config文件配置好了以后,就可以进行训练
set PYTHONPATH=$PYTHONPATH:.
set CUDA_VISIBLE_DEVICES=0(默认只有一个GPU)
python -u tools/train.py -c configs/yolov3_mobilenet_v1_fruit.yml --use_tb=True --tb_log_dir=tb_fruit_dir/scalar --eval
运行如下命令,即可开始训练
出现如下图所示现象,可以表示为训练正常,可等待训练结束。
关于训练命令的阐述:

-c configs/yolov3_mobilenet_v1_fruit.yml   用来指定配置文件

--use_tb 是否使用tb-paddle记录数据,进而在TensorBoard中显示,默认值是False

--tb_log_dir 指定 tb-paddle 记录数据的存储路径

--eval 是否边训练边测试


备注:

关于–eval参数的使用:

在训练中交替执行评估, 评估在每个snapshot_iter时开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下,建议训练时候使用该参数,可以使得完成训练后快速找到最好的模型。

关于预训练模型的来源:

在本案例中,预训练模型是通过一个链接方式在训练开始时候加载进行下载的,其实飞桨提供了丰富的预训练模型库,具体链接为:

https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/MODEL_ZOO_cn.md


训练过程出现的一个错误:
作者使用的电脑是笔记本,显卡型号是RTX2060 显存为6G。在训练过程中出现如下错误。

通过命令提示符中发现,竟然出现了(7184, 7184, 3)这样大的图片,而本身数据像素多数为1000*1000左右。解决改问题的方式有两个:

第一个是修改配置文件中的bufsize这个参数,将该值由128改成64(备注,PaddleDetection新更新的配置文件文档中,已经将该值设置成为32),即可正常运行。在这里解释一下:PaddleDetection YOLOv3系列模型训练时,由于图像增强等预处理方式较多,默认会开启多进程加速,子进程完成图像读取,图像增强等预处理后,会将输出结果放到一个队列里面等待模型训练时获取,bufsize这个参数即为该队列的最大长度,该队列存储在内存中,若机器内存较小并且队列长度bufsize设置得较大,就会有上述报错,报错内容为内存不够,无法给队列继续分配内存。这个时候只要把bufsize调小一些保存内存足够放下队列即可。

第二个方式是修改配置文件中的ratio的参数,将该值由4.0改成了2.0,即可正常运行。PaddleDetection中设置了数据增强功能:在RandomExpand这种数据增强里,首先新建一张(原图大小 * ratio)大小的空白图片,然后在这张空白图片上随机找个位置,把原图贴上去,之后再把这张新图片缩放成原图大小。当然如果显存足够大的话,也可以按照默认值来。
04
训练过程可视化
训练期间可以通过tensorboard实时观察loss和精度值,启动命令如下:
tensorboard --logdir tb_fruit_dir/scalar

05
模型导出

当我们训练完成后,在项目文件的output中可以看到我们生成的模型文件,在代码中我们设置模型每迭代200步保存一次,训练总共有20000步,因此会生成100个训练文件,由于我们使用 --eval参数进行边训练边测试,因此我们可以获得训练过程中最好的模型文件,我们将做好的模型进行导出。

执行如下命令:

python tools/export_model.py -c configs/yolov3_mobilenet_v1_fruit.yml --output_dir=./inference_model -o weights=output/yolov3_mobilenet_v1_fruit/best_model
最终导出如下所示:
特别备注:目前导出的模型使用是为了后面C++预测的,python预测目前不支持加载导出的模型。

06

模型预测

PaddleDetection给出的模型预测代码是infer.py。该文件在项目文件夹tools里面。改代码提供了两种预测方式第一种是单张图片预测,第二种是以一个文件夹中的图片进行预测。通过设置不同的预测方式达到自己的目的。如下,使用--infer_img=demo/xxx.jpg为单张图片进行预测,使用--infer_dir=demo为用一个文件夹进行预测。其中demo是放置测试图片的地方。

6.1 使用单张图片进行预测

测试的结果保存在infer_output这个文件夹中
python -u tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml -o weights= output/yolov3_mobilenet_v1_fruit/best_model --infer_img=demo/orange_71.jpg --output_dir=infer_output
特别注意:类似这种在命令提示符下输入时候,一定注意自己输入过程中的出现的多余空格问题:如下图所示,weights=后面出现了一个多的空格,导致模型文件读不到。
 

6.2 使用一个文件夹中图片进行预测

测试的结果保存在infer_output这个文件夹中:
python -u tools/infer.py -c configs/yolov3_mobilenet_v1_fruit.yml -o weights=output/yolov3_mobilenet_v1_fruit/best_model --infer_img=demo/test --output_dir=infer_output/testout

说明:

1、该文章多数内容来源于PaddleDetection的文档,链接

https://github.com/PaddlePaddle/PaddleDetection

2、该文章运行环境为Windows10 ,在原有文档基础上修改了一些Linux的用法。增加了创建VOC数据集以及如何划分训练集和验证集。

3、该文章写作过程中,受到了高松鹤同学、百度飞桨同学的大力帮助。


目标检测交流群

关注最新最前沿的2D、3D目标检测技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)

(请务必注明:目标检测):

喜欢在QQ交流的童鞋可以加52CV官方QQ群:805388940。

(不会时时在线,如果没能及时通过还请见谅)


长按关注我爱计算机视觉

环境搭建、标注、训练、推断,超详细的目标检测开发流程相关推荐

  1. Faster-rcnn环境搭建与训练自己的数据

    Faster-RCNN环境搭建与训练自己的数据 0 前言 之前整理过一篇关于fasterrcnn的文章,文中详细介绍了fasterrcnn原理分析,近期由于工作需要利用fasterrcnn进行模型训练 ...

  2. caffe-MobileNet-ssd环境搭建及训练自己的数据集模型

    caffe-MobileNet-ssd环境搭建及训练自己的数据集模型 ***************************************************************** ...

  3. windows环境下安装RabbitMQ(超详细)

    windows环境下安装RabbitMQ(超详细) 记录RabbitMQ安装过程,欢迎大家和我交流.(安装过程中遇到的问题也有总结哈,请查看) RabbitMq简介 安装准备工具 安装步骤(图文) 安 ...

  4. Centos7 搭建Nginx图片服务超详细新手小白教程

    简介:以上文章讲述的是[Centos7超详细的安装与部署应用MySQL,Redis]接下来我总结一下[Centos7 搭建Nginx图片服务超详细教程].觉得我还可以的可以加群一起督促学习探讨技术.Q ...

  5. Github + Hexo 搭建个人博客超详细教程

    Github + Hexo 搭建个人博客超详细教程 本文目录 generated with DocToc 网站搭建 本文目录 1.安装node.js 2.添加国内镜像 3.安装Git 4.注册Gith ...

  6. 完整目标检测项目流程——从使用LabelImg标注到使用YOLOv5训练测试

    完整目标检测项目流程--从使用LabelImg标注到使用YOLOv5训练测试 大家好呀,虽然前面已经有两篇,分别使用Faster RCNN和YOLOv3进行目标检测的项目了,但是!相信大家应该也和我一 ...

  7. 音视频开发-SRS 4.0开发环境搭建丨webrtc丨FFmpeg丨SRS流媒体服务器开发

    SRS 4.0开发环境搭建 视频讲解如下,点击观看: 音视频开发-SRS 4.0开发环境搭建丨webrtc丨FFmpeg丨SRS流媒体服务器开发 音视频高级开发学习学习资料链接:FFmpeg/WebR ...

  8. 只有0.7M?超超超轻量SOTA目标检测模型揭秘!

    目标检测作为计算机视觉领域的顶梁柱,不仅可以独立完成车辆.商品.缺陷检测等任务,也是人脸识别.视频分析.以图搜图等复合技术的核心模块,在自动驾驶.工业视觉.安防交通等领域的商业价值有目共睹. 正因如此 ...

  9. Object Detection with Discriminatively Trained Part Based Models(使用判别训练的部件模型进行目标检测 )

    目录(?)[-] 摘要 关键词 引言 相关研究工作 模型 1 可变形部件模型 2 匹配 3 混合模型 隐藏变量SVM 1 半凸规划 2 最优化 3 随机梯度下降 4 难例挖掘SVM版 5 难例挖掘LS ...

最新文章

  1. 面向小白的最全 Python 可视化教程,超全的!
  2. 使用ssh连接gitHub
  3. ASP——限制表单提交时间期限简单示例
  4. 一起撸个朋友圈吧(step5) - 控件篇【评论控件优化】
  5. html2个表单,单个html angular2中的多个表单
  6. oracle 安装乱码,linux安装Oracle中文乱码问题汇总
  7. 活动选择(信息学奥赛一本通-T1323)
  8. 如何显示python的内置模块_python之模块(内置模块)
  9. 南北非遗传承人齐聚北京 演绎非遗精巧
  10. PCL之区域生长分割
  11. 计算机专业男生宿舍,实拍大学男生宿舍,男生们不是玩电脑游戏,就是瘫在床上看手机!...
  12. Kubernetes如何删除deployment
  13. cadz轴归零命令_CAD中所有图形实现统一标高(Z轴归零)的方法,统一标高的快捷键命令...
  14. 数据分析告诉你,历年的诺贝尔奖都被哪些人拿走了?
  15. 必须收藏的MATLAB画图指南
  16. java 学习资料 分享
  17. python累乘怎么写_Python3 实现列表元素求累和,求累乘
  18. windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
  19. Java中的23个设计模式 【结构型模式】 中的 【装饰模式】
  20. kubectl rollout restart 命令“unkonw command“

热门文章

  1. java 关闭 tomcat,每次关闭TOMCAT就报错 不知道什么?该如何处理
  2. array用法 numpy_Numpy统计计算、数组比较,看这篇就够了
  3. A. Second Order Statistics(sort 水题)
  4. java 多线程合并结果集_多线程计算数据,然后合并数据
  5. python中elif可以单独使用吗_python中elif可以单独使用吗
  6. idea jpa方法 自动提示_Spring Boot的自动配置、Commandline Runner
  7. eclipse java web乱码_JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)...
  8. 手机下载Python_将安卓手机打造成 Python 全栈开发利器
  9. oracle数据库、数据表的创建与管理 实验笔记二
  10. oracle创建job一年执行,Oracle快速创建定时job执行批量转储过程脚本参考案例