资讯详情

AI质检(一):yolo检测

📅 2026/11/2 1:43:04 | 华诺云谱 👁 阅读
AI质检(一):yolo检测
目录项目介绍一、数据分析1数据集的定义2训练的脚本配置3数据准备1、数据标注2、EDA数据分析二、YOLO模型训练与调优1数据增强优化2模型选择和图片选择3离线数据增强 (扩充训练集)4推理时增强TTA还是以上一节内容yolo模型介绍二中钢铁缺陷检测的数据来做AI质检内容。我们的目标仍然是缺陷检测但是流程上会更完善。项目介绍在制造业产线中产品表面缺陷检测是品质把控的关键一环。传统人工目视质检长期面临效率、标准一致性、人力成本的多重压力AI 视觉质检正在成为工业落地的主流方案。目前工业视觉质检主要存在两套技术路线二者定位不同可以互为补充。第一套是YOLO 系列目标检测方案也是工业落地的主流选择支持自定义标注数据完成训练推理速度快能够满足产线实时检测的要求第二套是VLM 多模态大模型例如 Qwen‑VL依靠提示词就可以实现零样本缺陷检测不需要大量标注训练数据适合快速做原型验证但检测精度有限很难直接用于正式产线。本项目以钢铁缺陷检测数据集为例打造AI质检系统项目整体流程如下除此之外还用OpenClaw Skills 来搭建一个AI检测助理。如下是这个项目需要的工具栈本篇内容介绍前两个模块即数据分析处理和YOLO模型训练与调优。一、数据分析如下是我们整个项目给到的数据1数据集的定义我们的数据集定义在dataset.yaml这个文件里。在yolo模型介绍二里面我们介绍过dataset.yaml文件它里面包含了数据集所在的位置数据集的划分训练集测试集和验证集以及数据标注中6种缺陷。2训练的脚本配置如下是yolov12.yaml文件里的部分内容。nc表示我们要识别的缺陷的种类。Scales下面这些是yolo的尺寸从n到x层数越来越多参数也越来越多。还记得上篇内容中第一个实例种有这样一句话吗model YOLO(./yolov12n.pt)如果想用V12最强的模型我们将参数改为./yolov12x.pt即可。yolov12.yaml文件后面还有一些其他有关框架的内容一般都不需要改。了解即可。3数据准备1、数据标注在实际项目中最大的工作量是数据标注要准备很多标注好的数据进行训练。一般使用labelImg或者label-studio工具做数据标注yolo模型介绍二中介绍了labelImg的使用方法了。在本项目中数据已经标好了。2、EDA数据分析EDAexplore data analysis属于是在标注数据后模型训练前的数据分析。我们可以读取标注文件的内容来进行分析。我们读取的是.txt格式的标注文件格式如下第一个参数是dataset.yaml对应的缺陷类型后面四个参数代表的是经过归一化处理的缺陷的位置(x,y,w,h)。step 1读取所有的标注文件按照图片的名字存入annotations这个结构中。def load_all_labels(labels_dir): 读取所有标注文件, 返回 {filename: [(class_id, x, y, w, h), ...]} annotations {} for label_file in glob.glob(os.path.join(labels_dir, *.txt)): basename os.path.splitext(os.path.basename(label_file))[0] boxes [] with open(label_file, r) as f: for line in f: parts line.strip().split() if len(parts) 5: cls_id int(parts[0]) x, y, w, h float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) boxes.append((cls_id, x, y, w, h)) annotations[basename] boxes return annotationsstep 2根据缺陷Id统计每种缺陷的数量以及占所有缺陷的比例。并统计了每张图片缺陷的数量。def analyze_class_distribution(annotations): 分析类别分布 class_counts Counter() boxes_per_image [] for basename, boxes in annotations.items(): boxes_per_image.append(len(boxes)) for cls_id, *_ in boxes: class_counts[cls_id] 1 print( * 60) print(类别分布统计) print( * 60) total sum(class_counts.values()) for cls_id in sorted(class_counts.keys()): count class_counts[cls_id] ratio count / total * 100 bar # * int(ratio) print(f {CLASS_NAMES[cls_id]:30s} | {count:5d} ({ratio:5.1f}%) {bar}) print(f {总计:30s} | {total:5d}) print(f\n图片数量: {len(annotations)}) print(f每张图的标注框数: 最少{min(boxes_per_image)}, 最多{max(boxes_per_image)}, f平均{np.mean(boxes_per_image):.1f}) print() return class_counts, boxes_per_imagestep 3分析所有标注框的宽度高度和面积。def analyze_box_sizes(annotations): 分析标注框尺寸分布 widths [] heights [] areas [] aspect_ratios [] class_areas defaultdict(list) for basename, boxes in annotations.items(): for cls_id, x, y, w, h in boxes: widths.append(w) heights.append(h) area w * h areas.append(area) aspect_ratios.append(w / max(h, 1e-6)) #避免除0 class_areas[cls_id].append(area) print( * 60) print(标注框尺寸分析 (归一化坐标)) print( * 60) print(f 宽度: 最小{min(widths):.3f}, 最大{max(widths):.3f}, 平均{np.mean(widths):.3f}) print(f 高度: 最小{min(heights):.3f}, 最大{max(heights):.3f}, 平均{np.mean(heights):.3f}) print(f 面积: 最小{min(areas):.4f}, 最大{max(areas):.4f}, 平均{np.mean(areas):.4f}) print() return widths, heights, areas, aspect_ratios, class_areasstep 4统计出最多数量的缺陷和最少数量的缺陷判断不均衡的比例。def check_class_imbalance(class_counts): 评估类别不均衡程度 counts list(class_counts.values()) max_count max(counts) min_count min(counts) ratio max_count / max(min_count, 1) print( * 60) print(类别不均衡评估) print( * 60) print(f 最多类别数量: {max_count}) print(f 最少类别数量: {min_count}) print(f 不均衡比例: {ratio:.1f}:1) if ratio 5: print( [!] 类别严重不均衡, 建议采取以下措施:) print( 1. 对少数类别进行过采样/数据增强) print( 2. 使用类别权重(class weights)) print( 3. 使用Focal Loss) elif ratio 2: print( [!] 存在一定的类别不均衡, 建议关注少数类别的召回率) else: print( [OK] 类别分布较均衡) print()结果输出除此之外根据上述函数返回的值可以将这些数据绘制成可视化的统计图如果经过上述的分析发现缺陷数量不均衡就需要补充相对应的缺陷。在目标检测模型需要预测图上哪里有目标、目标多大。 如果让模型从零开始预测绝对坐标难度很高。Anchor的思路是先在图上铺一组预设的参考框模型只需预测目标相对于参考框的偏移量。上面的analyze_box_sizes函数分析了各个缺陷的长度宽度和长宽比等信息这些信息可以影响anchor预测参考框的尺寸。假设图上有个30x50 的缺陷方式A (无anchor)模型直接预测x120, y80, w30, h50 -- 数值跨度大学习困难方式B (有anchor)预设一个32x48 的参考框模型只需预测dx-2, dy1, dw2 -- 小偏移量 容易学二、YOLO模型训练与调优1数据增强优化数据增强是在不新增真实采集图片的前提下通过图像变换算法对原始图片做各类修改模拟现实中不同拍摄条件、物体形态生成大量 “虚拟样本”。如果不用数据增强的话我们的训练数据就只有我们给定的1400张。如果使用增强方法那么图片可能被处理使我们参与训练的图片增加很多。以下是训练的核心代码其实这个代码在yolo模型介绍二中已经见过。数据增强分为基础增强和高级增强。我把各个参数标出来大家可以看下model YOLO(YOLOV12_YAML) # 训练参数 train_kwargs dict( datadataset_yaml, epochsepochs, batchbatch, imgszargs.imgsz, patienceargs.patience if args.patience else (50 if not is_cpu else epochs), devicedevice, workersworkers, pretrainedFalse, saveTrue, verboseTrue, plotsFalse, projectos.path.join(BASE_DIR, runs), namesteel_train, exist_okTrue, # 高级增强: YOLO核心技术 mosaic1.0, # Mosaic: 4张图拼成1张, 增加小目标检测能力 mixup0.1, # MixUp: 两张图混合, 增加模型泛化能力 copy_paste0.1, # Copy-Paste: 将目标复制粘贴到其他图片, 适合目标较少的场景 # erasing0.3, # 擦除: 随机遮挡部分区域, 增加鲁棒性 # 几何变换: 缺陷方向不固定 scale0.5, # 缩放: 模拟不同距离拍摄 fliplr0.5, # 水平翻转: 缺陷可能出现在任何位置 # flipud0.5, # 垂直翻转: 钢铁表面缺陷方向不固定 # degrees15.0, # 旋转: 缺陷角度多变 # translate0.15, # 平移: 模拟相机位置变化 # 颜色变换: 模拟光照和材料差异HSV色调增强 # hsv_h0.02, # hsv_s0.7, # hsv_v0.5, # perspective0.001, # 透视变换: 轻微的视角变化 # shear5.0, # 剪切变换 # cos_lrTrue, # 余弦退火学习率, 训练更稳定 ) results model.train(**train_kwargs)调优思路1. 缺陷可能出现在任何方向 - 增加旋转和翻转2. 缺陷大小差异大 - 增加多尺度训练3. 光照不均匀 - 增加HSV增强4. 数据量有限 - 加强Mosaic和MixUp2模型选择和图片选择调优思路1.选用更大的模型如yolov12x.pt2.imgsz选用更大尺寸cos_lrTrue权衡: 这种调优方法精度更高, 但速度更慢、显存需求更大需要减小batch的大小3离线数据增强 (扩充训练集)Albumentations是专为计算机视觉设计的高性能图像增强库支持边界框、分割掩膜同步变换比PIL 快10-100倍。提供300种变换模糊、畸变、天气模拟等是工业检测离线增强的首选工具。这种方法和上面的两种方法相比- YOLO内置增强: 每个epoch随机变换, 不改变数据集大小- 离线增强: 物理扩充数据集, 增加数据量这二者可以结合使用def offline_augmentation(images_dir, labels_dir, output_dir, multiply3): try: import cv2 import albumentations as A except ImportError: print([!] 需要安装: pip install albumentations opencv-python) return out_images os.path.join(output_dir, images) out_labels os.path.join(output_dir, labels) os.makedirs(out_images, exist_okTrue) os.makedirs(out_labels, exist_okTrue) # 针对钢铁表面缺陷设计的增强管道 transform A.Compose([ A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.RandomRotate90(p0.5), # CLAHE: 对比度受限自适应直方图均衡化, 增强缺陷可见性 A.CLAHE(clip_limit4.0, tile_grid_size(8, 8), p0.3), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), A.GaussNoise(var_limit(10.0, 50.0), p0.2), A.Blur(blur_limit3, p0.1), A.ShiftScaleRotate(shift_limit0.1, scale_limit0.15, rotate_limit30, border_modecv2.BORDER_REFLECT, p0.5), ], bbox_paramsA.BboxParams( formatyolo, label_fields[class_labels], min_visibility0.3, )) image_files [f for f in os.listdir(images_dir) if f.endswith((.jpg, .png))] total_generated 0 for img_file in image_files: img_path os.path.join(images_dir, img_file) label_path os.path.join(labels_dir, os.path.splitext(img_file)[0] .txt) if not os.path.exists(label_path): continue image cv2.imread(img_path) if image is None: continue image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) bboxes [] class_labels [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: class_labels.append(int(parts[0])) bboxes.append([float(x) for x in parts[1:5]]) # 复制原图 basename os.path.splitext(img_file)[0] shutil.copy2(img_path, os.path.join(out_images, img_file)) shutil.copy2(label_path, os.path.join(out_labels, basename .txt)) # 生成增强副本 for i in range(multiply): try: augmented transform(imageimage, bboxesbboxes, class_labelsclass_labels) aug_image augmented[image] aug_bboxes augmented[bboxes] aug_labels augmented[class_labels] if len(aug_bboxes) 0: continue aug_name f{basename}_aug{i} aug_img cv2.cvtColor(aug_image, cv2.COLOR_RGB2BGR) cv2.imwrite(os.path.join(out_images, f{aug_name}.jpg), aug_img) with open(os.path.join(out_labels, f{aug_name}.txt), w) as f: for cls_id, bbox in zip(aug_labels, aug_bboxes): f.write(f{cls_id} {bbox[0]:.6f} {bbox[1]:.6f} {bbox[2]:.6f} {bbox[3]:.6f}\n) total_generated 1 except Exception as e: continue print(f原始图片: {len(image_files)} 张) print(f新增图片: {total_generated} 张) print(f输出目录: {output_dir})4推理时增强TTA测试时增强 (Test Time Augmentation)对同一张图做多次不同变换, 取所有预测的并集。优点是不需要重新训练, 直接提升推理精度缺点是推理速度变慢(约2-3倍)results_tta model.predict( sourcetest_images_dir, conf0.25, iou0.45, augmentTrue, # 开启TTA saveTrue, projectos.path.join(BASE_DIR, runs_enhanced), namepredict_tta, )
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