基于YOLOv3和B-CNN的车辆检测与多标签分类系统
项目背景
随着城市化进程的加快,智能交通系统的建设变得尤为重要。车辆检测与多标签分类是智能交通系统中的关键技术之一,可以帮助实现交通流量监控、违章行为检测、车辆追踪等多种功能。本项目通过结合YOLOv3进行车辆检测和B-CNN进行车辆多标签分类,实现了一个高效的车辆检测与多标签分类系统。
使用方法
-
下载模型文件:
- 从百度网盘下载训练好的模型文件,包括车辆检测模型
car_540000.weights
和多标签分类模型epoch_39.pth
。 - 将
car_540000.weights
放在项目根目录下。 - 将
epoch_39.pth
放在checkpoints
目录下。
- 从百度网盘下载训练好的模型文件,包括车辆检测模型
-
运行脚本:
python Vehicle_DC -src_dir your_imgs_dir -dst_dir your_result_dir
-src_dir
指定输入图像目录。-dst_dir
指定输出结果目录。
程序简介
本程序包含两大模块:
- 车辆检测模块:仅提供模型加载和推理代码,如果需要训练代码,可以参考
pytorch_yolo_v3
。 - 多标签识别模块:包含车辆颜色、车辆朝向、车辆类型等属性的识别。提供训练和测试代码,可以预测车辆的车身颜色、车身方向和车型。
将这两个模块结合在一起,可以同时实现车辆的检测和多标签识别。以此为基础,可以从室外交通场景中提取结构化信息。
程序模块详解
-
VehicleDC.py
- 模块功能:负责车辆检测和多标签分类的接口封装,需要指定测试源目录和结果输出目录。
- 主类
Car_DC
:__init__
方法:负责初始化车辆检测和车辆识别模型。detect_classify
方法:逐张对图像进行检测和识别。首先对输入图像进行预处理,统一输入格式,然后输出该图像中所有车辆的检测框。通过process_predict
函数进行 NMS 和坐标系转换,得到最终的检测框。然后调用cls_draw_bbox
函数,在该函数中,逐一处理每个检测框,取出原图像中检测框区域的 ROI,将 ROI 送入车辆多标签分类器。cls_draw_bbox
方法:在该方法中,使用 B-CNN 算法对 ROI 中的车辆进行多标签属性分类。B-CNN 主要用于训练端到端的细粒度分类,本程序对其网络结构进行了适应性修改,使用 ResNet-18 作为基础网络,以兼顾推断速度和准确度。
-
车辆多标签数据模块
dataset.py
- 数据组织:训练和测试数据按子目录存放,子目录名为标签,如
Yellow_Rear_SUV
。 Vehicle
类:__init__
方法:初始化数据路径和数据标签。由于数据标签是多标签类型,因此对输出向量分段计算交叉熵损失。__getitem__
方法:迭代返回数据和标签,返回的数据需要经过标准化等预处理。__len__
方法:获取数据的总数量。
- 数据组织:训练和测试数据按子目录存放,子目录名为标签,如
-
车辆多标签训练、测试模块
train_vehicle_multilabel.py
- 训练过程:
- 选择交叉熵作为损失函数,由于是多标签分类,计算损失时需要累加各个标签的损失,公式为
loss = loss_color + loss_direction + 2.0 * loss_type
。根据经验,将车辆类型的损失权重设为 2 倍效果较好。 - 训练分为两步:
- 冻结 ResNet-18 除全连接层外的所有层,进行 Fine-tune 训练直到收敛。
- 解冻所有层,进一步 Fine-tune 训练,调整所有层的权重,直至整个模型收敛。
- 选择交叉熵作为损失函数,由于是多标签分类,计算损失时需要累加各个标签的损失,公式为
- 训练过程:
性能评估
- 车辆检测:单张图像推断耗时,在单个 GTX 1050TI GPU 上约为 18ms。
- 车辆多标签识别:单张图像推断耗时,在单个 GTX 1050TI GPU 上约为 10ms。
项目优势
- 高精度:结合了 YOLOv3 和 B-CNN 的强大性能,实现了高精度的车辆检测和多标签识别。
- 实时性:高效的推理速度,适合实时应用场景。
- 易用性:提供了完整的接口封装,用户只需指定输入和输出目录即可使用。
未来展望
- 模型优化:持续优化模型,提高检测精度和速度。
- 功能扩展:增加更多的功能,如车牌识别、车辆追踪等,以适应更多应用场景。
- 跨平台支持:进一步优化代码,使其能在 Windows、Linux 等多个平台上稳定运行。
通过上述方法构建的车辆检测与多标签分类系统,不仅能够有效提升智能交通系统的性能,还可以为城市管理、交通安全等领域提供有力支持。随着技术的不断发展和完善,此类解决方案将在未来的智能交通系统中发挥越来越重要的作用。