Advertisement

opencv 车辆识别_基于Tensorflow的车辆检测和车型识别

阅读量:

1 项目介绍

本项目开发了一个车辆检测及车型识别系统的智能平台。该平台的数据来源主要集中在停车场出入口、路口以及高速卡口等多个位置,并从多个角度采集了丰富的图像素材。经过整理分类后发现,在这些采集过程中一共获得了48856张不同汽车型号的图片样本,并从中筛选出43971张用于训练集构建以及剩余的4885张作为验证用例集合。值得注意的是,在当前的数据集中我们主要关注于汽车型号分类这一核心任务,并未对图像中目标物体的具体位置信息(即标定框)进行标注存储。

因项目提供的数据集中缺少目标位置信息此问题亟待解决为此我们决定基于预训练的SSD模型结合人工标注数据进行多目标检测器的训练该系统能够识别单张图片中的多辆汽车并对其中的小型目标车辆进行精确定位通过这一技术手段我们可以获得较为完整的交通参与物信息为后续分析工作奠定基础随后通过已训练好的模型对整个数据集进行目标车体识别与剪裁处理随后将剪裁出的目标车体与其对应的车型标签导入分类器进行学习实验结果表明该分类器不仅达到了91%的基础准确率还实现了95%的前五名精确度这一成果充分验证了该方法的有效性

项目采用了分阶段的检测与分类方案,在实际操作中首先通过预先训练好的目标探测器对输入图像中的目标车辆进行识别,并从中分离出待分析的目标区域;随后经由分类模型对这些特征区域进行精确识别与类型划分;最后将系统识别输出结果叠加至原始图像,并在网页环境中展示该处理结果。

2 数据探索与分析

在目标检测流程中,确定图像目标的边界框并生成相应的XML标注文件。因此必须将课程提供的TensorFlow Record(TFRecord)文件转换为图像数据格式。参考download_and_convert_flowers.py文件从TFRecord中提取图片相关信息,并将其保存为JPG格式图片。还原后的图片按照车辆类型名称分类存放在764个子文件夹中,并对这些文件夹中的图片进行初步清理工作。对明显错误类别中的数据进行删除处理,请注意例如在比亚迪元车型类别中发现并删除了那些不符合条件的跑车图片(如下图所示)。

4a770bd7a14bb00ce107036de0bab148.png

解析tfrecord文件恢复图片的过程运行速度逐渐减缓,最终导致系统运行一段时间后陷入停滞状态。

abe0244ffed6f575de1d7e72adf4a51e.png

具体原因如下:如上文所示,在模型训练过程中,在循环迭代期间调用tf.reshape()函数会导致内存泄漏问题(memory leak),从而引发内存不足现象(memory issue)。每一次迭代都会向计算图中添加新的操作节点(operation nodes),随着时间推移会使整个系统的资源占用持续上升(resource utilization incrementally rises),最终导致程序运行速度显著下降(training speed drops)并被迫终止训练流程(forced to halt training process)。为了检测是否发生了操作节点数量变化的情况,请建议采用graph.finalize()来冻结整个计算图,并注意查看日志信息以判断是否存在操作节点修改情况发生(modify operation nodes occurred)。

解决:使用numpy.reshape()代替tf.reshape()

3 检测模型的训练

因为本项目的收集的数据仅限于车型标签信息。尽管项目要求实现车辆检测和车型识别。因此必须训练能够识别车辆的模型。其训练过程需基于每张图片中标注的目标坐标及其类别分类数据。

可通过LabelImg工具完成对数据的人工标注,并生成相应的XML格式标签文件。然而,在本项目中涉及约5万张图片时单纯采用人工注标的方式将导致大量的人力资源和时间成本投入。不过,在注标效率上具有显著优势的预训练好的SSD(单次运行耗时不到1秒)能够大幅缩短注标所需的时间。然而由于SSD模型基于COCO数据集进行过训练,在本项目的特定场景下可能存在较大差异——这种情况下会导致约900多张图像无法被正确识别或定位;舍弃这部分图像不仅会造成资源的巨大浪费而且其泛化能力相对较低;因此我们采用了以下策略:将SSD预训练模型与人工注标相结合的方法以显著提升整体检测系统的准确率。

具体方法为:

