YOLOv10工业缺陷检测实战:5步把实时检测流程部署到产线
【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10
一段传送带视频进来,缺陷的位置和数量出来——这就是我接下来要搭的流水线。全程用 YOLOv10 完成工业缺陷检测与目标计数:先拿自己的缺陷数据训练模型,再按区域数出缺陷个数,最后打包进容器,直接部署上产线。
🚀 为什么 YOLOv10 适合产线质检?
YOLOv10 免 NMS 后处理、端到端出结果,单帧延迟小且抖动小,产线节拍更稳。
- 🧩推理链路短:传统检测器先吐出一堆候选框,再用 NMS(对重复检测框去重)筛掉冗余。这一步在 CPU 上执行、耗时不固定,帧间延迟会抖。YOLOv10 在训练阶段就把"选哪个框"学进了网络,导出的 ONNX / TensorRT 引擎也是端到端结构,整条链路少一个后处理环节。
- ⚡延迟低:官方 COCO 数据(640 输入、导出格式):YOLOv10-N 单张 1.84ms、YOLOv10-S 2.49ms、YOLOv10-M 4.74ms。纯 CPU 工控机喂 25fps 的产线相机,n/s 规格绑绑有余。
- 📦部署路径全:PyTorch 权重、ONNX、TensorRT engine、Docker 镜像都有对应流程,边缘设备(如 Jetson)也有现成 Dockerfile 可参考。
| 规格 | 参数量 | AP (COCO) | 单张延迟 |
|---|---|---|---|
| YOLOv10-N | 2.3M | 38.5% | 1.84ms |
| YOLOv10-S | 7.2M | 46.3% | 2.49ms |
| YOLOv10-M | 15.4M | 51.1% | 4.74ms |
⚙️ 从克隆到第一次跑出结果
环境好不好,跑通一张测试图就知道了——框能落对位置,就只剩换数据这一件事。
- 拉仓库:
git clone https://gitcode.com/GitHub_Trending/yo/yolov10,然后cd yolov10。 - 装依赖:建议 conda 隔离环境,
conda create -n yolov10 python=3.9 -y激活后执行pip install -r requirements.txt,再pip install -e .,后者会注册yolo命令行入口。 - 加载权重:YOLOv10 提供 n/s/m/b/l/x 六档,n 最轻。官方预训练权重在 Hugging Face 上,标识为
jameslahm/yolov10n这类,框架会自动下载。 - 跑一张图验证:
yolo predict model=jameslahm/yolov10n source=ultralytics/assets/zidane.jpg。
仓库自带的这张测试图,就是验证推理是否正常的标的:
📦 把你的缺陷数据接进来
数据集 yaml 就是一份"目录":告诉框架数据在哪、类别叫什么,其余按默认约定摆放。
目录结构沿用默认布局:images/与labels/各放train、val子目录,标注文件是每张图一个同名的.txt(框的归一化坐标)。yaml 里只写四样东西——path(数据根目录)、train/val(两个集合)、names(类别名列表)。格式直接照 ultralytics/cfg/datasets/coco.yaml 抄,把 80 个 COCO 类别换成你的划痕、凹坑、缺料即可。
训练命令就一行:
yolo detect train data=defect.yaml model=yolov10n.pt epochs=100 batch=16 imgsz=640参数逐个说:
epochs:训练集完整过多少轮。缺陷样本通常几千张量级,100 轮足够看出收敛趋势。batch:每卡一次喂多少张。显存紧张就调小,速度不受影响,只影响单次更新的样本量。imgsz:输入分辨率。缺陷偏小时提到 1280 能换召回,代价是帧率下降。model:填.pt是拿预训练权重微调,收敛快;想从零训练则换成ultralytics/cfg/models/v10/下的结构配置(yolov10n.yaml 至 yolov10x.yaml),按产线算力和精度需求选档。
🔢 怎么数出"几个缺陷"
区域计数靠的是跟踪 ID 判断进出,不是把每帧的框简单相加。
检测回答"哪里有",产线报表要的是"有几个"。难点在去重:同一处缺陷连续几十帧都在画面里,直接累加框数会翻几十倍。所以需要给每个缺陷分配持久 ID,也就是跟踪。仓库自带 ObjectCounter,实现见 ultralytics/solutions/object_counter.py:传入若干多边形顶点圈定区域,它用 shapely 判断每个框的中心是否落入区域,按 track ID 记进出事件并累计。
import cv2 from ultralytics import YOLOv10 from ultralytics.solutions import ObjectCounter model = YOLOv10("yolov10n.pt") # 加载训练好的权重 counter = ObjectCounter() counter.set_args(classes_names=model.names, reg_pts=[(20, 400), (1260, 400), (1260, 20), (20, 20)]) # 计数区域四个顶点 cap = cv2.VideoCapture("defect.mp4") while cap.isOpened(): ok, frame = cap.read() if not ok: break tracks = model.track(frame, persist=True, show=False) # 获取跟踪ID frame = counter.start_counting(frame, tracks) # 按区域计数 cv2.imshow("counting", frame) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release()reg_pts给 2 个点是直线计数(数过线次数),3 个及以上是区域计数(数进出区域次数)。交互式画区域的完整示例在examples/YOLOv8-Region-Counter/readme.md,鼠标拖拽就能调区域。
🏭 上产线:导出与容器化部署
部署先锁两件事:模型形态锁定(ONNX/TensorRT),运行环境锁定(容器)。
- 先导出。ONNX 是跨平台的模型格式,导出一次后,任何硬件都能挂对应的推理后端:
yolo export model=yolov10n.pt format=onnx simplify。 - 有 NVIDIA GPU 的工位直接构建 TensorRT 引擎(NVIDIA 的推理加速运行时):
yolo export model=yolov10n.pt format=engine half=True simplify,FP16 下比 ONNX 再快一截。 - 容器化:
docker/目录下按硬件拆了 Dockerfile(cpu、jetson、conda 等),选对文件即可。纯 CPU 质检主机用 Dockerfile-cpu:
docker build -f docker/Dockerfile-cpu -t yolov10-defect . docker run -it --rm -v $(pwd):/app yolov10-defect选型思路一句话:有 GPU 上 TensorRT engine,边缘板卡(Jetson 类)用对应 Jetson 镜像并开 FP16/INT8,纯 CPU 服务器则 ONNX + n/s 规格起步,吞吐富余时再换更大规格换精度。
🛠️ 常见问题与求助渠道
卡住了先查 FAQ,再提 issue;多数"模型 bug"其实是环境和数据的问题。
- 🎥视频读帧失败(
cv2.VideoCapture返回空):八成是编码问题。产线相机常出 H.265 或 RTSP 流,OpenCV 默认解码器未必吃,先把第一帧存成 PNG 验证能否打开,再决定换 ffmpeg 后端还是转封装。 - 🐢权重下载慢:预训练权重来自 Hugging Face,内网机器建议提前镜像到公司 OSS 或 NAS,
model=指向本地文件路径即可,后面所有流程都不受影响。 - 🔍小缺陷检不出:官方建议调低置信度阈值,同时把
imgsz调大或换 m/l 规格;注意阈值放太松会引入误报,要和计数逻辑一起看效果。
高频问题汇编在 docs/en/help/FAQ.md;仍解决不了时走项目 issue 渠道,附上最小可复现示例(一张图 + 一条命令 + 报错全文),定位会快很多。数据标注扎实、环境干净,这条流水线从演示走到产线,中间不该有太多意外。
【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考