链接:https://zhuanlan.zhihu.com/p/1946346577628206809本文仅用于学术分享,如有侵权,请联系后台作删文处理
基于YOLOv8旋转目标检测框架,针对齿轮图像中任意方向排列的缺陷进行识别和定位。首先配置并加载齿轮缺陷数据集,使用预训练的YOLOv8旋转边界框模型进行迁移学习,通过100个epoch的训练优化模型参数使其适应齿轮缺陷检测任务。训练过程中实时监控精确度、召回率、边界框损失、分类损失等关键指标确保模型收敛。训练完成后使用独立测试集进行模型验证,评估其在真实场景下的泛化能力。在预测阶段,系统对输入齿轮图像进行旋转边界框检测,识别出三种不同类型的齿轮缺陷,并使用不同颜色的半透明填充区域和边界框进行可视化标注,最后生成详细的性能分析报告和训练过程曲线,为工业质量控制提供可靠的自动化检测解决方案┌─────────────────────────────────────────────────────────────┐│ 齿轮故障检测系统流程图 │└─────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ 数据准备阶段 │ │ 模型训练阶段 │ │ 模型验证阶段 ││ │ │ │ │ ││ • 加载数据集配置 │───▶│ • 初始化YOLOv8 │───▶│ • 计算性能指标 ││ • 验证数据完整性 │ │ 旋转检测模型 │ │ • 评估模型泛化 ││ • 设置数据路径 │ │ • 设置超参数 │ │ 能力 │└─────────────────┘ │ • 开始模型训练 │ └─────────────────┘ └─────────────────┘ │ │ ▼ │ ┌─────────────────┐ │ │ 预测推理阶段 │ │ │ │ └─────────────▶│ • 加载训练好的 │ │ 模型 │ │ • 处理测试图像 │ │ • 生成旋转边界框 │ └─────────────────┘ │ ▼┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ 结果可视化阶段 │ │ 性能分析阶段 │ │ 输出报告阶段 ││ │ │ │ │ ││ • 绘制检测框 │◀──│ • 解析训练日志 │◀──│ • 统计最终指标 ││ • 添加类别标签 │ │ • 生成指标曲线 │ │ • 格式化输出 ││ • 保存可视化结果 │ │ • 分析训练过程 │ │ • 生成检测报告 │└─────────────────┘ └─────────────────┘ └─────────────────┘
详细算法步骤:
第一步进行数据集配置与验证,检查齿轮图像数据集的文件结构和标注格式,确保YAML配置文件正确指向训练集、验证集和测试集路径,同时验证图像文件和标注文件的对应关系。
第二步初始化YOLOv8旋转目标检测模型,加载预训练权重作为迁移学习的基础,设置训练超参数包括训练轮次、批次大小和输入图像尺寸,启动模型训练过程并实时保存训练状态。
第三步在独立验证集上评估训练完成的模型性能,计算精确度、召回率、平均精度均值等关键检测指标,验证模型在未见数据上的泛化能力和鲁棒性。
第四步使用训练好的模型对测试集图像进行批量预测,生成旋转边界框来精确框出各种齿轮缺陷的位置和方向,同时输出每个检测结果的类别置信度。
第五步对预测结果进行后处理和可视化,为每个检测到的缺陷绘制带有颜色编码的旋转边界框,添加类别标签说明,使用半透明填充增强视觉效果,并将标注结果保存为新的图像文件。
第六步从训练日志中提取历史训练数据,绘制多维度性能曲线包括精确度变化趋势、召回率进展、损失函数下降过程等,通过图表分析模型训练的动态过程和收敛情况。
第七步统计和计算最终模型性能指标,基于训练结束时的最佳权重计算综合评估分数,生成格式化的性能报告供质量评估和决策参考,完成整个齿轮故障检测系统的开发流程。
代码可适当参考:
from ultralytics import YOLO import os import cv2 import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pd
dataset_path = "gears-dataset"yaml_path = os.path.join(dataset_path, "gear.yaml")
print("YAML配置文件内容:\n")with open(yaml_path, "r") as f: print(f.read())
model = YOLO("yolov8m-obb.pt")
results = model.train( data=yaml_path, epochs=100, imgsz=640, batch=16, name="gear-yolo-obb" )
metrics = model.val()print("验证指标结果:", metrics)
pred_results = model.predict( source=os.path.join(dataset_path, "test/images"), save=False, imgsz=640, conf=0.25 )
class_colors = { "hp_cd": (0, 255, 255), "hp_cm": (255, 0, 255), "kp": (128, 0, 255) }
os.makedirs("overlay_outputs", exist_ok=True)
for r in pred_results: img = r.orig_img.copy()
for box in r.obb: cls_id = int(box.cls[0]) label = r.names[cls_id] pts = box.xyxyxyxy[0].cpu().numpy().astype(int).reshape(-1, 2)
overlay = img.copy() cv2.fillPoly(overlay, [pts], class_colors[label]) img = cv2.addWeighted(overlay, 0.4, img, 0.6, 0) cv2.polylines(img, [pts], isClosed=True, color=class_colors[label], thickness=2)
x, y = pts[0] cv2.putText(img, label, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, class_colors[label], 2)
out_path = os.path.join("overlay_outputs", os.path.basename(r.path)) cv2.imwrite(out_path, img)
print("✅ 叠加可视化结果已保存至 'overlay_outputs/' 目录")
sample_imgs = os.listdir("overlay_outputs")sample_imgs.sort() num_display = min(4, len(sample_imgs))
plt.figure(figsize=(12, 12))for i in range(num_display): img_name = sample_imgs[i] img_path = os.path.join("overlay_outputs", img_name) img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(2, 2, i + 1) plt.imshow(img) plt.axis("off") plt.title(img_name)
plt.tight_layout()plt.show()
run_dir = "runs/obb/gear-yolo-obb"results_csv = os.path.join(run_dir, "results.csv")
if os.path.exists(results_csv): df = pd.read_csv(results_csv) print(f"\n✅ 成功从以下路径加载训练日志: {results_csv}") print(f"可用数据列:\n{list(df.columns)}\n")
sns.set(style="whitegrid", font_scale=1.2) plt.figure(figsize=(18
, 12))
plt.subplot(2, 3, 1) plt.plot(df["epoch"], df["metrics/precision(B)"], marker="o", linewidth=2) plt.title("Precision Curve") plt.xlabel("Epoch") plt.ylabel("Precision")
plt.subplot(2, 3, 2) plt.plot(df["epoch"], df["metrics/recall(B)"], marker="o", color="orange", linewidth=2) plt.title("Recall Curve") plt.xlabel("Epoch") plt.ylabel("Recall")
plt.subplot(2, 3, 3) f1 = 2 * (df["metrics/precision(B)"] * df["metrics/recall(B)"]) / ( df["metrics/precision(B)"] + df["metrics/recall(B)"] + 1e-9 ) plt.plot(df["epoch"], f1, marker="o", color="green", linewidth=2) plt.title("F1 Score Curve") plt.xlabel("Epoch") plt.ylabel("F1 Score")
plt.subplot(2, 3, 4) plt.plot(df["epoch"], df["train/box_loss"], marker="o", color="red", linewidth=2) plt.title("Box Loss Curve") plt.xlabel("Epoch") plt.ylabel("Box Loss")
plt.subplot(2, 3, 5) plt.plot(df["epoch"], df["train/cls_loss"], marker="o", color="purple", linewidth=2) plt.title("Classification Loss Curve") plt.xlabel("Epoch") plt.ylabel("Cls Loss")
plt.subplot(2, 3, 6) plt.plot(df["epoch"], df["train/dfl_loss"], marker="o", color="brown", linewidth=2) plt.title("DFL Loss Curve") plt.xlabel("Epoch") plt.ylabel("DFL Loss")
plt.tight_layout() plt.show() print("\n✅ 所有训练指标曲线已成功显示!")
else: print("⚠️ 训练结果文件results.csv未找到。请检查训练运行目录。")
run_dir = "runs/obb/gear-yolo-obb"results_csv = os.path.join(run_dir, "results.csv")
if os.path.exists(results_csv): df = pd.read_csv(results_csv) last_row = df.iloc[-1]
precision = last_row["metrics/precision(B)"] recall = last_row["metrics/recall(B)"] f1_score = 2 * (precision * recall) / (precision + recall + 1e-6) map50 = last_row["metrics/mAP50(B)"] map5095 = last_row["metrics/mAP50-95(B)"]
overall_accuracy = (2 * precision * recall) / (precision + recall + 1e-6)
print(
"========== 最终模型性能指标 ==========") print(f"✅ 精确度(Precision): {precision:.4f} ({precision*100:.2f}%)") print(f"✅ 召回率(Recall): {recall:.4f} ({recall*100:.2f}%)") print(f"✅ F1分数: {f1_score:.4f} ({f1_score*100:.2f}%)") print(f"✅ mAP@0.5: {map50:.4f} ({map50*100:.2f}%)") print(f"✅ mAP@0.5:0.95: {map5095:.4f} ({map5095*100:.2f}%)") print(f"✅ 整体准确度: {overall_accuracy:.4f} ({overall_accuracy*100:.2f}%)") print("=====================================")else: print("⚠️ 'results.csv' 文件未找到。请确保训练过程已成功完成。")


知乎学术咨询
https://www.zhihu.com/consult/people/792359672131756032?isMe=1
担任《Mechanical System and Signal Processing》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测