
简介工业缺陷检测是保障产线安全高效运行的关键环节。在煤矿、港口、电厂等场景中传送带一旦发生纵向撕裂、横向裂纹或边缘磨损及时发现至关重要。基于深度学习的视觉检测技术凭借YOLOv11等目标检测算法可实现皮带表面缺陷的自动识别与早期预警。然而实际落地中模型效果高度依赖高质量数据集缺陷样本稀缺与标注不规范常成为瓶颈。本文针对传送带破损检测需求探讨如何基于700张原始图片构建规范的YOLOv11数据集涵盖采集、清洗、标注、格式转换与训练推理全流程并总结工程实践经验为工业视觉算法团队提供可复用的技术参考。 传送带在煤矿、港口、电厂、水泥厂这些场景里基本就是物料运输的生命线。皮带一旦出现纵向撕裂、横向裂纹或者边缘磨损没有及时发现的话轻则整条产线停机重则几百万的皮带直接报废甚至引发安全事故。所以现在越来越多的工厂在尝试用视觉检测系统去盯皮带让算法代替人眼做实时巡检、早期预警。但这类项目真正落地的时候第一个卡住团队的点往往不是模型选型而是数据集——工业现场的缺陷样本本身就少能用的标注数据更少模型再先进没有高质量数据喂进去也是白搭。这篇文章围绕一个实际项目展开用700张传送带皮带原始图片做成yolov11格式的标注数据集目标是训练一个能识别传送带表面破损、撕裂、裂纹等缺陷的检测模型。我不会只给一个“数据集下载”的链接就完事而是把从采图、清洗、标注、格式转换到训练推理的全流程拆开讲清楚包括我实际踩过的坑和总结下来的操作经验。适合谁看工业视觉算法工程师、做设备点检自动化的团队、还有刚学YOLO想上手一个真实项目的同学都可以把这套流程当作一个可以直接复用的模板。1. 项目整体设计与方案选型1.1 为什么选yolov11而不是yolov8或更早的版本先说模型选型。传送带破损检测属于典型的工业缺陷检测任务对实时性和部署便利性都有要求。早期项目很多用yolov5后来v8出来后性能进一步提升但真正让我在近期项目中切到yolov11的是它在几个方面的综合表现一是主干网络和颈部结构做了优化在相同算力下精度比v8有所提升二是ultralytics框架的接口统一训练、验证、导出、推理可以一条命令走完对工业项目来说这意味着维护成本低三是官方预训练权重在COCO上表现不错做迁移学习的时候起点更高。当然不是说v8不能用。如果你的场景对延迟极其敏感、部署硬件非常老旧v8也可能够用。但既然做的是新的数据集、新的项目没必要回头看直接用v11把baseline建好后面即使要降级到v8或者以后迁移到更新的版本数据集和标注格式都是通用的迁移成本极低。这也是我在方案选型时的一个原则优先选择生态完善、社区活跃、迭代路径清晰的框架而不是某个特定版本的极致性能。1.2 700张图片这个规模够不够用很多人一听到数据集只有700张第一反应是“这么少训练出来能准吗”。这个担心有道理但也不全对。工业缺陷检测和通用目标检测的本质区别在于你的目标类别非常集中场景变化范围相对有限。传送带的背景虽然各有不同但整体结构、纹理、光照条件比开放世界的检测任务要收敛得多。我做过类似的项目500到1000张的高质量标注图配合合理的数据增强策略完全能训练出一个在生产环境可用的检测模型。关键前提是这700张图的质量要足够高。我指的是三点缺陷的形态要覆盖全面纵向撕裂、横向裂纹、边缘破损、表面剥落都要有标注要精确框不能随便拉一个大框把整张图圈进去正负样本比例要控制好最好有一定比例的负样本正常皮带图片参与训练降低误检率。我在实际项目里遇到过一种情况客户提供的视频抽帧数据有3000多张但真正包含破损缺陷的只有不到200张其余全是正常皮带。如果直接把3000张全塞进去训练模型会严重偏向负样本输出结果里几乎不报缺陷。后来我把数据集重新洗了一遍保留缺陷样本再按1:5到1:8的比例混入正常样本训练效果立刻正常了。所以说700张图不是死数字数据分布比绝对数量更重要。1.3 缺陷类别怎么定义才科学标注之前必须先定类别。类别定义直接决定了标注的一致性也影响模型的学习效果。我在传送带破损检测项目里把缺陷分为四类这里也推荐给你参考类别ID类别名称形态描述典型样例0longitudinal_tear纵向撕裂沿皮带运行方向的裂口细长裂口边缘不规则1transverse_crack横向裂纹垂直于运行方向的裂纹短粗裂纹常出现在接头附近2edge_wear边缘磨损皮带侧边出现缺损边缘不齐、起毛、缺口3surface_peel表面剥落覆盖层局部脱落表面凹坑、露出织物层为什么这样分因为不同缺陷对皮带运行的影响程度和处理方式完全不同。纵向撕裂最容易导致整条皮带断裂必须停机处理横向裂纹可能是接头老化造成的需要重点关注边缘磨损一般还能坚持一段时间但要持续监测表面剥落往往是大面积损伤的前兆。如果你把所有这些形态统一标成“破损”一个类模型虽然也能学但输出信息量大大降低现场人员看到报警后还要自己判断严重程度效率会打折扣。另外要注意避免类别之间的边界模糊。比如说一个表面剥落区域旁边跟着一条细小的裂纹很多标注员会纠结这算两个目标还是一个目标我的建议是如果两个缺陷区域的间隔超过一个标注框的距离就标成两个独立目标如果完全粘连在一起就按主要缺陷类型标成一个框并在备注里记录这是复合缺陷。这个规则要提前写进标注规范文档里否则不同标注员的标准不一致后续模型训练效果会受影响。2. 数据采集与预处理2.1 采集环境对检测效果的影响有多大传送带破损检测的数据采集通常有两种方式固定点位安装工业相机连续拍摄以及巡检人员手持相机或者无人机进行周期性拍照。这两种方式采集到的图像特点差异很大直接影响标注和训练策略。固定点位拍摄的图像视角稳定、光照条件可控、背景固定模型训练起来比较容易因为训练集和测试集之间的分布差异很小。但固定点位通常只能拍到皮带的某一小段缺陷样本的获取效率低。巡检拍摄的优势是覆盖面广能拍到不同类型的缺陷而且更贴近实际巡检场景。缺点是视角、距离、光照变化很大模型泛化能力要求更高。我推荐的做法是两种方式都采集但分训练集和验证集时要保证两者数据分布基本一致。也就是说不要把固定点位拍的图全放进训练集、巡检拍的图全放进验证集否则验证集精度看起来不错实际上线部署时会掉得很厉害。我在项目里会把两种来源的图片混合后按比例随机划分这样模型学到的是缺陷本身的特征而不是某个拍摄环境的特征。光线条件也要注意。传送带现场往往有较强的环境光、粉尘和逆光情况。采集时尽量保证皮带表面纹理清晰可见避免光源直射镜头造成大面积反光。如果条件允许加一个柔和光源或者调整拍摄角度减少反光区域。对于实在无法避免的逆光图片通过后期增强处理来补偿而不是直接删掉——因为现场部署时模型一定会遇到这种条件提前让模型见过这些脏数据反而更有利于上线后的稳定表现。2.2 图片分辨率怎么选图片分辨率是影响检测精度的关键因素之一。破损缺陷属于小目标尤其是横向裂纹和边缘磨损在720p的图片里可能只有几十个像素宽。检测网络在特征提取时小目标经过多层下采样后特征几乎丢失因此分辨率过低会直接导致漏检。我在这个项目里的经验是训练集图片分辨率最好不低于1280x720推理时建议使用imgsz1280尺度。如果原始图片是1920x1080或更高分辨率训练时可以直接用原图resize到1280x1280或者使用1280x640的非正方形拉伸注意这会改变长宽比但yolov11在检测中通常会做letterbox处理所以训练时统一用正方形输入就好。这里有个权衡分辨率高了计算量会显著增加。在GPU资源有限的情况下可以考虑用小分辨率先跑通流程再在所有环节验证通过后提高分辨率进行最终训练。我的习惯是先用640x640做快速实验确认数据、标注、配置都没有问题后再用1280x1280正式训练这样省时间也省算力。2.3 图像清洗的具体标准拿到原始图片后不要急着标注先做一轮清洗。这个环节看起来简单但偷懒的话后面会花好几倍的时间来填坑。我的清洗原则是四步去除无效图片明显虚焦的、镜头被遮挡的、大面积过曝或欠曝的图片直接删除。这些图片即使标注了模型也学不到有效特征反而可能产生错误关联。去除重复图片连续视频抽帧会产生大量几乎相同的相邻帧保留缺陷最清晰的一帧即可。过多的相似样本会让模型对特定位置产生过拟合而忽略缺陷本身的形态变化。检查缺陷可见程度有些图片虽然有缺陷但缺陷区域过小或者被遮挡肉眼都很难判断这类图片建议删除。标注员如果都看不清模型更不可能学好。统一格式与命名转成JPG格式大小合适且通用分辨率统一按最接近的宽度保存文件命名用类似tear_001.jpg、crack_002.jpg的格式方便后面的切割和标注。命名规范建议与类别关联但要注意不要因为文件名带类别就跳过对标签的最终核对。我踩过的一次坑是文件重新命名后标注软件生成的XML里的文件名和实际文件名不一致导致后续格式转换脚本找不到对应的图片整个流程卡了很久。所以洗完图之后一定要检查一遍文件名的匹配情况。3. 数据标注实操3.1 标注工具选哪个yolov11采用ultralytics框架训练数据要求的是YOLO格式的txt标注文件但标注过程不一定非得直接用txt编辑器去写坐标那样效率太低而且容易出错。我建议使用图形化标注工具标完再通过脚本转换成YOLO格式。目前常用的标注工具大致有这几类工具适合场景输出格式备注LabelImg单机快速标注PASCAL VOC XML、YOLO txt老牌轻量适合小项目Labelme多边形标注JSON需要多边形时用比如分割任务X-AnyLabeling单机进阶标注VOC、YOLO、COCO等支持AI辅助标注效率高CVAT团队协作标注多格式导出Web版适合多人并行标注如果你是自己一个人做700张图的小项目我推荐直接用LabelImg或者X-AnyLabeling。LabelImg的优势是简单直接安装后就能上手X-AnyLabeling的优势是内置了自动标注模型可以先让模型粗标一遍然后人工修正对于缺陷不太复杂的情况效率能提升不少。如果是团队协作且图片量大CVAT更合适它能做到多人在线标注、任务分配和审核留痕。但要注意CVAT的部署和维护成本小团队用起来会有点重。3.2 标注框的边界怎么定YOLO格式的标注框是水平矩形框用中心点坐标和宽高表示。但传送带破损缺陷往往是不规则的有时候是长条形撕裂有时候是块状剥落。怎么用矩形框标不规则目标是有讲究的。我总结下来有三条原则矩形框要紧贴缺陷的轮廓框的上边、下边、左边、右边都尽量贴合缺陷的外边界不要为了省事留太多背景。对于长条形撕裂如果撕裂宽度很窄矩形框会变成一条很扁的长条这种框在训练时是可以接受的因为网络会学习到目标的物理形态。但要注意框的宽度不能太极端如果宽度只有几个像素经过缩放后会很容易丢失建议在原始图上放大确认后再标注。对于边缘不清晰的缺陷比如表面剥落的边界比较模糊标注时可以稍微收窄一点宁可框略小于缺陷也不要框得太大把很多正常纹理包进去。因为框大了里面的负样本特征也会被当成正样本学进去增加模型的误检倾向。这里还要强调一个点破损缺陷的矩形框如果出现交叉重叠比如两个缺陷靠得很近在YOLO格式下是允许的一张图片里可以有多个目标的标注框它们之间可以重叠。但重叠过多会导致训练时一个anchor同时匹配到两个目标影响收敛效果。最佳实践是如果两个缺陷高度重叠且边界无法区分标注为一个框如果边界基本清晰就分两个框。3.3 标注完成后的质检流程标注完成不等于数据可用。我在项目里规定标注完成后必须执行一轮质检通常分两个阶段。第一阶段是漏标检查。逐张快速浏览图片确认每个可见缺陷都有对应的标注框。这个阶段容易出现的问题是边缘部分的破损、对比度较低的裂纹、以及跨图片边界的目标容易被忽略。强烈建议在原始分辨率下检查不要用缩小后的视图。第二阶段是框精度检查。随机抽取20%以上的标注结果放大查看框是否紧贴目标、类别标签是否与缺陷类型一致、是否存在误标比如把油渍、水渍、皮带接头纹理当成破损。如果抽检结果中误标率超过2%说明标注规范执行不到位需要让标注员修正后重新抽检。我自己的习惯是先标完全部图片后隔一天再质检一遍。刚标完的时候大脑会有惯性容易忽略自己的错误隔一段时间再来检查能发现很多之前没注意到的问题。这个习惯帮我在项目交付前避免过好多低级失误。4. yolov11格式转换与数据集组织4.1 YOLO标注格式到底长什么样先讲清楚YOLO格式的核心规则这是很多人第一步就搞错的地方。YOLO格式的标注文件是纯文本的txt文件每一行描述一个目标格式为class_id center_x center_y width height其中class_id是从0开始的整数类别编号center_x、center_y是目标中心点相对于图片宽高的比例坐标width、height是目标宽高相对于图片宽高的比例。所有坐标值都在0到1之间是归一化后的浮点数。举个例子一张宽1280、高720的图片标注一个纵向撕裂缺陷标注框左上角坐标为(400, 200)右下角坐标为(600, 500)那么中心点坐标是((400600)/2, (200500)/2) (500, 350)相对坐标是(500/1280, 350/720) (0.3906, 0.4861)宽是600-400200相对宽为200/12800.1563高是500-200300相对高为300/7200.4167。最终txt中的一行就是0 0.3906 0.4861 0.1563 0.4167需要注意的是如果图片经过letterboxing处理也就是在YOLO训练时对图片进行缩放和填充标注坐标不会改变因为坐标是相对于整张图片的。训练时yolov11会自行处理letterbox数据集的标注文件只需要按原图坐标计算即可。4.2 数据集目录结构怎么组织ultralytics框架默认的数据集目录结构是dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练图片对应的txt标注 │ └── val/ # 验证图片对应的txt标注 └── data.yaml # 数据集配置文件注意images和labels两个目录下的文件必须一一对应同名。比如images/train/tear_001.jpg对应labels/train/tear_001.txt。如果你没有给某张图片标注任何目标负样本对应的txt文件应该存在但内容为空。不要省略这个txt文件否则框架可能报错或者无法准确对齐图像和标签。在ultralytics里你还可以使用一个更简单的目录组织方式只提供images路径框架会自动从labels字段推断标签路径但前提是目录结构严格一致。为了保险起见我建议显式指定labels路径。4.3 从VOC或Labelme格式转换的脚本如果你用LabelImg标注并保存为VOC XML格式或者用Labelme保存为JSON格式转换到YOLO格式是必须的一步。这里我给出一份Python脚本处理Labelme JSON转YOLO txt的场景同时自动完成数据集划分。import json import os import random import shutil from pathlib import Path # 配置路径 labelme_json_dir Path(path/to/labelme_jsons) image_dir Path(path/to/images) output_dir Path(path/to/dataset) train_ratio 0.8 # 类别映射 class_map { longitudinal_tear: 0, transverse_crack: 1, edge_wear: 2, surface_peel: 3 } def convert_labelme_json(json_path, image_width, image_height): 将单个Labelme JSON转换为YOLO格式的字符串列表每行一个目标 with open(json_path, r, encodingutf-8) as f: data json.load(f) yolo_lines [] for shape in data[shapes]: label shape[label] if label not in class_map: continue points shape[points] # Labelme的点集通常为[左上, 右下]或任意多边形 xs [p[0] for p in points] ys [p[1] for p in points] x_min, x_max min(xs), max(xs) y_min, y_max min(ys), max(ys) # 计算归一化坐标 cx ((x_min x_max) / 2) / image_width cy ((y_min y_max) / 2) / image_height w (x_max - x_min) / image_width h (y_max - y_min) / image_height yolo_lines.append(f{class_map[label]} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) return yolo_lines def main(): # 创建输出目录 for split in [train, val]: (output_dir / images / split).mkdir(parentsTrue, exist_okTrue) (output_dir / labels / split).mkdir(parentsTrue, exist_okTrue) # 获取所有JSON文件 json_files list(labelme_json_dir.glob(*.json)) random.seed(42) random.shuffle(json_files) split_idx int(len(json_files) * train_ratio) train_files json_files[:split_idx] val_files json_files[split_idx:] for json_path, split in [(f, train) for f in train_files] [(f, val) for f in val_files]: # 从JSON中解析图片宽高 with open(json_path, r, encodingutf-8) as f: data json.load(f) image_w data[imageWidth] image_h data[imageHeight] img_name Path(data[imagePath]).name src_img_path image_dir / img_name if not src_img_path.exists(): print(f警告图片不存在 {src_img_path}) continue # 拷贝图片到对应split dest_img_path output_dir / images / split / img_name shutil.copy(src_img_path, dest_img_path) # 生成标注txt yolo_lines convert_labelme_json(json_path, image_w, image_h) txt_name json_path.stem .txt dest_txt_path output_dir / labels / split / txt_name with open(dest_txt_path, w, encodingutf-8) as f: f.write(\n.join(yolo_lines)) # 生成data.yaml yaml_content f path: {output_dir.resolve()} train: images/train val: images/val names: 0: longitudinal_tear 1: transverse_crack 2: edge_wear 3: surface_peel with open(output_dir / data.yaml, w, encodingutf-8) as f: f.write(yaml_content) print(转换完成) print(f训练集图片数: {len(train_files)}) print(f验证集图片数: {len(val_files)}) if __name__ __main__: main()这个脚本核心逻辑并不复杂但有几点提醒第一如果某些图没有缺陷Labelme JSON中的shapes为空数组脚本不会生成任何YOLO行最终txt内容为空——这是正常的不要删除这个txt保留空文件即可。第二如果你的标注工具比如LabelImg的VOC模式输出的是XML你需要把XML解析代码换成xml.dom.minidom或lxml来读取VOC的bndbox节点里存的是xmin、ymin、xmax、ymax计算归一化坐标的公式一样。4.4 数据增强策略与注意点训练YOLO模型时ultralytics框架默认已经开启了不少数据增强策略包括随机翻转、HSV色域扰动、马赛克增强Mosaic、随机透视变换等。这些默认策略对小数据集非常友好相当于免费扩充了训练多样性和样本数量。但是传送带缺陷检测有一个特殊点缺陷形态和纹理高度相关有些增强操作需要谨慎。比如随机透视变换在通用目标检测里效果不错但对于传送带这种表面有规律纹理的目标透视变换可能会把纹理的走向扭曲反而让模型学到不真实的缺陷形态。我的经验是在数据量不太充足的情况下保守使用几何类增强可以关闭或降低透视变换强度同时加强HSV颜色扰动和随机翻转。另外Mosaic增强是yolov11训练中默认开启的它会把4张图拼接成一张对提升小目标检测能力很有帮助。但Mosaic生成的图片中目标框会被裁剪和拼接如果缺陷本身比较小拼接后缺陷可能会被切碎导致难以识别。ultralytics中可以通过ultralytics.cfg配置文件里的mosaic参数控制开启概率训练时如果发现小缺陷的召回率一直上不去可以考虑关掉Mosaic再试一轮对比效果。5. 基于yolov11的训练与推理5.1 环境搭建和常用指令环境配置这块其实是很多新手最头疼的。在这里把关键步骤列出来照着操作即可。我用的是Anaconda Python 3.10 CUDA 11.8的组合这个组合目前跑yolov11非常稳定。# 创建虚拟环境 conda create -n yolo11 python3.10 -y conda activate yolo11 # 安装PyTorch根据你的CUDA版本选择合适的安装命令 # CUDA 11.8 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装ultralyticsyolov11的官方框架 pip install ultralytics # 验证安装 yolo version安装完成后可以用一行命令快速检测一张测试图片验证环境是否正常yolo predict modelyolo11n.pt sourcetest.jpg如果这一步能正常输出检测结果图片说明环境没问题可以开始训练了。我建议新手把ultralytics的文档存下来遇到参数不确定的时候直接查文档比在群里问人效率高得多。5.2 准备data.yaml文件训练前需要先写好data.yaml告诉框架数据集在哪、类别是什么。这个文件是整个训练流程的入口写错了训练直接报错或者效果很差。# data.yaml path: /home/user/dataset # 数据集根目录的绝对路径 train: images/train # 相对path的训练图片目录 val: images/val # 相对path的验证图片目录 # test: images/test # 测试集目录可选 names: 0: longitudinal_tear 1: transverse_crack 2: edge_wear 3: surface_peel注意path字段建议写绝对路径。写成相对路径的时候ultralytics会基于当前工作目录去匹配容易出现找不到图片的情况。还有一个容易踩坑的地方是训练时如果你把数据集放在别的目录下但data.yaml里的path写的是之前的路径训练会直接报错提示找不到图片。所以每次数据集移动位置后记得同步更新data.yaml里的path。5.3 训练命令与关键参数数据准备好了就可以开始训练。这是我实际用来训练传送带破损检测模型的命令yolo detect train \ modelyolo11s.pt \ datadata.yaml \ imgsz1280 \ epochs200 \ batch16 \ patience30 \ projectruns/detect \ nameconveyor_belt_tear \ device0 \ optimizerAdamW \ lr00.001 \ weight_decay0.0005 \ valTrue参数说明model这里指定的是yolo11s.pt预训练权重与从头训练使用yolo11s.yaml不同。使用预训练权重做迁移学习训练速度更快、收敛更稳定。imgsz输入图片尺寸我选择了1280。前面说过破损缺陷是小目标大输入尺寸有助于保留更多细节。如果你的GPU显存不够低于8GB可以先降到640跑通流程后续资源充足了再上1280。epochs200轮。工业数据集通常epochs不用太多配合早停机制可以自动停止。patience30轮验证集指标没有提升就早停。这个参数防止过拟合并节省时间。batch16根据显存调整。如果OOM就降到8或者4。optimizer我习惯用AdamW收敛快适合中小数据集。如果是大数据集SGD也能用两者差距不算大。lr0初始学习率0.001。对迁移学习来说这个值比较稳妥不会因为太大导致原有特征被破坏。训练过程中终端会实时打印每个epoch的loss、P、R、mAP50、mAP50-95等指标。如果loss一直在降mAP也在稳步上升说明训练正常不用人为干预。直到patience触发或者epochs跑完训练结束最佳权重保存在runs/detect/conveyor_belt_tear/weights/best.pt。5.4 如何判断模型效果是否合格训练结束后很多人只看一个mAP50就觉得万事大吉这是不对的。工业缺陷检测场景里我更关注两类指标召回率Recall和误检率Precision的互补项。漏检一个破损可能导致整条皮带报废而误检过多会让人失去对报警系统的信任。我在实际项目中的判断标准是mAP50 达到 0.85 以上说明整体检测精度可以接受召回率不低于 0.90确保绝大多数破损能被发现误检率控制在 1% 以内也就是每100个正常画面中不超过1次假报警。如果这些指标没达到先不要急于调参而是回到数据本身问三个问题缺陷样本数量是否足够标注框是否准确类别定义是否清晰我遇到过很多次模型精度上不去最后发现是标注阶段某个类别的框画得太松、包含了过多背景导致的。重新修正标注后同样配置的模型指标能提升五六个百分点。5.5 推理结果保存与部署训练完成后需要将模型应用到实际推理。yolov11推理命令非常简洁yolo predict \ modelruns/detect/conveyor_belt_tear/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrue \ save_txtTrueconf参数是置信度阈值低于这个值的预测结果会被过滤掉。在缺陷检测场景中阈值设置取决于你对漏检和误检的容忍度。如果你更怕漏检把conf降到0.15甚至0.1但误检会相应增加如果你更怕误检干扰操作人员可以设到0.35以上。建议在验证集上做一次阈值扫描选择Precision和Recall平衡点对应的阈值作为默认值。saveTrue会保存标注了检测框的图片save_txtTrue会把检测结果导出为txt文件。txt的每一行格式是类别ID、置信度、x1、y1、x2、y2像素坐标这是后续部署时做业务逻辑处理最常用的格式。部署到实际生产环境时我推荐将模型导出为ONNX再使用TensorRT推理速度和精度都能得到优化。导出命令yolo export modelbest.pt formatonnx imgsz1280导出ONNX后可以用onnxruntime或TensorRT部署到NVIDIA Jetson系列设备或GPU服务器上。如果是现场没有GPU、只有CPU控制器的情况ONNX Runtime的CPU推理也可以跑但速度会明显慢一些需要根据皮带运行速度评估是否满足实时性要求。6. 常见问题与排查技巧实录6.1 标注文件与图片对不上我碰到过的最典型的问题是训练时报错“Found no valid images for the indicated train split”或者提示缺少labels文件。这种问题多半是目录结构不对或文件名不匹配。排查步骤很简单打开data.yaml确认path指定的是数据集根目录检查images/train和labels/train下的文件是否一一对应确认图片是jpg、png等常见格式标签是txt且两者文件名不含扩展名完全一致检查txt内容是否为空文件空文件是允许的但如果txt不存在训练时就会跳过对应图片。还有一个坑Windows下数据集路径带中文或者空格可能导致读取失败。解决办法是尽量用英文字符命名所有目录和文件。6.2 训练时loss不降或mAP为0loss不降这个问题的排查顺序是检查标注是否可靠随机抽取20张图用可视化脚本把标注框画到图片上肉眼确认框和类别没有明显错误。检查类别映射是否一致比如标注时类别0是longitudinal_teardata.yaml里names[0]也必须对应longitudinal_tear否则模型学习的标签语义就乱了。检查学习率是否合适初始学习率太高会导致loss震荡不收敛太低会收敛极慢。按我给出的命令lr0设0.001通常不会有问题。检查是否存在标签全部为空的情况如果训练集中大量图片没有标签模型容易偏向预测“没有目标”导致P、R都很低。mAP为0或者一直很接近0还有一种常见情况验证集里某个类别在训练集里一个样本都没有。比如训练集里的edge_wear只有3个样本但验证集里却有20个模型在训练时几乎没见过这个类自然无法识别。解决方法是按类别分层划分数据集确保每个类别在训练集和验证集中的比例大致相同。6.3 小目标破损漏检严重漏检是传送带检测项目里最头疼的问题。如果你发现纵向撕裂这种长条形小目标容易被漏检可以从三个方向优化提高输入分辨率imgsz从640提升到1280通常能立竿见影地改善小目标检测效果。增加小目标样本不要只拍整条皮带的远景图凑近拍一些缺陷特写让模型看到更多“近距离”的缺陷形态。调整预测置信度阈值推理时把conf调低例如从0.25降到0.15召回率会上升代价是误检增加需要结合业务取舍。6.4 把皮带正常纹理误判为破损误检问题通常源于训练数据中缺少“难负样本”。模型没见过长得像裂纹的正常纹理自然容易误判。解决方法很直接往数据集中加入一定比例的负样本图片正常皮带、有接头纹理的、有油渍水渍的这些图片的标注txt文件为空。模型在训练中会看到“这些区域虽然没有标注框但它们是正常的”这一信息从而降低误检率。负样本比例不需要太高占到训练集的10%到20%就够。我从一个项目中得到的经验是加入15%的正常皮带图片后误检次数从每100帧七八次降到了每100帧不到一次。6.5 显存不足怎么办如果你用的是8GB显存的显卡训练1280x1280输入、batch16很容易爆显存。解决办法有几种调小batch比如batch4或2使用梯度累积功能ultralytics中可以通过batch16和nbs64来实现等效大batch效果降低输入尺寸先用640训练验证流程正确后再根据显存能力尝试更高分辨率使用更小的模型版本比如yolo11n.pt代替yolo11s.pt参数量更少训练显存占用更低。6.6 结果输出坐标怎么用到业务系统里最后补充一个容易被忽略的点推理输出的坐标是像素坐标但在实际业务系统中比如监控大屏、报警系统、控制PLC可能需要换算成实际物理坐标或者归一化坐标。yolov11的detect输出的是像素坐标左上角和右下角如果你需要的是归一化坐标用输出坐标除以图片宽高即可。我在项目里会把检测结果写入数据库并实时推送到监控看板字段包括时间戳、摄像头ID、缺陷类别、置信度、检测框坐标和对应的截图路径。这样现场人员能快速定位问题同时为后续分析提供数据支撑。7. 后续可以怎么扩展用到这个程度baseline已经立住了。但如果想进一步提升效果或者把这个检测能力复制到其他产线、其他设备上有两条扩展路径值得考虑一条是缺陷定位的精细化升级。目前是检测框定位只能告诉你破损大概在哪个区域。如果需求是要知道破损的精确面积、形态、长度建议升级到实例分割用yolov11-seg训练多边形分割模型。标注时需要用多边形勾画缺陷轮廓而不是用矩形框。这样做的好处是不仅能检测缺陷还能输出缺陷的面积和周长信息对评估损坏程度非常有价值。另一条是多点位巡检和连续监测。单张图片的检测只能发现“当前画面里有没有破损”但如果要评估破损的扩展速度需要把检测结果按时间序列关联起来。比如每10分钟对同一位置拍照检测将检测框位置对齐后计算缺陷面积变化趋势就能实现破损扩展示警。这个方向结合时序数据分析能做出更有业务价值的功能。我做这个项目时最大的体会是工业视觉项目的瓶颈往往不在算法而在数据质量。700张图听起来不多但是如果把采集、清洗、标注、质检每一步都做扎实训练出来的模型完全能拉到现场用。反过来数据集质量不过关哪怕给一万张图、用最牛的模型效果也未必好到哪里去。最后再分享一个小技巧训练后把best.pt在训练集上做一次回验看看模型能不能完美检测出所有训练样本。如果训练集上都有漏检说明标注有错或者数据增强过度如果训练集全对但验证集效果差说明存在过拟合需要增加数据或者正则化强度。这个简单的回验操作能帮你快速定位大部分训练效果不佳的原因。本文还有配套的精品资源点击获取