项目:Tunnel裂缝检测
时间:2026-05-14
训练设备:NVIDIA GeForce RTX 2080 Ti (22GB)
软件环境:Ultralytics 8.4.50, PyTorch 2.4.1, CUDA 12.1
tunnel/ ├── train/images/ # 训练集: 3185张图片 ├── train/labels/ # 训练标注 ├── valid/images/ # 验证集: 442张图片 ├── valid/labels/ # 验证标注 ├── test/images/ # 测试集: 120张图片 ├── data.yaml # 数据集配置 ├── train_tunnel.py # 训练脚本 ├── infer_tunnel.py # 推理脚本 └── runs/ # 训练结果目录 └── detect/ ├── tunnel_crack/ # 第一次训练 (YOLOv8n) │ ├── weights/ │ │ ├── best.pt # 最佳模型 │ │ └── last.pt # 最终模型 │ ├── results.csv # 训练日志 │ ├── results.png # 训练曲线 │ └── confusion_matrix.png └── tunnel_crack-2/ # 第二次训练 (YOLO26s) └── ... (相同结构)
| 参数 | 数值 |
|---|---|
| 类别数 | 4 |
| 训练图片 | 3,185 |
| 验证图片 | 442 |
| 测试图片 | 120 |
| 图片尺寸 | 640×640 |
| 标注格式 | YOLO |
| 类别 | 实例数 | 占比 | 说明 |
|---|---|---|---|
| 0 | 2,258 | 44.1% | 主要类别(裂缝) |
| stone | 1,115 | 21.8% | 石块/异物 |
| 2 | 963 | 18.8% | 次要裂缝类型 |
| 1 | 788 | 15.4% | 少数类别 |
类别不平衡: 类别0是类别1的 2.9倍
| 类别 | 实例数 | 占比 |
|---|---|---|
| 0 | 474 | 70.1% |
| 2 | 109 | 16.1% |
| stone | 81 | 12.0% |
| 1 | 12 | 1.8% |
pythonmodel = YOLO("yolov8n.pt")
model.train(
data="tunnel/data.yaml",
epochs=100,
imgsz=640,
batch=32,
device=0,
optimizer="Adam",
patience=20,
)
训练参数:
保存路径:
runs/detect/runs/tunnel_crack/weights/best.ptruns/detect/runs/tunnel_crack/weights/last.ptpythonmodel = YOLO("yolo26s.pt")
model.train(
data="tunnel/data.yaml",
epochs=100,
imgsz=640,
batch=32,
device=0,
optimizer="Adam",
patience=20,
)
训练参数:
保存路径:
runs/detect/runs/tunnel_crack-2/weights/best.ptruns/detect/runs/tunnel_crack-2/weights/last.pt| 指标 | YOLOv8n | YOLO26s | 差异 |
|---|---|---|---|
| 参数量 | 3.0M | 9.5M | +217% |
| 训练时间 | 23.7分钟 | 52.8分钟 | +123% |
| mAP50 | 0.570 | 0.562 | -1.4% |
| mAP50-95 | 0.378 | 0.347 | -8.2% |
| Precision | 0.843 | 0.612 | -27.4% |
| Recall | 0.487 | 0.489 | +0.4% |
| 推理速度 | 3.0ms/张 | 3.0ms/张 | 持平 |
| 指标 | YOLOv8n | YOLO26s |
|---|---|---|
| Precision | 0.932 | 0.862 |
| Recall | 0.673 | 0.705 |
| mAP50 | 0.865 | 0.822 |
| mAP50-95 | 0.556 | 0.485 |
分析: YOLOv8n在类别0上全面领先,特别是定位精度(mAP50-95)高14.6%
| 指标 | YOLOv8n | YOLO26s |
|---|---|---|
| Precision | 0.513 | 0.658 |
| Recall | 0.583 | 0.583 |
| mAP50 | 0.499 | 0.586 |
| mAP50-95 | 0.392 | 0.393 |
分析: YOLO26s在小样本类别上有优势,但提升有限
| 指标 | YOLOv8n | YOLO26s |
|---|---|---|
| Precision | 0.926 | 0.889 |
| Recall | 0.693 | 0.665 |
| mAP50 | 0.860 | 0.813 |
| mAP50-95 | 0.549 | 0.498 |
分析: YOLOv8n全面领先
| 指标 | YOLOv8n | YOLO26s |
|---|---|---|
| Precision | 1.0 | 0.038 |
| Recall | 0 | 0.002 |
| mAP50 | 0.055 | 0.034 |
| mAP50-95 | 0.015 | 0.011 |
分析: 两个模型在stone类别上都失败,可能是数据分布问题
原因分析:
| 图片 | YOLOv8n检测结果 | YOLO26s检测结果 | 胜者 |
|---|---|---|---|
| 95_png... | 1个目标, conf=0.517 | 1个目标, conf=0.816 | YOLO26s |
| Image_-696... | 1个目标, conf=0.774 | 1个目标, conf=0.764 | YOLOv8n |
| Image_-698... | 1个目标, conf=0.443 | 1个目标, conf=0.669 | YOLO26s |
| Image_-702... | 1个目标, conf=0.506 | 1个目标, conf=0.298 | YOLOv8n |
| Image_-731... | 3个目标 (0.826, 0.640, 0.264) | 0个目标 | YOLOv8n 🏆 |
第5张图最关键:
YOLOv8n: 检测到3个目标(类别2 + 2个类别1) YOLO26s: 完全漏检(0个目标)
统计:
| 指标 | YOLOv8n | YOLO26s |
|---|---|---|
| 检测到目标的图片 | 5/5 | 4/5 |
| 检测到的总目标数 | 7 | 4 |
| 多目标检测能力 | 强 | 弱 |
| 损失类型 | YOLOv8n | YOLO26s | 分析 |
|---|---|---|---|
| box_loss | 0.902 | 1.135 | v8n定位更准 |
| cls_loss | 0.712 | 0.891 | v8n分类更准 |
| dfl_loss | 1.242 | 0.021 | s模型dfl收敛好 |
关键发现:
理由:
模型路径:
runs/detect/runs/tunnel_crack/weights/best.pt
改进方案:
pythonmodel = YOLO("yolo26s.pt")
model.train(
data="tunnel/data.yaml",
epochs=200, # 100 → 200
batch=16, # 32 → 16
patience=50, # 20 → 50
# 其他参数不变
)
pythonfrom ultralytics import YOLO
# 推荐:YOLOv8n
model = YOLO("runs/detect/runs/tunnel_crack/weights/best.pt")
# 验证
metrics = model.val()
print(f"mAP50: {metrics.box.map50:.4f}")
# 推理单张图片
results = model("path/to/image.jpg")
results[0].show()
# 推理文件夹
results = model("tunnel/test/images", save=True)
python# 导出ONNX格式
model.export(format="onnx")
# 导出TensorRT格式(更快,需GPU)
model.export(format="engine")
# 导出CoreML格式(iOS/Mac)
model.export(format="coreml")
| 指标 | 含义 | YOLOv8n值 | 评价 |
|---|---|---|---|
| mAP50 | IoU=0.5时的平均精度 | 0.570 | 良好 |
| mAP50-95 | IoU=0.5:0.95平均精度 | 0.378 | 中等 |
| Precision | 精确率 | 0.843 | 优秀 |
| Recall | 召回率 | 0.487 | 一般 |
| 推理速度 | 单张图片时间 | 3.0ms | 极快 (~333 FPS) |
数据增强
pythonmodel.train(
augment=True,
mixup=0.1,
copy_paste=0.1,
)
类别平衡
stone类别排查
尝试更大模型
| 文件 | 说明 |
|---|---|
results.csv | 每轮训练详细数据 |
results.png | 训练曲线图(loss、mAP等) |
confusion_matrix.png | 混淆矩阵 |
labels.jpg | 数据集标签分布可视化 |
train_batch*.jpg | 训练批次可视化 |
val_batch*_pred.jpg | 验证集预测结果 |
runs/detect/runs/tunnel_crack/runs/detect/predict/tensorboard --logdir runs 可查看训练可视化报告生成时间: 2026-05-14
作者: Claude Code
项目: Tunnel裂缝检测系统
本文作者:Deshill
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!