YOLOv8模型实战:从零构建高精度竹签自动计数系统

张开发
2026/4/8 1:34:08 15 分钟阅读

分享文章

YOLOv8模型实战:从零构建高精度竹签自动计数系统
1. 为什么需要竹签自动计数系统在竹制品加工厂、餐饮后厨或手工艺品作坊里每天都要处理成百上千根竹签。传统人工计数不仅效率低下还容易因疲劳导致误差。我曾经见过一个质检员连续数了3小时竹签后计数结果开始出现10%以上的偏差。而使用YOLOv8构建的自动计数系统可以在0.1秒内完成单张图像的准确计数误差率能控制在1%以内。这个系统的核心优势在于24小时稳定工作不会因为工作时间长就降低准确率批量处理能力单次可以处理整筐竹签的俯拍图像成本效益高一套系统可以替代3-5个专职计数员2. 环境配置与工具准备2.1 基础环境搭建我推荐使用Python 3.8和PyTorch 1.12的组合这个版本组合在测试中表现最稳定。下面是具体安装命令conda create -n yolo_count python3.8 conda activate yolo_count pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113注意如果使用GPU训练务必安装对应CUDA版本的PyTorch。可以通过nvidia-smi命令查看显卡支持的CUDA版本。2.2 YOLOv8专用环境Ultralytics官方推荐使用最新版的ultralytics包pip install ultralytics pip install labelImg # 用于后续数据标注我测试过多个版本发现ultralytics-8.0.206在计数任务上表现最好可以使用指定版本安装pip install ultralytics8.0.2063. 数据集制作与处理技巧3.1 数据采集实战经验好的数据集是模型成功的关键。经过多次尝试我总结出几个采集要点拍摄角度保持相机垂直于竹签平面距离50-80cm最佳光照条件避免强光直射造成反光阴天自然光效果最好背景选择使用纯色背景建议深蓝色与竹签颜色形成鲜明对比我通常会采集以下场景数据整齐排列的竹签训练模型识别单个目标交叉堆叠的竹签提高模型抗干扰能力不同光照条件下的竹签增强模型鲁棒性3.2 数据标注的坑与解决方案使用labelImg标注时要注意几个细节标注框要完全包含竹签但不要留太多空隙对于交叉竹签按照可视部分标注每个图像保存为YOLO格式的txt文件这里有个实用脚本可以检查标注是否正确import cv2 import os image_dir dataset/images/train label_dir dataset/labels/train for img_name in os.listdir(image_dir): img_path os.path.join(image_dir, img_name) label_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: for line in f: cls, x, y, w, h map(float, line.strip().split()) # 转换为像素坐标 x1 int((x - w/2) * w) y1 int((y - h/2) * h) x2 int((x w/2) * w) y2 int((y h/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) cv2.imshow(check, img) if cv2.waitKey(0) ord(q): break4. 模型训练与调优策略4.1 关键配置文件修改需要修改两个核心yaml文件数据集配置文件mycoco.yamlpath: /path/to/your/dataset train: images/train val: images/val names: 0: bamboo_skewer模型配置文件myyolov8.yaml# 参数 nc: 1 # 只有竹签一个类别 depth_multiple: 0.33 # 控制模型深度 width_multiple: 0.50 # 控制通道数4.2 训练参数详解这是我经过多次实验得出的最优参数组合from ultralytics import YOLO model YOLO(yolov8n.pt) # 使用预训练权重 results model.train( datamycoco.yaml, epochs100, batch16, imgsz640, patience10, device0, # 使用GPU optimizerAdamW, lr00.001, weight_decay0.0005 )关键参数说明patience10如果10个epoch验证集指标没有提升就提前停止imgsz640输入图像尺寸太大容易OOM太小影响精度AdamW优化器比默认SGD更适合小数据集4.3 训练过程监控训练开始后重点关注这几个指标指标名称健康范围说明mAP0.50.95竹签检测的主要指标precision0.97避免误检其他物体recall0.96避免漏检竹签如果发现过拟合训练集指标远高于验证集可以增加数据增强参数减小模型复杂度提前停止训练5. 模型部署与性能优化5.1 生产环境部署方案对于工厂环境我推荐使用ONNX格式部署from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) model.export(formatonnx, imgsz[640,640], dynamicFalse)部署时注意使用TensorRT加速能提升3-5倍速度开启半精度模式FP16批量处理图像提高吞吐量5.2 计数算法实现这是改进版的计数代码解决了密集场景下的重复计数问题import cv2 from ultralytics import YOLO model YOLO(best.onnx) # 加载导出的模型 def count_skewers(img_path): results model(img_path) count 0 for result in results: boxes result.boxes.xyxy.cpu().numpy() conf result.boxes.conf.cpu().numpy() # 使用NMS过滤重叠框 indices cv2.dnn.NMSBoxes( boxes.tolist(), conf.tolist(), 0.5, # NMS阈值 0.3 # 置信度阈值 ) count len(indices) return count5.3 性能优化技巧在Jetson Nano上的实测优化方法将图像缩放至512x512速度提升40%精度仅下降2%使用TensorRT引擎启用CUDA流并行处理优化前后对比优化措施推理速度(FPS)内存占用(MB)原始模型8.21200图像缩放11.5800TensorRT22.3600CUDA流28.76006. 实际应用案例分享在某竹制品厂的落地案例中系统部署后计数速度从人工的200根/分钟提升到5000根/分钟错误率从人工的3-5%降低到0.8%每年节省人力成本约15万元遇到的典型问题及解决方案反光问题在光源处加装偏振片密集重叠调整拍摄角度为30度斜拍不同批次色差在训练数据中加入多种颜色的竹签对于想尝试的开发者建议先从1000张图像的小数据集开始逐步迭代优化。我在GitHub上开源了一个包含2000张标注图像的竹签数据集包含各种复杂场景的样本。

更多文章