基于预训练的SSD模型对全部数据进行标注,并将能被检测的数据与不可检测的数据区分为两类。其中约900张样本是该预训练过程无法识别的对象。该过程基于COCO数据集进行,在包含汽车、行人、卡车等90种物体在内的丰富分类场景下运行。然而,在本研究中我们关注的是车辆位置定位问题而非分类识别任务本身。因此仅需提取SSD模型中识别出的汽车、卡车以及公交车的相关坐标信息并将这些信息按照统一类别标记(即将其类别标记设为'car')以实现后续的位置定位需求即可完成这一目标任务的具体操作步骤就是将这些坐标信息及其对应的图像名称以及类别标记归类为'car'后导出至VOC格式XML文件中

(2)从预先标记好的数据集中随机提取5000张图像用于筛选,并选择具有较高注释准确率的图像样本作为主要数据集。在未被检测到的数据库中取其三分之一用于人工注释(LabelImg)。通过整合筛选出的自动注标签信息与人工注标签样本构建训练集,并利用原始图片及XML文件生成TFRecord格式文件以供目标检测模型训练使用

利用训练好的模型对全部数据集进行第二次检测,在这一过程中,其中一部分数据能够被准确识别出来;按照第(2)步的操作流程重复上述步骤;从而不断优化并提高该模型的性能水平。

下图显示了检测模型训练损失下降过程及测试:

6a5ebf2ddbe8d31d7e2352bf9d42b7b3.png

问题:

在使用SSD预训练模型进行数据标注时

(2) 采用预训练模型进行标注并随后进行模型训练的过程中存在不足之处会导致该方法的性能表现欠佳。具体而言,在采用SSD标注的数据集中可能会导致一定偏差因为SSD所使用的COCO数据集与本项目的实际应用场景之间并非完全满足独立同分布的前提条件因此这种做法的效果并不理想

9c79dc10ea6a7eaa8b58b4ae05e89819.png

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]

裁剪后图片按类别保存到每个文件夹下,下图为裁剪后的示例:

aba315d20f9b17604d88f8fb67c909b5.png

模型训练参数:

预训练模型:inception v4 优化器:rmsprop batch_size:16

初始学习率:0.005

训练结果如下所示:

104f71624fc9c9b1bf2c9d49290ddf12.png

5 构建web检测系统

基于Python的Flask框架开发了一个前后端交互系统

最终检测结果呈现如图所示。该系统能够识别图像中的多个目标对象,并能输出每个目标所属类别及其相应的置信度数值。该图像采用cv2.rectangle函数和相关参数设置实现了边界框绘制功能

cv2.putText(img, text, (x,y), Font, Size, (B,G,R), Thickness)

弊端:从每张图片中逐一提取多个目标并输入分类模型进行识别操作,耗时较多;针对工业领域的实时检测识别任务而言仍存在诸多局限性。

179454947b164fcf75d1ae3204bd4e86.png
0f3ebffff40345bf0ade1f5f301f5721.png

方法二:端到端

1 车辆检测器训练

基于预训练的SSD模型对所有数据进行了标注,并通过区分能被识别出的数据与未被识别出的数据来分类处理。测试结果显示,在这些数据集中共有近900张图片未能被当前SSD预训练模型识别出来。

(2)从预先标记好的数据集中随机选取5,000张图像作为样本。选择具有较高标注准确度的图像样本用于后续分析。从未被检测到的原始数据源中提取约三分之一的数据用于人工标注,并借助LabelImg完成这一过程。将上述两种来源的标注信息整合后训练检测器模型,并确保所有样本最终被归类为'car'类型

通过训练后的模型对所有数据进行第二次检测后发现的结果被划分为能够被检测到和无法被检测到两类。如同步骤(2)所述的操作将此过程反复执行以持续提升该检测器的性能。

2 生成xml标签

通过训练好的模型对全部数据创建xml标签,并确保每个标签中包含每张图片的目标车辆型号信息

3 检测和分类模型的训练

由生成的xmls和images转换为tfrecord文件,开始训练模型。

训练超参数:

预训练模型 :ssd-mobilenet_v1 初始学习率:0.002 batch_size:24

训练过程如下图所示:

91d562d3c5d5a0965b7fd395c98b6916.png

全部评论 (0)

还没有任何评论哟~