本项目基于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
pip install -r requirements.txtpython augment_dataset.py- 标准YOLOv8:
python train_full_pipeline.py
- 深度可分离卷积YOLOv8:
python train_depthwise_yolo.py
- 注意力增强YOLOv8(推荐):
python train_attention_yolo.py
先划分训练/验证集:
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
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张图片的小样本车型识别,我们提供了以下改进方案:
-
模型选择:
- 对于基础应用:EfficientNet-B2或ResNet34+SE注意力
- 对于高精度要求:EfficientNetV2-S或ConvNext-Small
-
数据增强策略:
- 使用
retrain_classifier.py中的高级数据增强套件 - 对原始图像进行多角度、多光照、多天气条件下的增强
- 使用
-
训练技巧:
- 先冻结主干网络10个epoch,再解冻整个网络继续训练
- 使用Mixup和CutMix对抗小样本过拟合
-
推理优化:
- 使用区域细分分析(既分析整车,也分析细节区域)
- 引入多尺度测试提高预测稳定性
- 设置合理的置信度阈值(默认0.5)
- 参数量:深度可分离卷积减少40%-60%,注意力增强略有增加
- 推理速度:深度可分离卷积提升20%-40%
- 检测精度:注意力增强可提升3%-8%
- 标准训练(EfficientNet-B2):小样本条件下约70%-80%准确率
- 增强训练(EfficientNetV2-S):小样本条件下约80%-90%准确率
- 区域细分+多尺度测试:准确率额外提升3%-5%
- 确保每类样本质量和多样性,宁可减少数量也要保证质量
- 使用
retrain_classifier.py脚本训练,选用EfficientNetV2模型 - 采用高强度数据增强,特别是透视变换和天气模拟
- 将置信度阈值设为0.5-0.6区间,避免错误识别
- 利用GUI工具中的置信度滑块调整检测灵敏度
- 检测模型使用深度可分离卷积版本提高速度
- 分类模型可使用量化压缩减少大小和推理时间
- 对特别难以区分的类别,可额外添加样本或单独训练
在detect_and_classify.py中,我们引入了多尺度测试,将不同分辨率的预测结果进行融合,提高了预测的稳定性和准确率。
对车辆同时进行中心区域和底部区域的分析,分别预测后选择置信度更高的结果,有效提高了细节特征的识别能力。
新增retrain_classifier.py脚本,专为小样本场景优化,包含更先进的模型架构、数据增强和训练策略。
在GUI中增加了检测置信度滑块,允许用户根据实际需求调整检测灵敏度,并显示每个预测结果的置信度。
实现了更健壮的模型加载机制,可自动尝试多种模型结构匹配权重文件,大大提高了模型兼容性。
- 数据集需符合YOLO格式
- 训练前请确认GPU显存充足,batch size可根据实际情况调整
- 细分类任务建议用迁移学习+数据增强
- 训练日志、模型权重等输出在
runs/detect/目录 - 对于特别相似的车型,可能需要更多样本或更专注于区分性特征
- 脚本已更新为不使用预训练权重(
pretrained=False),解决了"No pretrained weights exist"错误。如果需要使用预训练权重,请确保安装支持相应模型预训练权重的timm库版本。
针对RTX 3050等4GB显存GPU用户,我们提供了特别优化的训练配置:
-
使用更小的模型:
- 默认使用
efficientnet_b0而非更大的efficientnet_b2或efficientnetv2_s - 您可以通过参数选择:
--model efficientnet_b0
- 默认使用
-
减小批次大小:
- 默认批次大小已调整为4(原为16)
- 如果仍有显存不足,可尝试更小的值:
--batch-size 2
-
使用自动混合精度训练(AMP):
- 脚本已默认启用AMP,可减少30%-50%显存占用
-
梯度累积训练:
- 新增梯度累积功能,允许使用小批次大小模拟大批次训练效果
- 默认累积步数为4,相当于有效批次大小为
batch_size * 4 - 可通过参数调整:
--grad-accum 8(增加累积步数) - 推荐配置:
--batch-size 6 --grad-accum 4(等效于批次大小24)
-
预训练模型加载优化:
- 解决了在线加载预训练权重可能遇到的网络问题
- 提供三种加载模式:
- 离线随机初始化:
--pretrained-path ''(默认,不需要网络) - 本地预训练权重:
--pretrained-path path/to/weights.pth - 在线预训练权重:
--pretrained(需要网络连接)
- 离线随机初始化:
- 实现了更健壮的模型加载机制,自动处理不同结构模型的权重加载
-
数据增强优化:
- 修复了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等),欢迎随时联系!
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)
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)
为了更好地分析模型性能和识别错误的原因,我们增加了一个专门的验证集测试工具,它可以:
- 测试验证集准确率:全面评估模型在验证集上的性能表现
- 可视化分类结果:保存正确和错误分类的结果图片,方便分析
- 错误分析:在错误分类图片上标注真实类别、预测类别和置信度
- 类别性能统计:提供每个类别的准确率、未识别率、错误率等详细指标
- 混淆矩阵分析:帮助识别容易混淆的类别
# 基本测试
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- 运行
detect_and_classify.py启动GUI界面 - 点击"测试验证集"按钮进行基本测试
- 点击"高级验证集测试"按钮,可以选择:
- 是否保存正确分类图片
- 是否保存错误分类图片
- 设置置信度阈值
- 指定保存结果的目录
测试结果保存在指定目录下,包含以下内容:
- correct目录:按类别存储所有正确分类的图片
- error目录:按类别存储所有错误分类的图片
- 包括未能识别的图片(标记为"未识别")
- 包括错误分类的图片(与真实类别不符)
每张保存的图片上都有标注,包括类别和置信度,帮助用户分析模型的表现和问题。
这一工具对于后续改进模型性能非常有帮助,用户可以:
- 找出分类错误的共同特征
- 确定需要增加训练样本的类别
- 调整置信度阈值以获得更好的实际应用效果
- 发现模型对特定角度、光照条件的弱点