# 基于yolo的内螺纹缺陷识别 **Repository Path**: zzt-git/defect_detection ## Basic Information - **Project Name**: 基于yolo的内螺纹缺陷识别 - **Description**: 2026届武汉大学本科毕业设计 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-17 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 螺纹缺陷检测完整流程指南 ## 目录结构 ``` py_main/ ├── picture/ # 原始大图 ├── data/ # 数据集 │ ├── tiles/ # 切割后的小图 │ ├── images/ # 用于标注的图像 │ ├── labels/ # YOLO格式标签 │ ├── train/ # 训练集 │ │ ├── images/ │ │ └── labels/ │ └── val/ # 验证集 │ ├── images/ │ └── labels/ ├── labelme_annotations/ # labelme标注文件 ├── runs/ # 训练结果 ├── split_images.py # 图片切割脚本 ├── convert_labelme_to_yolo.py # 标注转换脚本 ├── train_yolo.py # 模型训练脚本 ├── defect_detection.py # 缺陷检测脚本 └── README.md # 本指南 ``` ## 第一步:准备原始图片 1. **将原始大图放入 `picture` 文件夹** - 原始大图尺寸:18000*9700 - 格式:jpg、png等 ## 第二步:切割原始图片 ### 运行切割脚本 ```bash # 切割所有原始图片 python split_images.py --input_dir picture --output_dir data/tiles # 自定义切割参数 python split_images.py --input_dir picture --output_dir data/tiles --tile_size 640 --overlap 160 --crop_left 120 --crop_top 740 ``` ### 参数说明 - `--input_dir`: 原始图片目录 - `--output_dir`: 输出小图目录 - `--tile_size`: 小图尺寸(默认640) - `--overlap`: 重叠区域大小(默认160) - `--crop_left`: 左侧切除像素(默认120) - `--crop_top`: 顶部切除像素(默认740) ### 输出结果 - 每个原始图片会生成多个640x640的小图 - 文件名格式:`原始图片名_tile_0000.jpg` - 生成对应的切割信息文件:`原始图片名_tile_info.json` ## 第三步:选择标注图像 1. **从 `data/tiles` 中选择有代表性的小图** - 选择包含缺陷的小图 - 选择不同位置、不同类型的缺陷 - 建议选择100-200张进行标注 2. **将选择的小图复制到 `data/images` 目录** ## 第四步:使用labelme进行标注 ### 启动labelme ```bash labelme ``` ### 标注步骤 1. **设置输出目录**: - 点击 "Change Output Dir" - 选择 `labelme_annotations` 目录 2. **添加标注类别**: - 在右侧面板的 "Labels" 区域,添加以下类别: - `wear`(磨损) - `residue`(残留) 3. **开始标注**: - 点击 "Open" 打开 `data/images` 中的图像 - 点击 "Create Polygon" 或按 `Ctrl+N` - 用鼠标点击图像上的缺陷点,形成一个多边形 - 右键点击完成标注 - 在弹出的对话框中选择类别名称 - 重复标注所有缺陷 4. **保存标注**: - 点击 "Save" 或按 `Ctrl+S` - 会生成对应的JSON文件到 `labelme_annotations` 目录 ### 标注技巧 - **多边形标注**:对于不规则形状的缺陷,使用多边形标注更准确 - **矩形标注**:对于规则的缺陷,可以使用矩形标注 - **快捷键**: - `Ctrl+N`: 新建标注 - `Ctrl+S`: 保存 - `Ctrl+O`: 打开图像 - `Ctrl+Z`: 撤销 - `Delete`: 删除当前标注 ## 第五步:转换标注格式 ### 运行转换脚本 ```bash # 将labelme标注转换为YOLO格式 python convert_labelme_to_yolo.py --json_dir labelme_annotations --images_dir data/images --output_dir data/labels --data_dir data ``` ### 输出结果 - `data/labels` 目录会生成对应的YOLO格式标签文件 - 生成 `data/data.yaml` 配置文件 ## 第六步:准备训练数据集 ### 运行数据集准备脚本 ```bash # 准备训练集和验证集 python train_yolo.py --action prepare --image_dir data/images --label_dir data/labels --data_dir data --output_dir runs --split_ratio 0.8 ``` ### 参数说明 - `--image_dir`: 图像目录 - `--label_dir`: 标签目录 - `--data_dir`: 数据集根目录 - `--output_dir`: 输出目录 - `--split_ratio`: 训练/验证集分割比例(默认0.8) ### 输出结果 - `data/train` 目录:训练集 - `data/val` 目录:验证集 - 自动创建 `data/data.yaml` 配置文件 ## 第七步:训练YOLO模型 ### 运行训练脚本 ```bash # 训练模型 python train_yolo.py --action train --model_name yolov8n.pt --epochs 100 --imgsz 640 --batch 16 --data_dir data --output_dir runs ``` ### 参数说明 - `--model_name`: 预训练模型名称(默认yolov8n.pt) - `--epochs`: 训练轮数(默认100) - `--imgsz`: 输入图像尺寸(默认640) - `--batch`: 批次大小(默认16) ### 训练过程 - 训练过程会在终端显示 - 训练结果保存在 `runs/yolo_training` 目录 - 最佳模型保存在 `runs/yolo_training/weights/best.pt` ## 第八步:评估模型 ### 运行评估脚本 ```bash # 评估模型性能 python train_yolo.py --action evaluate --data_dir data --output_dir runs ``` ### 输出结果 - 显示模型的精确率、召回率、mAP等指标 ## 第九步:使用模型进行检测 ### 方法一:使用defect_detection.py ```bash # 检测单个图像 python defect_detection.py # 或在Python代码中使用 from defect_detection import DefectDetector # 创建检测器,加载训练好的模型 detector = DefectDetector(yolo_model_path='runs/yolo_training/weights/best.pt') # 运行检测 results = detector.run( image_path='picture/1.jpg', output_dir='output' ) ``` ### 方法二:使用train_yolo.py进行预测 ```bash # 预测示例图像 python train_yolo.py --action predict --data_dir data --output_dir runs ``` ## 第十步:批量处理所有原始图片 ### 创建批量处理脚本 ```python import os import glob from defect_detection import DefectDetector # 创建检测器 detector = DefectDetector(yolo_model_path='runs/yolo_training/weights/best.pt') # 获取所有原始图片 image_files = [] for ext in ['.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff']: image_files.extend(glob.glob(os.path.join('picture', f"*{ext}"))) # 批量处理 for img_path in image_files: print(f"处理图像: {img_path}") output_dir = os.path.join('output', os.path.basename(img_path).split('.')[0]) detector.run(image_path=img_path, output_dir=output_dir) ``` ## 训练参数建议 ### 模型选择 - **yolov8n.pt**:轻量级,适合小目标检测,速度快 - **yolov8s.pt**:比nano版本更准确,速度稍慢 - **yolov8m.pt**:中等大小,更准确但速度较慢 ### 训练轮数 - 建议:100-200轮 - 可以根据验证集性能自动停止 ### 批次大小 - 根据GPU内存调整: - 8GB GPU:batch=8 - 16GB GPU:batch=16 - 32GB GPU:batch=32 ## 标注建议 1. **标注质量**: - 标注框要紧密包围缺陷 - 确保类别标注准确 - 不要遗漏小缺陷 2. **标注数量**: - 至少100-200张图像 - 每个类别至少50个样本 3. **标注多样性**: - 不同位置的缺陷 - 不同大小的缺陷 - 不同形态的缺陷 4. **负样本**: - 包含一些没有缺陷的图像 - 帮助模型学习正常螺纹特征 ## 常见问题解决 ### 1. 图片切割失败 - 检查原始图片格式是否正确 - 确保图片路径不存在中文或特殊字符 ### 2. 标注工具启动失败 - 确保安装了正确版本的labelme - 可以尝试使用其他标注工具如CVAT ### 3. 训练过程中内存不足 - 减小批次大小(batch) - 使用更小的模型(如yolov8n.pt) - 减小输入图像尺寸(imgsz) ### 4. 模型检测效果不好 - 增加标注数据量 - 提高标注质量 - 调整训练参数 - 尝试不同的模型版本 ### 5. 检测速度慢 - 使用更小的模型 - 减小输入图像尺寸 - 优化代码性能 ## 输出结果说明 ### 检测结果文件 - `output/detections.json`:详细的检测结果 - `output/result.jpg`:带有检测框的图像 - `output/tile_*.jpg`:切割后的小图 ### 训练结果文件 - `runs/yolo_training/weights/best.pt`:最佳模型 - `runs/yolo_training/weights/last.pt`:最后一轮模型 - `runs/yolo_training/metrics.csv`:训练指标 - `runs/yolo_training/confusion_matrix.png`:混淆矩阵 ## 完整流程示例 ```bash # 1. 切割原始图片 python split_images.py # 2. 选择标注图像并复制到data/images # 手动操作 # 3. 使用labelme标注 labelme # 4. 转换标注格式 python convert_labelme_to_yolo.py # 5. 准备数据集 python train_yolo.py --action prepare # 6. 训练模型 python train_yolo.py --action train # 7. 评估模型 python train_yolo.py --action evaluate # 8. 使用模型检测 python defect_detection.py ``` ## 技术参数 - **图像处理**:OpenCV 4.0+ - **模型框架**:YOLOv8(ultralytics) - **编程语言**:Python 3.8+ - **硬件要求**: - 训练:GPU(至少8GB显存) - 推理:CPU或GPU - **软件依赖**: - opencv-python - numpy - ultralytics - torch - labelme ## 注意事项 1. **数据安全**: - 备份原始数据 - 定期保存训练结果 2. **性能优化**: - 对于大批量图像处理,建议使用批处理脚本 - 可以使用多线程加速处理 3. **模型更新**: - 随着数据量增加,定期重新训练模型 - 持续优化标注质量 4. **部署建议**: - 训练完成后,可以导出为ONNX格式 - 可以部署到边缘设备或云端