python车辆型号识别_基于Tensorflow的车辆检测和车型识别
1 项目介绍
本系统实现了车辆检测及车型识别功能。该系统采用的数据来源主要集中在停车场出入口、路口以及高速卡口等典型场景中,并采集了共48,856张不同车型的照片数据。这些图片涵盖了43,971张用于训练的内容以及4,885张用于验证的内容。值得注意的是,在该数据集中仅标注了各类车辆的车型信息而不包含目标物体在图像中的具体位置信息(即未标注标定框)。为了实现系统的开发目标,我们主要利用TensorFlow提供的 slim 分类框架和 object detection 框架进行开发
由于项目所提供的数据集中缺乏对目标位置的标注信息,在此背景下我们基于预设的SSD模型框架结合人工标注的数据进行优化后构建了一个多目标检测系统。该系统不仅能够实现对单幅图像中多辆汽车的识别,并且能够实现对图像中小型物体(小型车辆)的识别能力提升。通过已知配置的学习过程,在测试集上完成对所有待检车辆的定位与提取。随后通过该系统的输出结果完成特征抽取并建立分类器,在评估指标上取得优异效果:分类器在验证集上的准确率达到91%,并且在top5评估指标上表现达到95%。
该系统采用了基于检测与分类的双重策略。通过预先训练的检测模型识别出目标车辆,并对图像区域进行截取。随后将这些区域输入至预-trained分类器中完成识别工作。系统将所有检测与识别结果叠加到原始图像上,并在Web界面展示处理后的结果。
2 数据探索与分析
目标检测任务中的一个主要环节是对图像进行标注框设置并生成相应的XML标注文件。为了实现这一目标,请将课程提供的TFRecord文件转换为图像数据集。参考download_and_convert_flowers.py脚本程序提取TFRecord中的图像信息,并将其保存为JPG格式的图片文件。修复后得到的图片按照车辆类型名称分类存放在764个子文件夹中,并对每个子文件夹中的图片进行初步清理工作:对于明显错误类别的图像数据予以剔除(例如,在比亚迪元车型类别中发现跑车图像的情况),如图所示:
在解析包含图像的tfrecord文件时,图片重建过程的速度逐渐减缓,在经过一定时间的迭代后可能陷入停滞状态。
问题描述:如上图所示,在循环迭代过程中调用tf.reshape()[函数](()锁定整个计算图来进行检查:如果出现错误信息,则表示迭代过程中计算图发生了变化。
解决:使用numpy.reshape()代替tf.reshape()
3 检测模型的训练
基于本项目所使用的数据仅为车型标签信息,并未包含完整的车辆特征描述。然而根据项目需求是实现车辆检测及车型识别的目标,则必须开发能够进行车辆检测与识别的技术方案。因此我们需要设计并训练一个能够有效完成这些任务的具体模型架构。该模型在训练过程中将依据每张图片中被检测到的目标对象对应位置坐标以及具体分类标签作为必要条件来进行学习与优化。
对数据的人工标记可采用LabelImg工具完成,并遵循voc格式规范生成xml文件以供处理。然而面对约5万张图片的数据量时,单纯依赖人工标记会导致巨大的时间和人力资源投入。而采用预训练的ssd模型能够显著缩短检测所需的时间,但因coco数据集与本项目实际场景存在差异,直接应用该模型会导致约9,000张图像无法被正确识别,造成大量样本无法有效利用的同时也影响了检测器的泛化性能。因此我们采取了将ssd预训练模型与人工标记相结合的方法,从而显著提升了检测系统的准确度
具体方法为:
(1) 采用预训练的SSD模型对数据进行校准,并将其能够捕获的数据与无法捕获的数据区分开来。结果显示,在这些数据集中有近900张图片无法被SSD预训练模型捕获。其中所使用的基准数据集是COCO格式,并包含car、person、truck、bus以及boat等90种物体类别。然而,在本研究中我们专注于开发一个针对车辆定位的应用程序,并不需要区分person或其他物体类别。因此,在后续处理中我们将只需要提取这些类别中的目标(即car, bus和truck),并将它们的目标位置坐标信息提取出来即可。为了简化后续流程,在这一阶段我们将所有的目标类别归一化为同一类别(即'car')。最后我们需要将提取出的目标信息以及对应的图像文件名和分类标签(均为'car')按照VOC格式生成XML文件以供后续使用
(2) 从已标定的数据集中随机选取5000幅图像进行筛选,并选择具有较高注释准确率的样本作为自动注释数据集。从未能直接获取的原始数据源中提取1/3的比例用于人工标注(LabelImg)。基于筛选后的自动标注数据与人工标注数据结合构建训练集,并将原始图像及XML注释文件转录为TFRecord格式文件后开展模型训练
通过训练优化后的模型进行二次检测结果仍然分为可识别和不可识别两类按照步骤(2)执行同样的操作从而持续提高检测系统的性能水平
该图呈现了对模型训练损失曲线的下降趋势及其测试结果。
问题:
在基于预训练SSD模型的数据标注过程中,在car、bus和truck类别的目标检测坐标信息记录方面存在特定需求。最初阶段仅输出每张图片的最大目标框作为标注,并据此构建相应的训练数据集。这使得模型在处理较小尺寸的目标时表现不足。
采用预训练模型进行标注并经过后续训练后得到的模型性能难以达到预期效果。原因在于所使用的COCO数据集与当前项目的数据集并非独立同分布,这可能导致所采用的方法无法有效适应当前任务的需求。
4 分类模型的训练
构建分类模型有两种途径:其一为基于原始图像的数据构建模型;这些模型主要基于项目提供的TFRecord格式分类数据集构建。然而,在实际应用中发现这类模型在处理被检测器裁剪后的目标时表现不佳。因此,在后续的研究中我们采用了基于原始图像的改进方案。
基于三个训练好的汽车检测模型对项目中的所有图像进行遍历处理。由于同一图像可能包含多个目标车辆,在处理过程中会获取了每个目标的具体坐标信息。通常情况下,在一个图像中只会赋予最大尺寸的目标具有分类标签。为了确保检测到的目标与其标签的一致性,在处理过程中我们仅对图像中具有分类标签的最大尺寸的目标进行裁剪处理。裁剪的方式可以选择PIL或OpenCV这两种工具来实现
PIL:img=Image.open() crop_img=img.crop(xmin,ymin,xmax,ymax)
Opencv: img=cv2.imread() crop_img=img[ymin:ymax,xmin:xmax]
裁剪后图片按类别保存到每个文件夹下,下图为裁剪后的示例:
模型训练参数:
预训练模型:inception v4 优化器:rmsprop batch_size:16
初始学习率:0.005
训练结果如下所示:
5 构建web检测系统
基于Python的Flask框架进行开发,并构建一个能够实现前后端程序与HTML页面之间有效交互的应用系统
生成的目标检测结果图中展示了系统能够识别图像中的多个目标对象,并支持为每个识别的目标类别分配相应的置信度值。该结果显示系统能够通过OpenCV库实现矩形边界框绘制功能准确标注出各个目标区域,并基于此输出相应的检测结果信息。
cv2.putText(img, text, (x,y), Font, Size, (B,G,R), Thickness)
缺点如下:对每张图片中的多个目标分别进行裁剪后输入分类模型进行识别的过程耗时较长;相较于针对实时检测识别需求而设计的任务系统而言,在实际应用中仍存在诸多局限性。
方法二:端到端
1 车辆检测器训练
采用SSD预训练模型对所有数据进行标注,并将可检测与不可检测的数据分类区分。其中约有900张数据无法被该模型检测
(2)首先从预先标记好的数据集中随机提取5000幅图像作为候选样本,并从中选择具有较高准确性的标注样本。接着从未检出的数据源获取三分之一数量用于人工注释(LabelImg)。随后将自动识别与人工校对得到的高质量样本集进行检测器训练,并确保所有样本均标记为car类型。
采用训练后的模型对所有数据进行进一步检测的结果表明其能够区分可检出与不可检出两类数据。通过重复(2)中的步骤被进一步优化的过程不断执行该操作使得检测器性能得以持续提升。
2 生成xml标签
通过经过训练的模型为所有图像赋予xml标签,在每个标记中包含其目标车辆型号的信息。
3 检测和分类模型的训练
由生成的xmls和images转换为tfrecord文件,开始训练模型。
训练超参数:
预训练模型 :ssd-mobilenet_v1 初始学习率:0.002 batch_size:24
训练过程如下图所示:
