基于mmcls的车辆属性识别

一、概述

本研究主要针对车辆属性识别课题。研究能够识别车辆多种外观属性的智能算法,这些属性包含颜色、 类型、副驾驶是否有人、是否系安全带、遮阳板是否放下、车辆朝向、是否有车顶架等。

二、研究过程

2.1 调研

  • 搜集车辆属性识别相关的文献资料,了解该方向的发展和意义
  • 搜集相关算法和模型,选择合适的模型进行后续的实验
  • 搜集该领域的有些开源数据集,用于模型的训练

2.2 数据集

在本项目中,能寻找到的开源数据集有限。目前所用数据集为车辆ReID的数据集VeRi。

2.2.1 数据集介绍

该数据集来自于论文(A Deep Learning-Based Approach to Progressive Vehicle Re-identification for Urban Surveillance),其中提到为了促进车辆重识别(Re-Id)的研究,我们在现实世界城市监控场景中建立了一个名为VeRi的车辆重识别的大规模基准数据集。

基于mmcls的车辆属性识别_第1张图片

该数据集的ann_file中标注了一些车辆属性。

2.2.1 数据集格式转换

为了方便后续实验,针对VeRi数据集的ann_file格式进行了转换。

  • 转换之前的格式如下:

基于mmcls的车辆属性识别_第2张图片

  • 转换之后:
    基于mmcls的车辆属性识别_第3张图片

2.3 模型选择

为了训练更加快速,本项目选择了轻量化的MobileNet_v2。

2.3.1 MobileNetV2的介绍

MobileNet v2网络是由google团队在2018年提出的,相比MobileNet V1网络,准确率更高,模型更小。

网络中的亮点 :

  • Inverted Residuals (倒残差结构 )
  • Linear Bottlenecks(结构的最后一层采用线性层)
2.3.2 MobileNetV2的结构
  • Inverted Residuals。相信熟悉ResNet残差结构的都清楚,残差结构是先用1x1的卷积降维,再升维的操作。但在MobileNetV2中,是先升维,在降维的操作。所以对于ResNet残差结构是两头大,中间小。而对于MobileNetV2结构是中间大,两头小的结构。除此之外,MobileNet结构中采用了新的激活函数ReLU6

基于mmcls的车辆属性识别_第4张图片

  • Linear Bottlenecks。针对倒残差结构中,最后一层的卷积层,采用了线性的激活函数,而不是ReLU激活函数。

基于mmcls的车辆属性识别_第5张图片

这样做的原因:

  • ReLU激活函数对于低维的信息可能会造成比较大的瞬损失,而对于高维的特征信息造成的损失很小。而且由于倒残差结构是两头小中间大,所以输出的是一个低维的特征信息。所以使用一个线性的激活函数避免特征损失。

三、可视化与结果分析

3.1 可视化

3.1.1 数据流水线可视化

基于mmcls的车辆属性识别_第6张图片
基于mmcls的车辆属性识别_第7张图片

上图展示了模型训练之前,对训练集图像进行数据增强之后的效果。通过这种数据增强操作,对于车辆属性识别中的车型属性有着非常好的训练效果。

3.1.2 学习率策略可视化

基于mmcls的车辆属性识别_第8张图片

上图展示了训练过程中学习率lr的变化,可通过该方式在训练之前验证自己的设置是否正确。

3.2 结果分析

由于是通过finetune的方法进行模型训练的,所以模型原本已具备很好的特征提取能力。通过下面的结果可以看到,在训练初期,loss和准确率已经比较稳定了。

3.2.1 loss下降曲线(上:颜色 下:车型)

基于mmcls的车辆属性识别_第9张图片
基于mmcls的车辆属性识别_第10张图片

3.2.2 accuracy曲线(上:颜色 下:车型)

基于mmcls的车辆属性识别_第11张图片
基于mmcls的车辆属性识别_第12张图片

四、源码使用说明

具体代码已上传至Github

4.1 安装依赖

下面是快速安装的步骤:

conda create -n open-mmlab python=3.8 pytorch=1.10 cudatoolkit=11.3 torchvision -c pytorch -y
conda activate open-mmlab
pip3 install openmim
mim install mmcv-full
git clone https://github.com/GoblinsWang/mmcls_car_attribute_recognition.git
cd mmcls_car_attribute_recognition
pip install -v -e .
# "-v" 表示输出更多安装相关的信息
# "-e" 表示以可编辑形式安装,这样可以在不重新安装的情况下,让本地修改直接生效

4.2 主要改动

  • mmcls/datasets中添加自定义的数据集类carslist.py
import mmcv
import numpy as np
from .builder import DATASETS
# from .multi_label import MultiLabelDataset
from .base_dataset import BaseDataset

@DATASETS.register_module()
class CarsList(BaseDataset):
    # CLASSES = ['sedan', 'suv', 'van', 'hatchback', 'mpv', 'pickup', 'bus', 'truck', 'estate']
    CLASSES = ['yellow', 'orange', 'green', 'gray', 'red', 'blue', 'white', 'golden', 'brown', 'black']
    def load_annotations(self):
        assert isinstance(self.ann_file, str)

        data_infos = []
        with open(self.ann_file) as f:
            samples = [x.strip().split(' ') for x in f.readlines()]
            for sample in samples:
                info = {'img_prefix': self.data_prefix}
                info['img_info'] = {'filename': sample[0]}
                info['gt_label'] = np.array(sample[1], dtype=np.int64)
                data_infos.append(info)
            return data_infos
  • mmcls_car_attribute_recognition/car_attr_recognition/configs/mobilenet_v2_finetune.py中通过以下代码注册上述模块:
# 添加自定义类
custom_imports = dict(
    imports=['mmcls.datasets.filelist', 'mmcls.datasets.carslist'],
    allow_failed_imports=False)

4.3 使用示例

  • 训练:
python tools/train.py car_attr_recognition/configs/mobilenet_v2_finetune.py

五、参考资料

  1. MobileNetV2: Inverted Residuals and Linear Bottlenecks

  2. 轻量级网络——MobileNetV2

  3. openmmlab的mmcls源码

  4. 关于VeRi-776(车辆重识别)数据集

你可能感兴趣的:(算法任务,深度学习,人工智能,神经网络)