💡💡💡本文主要内容:详细介绍了工业油污缺陷检测整个过程,从数据集到训练模型到结果可视化分析,以及如何优化提升检测性能。
💡💡💡加入CPMS mAP@0.5由原始的0.648提升至0.699
1.工业油污数据集介绍
三星油污缺陷类别:头发丝和小黑点,["TFS","XZW"]
数据集大小:660张
数据集地址:https://download.csdn.net/download/m0_63774211/87741209
2.基于YOLOv8的工业油污检测
2.1 修改sanxing.yaml
path: ./data/sanxing # dataset root dir
train: trainval.txt # train images (relative to 'path') 118287 images
val: test.txt # val images (relative to 'path') 5000 images
# number of classes
nc: 2
# class names
names:
0: TFS
1: XZW
2.2 开启训练
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('ultralytics/cfg/models/v8/yolov8.yaml')
model.train(data='data/sanxing/sanxing.yaml',
cache=False,
imgsz=640,
epochs=200,
batch=16,
close_mosaic=10,
workers=0,
device='0',
optimizer='SGD', # using SGD
project='runs/train',
name='exp',
)
3.结果可视化分析
YOLOv8 summary (fused): 168 layers, 3006038 parameters, 0 gradients, 8.1 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 3/3 [00:03<00:00, 1.30s/it]
all 66 187 0.741 0.554 0.648 0.302
TFS 66 130 0.604 0.423 0.531 0.242
XZW 66 57 0.877 0.684 0.766 0.361
F1_curve.png:F1分数与置信度(x轴)之间的关系。F1分数是分类的一个衡量标准,是精确率和召回率的调和平均函数,介于0,1之间。越大越好。
TP:真实为真,预测为真;
FN:真实为真,预测为假;
FP:真实为假,预测为真;
TN:真实为假,预测为假;
精确率(precision)=TP/(TP+FP)
召回率(Recall)=TP/(TP+FN)
F1=2*(精确率*召回率)/(精确率+召回率)
PR_curve.png :PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系。
R_curve.png :召回率与置信度之间关系
results.png
mAP_0.5:0.95表示从0.5到0.95以0.05的步长上的平均mAP.
预测结果:
4.如何优化模型
4.1 加入自研CPMS
YOLOv8独家原创改进:原创自研 | 创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM-CSDN博客
多尺度通道注意力具+多尺度深度可分离卷积空间注意力
4.2对应yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPs
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPs
l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 1, CPMS, [1024]] # 10
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 13
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 16 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 19 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 22 (P5/32-large)
- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)
4.3 实验结果分析
mAP@0.5由原始的0.648提升至0.699
YOLOv8_CPMS summary (fused): 187 layers, 3193942 parameters, 0 gradients, 8.3 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 3/3 [00:03<00:00, 1.32s/it]
all 66 187 0.65 0.686 0.699 0.326
TFS 66 130 0.514 0.6 0.576 0.264
XZW 66 57 0.786 0.771 0.821 0.387
5.系列篇
系列篇1:DCNV4_SPPF提升近四个点
系列篇2:自研注意力CPM:提升近五个点