Skip to content

wuyehan/yolo_dawn_project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

轻量级神经网络在复杂环境下的车型识别

项目简介

本项目基于YOLOv8,结合深度可分离卷积和注意力机制,旨在实现复杂环境下的高效车型检测与细分类。项目支持多类别车辆识别,并通过数据增强、结构优化等手段提升模型在遮挡、恶劣天气等场景下的鲁棒性。特别针对小样本情况(每类仅约50张图片)进行了专门优化,实现了端到端训练、推理和模型对比。


主要特性

  • 深度可分离卷积:大幅减少参数量和计算量,适合轻量化部署。
  • 注意力机制:集成SE/CBAM等模块,提升多尺度特征融合与表达能力。
  • 高级数据增强:支持随机遮挡、天气模拟、透视变换等多种增强方式,极大提升模型泛化能力。
  • 小样本优化:专为每类约50张样本的情况优化,通过多种技术提高细分类准确率。
  • 灵活训练:支持标准YOLOv8、深度可分离卷积YOLOv8、注意力增强YOLOv8三种训练模式。
  • 模型对比:可一键对比不同模型的参数量、推理速度和精度。
  • 两阶段细粒度识别:实现"先检测后细分车型"的两阶段方案,带图形界面。
  • 多尺度推理:支持多尺度测试,提高预测精度和稳定性。

目录结构

project_root/
├── models/                        # 模型定义与结构
│   ├── __init__.py
│   ├── attention.py               # 注意力机制模块
│   ├── depthwise_yolo.py          # 深度可分离卷积模块
│   ├── yolov8_depthwise.py        # 深度可分离YOLOv8
│   └── yolov8_depthwise_attention.py # 注意力增强YOLOv8
├── weights/                       # 预训练权重
│   ├── yolov8n.pt
│   └── yolo11n.pt
├── Vehicle_Model_Segmentation_Dataset/ # 车型数据集
│   └── car_images/                 # 分类训练数据
├── DAWN_YOLO_AUGMENTED/           # 增强后数据集
│   ├── images/train/
│   ├── labels/train/
│   └── data.yaml
├── detect_and_classify.py         # 集成检测与分类GUI程序
├── train_car_model.py             # 车型细分类训练脚本
├── retrain_classifier.py          # 增强版分类模型训练脚本
├── split_train_val.py             # 数据集划分脚本
├── augment_dataset.py             # 数据增强脚本
├── train_full_pipeline.py         # 标准YOLOv8训练
├── train_depthwise_yolo.py        # 深度可分离YOLOv8训练
├── train_attention_yolo.py        # 注意力增强YOLOv8训练
├── compare_models.py              # 模型性能对比
├── requirements.txt               # 依赖包列表
└── README.md

快速开始

1. 环境准备

pip install -r requirements.txt

2. 数据增强

python augment_dataset.py

3. 训练车辆检测模型

  • 标准YOLOv8:
    python train_full_pipeline.py
  • 深度可分离卷积YOLOv8:
    python train_depthwise_yolo.py
  • 注意力增强YOLOv8(推荐):
    python train_attention_yolo.py

4. 训练车型细分类模型

先划分训练/验证集:

python split_train_val.py

然后选择以下训练方式之一:

  • 标准训练(适用于50张图片/类的小样本):

    python train_car_model.py --epochs 100 --patience 20 --model efficientnet_b2
  • 增强版训练(可获得更高准确率):

    python retrain_classifier.py --model efficientnetv2_s --epochs 100

5. 运行推理GUI

python detect_and_classify.py

技术细节

深度可分离卷积

  • 计算量从 Dk×Dk×Cin×Cout×H×W 降低到 Dk×Dk×Cin×H×W + Cin×Cout×H×W,大幅提升效率。

注意力机制

  • 通道注意力(SE-like)、空间注意力(CBAM-like)、跨尺度融合,提升特征表达。

数据增强技术

  • 基础增强:随机遮挡、颜色扰动等,遮挡比例最高可达70%
  • 高级增强:
    • 随机高斯模糊(模拟摄像头不清晰)
    • 随机颜色平衡(模拟不同光照)
    • 随机天气效果(模拟雾、雨)
    • 网格遮罩(模拟车辆部分被遮挡)
    • 透视变换(模拟不同视角)

小样本优化策略

  • 多尺度测试:推理时融合多种尺度的预测结果 (224, 256, 288)
  • 混合增强:Mixup和CutMix增强训练样本多样性
  • 区域细分:分别分析车辆中心区域和底部区域,选择最高置信度
  • 置信度过滤:低于阈值的预测标记为"未识别"
  • 高级模型:支持EfficientNetV2、ConvNeXt等最新模型架构

训练参数推荐

  • 检测模型:

    • 批次大小(batch):根据显存建议设置(如4~16)
    • 学习率(lr0):0.001,余弦退火调度
    • 优化器:AdamW,权重衰减0.01
    • 训练轮数(epochs):100~150,早停机制(patience=15)
  • 分类模型:

    • 批次大小:16
    • 学习率:0.001(主干解冻后自动降为0.0001)
    • 优化器:AdamW,权重衰减0.01
    • 训练轮数:100,早停patience=20
    • 输入分辨率:224~320

细粒度车型识别改进指南

针对每类约50张图片的小样本车型识别,我们提供了以下改进方案:

  1. 模型选择

    • 对于基础应用:EfficientNet-B2或ResNet34+SE注意力
    • 对于高精度要求:EfficientNetV2-S或ConvNext-Small
  2. 数据增强策略

    • 使用retrain_classifier.py中的高级数据增强套件
    • 对原始图像进行多角度、多光照、多天气条件下的增强
  3. 训练技巧

    • 先冻结主干网络10个epoch,再解冻整个网络继续训练
    • 使用Mixup和CutMix对抗小样本过拟合
  4. 推理优化

    • 使用区域细分分析(既分析整车,也分析细节区域)
    • 引入多尺度测试提高预测稳定性
    • 设置合理的置信度阈值(默认0.5)

性能指标(参考)

检测模型:

  • 参数量:深度可分离卷积减少40%-60%,注意力增强略有增加
  • 推理速度:深度可分离卷积提升20%-40%
  • 检测精度:注意力增强可提升3%-8%

分类模型:

  • 标准训练(EfficientNet-B2):小样本条件下约70%-80%准确率
  • 增强训练(EfficientNetV2-S):小样本条件下约80%-90%准确率
  • 区域细分+多尺度测试:准确率额外提升3%-5%

最佳实践指南

小样本车型识别:

  1. 确保每类样本质量和多样性,宁可减少数量也要保证质量
  2. 使用retrain_classifier.py脚本训练,选用EfficientNetV2模型
  3. 采用高强度数据增强,特别是透视变换和天气模拟
  4. 将置信度阈值设为0.5-0.6区间,避免错误识别
  5. 利用GUI工具中的置信度滑块调整检测灵敏度

性能优化:

  1. 检测模型使用深度可分离卷积版本提高速度
  2. 分类模型可使用量化压缩减少大小和推理时间
  3. 对特别难以区分的类别,可额外添加样本或单独训练

新增功能说明

1. 多尺度测试

detect_and_classify.py中,我们引入了多尺度测试,将不同分辨率的预测结果进行融合,提高了预测的稳定性和准确率。

2. 区域细分分析

对车辆同时进行中心区域和底部区域的分析,分别预测后选择置信度更高的结果,有效提高了细节特征的识别能力。

3. 增强版训练脚本

新增retrain_classifier.py脚本,专为小样本场景优化,包含更先进的模型架构、数据增强和训练策略。

4. 置信度控制

在GUI中增加了检测置信度滑块,允许用户根据实际需求调整检测灵敏度,并显示每个预测结果的置信度。

5. 改进的模型加载

