YOLOv5实现自定义对象训练与OpenVINO部署全解析

YOLOv5实现自定义对象训练与OpenVINO部署全解析

点击上方“小白学视觉”,选择加"星标"或“置顶


      
      
  1. 重磅干货,第一时间送达

本文转自:opencv学堂

大家好,前面写了一个OpenVINO部署YOLOv5推理的教程,收到很多反馈!这里就再写了一篇如何使用YOLOv5训练自定义对象检测,从数据准备到推理整个环节,帮助大家更好的使用YOLOv5来解决实际问题。整个文章主要分为三个部分,分别是数据准备与YOLO格式数据转换,模型训练与推理测试,模型转换为ONNX与部署。

关于环境搭建与测试请看这里:

YOLOv5在最新OpenVINO 2021R02版本的部署与代码演示详解

数据下载与准备

数据下载我参考了别人提到一个Open Imag数据集的下载工具,github地址如下:

https://github.com/EscVM/OIDv4_ToolKit

      
      

用这个工具可以很方便的下载想要的数据,Open Image数据集包括包括100W+张图像,对象检测支持600个类别,所以很多图像都可以通过这个来下载,避免自己收集图像数据与标注数据的时间。所以首先需要执行

git clone https://github.com/EscVM/OIDv4_ToolKit

      
      

然后运行

pip3 install -r requirements.txt

      
      

安装好所有依赖,之后再下载数据集

python3 main.py downloader --classes Apple Orange --type_csv validation

      
      

意思是下载苹果跟橘子两个类别的图像标注数据。下载好的数据集文件夹结构如下:

分为三个文件夹,分别对应训练集、测试集、验证集。其中jpg文件是每个图像,labels里面的txt同名文件是每个图像中对象标注信息,格式如下:


      
      
  1. name_of_the_class left top right bottom
  2. name_of_the_class 对象类别名称
  3. left top标注框左上角坐标
  4. right bottom 标注框右下角坐标

转换为YOLO标注格式数据,首先看一下标注文本文件与图像的文件夹结构

其中images是所有图像的集合,labels是所有标签信息集合。train表示训练集、valid表示测试集。这里需要注意的是,labels信息中的标签信息YOLO格式标注框需要把原始标注信息的标注框格式从:

Left top right bottom

      
      

转换为

Center_x, center_y, width, height

      
      

并归一化到0~1之间,这部分我写了一个脚本来完成label标签的生成。代码如下:


      
      
  1. for f in files:
  2.      if os.path.isfile(os.path.join(current_dir, f)):
  3.         image = cv.imread(os.path.join(current_dir, f))
  4.         label_file = os.path.join(current_dir,  "label", f.replace( ".jpg"".txt"))
  5.         yolo_label = f.replace( ".jpg"".txt")
  6.         data_label_text_f = os.path.join(valid_label_dir, yolo_label)
  7.         file_write_obj = open(data_label_text_f,  'w')
  8.         with open(label_file) as f:
  9.             boxes = [line.strip()  for line in f.readlines()]
  10.         clazz_index =  -1
  11.         # create  new file
  12.          for box in boxes:
  13.             anno_info = box.split( " ")
  14.              if anno_info[ 0] ==  "Cricket":
  15.                  print( "class name: ", anno_info[ 0] +  " ball")
  16.                 x1 = float(anno_info[ 2])
  17.                 y1 = float(anno_info[ 3])
  18.                 x2 = float(anno_info[ 4])
  19.                 y2 = float(anno_info[ 5])
  20.                 clazz_index =  0
  21.              else:
  22.                  print( "class name: ", anno_info[ 0])
  23.                 x1 = float(anno_info[ 1])
  24.                 y1 = float(anno_info[ 2])
  25.                 x2 = float(anno_info[ 3])
  26.                 y2 = float(anno_info[ 4])
  27.                 clazz_index =  1
  28.             h, w, c = image.shape
  29.             cx = (x1 + (x2 - x1) /  2) / w
  30.             cy = (y1 + (y2 - y1) /  2) / h
  31.             sw = (x2 - x1) / w
  32.             sh = (y2 - y1) / h
  33.             file_write_obj.write( "%d %f %f %f %f\n"%(clazz_index, cx, cy, sw, sh))
  34.             # cv.rectangle(image, ( int(x1),  int(y1)), ( int(x2),  int(y2)),( 00255),  28)
  35.         file_write_obj. close()

最后需要创建一个dataset.ymal文件,放在与data文件夹同一层,它的内容如下:


      
      
  1. # train andval datasets (image directory or *.txt file with image paths)
  2. train:football_training/data/images/train/
  3. val: football_training/data/images/valid/
  4. # number ofclasses
  5. nc: 2
  6. # class names
  7. names:['Cricketball', 'Football']

其中


      
      
  1. Cricketball与Football是我从Open Image中下载的两个类别数据。
  2. nc: 2 表示识别两个类别。

这样就完成了整个数据集准备部分。

模型训练与推理测试

这里我分别基于yolov5l.ymal与yolov5s.ymal完成了模型训练,需要修改的只有一个地方,就是把类别数目从80改为2。图示如下:

然后执行训练脚本的命令行如下:

python train.py --data --epochs 300 football_training/dataset.yaml --cfg football_traing/yolov5l.yaml --weights '' --batch-size 1

      
      

推荐的参数中没有这么小的batchi-size,我是用笔记本训练,发现2就爆内存了,人穷!有条件的把这个参数调大点,效果会好!训练时可以通过tensorboard查看训练实时变换,图示如下:

最终每个类别的AP得分

最终训练完成得到best.pt文件

运行测试视频

python detect.py --source football_training/test.mp4 --weights football_training/best.pt --conf 0.5

      
      

ONNX格式推理部署

通过下面的脚本转换为ONNX文件

python models/export.py --weights football_training/best.pt --img 640 --batch 1

      
      

然后再转换为OpenVINO的IR中间文件格式,C++推理与部署代码实现参见

YOLOv5在最新OpenVINO 2021R02版本的部署与代码演示详解

运行效果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

文章知识点与官方知识档案匹配,可进一步学习相关知识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值