Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏
车辆检测及型号识别广泛应用于物业,交通等的管理场景中。通过在停车场出入口,路口,高速卡口等位置采集的图片数据,对车辆的数量型号等进行识别,可以以较高的效率对车型,数量信息等进行采集。通过采集的数据,在不同的场景中可以辅助不同的业务开展。如商场停车位的规划,路况规划,或者公安系统追踪肇事车辆等等。
数据集分类文件labels.txt
因此,经过讨论,我们的首要任务是将tfrecord数据复原出来,并且找到一种合适的方式能实现检测功能。
可能的方案有:
经过对比,我们最终选择了第三个方案。
最终的方案流程如下:
图3-1 方案流程图
项目实施计划如下:
第一周:
第二周:
第三周:
第四周:
根据项目提示,图片打包过程参考flower的例子,经过研究源代码打包过程和解包过程,我们完成了图片的复原工作。将图片按照分类放进各自的文件夹中。
首先,Yolo是回归检测的开山之作,检测效果不错mAP~0.58,而且运行速度非常快能够达到45-150帧每秒。另外一个是因为我们团队的黎同学之前研究过这个模型,所以弄起来比较有把握。
然后我们测试了一下检测的能力:
图3-4 YOLO检测汽车测试
图3-5 YOLO检测更多辆汽车测试
可以看到,YOLO能够出色的完成多辆汽车检测的任务,框选出来的位置很准确。只是会把汽车分成truck、car、bus等分类,这个只需要后期做一下处理都当成汽车就行了。
下一步就是要进行分类网络的训练,项目要求使用Inception_v4模型。于是我们就读了一下Inception_v4的论文,然后研究了一下slim分类训练里面的代码。
论文中介绍了Inception_v4的网络结构还同时介绍了另外一种加了residual的Inception_v4的结构。 同时还把Inception_v3以及带residual的inception_v3做了对比,得出了一些结论:
Inception_v4在Inception_v3的网络结构上进行了一些结构上的微调,最终的实验结果是
图3-6 四种模型的训练结果
Inception_v4系列比Inception_v3系列相比,准确率方面是更优秀的,Top-5 error减少了1.多,另外加了residual的V3或者V4都比不加的模型训练更快的收敛,但是准确率方面倒没有什么更多的贡献。
训练的思路是,先从slim的github上下载预训练的模型
图3-7 Inception_v4
然后对这个模型进行Finetune。过程是这样的:
图3-8 Inception_v4进行finetune
这里指定了train_dir 和dataset_dir,model_name是incption_v4, checkpoint_path是我们下载的checkpoint。然后重要的一点是指定checkpoint_exclude_scopes参数,这里把InceptionV4/Logits,InceptionV4/AuxLogits这两个层排除了,这在slim中会判断没有这两层的话,会根据dataset.py中提供的_NUM_CLASSES参数,从新配置分类的层。而前面的层目前还是保持不变的。尤其注意的是,这里不需要额外指定trainable_scopes参数就行了,否则训练只会训练这里指定的层。我们这里需要将全部的层都参加训练。这样前面特征提取的层在训练中会进行微调,而后面的分类层会着重进行反向传播调整。
训练过程中打开tensorboard,查看过程如下:
可以看到total_loss稳步下降,最终稳定在1.多左右
模型的稀疏度也一直在调整,下降,代表模型的拟合能力在提升。
学习率开始的时候设置的是0.001, 然后中间停止训练改成decay模式,继续训练,可以看到后面学习率在下降一段时间后,保持在我们设置的最小值上。最小值能防止模型失去反向传播的动量,而随着训练的进行减小学习率能够减小模型的震荡,让模型尽快调整到最优点。
Slim训练中有对数据进行预处理的功能,可以将图片进行裁切、反转等操作,增广训练数据,让模型的拟合能力更强。
可以看到各个层的参数都在随着训练进行调整
训练的差不多了,进行一次验证:
验证集上准确率达到了88.7% ,top-5 达到了94.59%,达到了预定的要求。
代码整合是把两个模型的检测程序连接起来,通过YOLO网络检测出Car,Bus,Truck类的坐标,然后根据坐标将原图裁剪,将裁剪后的数据送入inceptionV4分类网络中,得到类别,最后通过得到的类别,坐标信息在原图上标记并显示原图。
单个目标的识别结果很好
单个目标的结果1
单目标检测结果2
多个目标的情况会受图片质量,以及车辆遮挡的影响
多个目标的情况,前面的车结果正确,后面两个车明显不对
这种情况就更不行了
原因:
图4-1 图片的宽高对应col和row问题
trainable_scopes=InceptionV4/Logits,InceptionV4/AuxLogits
这样,模型训练的时候,将只训练最后这分类的两层。导致我们出现了如下问题:
在6-8小时训练过后也没有在验证集上达到top1 80% 准确率;
训练了53万步依然在4和5之间摇摆
Tensorboard上相关数据:
可以看到我们的正则项损失趋向平缓,说明模型参数好像没有继续拟合了。
学习率在finetune的过程中我修改过几次,好像对模型影响效果不明显。
在tensorboard中这两个参数一直没有改变,看demo的话好像是把这两个节点是给排除的。
经过分析之后,感觉是训练出现了问题,于是寻找答案,发现slim上给出的finetune模式是这样的:
即第一步是只训练线性分类那两层,第二步是把所有参数一起训练,即就是修改这API中这两个参数。 我这里最终是在之前自己训练的基础上,继续把所有参数加入进去进行了训练,得到了上一节中达到的效果。
合并处理方案
完整代码下载地址:Pyhon基于YOLOV实现的车辆品牌及型号检测项目