实现了更健壮的模型加载机制,可自动尝试多种模型结构匹配权重文件,大大提高了模型兼容性。


注意事项

  1. 数据集需符合YOLO格式
  2. 训练前请确认GPU显存充足,batch size可根据实际情况调整
  3. 细分类任务建议用迁移学习+数据增强
  4. 训练日志、模型权重等输出在 runs/detect/ 目录
  5. 对于特别相似的车型,可能需要更多样本或更专注于区分性特征
  6. 脚本已更新为不使用预训练权重(pretrained=False),解决了"No pretrained weights exist"错误。如果需要使用预训练权重,请确保安装支持相应模型预训练权重的timm库版本。

RTX 3050等小显存GPU训练指南

针对RTX 3050等4GB显存GPU用户,我们提供了特别优化的训练配置:

显存优化方案

  1. 使用更小的模型

    • 默认使用efficientnet_b0而非更大的efficientnet_b2efficientnetv2_s
    • 您可以通过参数选择:--model efficientnet_b0
  2. 减小批次大小

    • 默认批次大小已调整为4(原为16)
    • 如果仍有显存不足,可尝试更小的值:--batch-size 2
  3. 使用自动混合精度训练(AMP)

    • 脚本已默认启用AMP,可减少30%-50%显存占用
  4. 梯度累积训练

    • 新增梯度累积功能,允许使用小批次大小模拟大批次训练效果
    • 默认累积步数为4,相当于有效批次大小为batch_size * 4
    • 可通过参数调整:--grad-accum 8(增加累积步数)
    • 推荐配置:--batch-size 6 --grad-accum 4(等效于批次大小24)
  5. 预训练模型加载优化

    • 解决了在线加载预训练权重可能遇到的网络问题
    • 提供三种加载模式:
      • 离线随机初始化:--pretrained-path ''(默认,不需要网络)
      • 本地预训练权重:--pretrained-path path/to/weights.pth
      • 在线预训练权重:--pretrained(需要网络连接)
    • 实现了更健壮的模型加载机制,自动处理不同结构模型的权重加载
  6. 数据增强优化

    • 修复了PIL图像和Tensor操作顺序问题
    • 确保所有PIL图像操作在ToTensor()前执行
    • 所有Tensor操作在ToTensor()后执行
    • 提供了简单和高级两种数据增强选项,根据实际情况自动选择

使用示例

对于RTX 3050等小显存GPU的推荐训练命令:

# 基础训练(最省显存)
python retrain_classifier.py --batch-size 6 --grad-accum 4 --model efficientnet_b0

# 如果显存足够,可以尝试更大模型
python retrain_classifier.py --batch-size 4 --grad-accum 6 --model efficientnet_b1

# 如果遇到预训练权重下载问题,使用随机初始化
python retrain_classifier.py --batch-size 6 --grad-accum 4

这些优化使得即使在显存有限的情况下,也能够训练出性能优异的车型识别模型。


未来计划

  • 优化注意力机制效率
  • 支持更多车型细分类别
  • 集成半自动标注/主动学习工具
  • 支持移动端部署优化
  • 添加更多天气和光照条件的模拟
  • 引入视频流处理优化

参考资料

  • YOLOv8官方文档
  • 深度可分离卷积论文
  • SENet、CBAM等注意力机制论文
  • EfficientNetV2、ConvNeXt等先进模型架构
  • Stanford Cars、CompCars等公开数据集
  • Mixup、CutMix等数据增强技术

许可证

[待定]


作者

[待补充]


如需进一步帮助(如迁移学习代码、数据增强脚本、推理API等),欢迎随时联系!


附录:完整的命令行参数

retrain_classifier.py 参数

usage: retrain_classifier.py [-h] [--train-dir TRAIN_DIR] [--val-dir VAL_DIR]
                            [--model {efficientnetv2_s,efficientnetv2_m,efficientnet_b2,convnext_small}]
                            [--batch-size BATCH_SIZE] [--epochs EPOCHS] [--lr LR]
                            [--output OUTPUT] [--patience PATIENCE] [--seed SEED]
                            [--num-workers NUM_WORKERS] [--gpu]

