接上文《PCB目标检测2——数据继续分析》
3.2 验证集推理
(1)代码:
import ultralytics.data as yolo_data from pcb_yolo_dataset import PCB_YOLODataset from ultralytics import YOLO # ===== 1. 应用验证专用补丁 ===== _original_build = yolo_data.build_yolo_dataset def _patched_build_val(opt, img_path, batch_size, augment=False, hyp=None, rect=False, cache=False, stride=32, pad=0.5, prefix=''): return PCB_YOLODataset( img_path=img_path, img_size=opt.imgsz, # ← 从配置对象中安全获取尺寸 batch_size=batch_size, augment=augment, # val模式下YOLO会自动传False hyp=hyp, rect=rect, # val模式下YOLO会自动传True cache=cache, stride=stride, pad=pad, prefix=prefix, data=opt.data if hasattr(opt, 'data') else {}, ) yolo_data.build_yolo_dataset = _patched_build_val print("验证补丁已应用") # ===== 2. 运行验证 ===== model = YOLO(r'D:\我的\5.机器视觉\PCB缺陷检测系统\runs\detect\train-8\weights\best.pt') results = model.val( data=r'D:\pcb\PCB_DATASET\yolo11_data\pcb.yaml', imgsz=960, # 必须与训练时的960严格一致 batch=4, # 与训练batch一致,避免padding策略差异 cache='ram', # 与训练一致 workers=0, # 与训练一致 device='cpu', # 与训练一致 conf=0.001, # 默认阈值,除非训练时改过 iou=0.7, # 默认阈值,除非训练时改过 plots=True, verbose=True, ) print(f"\nmAP@50:95 = {results.box.map:.4f}")(2)结果评估:总的来看,mAP50-95精度较低,与mAP50差距达0.395,说明当预测框和真实框的重叠度(IoU)≥0.5时,就算"检测对了"的精度较高,能确定大概位置;但是当IoU 阈值从0.5到0.95,每隔0.05取一个值(共10个阈值),分别计算mAP后取平均值的结果较低,模型不能精准地框住缺陷,之前在训练集上这个指标就不太好,怀疑是标注太松。epoch不用增加了:
(3)优化方向:换yolov8s、重新标注
4. 进一步优化
4.1 换yolov8s
(1)有提升,但不多。
训练集:
验证集:
4.2 重新标注
(1)下载X-AnyLabeling软件,可以先通过best.pt进行自动标注,然后再人为去修改,下载网址:Releases · CVHub520/X-AnyLabeling · GitHub
(2)软件需要导入best.onnx格式的数据和yaml文件,这个yaml文件需要根据官方案例去修改:X-AnyLabeling/docs/zh_cn/model_zoo.md at main · CVHub520/X-AnyLabeling · GitHub我选的是yolov8s对应的yaml文件。
from ultralytics import YOLO model = YOLO(r"C:\D\我的\5.机器视觉\PCB缺陷检测系统\runs\detect\train-9\weights\best.pt") model.export(format="onnx")(3)软件左侧垂直工具栏里点自动标注的按钮,中间左上角界面 no model的按钮点击后选自定义模型,导入上面做的那个yaml文件。然后左上角打开文件夹,选中训练集与验证集在一起的文件夹,右下角就可以自由选图片显示了。
(4)出来图片后点击上面蓝色的运行按钮,就会自动标注了,然后自己放大缩小去调整边框就行,挺好用的,就是图太多了...开干~~~
(5)导出的时候要保证界面右侧的修改之后的标注框对象都勾选上了(工具箱里有标签管理器,选上visible就能自动默认是勾选的),然后自己生成一个类别文件,比如classes.txt(这样才能知道每个类别对应的编号,第一行就是0,依次类推的),然后点击菜单栏的导出,选第一个YOLO HBB(方形框),选择calsses.txt文件,新建一个文件夹,保存好标注框信息(就是之前json转换好的那种txt文件)。再去用之前的代码将新的标注画出来看了看,效果是好了,紧致了。标注的时候开着原始标注框的图片对应看,因为自动标注可能会少标或者错标。
(6)重新标注思路,仅个人感觉:
- missing_hole:没有紧贴金属外框,留了一点阴影的区域;
- mouse_bite:尽量贴合,留一点点点的缓冲区;
- open_circuit:和mouse_bite一样的,也是尽量贴合了,留了一点缓冲区;
- short:蓝色框区域内,感觉要把拐角显示出来,多留一些缓冲区;
- spur:和short一样的思路;
- spurious_copper:尽量贴合,留一点点缓冲区。
4.3 重新训练与推理
(1)根据新的数据标注重训的各指标结果:
(2)根据新的数据标注重推理的各指标结果
(3)大模型给的解释,确实重新标注的框更贴合了,精细定位能力应该提升了,至于之前的是不是虚高不是很确定。
5. 可下载新标注
http://通过网盘分享的文件:labels.rar 链接: https://pan.baidu.com/s/1MPQgsxTe44ZTNcReKSu0Bw 提取码: e3a6
6. 感想
(1)数据标注感觉就是ai时代农民工,太累了,这个数据集的检测先告一段落,前几天在阿里云天池上又找到了新的pcb数据集,后面可以再把流程走一遍,看看有没有其他问题,然后再工程化一下。