YOLOv5s训练学习记录:

训练、获取模型

YOLOv5初级使用教程

下载yolov5

git上下载Yolov5并调通测试代码

数据集准备与文件夹结构

这里我使用的是之前提供的装甲板数据集’RM_train_data’
这个和原本提供的’RM_train_data’不太一样,需要改成下边的样子

1
2
3
4
5
6
7
8
9
├─images  
│ ├─test
│ ├─train
│ └─val
└─labels
├─test
├─train
└─val

新建数据路径yaml配置文件

比如我在./data下新建了一个RM.yaml(应该很容易看懂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC by University of Oxford
# Example usage: python train.py --data VOC.yaml
# parent
# ├── yolov5
# └── datasets
# └── VOC ← downloads here (2.8 GB)


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# path: ../datasets/VOC
train: /home/danielvon/MyCodes/RM_train_data/images/train # 3555 images
val: /home/danielvon/MyCodes/RM_train_data/images/val # 360 images
test: /home/danielvon/MyCodes/RM_train_data/images/test


# Classes
nc: 12 # number of classes
names: ['r1', 'r2', 'r3', 'r4', 'b1', 'b2', 'b3', 'b4', 'rs', 'rj', 'bs', 'bj'] # class names

新建yaml配置文件

比如我在./models下新建了个yolov5s_RM.yaml(从yolov5s.yaml改来的,只要改一下nc的值(也就是’number of classes’的值)就好了)

训练

用下边的命令开始训练

1
python train.py --data RM.yaml --cfg yolov5s_RM.yaml --weights yolov5s.pt --epoch 120 --batch-size 16 --device 0

训练结束后会在./runs中生成/train/expX文件夹,最后训练出的模型为/expX/weights/best.pt,加载这个模型即可进行目标检测
例如:

1
python3 detect.py --weights ./runs/train/exp2/weights/best.pt --source 0 --device 0

一些参数 YOLOv5训练与测试参数介绍

train.py

--weigths: 指的是训练好的网络模型,用来初始化网络权重
--cfg:为configuration的缩写,指的是网络结构,一般对应models文件夹下的xxx.yaml文件
--data:训练数据路径,一般为data文件夹下的xxx.yaml文件
--epochs:设置训练的轮数
--batch-size:每次输出给神经网络的图片数
--rect: 是否采用矩形训练
--resume: 指定之前训练的网络模型,并继续训练这个模型
--cache-images:是否对图片进行缓存,可以加快训练
--device:训练网络的设备cpu还是gpu
--sync-bn:生效后进行多 GPU 进行分布式训练
--workers: 多线程训练
--name: 训练结果保存文件名
--multi-scale:训练过程中对图片进行尺度变换

detect.py

--weights:训练的权重
--source:测试数据,可以是图片/视频路径,也可以是’0’(电脑自带摄像头),也可以是rtsp等视频流
--output:网络预测之后的图片/视频的保存路径
--img-size:网络输入图片大小
--conf-thres:置信度阈值(检测精度,作者是设置的0.25)
--iou-thres:做nms的iou阈值()
--device:设置设备
--save-txt:是否将预测的框坐标以txt文件形式保存,默认False
--classes:设置只保留某一部分类别,形如0或者0 2 3
--agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
--augment:推理的时候进行多尺度,翻转等操作(TTA)推理
--update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False

C++下使用opencv部署yolov5模型

我感觉这个不太好搞,当然,也可能是我的搜索方式不太对

【opencv c++】实现yolov5部署onnx模型完成目标检测 - iuk11 - 博客园

基于OpenCV和ROS的Yolov5模型推理部署 - 掘金

有个人写了好多相关内容:

2021.03.11更新 c++下使用opencv部署yolov5模型(一)_[error:0] global c:\build\master_winpack-build-win_爱晚乏客游的博客-CSDN博客

2021.04.15更新 c++下使用opencv部署yolov5模型 (二)_opencv调用yolov5模型_爱晚乏客游的博客-CSDN博客

2021.09.02更新说明 c++下使用opencv部署yolov5模型 (三)_opencv yolov5_爱晚乏客游的博客-CSDN博客

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)_如何查看yolov5版本_爱晚乏客游的博客-CSDN博客

2022.07.25 C++下使用opencv部署yolov7模型(五)_opencv yolov7_爱晚乏客游的博客-CSDN博客

2022.09.29更新 c++下面部署yolov5实例分割模型(六)_c++ yolov5_爱晚乏客游的博客-CSDN博客

关于C++下使用opencv部署yolov5模型的记录:

参考了的帖子:

Linux下C++中OpenCV无法读取视频文件的解决方法(opencv isopened) – 抖店铺 (doudianpu.com)

linux下opencv with ffmpeg安装-CSDN博客

Yolov5 + Opencv DNN + C++部署-腾讯云开发者社区-腾讯云 (tencent.com)

在使用上边这个文章的代码进行测试的时候,我发现在cv::VideoCapture capture("VIDEO.mp4")这里直接写视频文件名(此时视频存在项目根目录下,这个写法相当于是相对路径)会出现capture.isOpened()返回值是 false 的错误,必须改成绝对路径才不会报错,得写成cv::VideoCapture capture("/home/rimrose/CLionProjects/ForTest001/VIDEO.mp4")

用到的测试视频:

测试视频—YOLOV5+Deep Sort_哔哩哔哩_bilibili

上边所说的路径问题解决之后遇到了新问题,报错如下:

1
2
3
4
[ERROR:0@0.110] global onnx_importer.cpp:1031 handleNode DNN/ONNX: ERROR during processing node with 1 inputs and 1 outputs: [Floor]:(onnx_node!/model.11/Floor) from domain='ai.onnx'
terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(4.9.0) /home/rimrose/opencv-4.9.0/modules/dnn/src/onnx/onnx_importer.cpp:1053: error: (-2:Unspecified error) in function 'handleNode'
> Node [[email protected]]:(onnx_node!/model.11/Floor) parse error: OpenCV(4.9.0) /home/rimrose/opencv-4.9.0/modules/dnn/src/layers/elementwise_layers.cpp:260: error: (-215:Assertion failed) src.size == dst.size && src.type() == dst.type() && src.isContinuous() && dst.isContinuous() && src.type() == CV_32F in function 'forward'

暂时不知道如何解决,不过看报错应该主要问题是src.size == dst.size && src.type() == dst.type() && src.isContinuous() && dst.isContinuous() && src.type() == CV_32F,可能是输入输出尺寸的问题;但是这又是官方给的代码,模型也是官方的模型,按理说不应该有问题的吧()

← to be continued