Bootstrap

基于深度学习的车型识别系统的设计与实现

**计算机系统的介绍

一 概要

   随着城市化建设的不断发展,我国对交通建设的需求也不断增长。发展智能交通是一项重要的任务,而汽车车型的识别在智能交通领域又起着极其重要的作用。本文采用PyTorch这一深度学习框架,利用ResNet-50预训练模型为基础训练得到了用于车型识别的模型,通过分析比对全连接层中的各项参数与各类函数,对该模型的全连接层进行了修改与调优以适应本模型。除此之外,本文通过编写爬虫脚本采集迁移学习时所需要的样本图片以完成训练集的制作。经过不断尝试与挑选得到了训练完成的最优模型并将其应用到实际场景中,分别设计了一个汽车图片分类程序以及一个以html为前端、python为后端的车型识别网站。
关键字:深度学习、车型识别、迁移学习、PyTorch。

二、绪论

1.1.研究背景与意义

1.1.1.研究背景

  随着城市化建设不断发展,我国对交通建设的需求也不断增长,我国成为了世界上在交通领域基础设施建设最快的国家之一[1],但车辆管控问题、道路交通问题、车辆违章问题等层出不穷,很难做到全面、有效的管理。目前,计算机技术不断提高,在大数据、物联网和机器学习等技术的支持下,人类社会日渐趋于智能化,智能地管理城市交通正是目前急需发展的,即智能交通。智能交通指的是将计算机技术、物联网、机器学习等技术综合运用于交通体系,能够有效、准确、全面地管理交通[2]。目前,智能交通在国外一些发达国家已经得到了广泛地使用,在我国也快速地发展着。
  汽车车型的识别在智能交通领域有着极其重要的作用,它采用图像处理等技术,根据不同汽车车型的图像特征,对其进行分类。我国从九十年代已经开始了这方面的研究,社会上很多人才已经在这一方面投入了大量的研究,对交通智能化领域的发展提供了巨大的帮助。
  对于车辆的智能识别来说,深度学习提供了一种高效可靠的解决方案,其中卷积神经网络在车型识别中得到了广泛的应用[3]。近几年来,随着大数据的发展,传统机器学习的发展并未随着数据量的增多而发展,深度学习却有了很好的表现。运用大量数据来提高自身性能的深度学习迅速被应用到各种场合,并发挥了独特的作用。从2017年1月Facebook AI 研究团队发布PyTorch以来的三年的时间,PyTorch发展迅速,在深度学习领域不断发光发热,为深度学习爱好者提供了一个优秀的深度学习框架。

1.1.2.研究意义

  一方面,汽车车型识别能有效地简化一些交通管理问题,减小了交通规划所需的成本,提升管理效率。例如,有些路段禁止大货车通行,要严格管控违章车辆需要投入大量人力成本,但智能化识别车型便能方便有效地管理这些交通问题。另一方面,也有利于道路车辆信息实时地采集,通过对采集到的这些数据进行统计分析,有利于之后对不同路段道路交通的规划建设。除此之外,车型识别对于数据集的管理也有重要的意义,对于其他汽车智能定损项目的数据集的筛选制作提供了便捷的方法,极大地提升了素材管理的人力成本。

1.2.主要研究内容

  本文开发了一个以python为后台,以html为前台用于车型识别的网站系统。系统后台通运用 PyTorch深度学习框架,根据性能及需求选择并搭建了一个适合的神经网络,通过采集大量素材,制作了训练数据集、验证数据集及测试数据集对网络不断训练和测试,根据结果不断进行优化和完善,最终得到了一个可靠的识别系统。
  与此同时,本文开发一个了python程序,用于将文件夹中的汽车图片按照车型分入不同的文件夹中,该程序可以用于到一些实际项目中,帮助项目整理车型类图像样本素材,节约素材整理时间,提高效率。

二、车型识别系统总体设计

2.1.系统需求分析

  以杭州某公司为例,该公司的车辆保险项目是利用机器学习方法,仅需通过车损照片就可以快速、智能、高效地判断赔损情况。由于定损过程中对车型具有限制,因此需要员工进行网络车型图片爬取并人工筛选制作数据集,效率低下且常常因为员工的失误导致车型数据集存在不属于该车型的杂质样本。本车型识别系统很好地可以应对这一需求,该系统能将车型图片进行快速有效地分类,即节约了该公司研发时间,又降低了研发成本,可以实现高度自动化。
  除此之外,随着机器学习技术的快速进步,智慧交通这一概念不断被提起。实现交通智能化、管理高效化时钟离不开基于各项机器学习技术的一些识别系统,本车型识别系统就是其中的一个重要组成部分。利用本车型识别系统,可以实时监控路段车型情况,有效排查违规车型这一智能交通领域的基本需求。
  综上所述,制作一个基于深度学习框架的车型识别系统无论对于相关企业或是交通智能管理都有着较大的需求和重要的意义。

2.2.环境介绍

  操作系统:Windows 10
  Python IDE(集成开发环境): JetBrains PyCharm+ Jupyter notebook
   Python版本:Python3.7
   深度学习框架:PyTorch
  PyTorch框架介绍:深度学习框架可以有效简化神经网络搭建的代码,同时使代码有更好的可读性。相较其他较为常用的框架,PyTorch的性能更好,具体表现在模型的训练上有着更快的速度,这也是深度学习上一个重要的指标,主要由于PyTorch是由C语言开发。PyTorch框架的出现相对比较迟,目前的学习资源也相对来说较少,但由于该框架的实用性很高,目前也受到了很多人的关注。同时,PyTorch在学习上和使用上相对来说比较简单灵活。
CUDA版本:10.2(用于进行GPU运算,相较于CPU运算大大提高训练效率)
  爬虫编写相关库:requests、urllib3
  神经网络训练相关库:numpy、torch、torchvision、opencv、matplotlib

2.3.整体方案设计

  本文分析了Pytorch和TensorFlow深度学习框架的优劣势和所适用的应用场景,结合车型识别这一实际目的,最终选择了灵活简易,易于应用的Pytorch框架。在深度学习网络的设计中,对经过不同层数的预训练的RestNet模型进行迁移学习实验。迁移学习是目前深度学习中的一个热点,主要也是为了解决目前很多情况下标注数据稀缺的问题[4],在素材较少的场合下也能达到满意的识别结果。本文用全链接神经网络代替RestNet网络最后一层,并将该输出经过Softmax函数进行分类判断得到预测结果。实验过程中还对预训练模型的最后一层进行了包括Loss函数、学习率及其动态变化方法、正则化函数、梯度下降算法及优化器等在内的算法和函数的调整以最优化适应本车型识别模型。
  用于训练的车型被分为小汽车、越野车、面包车、大巴车、货车、SUV六类,通过爬虫技术采集该六类车型的图片素材,通过筛选和清洗之后制作包括训练集、验证集和测试集在内的完整数据集。训练集将输入到模型中用来训练和更新模型的参数,验证集则将在每一轮次的训练后对模型识别准确率进行验证,评估选择在迭代过程中的最优模型。根据分析验证集的准确率数值,与训练集的数据同时分析之后可以对模型最后一层的各项函数和参数进行人工调优后得到更适应车型识别的模型,最终可以将测试集输入到训练结果最好的模型中进行考核该模型的泛化能力。
  模型训练测试完成之后,可以将这个模型应用于各种车辆图片的车型识别与分类。分类程序中,程序得到需要被分类的车型图片的文件夹路径之后将各图片输入到训练完的模型之中,根据测试模型输出的对应标签将各车型图片复制到该目录下生成的对应车型文件夹中,完成分类工作。此外,本文还设计了一个示意网站来与用户进行交互,用户将上传汽车图片到后端进行识别,识别结果将返还到用户界面上。
系统整体框架流程图如图1-1所示。
在这里插入图片描述

图1-1 系统整体框架图

2.4.原理概述

  深度神经网络可以模拟出人体的神经结构,建立神经网络来解析数据进行学习。神经网络一般包括了输入层、隐藏层和输出层,深度神经网络一般含有较多数量的隐藏层,层与层之间进行输入与输出进行加权计算连接,加上偏置后,通过激活函数对输出按照激活函数进行变换,变换后即为该神经元的输出。神经网络的训练就是给网络输入大量的数据集进行训练,对神经元中未知的权重值通过反向传播进行计算和修正,使之总结出事物特征。
  卷积深度神经网络是常用于图像识别的深度学习方法之一,其隐藏层较为复杂。一般来说,一个卷积网络的隐藏层包含了卷积层、池化层、全连接层。卷积层能够计算得到素材样本的局部特征,从而当图片本质未发生变化,只是位置发生变化时,能够依然保留图像的本质特征,如当图片进行旋转、镜像、变换位置时,依然使神经网络能提取出与原图类似的特征。
  由于训练一个完全的卷积神经网络需要大量数据集,训练时长将无法预估,所以本文将应用到卷积神经网络中的ResNet网络模型进行迁移学习。迁移学习,就是将已经经过预训练的适用于大数据的模型及其参数迁移到自己的模型中,然后根据本身数据集的需求,对训练好的模型的输入层、输出层进行调整,使其适用于自己的数据集,再进行训练。车型识别系统总体设计。

三、数据集设计与制作

  

4.1.数据集介绍

  该系统包含识别的车型为六类,分别为大巴车、货车、小汽车、面包车、越野车、SUV,数据集被分为训练集、验证集和测试集。
  训练集作用:训练集输入到神经网络中,使网络自动学习数据集中图片的特征,从而对神经元中未知的权重值通过反向传播进行计算和修正,使之能总结出图片额的特征。
  验证集作用:验证集将在每一轮次的训练后对模型识别准确率进行验证,评估选择在迭代过程中的最优模型。根据分析验证集的准确率数值和变化趋势,根据准确率的收敛和发散情况,可以对模型最后一层的各项函数和参数进行人工调优后得到更适应车型识别的模型。
  测试集作用:用于对最终的模型进行测试与评估。
  训练集、验证集、测试集分别放入三个文件夹内,分别命名为train、valid、test。每个文件夹内包含六个文件夹:0_BUS、1_TRUCK、2_CAR、3_MINIBUS、4_JEEP、5_SUV,每个文件夹对应一类车型。将相应车型的图片放入相应的文件夹,用来给图片打上标签。

4.2.数据爬取与整理

4.2.1.数据爬取

  由于深度神经网络的训练需要大量的图像素材,所以本文使用python编写爬虫脚本,进行多线程爬取百度图库中相关的车型的搜索结果图片,关键代码如下:
  1)对输入的搜索关键字进行url编码,urllib库中的urllib.parse用于url解析:
queryEnc = urllib.parse.quote(keyword)
  2)为了提高图片爬取的效率,需要进行多线程工作。将进程池设为5,当有新的请求被提交时,如果进程池中的进程数未到最大,则为提交的请求创建一个新的进程,直至进程数到达上限,其余的请求则需要等待池中其中一个进程结束。在多线程中对图片进行读取和保存的相关代码,首先需要导入相关的库,设置进程池的大小,通过异步非阻塞的方式对图片进行读取和存储:

from multiprocessing import Pool
p = Pool(5)
;