YOLOv11工业视觉实战:从数据标注到模型部署的针织品瑕疵检测全流程
简介:目标检测是计算机视觉的核心任务之一,旨在识别图像中的物体并定位其位置。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并预测边界框和类别。这项技术的核心价值在于将传统依赖人眼的检测工作自动化,实现高效、精准且可复现的智能识别。在工业质检、自动驾驶、安防监控等场景中,目标检测技术正发挥着关键作用。本文聚焦于工业质检这一具体应用,深入探讨了如何利用YOLOv11算法解决针织布匹的瑕疵检测难题。文章详细拆解了从数据采集、标注规范制定、YOLO格式解析,到模型训练、超参数调优及最终部署落地的完整技术链路,并分享了针对工业场景的数据增强策略与性能优化技巧,为相关领域的工程实践提供了详实的参考。
1. 项目概述:从一份压缩包到工业质检的落地实践
最近在整理硬盘时,翻出了一个名为“针织品瑕疵检测数据集 yolov11标记.zip”的文件包。这让我想起了去年参与的一个纺织厂智能化改造项目,核心目标就是用AI视觉替代传统的人工验布环节。当时,为了训练一个可靠的瑕疵检测模型,我们团队花了大量精力在数据准备上,这个压缩包就是那段“艰苦岁月”的结晶。今天,我想把这个过程完整地复盘出来,不仅仅是分享一个数据集,更是想聊聊如何将一个工业场景的抽象需求,一步步落地成一个可训练、可部署的YOLO模型。无论你是刚接触目标检测的学生,还是正在为产线升级寻找方案的工程师,希望这篇从数据到模型的全程记录,能给你带来一些实实在在的参考。
简单来说,这个项目就是利用YOLOv11算法,对针织布匹图像中的各类瑕疵(如破洞、污渍、断纱、勾丝等)进行自动识别和定位。其价值在于将质检员从高强度、易疲劳的重复劳动中解放出来,实现7x24小时不间断、标准统一的检测,大幅提升生产效率和产品质量的一致性。整个过程涉及数据采集、标注、模型选型、训练、优化及部署等多个环节,而数据集是这一切的基石。接下来,我将拆解每个环节的核心要点与实操细节。
2. 数据集构建:工业场景下的数据“炼金术”
构建一个高质量的工业视觉数据集,远比在互联网上搜集猫狗图片复杂得多。它需要紧密贴合实际生产环境,考虑光照、背景、物料形态的多样性,以及瑕疵本身的不确定性。
2.1 数据采集:模拟真实产线环境
我们的数据主要来源于安装在验布机上的工业相机。这里有几个关键决策点:
相机与光源选型:我们选择了2000万像素的全局快门CMOS相机,搭配高亮度的条形LED漫射光源。全局快门能有效避免布料高速移动时产生的果冻效应,而漫射光可以消除布面反光,让纹理和瑕疵更清晰地呈现。光源的色温选择6500K(日光色),以减少颜色偏差。
采集策略:并非对整卷布进行无差别拍摄。我们设定了两种采集模式:
- 连续采样模式:在验布机匀速运行时,以固定频率(如每秒5帧)采集图像,用于获取大量背景(无瑕疵)样本和部分常见瑕疵。
- 触发采集模式:当验布机上的光电传感器或初步算法发现疑似瑕疵区域时,触发相机进行局部高清拍摄,确保瑕疵特征的完整性。
图像预处理:采集到的原始图像会进行初步处理,包括:
- 尺寸归一化:将所有图像缩放至统一的尺寸(如1920x1080),便于后续批量处理。
- 格式转换:统一转换为
.jpg格式,在保证质量的同时兼顾存储效率。 - 信息记录:每张图像都关联一个元数据文件,记录布匹型号、采集时间、线速度、光照参数等信息,这对后续分析模型在不同工况下的表现至关重要。
注意:采集阶段一定要预留足够的“脏数据”。比如,故意在部分时段调整光照强度、让布面产生轻微褶皱、或者让相机镜头上沾一点灰。这些“不完美”的数据能极大地增强模型在真实复杂环境下的鲁棒性,避免模型成为只能在实验室理想条件下工作的“温室花朵”。
2.2 瑕疵标注规范与YOLO格式详解
标注是数据工程中最耗时但也最决定模型上限的环节。我们制定了详细的《针织品瑕疵标注规范》。
瑕疵类别定义:我们最终定义了8类瑕疵,这是与工厂老师傅反复沟通后确定的:
- hole(破洞):布面出现的贯通性孔洞。
- stain(污渍):油污、水渍、色渍等。
- broken_yarn(断纱):单根或多根纱线断裂。
- snag(勾丝):纱线被钩出形成的线圈。
- thick_bar(粗节):纬向出现的密集粗纱。
- thin_bar(细节):纬向出现的稀疏细纱。
- knot(结头):纱线接头处形成的小球。
- foreign_matter(异物):织入布内的飞花、毛发等。
标注工具与流程:我们使用LabelImg和CVAT相结合。LabelImg用于初期小批量数据的标注和规范制定,CVAT则用于团队协作进行大规模标注。标注时要求:
- 框(Bounding Box)要紧贴瑕疵边缘,但不必像素级精确。
- 对于细长型的瑕疵(如断纱、勾丝),允许使用多个小框覆盖其走向,而不是一个巨大的框。
- 每个标注框都必须有
confidence字段,标注员需评估自己标注的置信度(高/中/低),后期可用于困难样本挖掘。
YOLO格式解析:最终生成的标注文件是.txt格式,与图像文件同名,存放在labels文件夹下。每一行代表一个标注对象,格式为:<class_id> <x_center> <y_center> <width> <height>。
class_id:瑕疵类别的索引(从0开始)。x_center, y_center:标注框中心点的归一化坐标(除以图像宽高)。width, height:标注框的归一化宽高。
例如,一张1920x1080的图中,在(100, 200)位置有一个宽50、高30的破洞(class_id=0),其标注行应为:0 0.0521 0.1852 0.0260 0.0278。计算过程:x_center = (100 + 50/2) / 1920 ≈ 0.0521。
2.3 数据增强:针对针织品特性的定制化策略
针织品瑕疵检测面临两个挑战:瑕疵样本少、背景纹理复杂。我们设计了针对性的数据增强管道(使用Albumentations库实现):
几何变换:
- 随机旋转(-5°, +5°):小幅旋转模拟布匹在传输中的轻微偏移。
- 弹性变换:模拟布料的自然拉伸和褶皱。
- 网格失真:轻微扭曲,增加对纹理变化的适应性。
像素变换:
- CLAHE(限制对比度自适应直方图均衡化):增强局部对比度,让浅色瑕疵更明显。
- 随机亮度/对比度:模拟光照变化。
- 添加高斯噪声:模拟相机传感器噪声。
- 模糊:轻微的高斯模糊或运动模糊,模拟对焦不准或快速移动。
针对性的高级增强:
- CutMix:将另一张图像上的瑕疵区域(连同标注框)粘贴到当前图像上,能高效生成新的瑕疵样本,尤其对于“破洞”、“污渍”这类离散型瑕疵效果显著。
- Mosaic:将四张图像拼接为一张,大幅增加单张图片的背景复杂度和目标数量,提升模型对小目标和复杂背景的检测能力。
实操心得:数据增强的顺序很重要。我们的经验是:先做几何变换(旋转、裁剪),再做颜色变换(亮度、对比度),最后添加噪声。避免在几何变换后立刻进行需要精确坐标的操作(如CutMix)。此外,所有增强参数都必须控制在一定范围内,避免生成过于离谱、脱离实际生产场景的“科幻图片”,这反而会损害模型性能。
3. YOLOv11模型训练全流程拆解
有了高质量的数据集,模型训练就是“临门一脚”。YOLOv11作为YOLO家族的最新成员之一,在精度和速度的平衡上做了不少优化。
3.1 环境配置与依赖安装
我们选择在Linux服务器上使用Anaconda进行环境管理,这能很好地解决依赖冲突问题。
# 1. 创建并激活conda环境 conda create -n yolov11 python=3.8 -y conda activate yolov11 # 2. 安装PyTorch(根据CUDA版本选择) # 例如,对于CUDA 11.3 pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 3. 克隆YOLOv11官方仓库(这里以Ultralytics YOLO为例,因其生态完善) git clone https://github.com/ultralytics/ultralytics cd ultralytics pip install -e . # 以可编辑模式安装 # 4. 安装其他依赖 pip install opencv-python pillow matplotlib seaborn pandas pyyaml tqdm albumentations关键点解析:
- Python 3.8:这是一个在深度学习领域兼容性极佳的版本,避免使用过新版本可能带来的库冲突。
- PyTorch版本:务必与你的CUDA驱动版本匹配。可以通过
nvidia-smi查看CUDA版本。不匹配会导致无法调用GPU。 -e安装模式:这允许你直接修改源码(如模型结构、数据加载逻辑)而无需重新安装,对于调试和定制化开发非常方便。
3.2 数据集目录结构与配置文件准备
将之前准备的“针织品瑕疵检测数据集 yolov11标记.zip”解压后,需要组织成YOLO要求的格式,并创建配置文件。
目录结构:
knit_defect_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── 000001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 000501.jpg │ └── ... └── labels/ ├── train/ # 训练集标签(与images/train/一一对应) │ ├── 000001.txt │ └── ... └── val/ # 验证集标签 ├── 000501.txt └── ...创建数据集配置文件:在项目根目录下创建defect_dataset.yaml。
# defect_dataset.yaml path: /path/to/your/knit_defect_dataset # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 # 类别数量和名称 nc: 8 names: ['hole', 'stain', 'broken_yarn', 'snag', 'thick_bar', 'thin_bar', 'knot', 'foreign_matter']划分训练集与验证集:我们按照8:2的比例随机划分。确保同一卷布匹的图像不会同时出现在训练集和验证集中,防止数据泄露,评估模型真正的泛化能力。
3.3 模型训练与超参数调优
使用Ultralytics YOLO接口进行训练非常简洁,但背后的超参数设置大有学问。
基础训练命令:
from ultralytics import YOLO # 加载预训练模型(推荐使用yolov11m.pt,平衡精度与速度) model = YOLO('yolov11m.pt') # 开始训练 results = model.train( data='defect_dataset.yaml', epochs=300, imgsz=640, batch=16, workers=8, device=0, # 使用GPU 0 project='knit_defect_detection', name='exp1', exist_ok=True )核心超参数深度解析:
imgsz(图像尺寸):设置为640是YOLO系列的常用尺寸。更大的尺寸(如1280)可能提升对小瑕疵的检测能力,但会显著增加显存消耗和训练时间。对于针织瑕疵,640在大多数情况下已足够。batch(批次大小):在显存允许的前提下尽可能设大。大的batch size能使梯度估计更稳定,有助于模型收敛。我们使用RTX 4090,batch设为16。workers(数据加载进程数):通常设置为CPU核心数的2-4倍,以加快数据I/O,避免训练时GPU等待数据。设置过高可能导致内存溢出。epochs(训练轮数):300轮是一个合理的起点。可以通过观察验证集损失曲线(val_loss)来判断:当损失连续10-15个epoch不再显著下降时,可以考虑早停(Early Stopping)。
高级调优策略:
- 优化器选择:YOLOv11默认使用
SGD优化器。对于我们的数据集,我尝试换用AdamW优化器,并配合OneCycleLR学习率调度策略,发现模型在初期收敛更快,最终精度也有微小提升(约0.5% mAP)。 - 损失函数权重:YOLO的损失由分类损失、框回归损失和目标置信度损失组成。如果发现某一类瑕疵(如细小的“勾丝”)召回率很低,可以尝试在代码中微调分类损失的权重,让模型更关注分类任务。
- 锚框(Anchor)重聚类:YOLO预设的锚框尺寸是基于COCO等通用数据集的。我们可以使用自己的数据集的所有标注框进行K-means聚类,生成更适合针织瑕疵尺寸分布的锚框,这通常能带来稳定的性能提升。
3.4 训练过程监控与评估指标解读
训练启动后,监控是关键。Ultralytics会在runs/detect/exp1目录下生成大量日志和可视化结果。
关键文件:
results.csv:记录每个epoch的训练/验证损失、各项指标。confusion_matrix.png:混淆矩阵,查看各类别间的误检情况。F1_curve.png:F1分数随置信度阈值变化的曲线。P_curve.png&R_curve.png:精确率和召回率曲线。
核心评估指标:
- mAP@0.5:在IoU阈值为0.5时的平均精度均值。这是我们最关注的综合指标,达到0.85以上说明模型性能不错。
- mAP@0.5:0.95:在IoU阈值从0.5到0.95(步长0.05)的平均mAP,更严格,衡量模型定位的精确度。
- Precision(精确率):模型预测为正的样本中,真正为正的比例。高精确率意味着误报(将好布判为坏布)少。
- Recall(召回率):所有真实的正样本中,被模型正确找出的比例。高召回率意味着漏报(瑕疵没检出来)少。
如何分析:
- 如果精确率低但召回率高:模型过于“激进”,检出了很多瑕疵,但其中很多是误报。需要提高预测时的置信度阈值(
conf参数)。 - 如果精确率高但召回率低:模型过于“保守”,很多真正的瑕疵没被检出。需要降低置信度阈值,或检查是否某类瑕疵样本太少,需要补充数据或使用更激进的数据增强。
- 查看混淆矩阵:如果“破洞”(hole)经常被误检为“污渍”(stain),说明这两类特征在视觉上可能相似,需要回头检查标注是否准确,或者考虑在特征提取层面让模型更好地区分它们。
4. 模型优化与部署实战
训练出一个指标不错的模型只是第一步,要让它在产线上稳定运行,还需要进行优化和封装。
4.1 模型导出与格式转换
训练完成后,我们需要将PyTorch模型(.pt)导出为更适合部署的格式。
from ultralytics import YOLO model = YOLO('runs/detect/exp1/weights/best.pt') # 加载最佳模型 # 导出为ONNX格式(通用性强) model.export(format='onnx', imgsz=640, simplify=True) # 如果需要,也可以导出为TensorRT格式(NVIDIA GPU极致性能) # model.export(format='engine', imgsz=640, device=0)ONNX导出详解:
simplify=True:会应用ONNX Simplifier对计算图进行优化,去除冗余操作,通常能减小模型体积并提升推理速度。- 导出后,务必使用
onnxruntime或Netron工具打开生成的.onnx文件,检查输入输出节点是否符合预期,确保导出成功。
4.2 基于ONNX Runtime的推理服务封装
在生产环境中,我们通常将模型封装成一个独立的推理服务。这里给出一个使用ONNX Runtime进行推理的Python服务核心代码示例:
import cv2 import numpy as np import onnxruntime as ort from typing import List, Tuple class KnitDefectDetector: def __init__(self, onnx_model_path: str, conf_threshold: float = 0.5, iou_threshold: float = 0.45): """ 初始化检测器 Args: onnx_model_path: ONNX模型文件路径 conf_threshold: 置信度阈值 iou_threshold: NMS的IoU阈值 """ self.conf_threshold = conf_threshold self.iou_threshold = iou_threshold # 创建ONNX Runtime会话 providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] # 优先使用CUDA self.session = ort.InferenceSession(onnx_model_path, providers=providers) # 获取输入输出信息 self.input_name = self.session.get_inputs()[0].name self.output_name = self.session.get_outputs()[0].name self.input_shape = self.session.get_inputs()[0].shape # 通常是[1, 3, 640, 640] def preprocess(self, image: np.ndarray) -> np.ndarray: """预处理:缩放、归一化、转换通道维度""" # 保持宽高比缩放,并在边缘填充灰色 h, w = image.shape[:2] target_size = self.input_shape[2] # 640 scale = min(target_size / h, target_size / w) new_h, new_w = int(h * scale), int(w * scale) resized_img = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_LINEAR) # 创建画布并填充 canvas = np.full((target_size, target_size, 3), 114, dtype=np.uint8) top = (target_size - new_h) // 2 left = (target_size - new_w) // 2 canvas[top:top+new_h, left:left+new_w, :] = resized_img # 转换:HWC -> CHW, BGR -> RGB, 归一化 canvas = canvas.transpose(2, 0, 1) # CHW canvas = canvas[::-1, :, :] # BGR to RGB canvas = canvas.astype(np.float32) / 255.0 # 归一化到[0,1] return np.expand_dims(canvas, axis=0) # 增加batch维度 -> [1,3,640,640] def postprocess(self, outputs: np.ndarray, original_shape: Tuple) -> List[dict]: """后处理:过滤低置信度框,NMS,坐标转换回原图""" predictions = outputs[0] # outputs形状通常是[1, 8400, 8+nc] # 过滤置信度 conf_mask = predictions[:, 4] > self.conf_threshold predictions = predictions[conf_mask] if predictions.shape[0] == 0: return [] # 分离框、置信度、类别概率 boxes = predictions[:, :4] scores = predictions[:, 4:5] * predictions[:, 5:].max(axis=1, keepdims=True) # 对象置信度 * 类别最大概率 class_ids = predictions[:, 5:].argmax(axis=1) # 执行NMS (使用OpenCV实现) indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.flatten().tolist(), self.conf_threshold, self.iou_threshold) results = [] if len(indices) > 0: for i in indices.flatten(): x_center, y_center, width, height = boxes[i] # 将归一化坐标转换回原图坐标(需要根据预处理时的缩放和填充进行逆变换) # ... 此处省略详细的坐标逆变换计算 ... results.append({ 'bbox': [x1, y1, x2, y2], # 转换后的原图坐标 'confidence': float(scores[i]), 'class_id': int(class_ids[i]), 'class_name': self.class_names[int(class_ids[i])] }) return results def detect(self, image_path: str): """主检测函数""" orig_img = cv2.imread(image_path) orig_h, orig_w = orig_img.shape[:2] # 预处理 input_tensor = self.preprocess(orig_img) # 推理 outputs = self.session.run([self.output_name], {self.input_name: input_tensor}) # 后处理 detections = self.postprocess(outputs, (orig_h, orig_w)) # 可视化结果(可选) for det in detections: x1, y1, x2, y2 = map(int, det['bbox']) cv2.rectangle(orig_img, (x1, y1), (x2, y2), (0, 255, 0), 2) label = f"{det['class_name']} {det['confidence']:.2f}" cv2.putText(orig_img, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) return detections, orig_img # 使用示例 if __name__ == '__main__': detector = KnitDefectDetector('best.onnx', conf_threshold=0.6) results, visualized_img = detector.detect('test_image.jpg') cv2.imwrite('result.jpg', visualized_img)4.3 性能优化技巧
在产线上,推理速度(FPS)和稳定性至关重要。
- 动态批处理:如果产线是多相机并行,可以在服务端实现动态批处理。将短时间内多个相机的请求图片组合成一个批次进行推理,能极大提升GPU利用率。
- 半精度推理:ONNX Runtime和TensorRT都支持FP16(半精度)推理,这通常能在精度损失极小的情况下(<0.5% mAP),将推理速度提升1.5-2倍,并减少显存占用。
- 模型剪枝与量化:
- 剪枝:移除模型中冗余的神经元或通道。可以使用训练好的YOLO模型,基于通道重要性进行稀疏训练和剪枝。
- 量化:将模型权重从FP32转换为INT8。ONNX Runtime提供静态量化工具。量化后的模型体积减小约75%,推理速度大幅提升,但对芯片的指令集有要求(需支持INT8运算)。
- 流水线并行:将预处理(CPU)、推理(GPU)、后处理(CPU)安排成流水线,使CPU和GPU同时忙碌,减少空闲等待时间。
5. 常见问题排查与避坑指南
在实际操作中,你一定会遇到各种各样的问题。下面是我踩过的一些坑和解决方案。
5.1 训练阶段问题
问题1:Loss(损失)不下降或震荡剧烈。
- 可能原因1:学习率(LR)设置不当。LR太大导致在最优解附近震荡,太小导致收敛缓慢。
- 排查:观察训练日志前几个epoch的loss变化。如果loss先降后猛增,可能是LR太大。
- 解决:使用学习率预热(Warmup)和余弦退火(Cosine Annealing)调度策略。YOLO内置了这些策略,确保
warmup_epochs和warmup_momentum参数已启用。
- 可能原因2:数据标注质量差。存在大量错误标注或模糊标注。
- 排查:使用YOLO提供的
val模式在训练集上跑一遍,查看预测结果和标注框的重合情况。如果模型在训练集上都表现很差,大概率是数据问题。 - 解决:对模型预测置信度低但标注存在的样本,以及模型预测置信度高但标注没有的样本进行人工复核,清洗标注数据。
- 排查:使用YOLO提供的
问题2:验证集mAP远低于训练集mAP。
- 可能原因:严重过拟合。模型只“记住”了训练集,而无法泛化到新数据。
- 排查:检查训练集和验证集的数据分布是否差异过大(如光照、布匹种类完全不同)。
- 解决:
- 增加数据增强的强度和多样性。
- 在模型结构中添加或加强正则化,如Dropout层(YOLO中通常已集成)。
- 使用更小的模型(如从
yolov11m换到yolov11s)。 - 如果数据集本身很小,考虑使用迁移学习,冻结骨干网络(Backbone)的前面几层,只训练检测头(Head)。
5.2 推理部署阶段问题
问题3:推理速度慢,达不到实时性要求(如30 FPS)。
- 排查步骤:
- 基准测试:使用
python -m onnxruntime.transformers.benchmark -m best.onnx对ONNX模型进行基准测试,看纯模型推理耗时。 - 性能分析:如果纯推理耗时符合预期,则瓶颈可能在数据预处理(图片解码、缩放)或后处理(NMS)上。使用Python的
cProfile模块或line_profiler工具定位耗时函数。
- 基准测试:使用
- 解决方案:
- 预处理优化:使用
cv2.imdecode从内存读取二进制图像数据,而非从磁盘读取文件。使用GPU加速的预处理库(如DALI)或CUDA实现自定义的预处理核函数。 - 后处理优化:NMS是CPU操作,可能成为瓶颈。可以尝试:
- 使用CUDA实现的NMS(如PyTorch的
torchvision.ops.nms)。 - 将多个检测框的后处理合并进行,减少循环次数。
- 使用CUDA实现的NMS(如PyTorch的
- 模型层面:如前所述,尝试FP16量化或INT8量化,或转换为TensorRT引擎。
- 预处理优化:使用
问题4:在特定光照或布种下,误检率飙升。
- 可能原因:模型学习的特征与光照/纹理强相关,而非瑕疵本身。
- 解决:这是工业场景的典型挑战——“域偏移”。
- 数据收集:在出现问题的工况下,重新采集一批数据(即使都是好布,也要采集)。
- 在线学习或微调:将新采集的数据作为一个小型数据集,在已训练好的模型上进行少量epoch的微调(Fine-tuning),注意此时要使用极小的学习率(如初始LR的1/10),并可能只解冻最后几层网络。
- 域自适应:如果无法获取新标注数据,可以考虑无监督域自适应技术,但实现较为复杂。
5.3 一个实用的调试检查清单
当模型效果不如预期时,可以按以下顺序排查:
| 排查环节 | 关键检查点 | 工具/方法 |
|---|---|---|
| 数据质量 | 1. 标注是否正确、一致? 2. 图像是否模糊、过曝、欠曝? 3. 训练/验证集分布是否一致? | 用LabelImg/CVAT复查标注;可视化数据加载器输出的图片和框 |
| 数据管道 | 1. 数据增强是否合理?是否过于激进? 2. 标签文件路径是否正确? 3. 类别索引是否从0开始且连续? | 检查dataset.yaml文件;打印一个batch的数据和标签查看 |
| 模型配置 | 1. 模型结构(yolov11s/m/l)是否匹配任务复杂度?2. 锚框(anchors)是否适合目标尺寸? 3. 超参数(LR, batch size)是否合理? | 使用model.info()查看模型;用聚类算法分析自有数据锚框 |
| 训练过程 | 1. Loss曲线是否正常下降? 2. 验证集指标是否随训练提升? 3. 是否有过拟合迹象? | 观察TensorBoard或Ultralytics内置的日志图表 |
| 推理部署 | 1. 导出的模型格式是否正确? 2. 预处理/后处理逻辑与训练时是否一致? 3. 置信度阈值(conf)和NMS阈值(iou)是否调优? | 用同一张图分别测试训练模型和导出模型的结果;绘制P-R曲线选择最佳阈值 |
最后,我想分享一点最深的体会:在工业AI项目中,算法模型只占成功因素的一部分,甚至可能不是最大的那部分。数据的质量、对业务场景的理解(比如哪种瑕疵是致命缺陷,哪种可以接受)、以及将模型与现有生产系统(如MES、PLC)无缝集成的工程能力,往往更为关键。这个“针织品瑕疵检测数据集”只是一个起点,真正让它产生价值的,是后续持续的数据迭代、模型优化和工程化打磨。希望这个从数据准备到模型落地的完整闭环经验,能帮助你少走些弯路。如果在复现过程中遇到具体问题,欢迎随时交流讨论。
本文还有配套的精品资源,点击获取
