一文学习yolov5 实例分割:从训练到部署
- 1.模型介绍
- 1.1 YOLOv5结构
- 1.2 YOLOv5 推理时间
- 2.构建数据集
- 2.1 使用labelme标注数据集
- 2.2 生成coco格式label
- 2.3 coco格式转yolo格式
- 3.训练
- 3.1 整理数据集
- 3.2 修改配置文件
- 3.3 执行代码进行训练
- 4.使用OpenCV进行c++部署
- 参考文献
1.模型介绍
1.1 YOLOv5结构
SF-YOLOv5: A Lightweight Small Object Detection Algorithm Based on Improved Feature Fusion Mode论文中给出了yolov5的结构框图:
SPPF块与传统的SPP之间的差异:
特征融合的几种结构:
YOLOV5的特征融合结构:
Ultralytics YOLOv5 Architecture 官方文档给出的详细的整体架构如下:
1.2 YOLOv5 推理时间
YOLOv5 CPU Export Benchmarks 给出的CPU推断时间:
benchmarks: weights=yolov5s.pt, imgsz=640, batch_size=1, data=/usr/src/app/data/coco128.yaml, device=, half=False, test=False, pt_only=False
Checking setup...
YOLOv5 🚀 v6.1-174-gc4cb7c6 torch 1.11.0+cpu CPU
Setup complete ✅ (96 CPUs, 1007.7 GB RAM, 1948.4/3519.3 GB disk)
Benchmarks complete (128.39s)
Format mAP@0.5:0.95 Inference time (ms)
0 PyTorch 0.4623 56.52
1 TorchScript 0.4623 59.21
2 ONNX 0.4623 60.95
3 OpenVINO 0.4623 27.44
4 TensorRT NaN NaN
5 CoreML NaN NaN
6 TensorFlow SavedModel 0.4623 70.84
7 TensorFlow GraphDef 0.4623 72.44
8 TensorFlow Lite 0.4623 130.43
9 TensorFlow Edge TPU NaN NaN
10 TensorFlow.js NaN NaN
https://learnopencv.com/custom-object-detection-training-using-yolov5/给出的时间:
2.构建数据集
参考labelme+yolov5实例分割:自定义数据集制作、训练与注意点,使用labelme来构建yolov5支持的数据集。
2.1 使用labelme标注数据集
pip安装labelme,打开目录进行标注。
2.2 生成coco格式label
使用位于labelme-main\examples\instance_segmentation目录下的labelme2coco.py文件。
python labelme2coco.py labelme标注json文件夹 coco目标文件夹 --labels labels.txt路径
查看设置的生成目录,存在以下三个文件:
2.3 coco格式转yolo格式
使用官方提供的转换工具 general_json2yolo.py :
代码中稍加修改2出:
- 修改1
if __name__ == "__main__":
source = "COCO"
if source == "COCO":
convert_coco_json(
"../datasets/coco/annotations", # directory with *.json
use_segments=True,
cls91to80=True,
)
改为:
if __name__ == "__main__":
source = "COCO"
if source == "COCO":
convert_coco_json(
"上一步生成的coco文件目录", # directory with *.json
use_segments=True,
cls91to80=False,# 这里修改成False
)
- 修改2
修改为:
# Write
with open((fn / f[11:]).with_suffix(".txt"), "a") as file: #去掉字符串的父路径
for i in range(len(bboxes)):
line = (*(segments[i] if use_segments else bboxes[i]),) # cls, box or segments
file.write(("%g " * len(line)).rstrip() % line + "\n")
运行
转换后的结果位于此文件同目录下的new_dir文件夹/labels/annotations目录中。一张图片对应一个txt文件。
3.训练
3.1 整理数据集
将上面环节生成的数据集保存成以下层次:
dataset
images
train
val
labels
train
val
3.2 修改配置文件
在git主目录下的data文件夹下新建或者修改自定义项目的数据集配置文件:
path:数据集目录
train:训练集目录
val:验证集目录
# Classes
names:
0: cat1
1: cat2
...
3.3 执行代码进行训练
python segment/train.py --model yolov5s-seg.pt --data data/custom.yaml --epochs 5 --img 640
4.使用OpenCV进行c++部署
https://github.com/doleron/yolov5-opencv-cpp-python/tree/main
参考文献
[1] https://learnopencv.com/custom-object-detection-training-using-yolov5/
[2] YOLOv5 CPU Export Benchmarks
[3] https://github.com/ultralytics/yolov5/releases
[4] https://sh-tsang.medium.com/brief-review-yolov5-for-object-detection-84cc6c6a0e3a
[5] Ultralytics YOLOv5 Architecture
[6] SF-YOLOv5: A Lightweight Small Object Detection Algorithm Based on Improved Feature Fusion Mode
[7] labelme+yolov5实例分割:自定义数据集制作、训练与注意点