从Labelme标注到YOLOv3模型部署:一个完整的目标检测项目实战
1. 从零开始Labelme数据标注全流程目标检测项目的第一步就是准备高质量的标注数据。我刚开始接触工业质检项目时花了整整两周时间才搞明白标注工具的选择和标注规范的重要性。Labelme作为一款开源标注工具支持多边形、矩形、圆形等多种标注方式特别适合不规则物体的标注需求。安装Labelme只需要简单的pip命令pip install labelme pyqt5 pillow启动后你会发现界面非常简洁左侧是图像显示区域右侧是标注列表和工具选项顶部菜单栏包含文件操作和标注设置实际标注时有个小技巧先按W键快速激活矩形标注工具用鼠标框选目标后在弹出的对话框中输入标签名称。我建议在项目初期就建立统一的标签命名规范比如工业缺陷可以使用defect_type1、defect_type2这样的命名方式避免后期整理数据时出现混乱。标注完成后每张图片都会生成对应的JSON文件包含以下关键信息{ version: 4.5.6, flags: {}, shapes: [ { label: dog, points: [[121.0, 233.0], [223.0, 345.0]], shape_type: rectangle } ], imagePath: test.jpg, imageData: null }2. 数据预处理从JSON到YOLO格式拿到标注数据后我们需要将其转换为YOLO训练所需的格式。这个转换过程看似简单但我在实际项目中踩过不少坑。YOLO格式要求每个标注对象用一行表示包含class_id x_center y_center width height其中坐标值都是相对于图片宽高的归一化值。转换脚本的核心是坐标转换函数def convert(size, box): dw 1./size[0] dh 1./size[1] x (box[0] box[2])/2.0 y (box[1] box[3])/2.0 w box[2] - box[0] h box[3] - box[1] x x*dw w w*dw y y*dh h h*dh return (x,y,w,h)处理大量数据时我建议使用多进程加速from multiprocessing import Pool def process_file(json_file): # 转换逻辑 pass if __name__ __main__: with Pool(8) as p: p.map(process_file, json_files)3. YOLOv3模型配置详解YOLOv3的配置文件是项目成功的关键。经过多次实验我总结出几个重要参数调整经验网络结构配置[convolutional] batch_normalize1 filters32 size3 stride1 pad1 activationleaky训练参数优化初始学习率建议设为0.001batch size根据显存调整多尺度训练(multiscale_training)能显著提升模型鲁棒性数据增强策略要结合实际场景工业质检可能需要减少随机裁剪Anchor Box设计# 使用k-means聚类计算自定义anchor anchors [[10,13], [16,30], [33,23], [30,61], [62,45], [59,119], [116,90], [156,198], [373,326]]4. 模型训练与调优实战开始训练前一定要设置好日志系统。我习惯用TensorBoard来监控训练过程from torch.utils.tensorboard import SummaryWriter writer SummaryWriter(logs) for epoch in range(opt.epochs): for i, (_, imgs, targets) in enumerate(dataloader): # 训练代码 writer.add_scalar(Loss/train, loss.item(), epoch)训练过程中常见的几个问题及解决方案Loss震荡大适当减小学习率增加batch size过拟合添加数据增强使用早停策略检测框不准检查anchor box是否匹配目标尺寸验证模型效果时mAP是最重要的指标。我写了一个简单的评估脚本def evaluate(model, dataloader, conf_thres0.5, nms_thres0.5): model.eval() sample_metrics [] for _, imgs, targets in dataloader: # 推理代码 sample_metrics get_batch_statistics(outputs, targets, iou_threshold0.5) true_positives, pred_scores, pred_labels [np.concatenate(x, 0) for x in list(zip(*sample_metrics))] precision, recall, AP, f1, ap_class ap_per_class(true_positives, pred_scores, pred_labels, labels) return precision, recall, AP, f1, ap_class5. 模型部署与性能优化训练好的模型需要部署到实际环境中。我常用的几种部署方式PyTorch原生部署model.load_state_dict(torch.load(weights.pth)) model.eval() with torch.no_grad(): outputs model(imgs)ONNX转换推荐torch.onnx.export(model, imgs, model.onnx, input_names[images], output_names[output])TensorRT加速trtexec --onnxmodel.onnx --saveEnginemodel.engine --fp16部署时要注意几点输入图片的预处理必须与训练时一致后处理的置信度阈值需要根据场景调整对于边缘设备可以考虑模型量化减小体积6. 实际项目中的经验分享在完成多个工业质检项目后我总结了这些实战经验数据质量比数量重要1000张标注准确的图片胜过10000张标注粗糙的模型不是越复杂越好轻量化的YOLOv3-tiny在很多场景已经足够持续迭代是关键上线后要持续收集bad case进行模型优化一个典型的优化流程收集新数据 → 针对性标注 → 增量训练 → A/B测试 → 全量部署最后分享一个实用技巧使用Albumentations库进行高效数据增强import albumentations as A transform A.Compose([ A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(p0.2), A.ShiftScaleRotate(shift_limit0.1, scale_limit0.1, rotate_limit15), ], bbox_paramsA.BboxParams(formatyolo))
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431113.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!