参数:
  --train-dir         训练数据目录 (默认: Vehicle_Model_Segmentation_Dataset/car_images/train)
  --val-dir           验证数据目录 (默认: Vehicle_Model_Segmentation_Dataset/car_images/val)
  --model             模型架构 (默认: efficientnetv2_s)
  --batch-size        批次大小 (默认: 16)
  --epochs            最大训练轮数 (默认: 100)
  --lr                初始学习率 (默认: 0.001)
  --output            模型保存路径 (默认: best_car_model_v2.pth)
  --patience          早停耐心值 (默认: 15)
  --seed              随机种子 (默认: 42)
  --num-workers       数据加载线程数 (默认: 4)
  --gpu               使用GPU (默认: False)

train_car_model.py 参数

usage: train_car_model.py [-h] [--batch-size BATCH_SIZE] [--lr LR] [--epochs EPOCHS]
                         [--patience PATIENCE] [--unfreeze-epoch UNFREEZE_EPOCH]
                         [--train-dir TRAIN_DIR] [--val-dir VAL_DIR]
                         [--num-workers NUM_WORKERS] [--output OUTPUT] [--model MODEL]

参数:
  --batch-size        批次大小 (默认: 16)
  --lr                学习率 (默认: 0.001)
  --epochs            总训练轮数 (默认: 100)
  --patience          早停机制patience (默认: 20)
  --unfreeze-epoch    主干自动解冻epoch (默认: 10)
  --train-dir         训练集路径 (默认: Vehicle_Model_Segmentation_Dataset/car_images/train)
  --val-dir           验证集路径 (默认: Vehicle_Model_Segmentation_Dataset/car_images/val)
  --num-workers       DataLoader线程数 (默认: 2)
  --output            最佳模型保存路径 (默认: best_car_model.pth)
  --model             基础模型类型 (默认: efficientnet_b2)

验证集测试与结果可视化

为了更好地分析模型性能和识别错误的原因,我们增加了一个专门的验证集测试工具,它可以:

  1. 测试验证集准确率:全面评估模型在验证集上的性能表现
  2. 可视化分类结果:保存正确和错误分类的结果图片,方便分析
  3. 错误分析:在错误分类图片上标注真实类别、预测类别和置信度
  4. 类别性能统计:提供每个类别的准确率、未识别率、错误率等详细指标
  5. 混淆矩阵分析:帮助识别容易混淆的类别

命令行使用方法

# 基本测试
python test_validation_set.py

# 保存正确分类的图片
python test_validation_set.py --save-correct --save-dir validation_results

# 同时保存正确和错误分类的图片
python test_validation_set.py --save-correct --save-error --save-dir validation_results

# 调整置信度阈值
python test_validation_set.py --conf-threshold 0.6 --save-error

GUI界面使用方法

  1. 运行detect_and_classify.py启动GUI界面
  2. 点击"测试验证集"按钮进行基本测试
  3. 点击"高级验证集测试"按钮,可以选择:
    • 是否保存正确分类图片
    • 是否保存错误分类图片
    • 设置置信度阈值
    • 指定保存结果的目录

结果分析

测试结果保存在指定目录下,包含以下内容:

  • correct目录:按类别存储所有正确分类的图片
  • error目录:按类别存储所有错误分类的图片
    • 包括未能识别的图片(标记为"未识别")
    • 包括错误分类的图片(与真实类别不符)

每张保存的图片上都有标注,包括类别和置信度,帮助用户分析模型的表现和问题。

这一工具对于后续改进模型性能非常有帮助,用户可以:

  1. 找出分类错误的共同特征
  2. 确定需要增加训练样本的类别
  3. 调整置信度阈值以获得更好的实际应用效果
  4. 发现模型对特定角度、光照条件的弱点

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages