基于深度学习的车辆类别检测研究与实践
时间:2023-06-23 15:15:05 来源:雅意学习网 本文已影响 人
甘 丽
(马鞍山师范高等专科学校,安徽 马鞍山 243041)
目标识别与分类一直是计算机视觉领域重要的一个应用方向,早期的利用尺度不变特征变换[1]、利用方向梯度直方图等方法因其不能支持太大的数据规模,模型的泛化能力较差,目标检测技术的发展受到一定限制[1]。神经网络在机器学习中的提出,使得目标检测有了新的发展,但受计算机性能限制,其理论存在解释性差,训练时间长等缺点。90年代中期,支持向量机、逻辑回归等机器学习算法的兴起也对神经网络的发展带来重大打击。然而,随着计算机性能的提高,2006年Hinton教授等人提出深度学习概念,让目标检测领域有了新的希望与发展。Chen等人提出利用深度学习原理在SAR(Synthetic Aperture Radar)图像上实现目标识别,在MSTAR数据集上的实验取得了良好的效果[2]。目标识别技术被广泛应用于人脸识别、自动驾驶、安防监控等各个领域。
通过研究卷积神经网络原理,分析VGG算法模型并进行迁移学习,在车辆类型的目标检测中成功应用。文中描述了实现车辆品牌类别目标检测的关键步骤,对图像目标检测的应用开发有积极参考作用。
在道路目标检测领域,检测不同种类的车辆如货车、小汽车、行人、骑行人等已有不少成熟的研究[3],本课题主要研究利用迁移学习的方法对检测目标进一步细化,检测各种不同品牌的小汽车,为道路交通中的目标检测提供积极的参考作用。采用卷积神经网络VGG16模型来解决10个车辆品类的目标检测问题,利用VGG网络的预训练模型,对其进行微调,建立自己的网络结构,通过训练集数据对模型进行训练得到目标模型,然后利用目标模型对测试集数据进行预测,模型学习检测流程如图1所示。
图1 模型学习检测流程图
1.1 卷积神经网络
在计算机视觉领域,图像特征数量会对神经网络效果产生较大压力,使用卷积神经网络能很好解决此问题。卷积神经网络有一个或多个卷积层、池化层以及全连接层等组成[4]。卷积神经网络结构图如图2所示。
图2 卷积神经网络结构图
卷积层的作用是提取输入的不同特征,主要参数有卷积核Size的大小,padding-零填充,stride步长等。通过卷积层的计算能在提取特征的同时不减少图片特征数量,但在最后的全连接层依然面临大量参数,所以需要池化层进行特征数量的减少。
池化层的作用是对卷积层学习到的特征图进行亚采样处理,池化方式主要有最大池化和平均池化两种,目的是为了降低后续网络层的输入维度,缩减模型大小,提高计算速度。
卷积层、激活层、池化层可以看成是学习特征提取层,而学习到的特征最终应用于模型任务需要先对所有特征图扁平化处理,再接一个或多个全连接层,进行模型学习[5]。
VGG是非常经典的卷积神经网络模型,该模型结构清晰,层参数简单。因其有13个卷积层和3个全连接层,也被称为VGG16模型。所有卷积层都采用小卷积核(3*3),步长为1,所有池化层都采用2*2池化,步长为2。
1.2 目标模型的训练
模型的训练主要包括模型的训练步骤和数据增强。
1.2.1 目标模型训练的步骤
目标模型的训练分为2个阶段:预训练阶段和训练集阶段。预训练的VGGNet是在AlexNet的基础上反复堆叠3*3的小型卷积核和2*2的最大池化层,不断加深网络结构,在CIFAR10的数据集上进行训练。训练集阶段:在预训练的模型的基础上,修改最后输出结构,利用自制数据集对剩余网络结构进行训练,最后对网络模型进行参数微调。实验的目标模型中,预训练模型引用TensorFlow提供的VGG16模型,目标模型的训练过程如图3所示。
图3 目标模型训练图
1.2.2 数据增强
在深度学习中,对输入数据进行数据增强,可以丰富图像的训练集,更好地提取图像特征,泛化模型,数据增强还有一个很重要的作用是可以将图片转化成符合算法的大小要求,比如YOLO算法中图片大小都要变换成448×448。
数据增强一般是通过剪切、旋转、缩放变化、尺度变换、颜色变换等一种或多种组合数据增强变换的方式来增加数据集的大小[6]。
实验中,因采集的图片数量没有足够大,需要减少数据集中不相关特征的数量。对于实验中的汽车分类器来说,将现有数据集中照片翻转获得新的数据集。通过增强数据集,可以有效防止神经网络学习到不相关的模式,提升效果。
利用Keras框架里面已经训练好的VGG16模型,对其进行微调,来做本研究中车辆类别的迁移学习实践。
2.1 读取本地图片数据以及类别
使用一个ImageDataGenerator图片生成器,定义图片处理以及数据增强相关功能,主要实现代码如下:def __init__(self):
# 1.实例化图片生成器
# rescale:做归一化
self.train_generator = ImageDataGenerator(rescale=1. / 255)
self.test_generator = ImageDataGenerator(rescale=1. / 255)
# 指定读取数据的相关参数
self.train_dir = “./data/train”
self.test_dir = “./data/test”
self.model_size = (224, 224)
self.batch_size = 32
# 定义基础模型VGG(没有最后三个全连接层的结构)
self.base_model = VGG16(weights=“imagenet”, include_top=False)
def read_local_data(self):
# 读取训练数据集构造gen目标值格式
# 输入到VGG的形状
# 目标值的类型
train_gen = self.train_generator.flow_from_directory(directory=self.train_dir,#读取目录
target_size=self.model_size,#目标形状
class_mode=“binary”,#目标值格式
batch_size=self.batch_size,#批数量大小(样本批次)
shuffle=True)#读取的时候打乱数据
test_gen = self.test_generator.flow_from_directory(directory=self.test_dir,
target_size=self.model_size,
class_mode=“binary”,
batch_size=self.batch_size,shuffle=True)
return train_gen, test_gen
2.2 模型的结构修改
在不动VGG 输出结果的基础上,加上全局池化层和两个全连接层,构建自己的模型,实现代码如下:def refine_base_model(self):
x = self.base_model.outputs[0]
x = keras.layers.GlobalAveragePooling2D()(x)
#两个全连接层1024, 5
x = keras.layers.Dense(1024,activation=tf.nn.relu)(x)
y_prediction = keras.layers.Dense(10,activation=tf.nn.softmax)(x)
#构建自己的model
model = Model(inputs=self.base_model.inputs, outputs=y_prediction)
return model
2.3 freeze原始VGG模型
让 VGG 结构当中的权重参数不参与训练,代码如下:
def freeze_base_model(self):
for layer in self.base_model.layers:
layer.trainable = False
return None
2.4 编译
编译(指定优化器,定义损失函数,定义准确率)、训练模型,在迁移学习算法中,学习率初始化为较小的值:0.001,0.0001。因为是在已训练好的模型基础上更新,所以设置较小的学习率去学习。将训练好的模型保存为h5文件格式,实现代码如下:
def compile(self,transfer_model):
transfer_model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=[“accuracy”])
def fit(self,model,train_gen,test_gen):
model.fit_generator(train_gen,epochs=30,validation_data=test_gen)
model.save_weights(“./Transfer.h5”)
3.1 实验环境与数据
采用的是TensorFlow平台,利用Keras框架,采集的数据集的统计信息,如表1所列。
表1 训练集和测试集的统计信息
3.2 实验结果与分析
通过实验,典型测试结果如图4所示。
图4 典型的测试结果
在设置30个epoch后,10个车辆品类的训练集精度达近95%,测试集平均精度也达到了近90%。具体精度如表2所示。
表2 各个数据集的训练和测试精度值
在增加epoch为50、设置bath_size值为64,128后,训练精度有所提升,但测试集精度并未明显提升。
利用深度学习模型VGG解决车辆品类的目标检测问题,采用VGG16模型结构, 以ImageNet预训练卷积层,固定卷积层用自建的车辆品类训练集对剩余网络进行预训练;
通过加上池化层和两个全连接层来微调网络结构,构建自己的模型;
指定优化器,定义损失函数,定义准确率后编译训练,形成Transfer.h5模型文件。实验结果表明:深度学习算法能很好的提高模型泛化能力,模型在10个品类的测试集上准确率达到近90%。