背景
图像分类,是计算机视觉领域的一个核心问题,顾名思义就是输入一张图像,根据内容将其划分到某一个特定的类别。与其他分类问题相比,主要的区别在于输入是图像,这就导致其特征工程方法相对单一,通过图像的像素值进行特征提取。图像分类问题可以用图1来形象的描述。
图1 图像分类之“猫狗大战”
图像分类同时是其他很多高层视觉问题的基础,例如目标检测、图像分割、目标追踪、行为分析等等。它本身也在很多领域中有广泛的应用,例如社会生活领域中的垃圾分类、安防领域的人脸识别、医学领域的病灶识别、航空遥感领域的环境污染检测等等,本文中研究的具体问题属于自动驾驶领域中的交通路况识别。
图像分类的算法研究经历了一个比较漫长的过程。早期的最近邻分类(KNN)算法,将图像的像素值用二维矩阵存储,再将二维矩阵拉伸成一维向量,通过度量向量间距的方式进行分类。该类算法操作简单易于实施,但是计算量大,并且容易受到样本不平衡问题的影响;然后是多层感知器(MLP)算法,类似于KNN的特征处理,让一维向量特征通过包含多个线性非线性函数组合的神经网络结构,通过计算各类别可能性概率的方式进行分类。这一类算法在普通图片上识别效果不错,但是由于节点间的全连接方式会导致维度灾难,因此不能扩展到更高分辨率的图像上;近些年伴随深度学习的兴起,基于卷积神经网络(CNN算法)的算法越来越受欢迎。该类算法是通过卷积网络分层提取图像特征,替代单纯的向量特征,再依次通过卷积层、池化层、激活层等神经网络结构的运算,直接进行端到端的分类。这一类算法的网络结构不再使用全连接模式,并且计算量更小,也不需要额外的特征工程,因此使用范围更广。本文中进行交通路况识别所使用的模型就是基于卷积神经网络的残差网络(ResNet)。
数据准备
本文以阿里巴巴高德地图AMAP-TECH算法大赛 - 基于车载视频图像的动态路况分析为例,探索图像分类问题的建模方案。该比赛需要通过由行车记录仪拍摄的图像序列,判断对应道路当前时刻真实的路况状态。本文中用于建立模型使用的数据集包含4200个图像序列,每一个图像序列包含(3-5)帧图像,总共有16000多张图片。一个图像序列中包含的图像如图2所示。
图2 一个图像序列里包含的多帧图像
每个图像序列中有一幅为参考帧(参考帧多为路况状态容易清晰判断的序列中间或最后一帧图像),算法需要根据整个图像序列来推断路况的状态,分为畅通、缓行、拥堵和封闭四种情况。每个状态的参考帧示例如图3所示。
图3 不同路况状态的图像
数据集整体对应的路况状态情况大致为畅通30%,缓行10%,拥堵20%,封闭40%。其分布如图4所示。
图4 不同路况状态的分布
建模流程
问题分析
在初步分析数据集后,我们对整个问题有了一个大致的了解。从表面上看来,这是一个典型的图像分类问题,需要输入一张图片,根据图片内容判断图中路况属于哪一个类型。再进一步观察数据和结合交通的基本常识可以知道,大部分场景下,前方车辆的数量和密度决定了路况状态,前方道路障碍物存在与否,决定了道路是否封闭。似乎需要先对图片进行目标检测,检测出车辆和道路障碍物,再根据检测结果进行分类。但是经过简单的实验,发现先目标检测再进行分类的效果并不理想。研究背景知识得知,实际路况上可能存在诸如行驶道路有大量路边停车,但不影响车辆行驶,状态为畅通;或者行驶在双向道路,对向车道拥堵,但行驶车道路况状态为缓行或畅通;又或者围挡、路障等障碍物是造成道路封闭的直接原因,但非道路区域存在大量噪声(如路边的围挡、锥桶等)。加之目标检测算法本身可能存在的误差,都会影响分类的效果。
基于以上各种因素,还是决定放弃先目标检测再进行分类的策略,直接进行图像分类。进一步分析数据集,发现每个图像序列都是多帧图像,并且标明了参考帧,参考帧是整个图像序列中最清晰或者最后一帧图像,所有分类的判断都基于参考帧。所以决定以参考帧为输入图像进行分类。
图像分类问题的基本建模流程如图5所示。
图5 图像分类问题建模流程
图像预处理
图像分类中,图像质量的好坏会直接影响模型的效果,因此需要对图像进行预处理。预处理的主要目的一方面是消除图像中的无关信息,例如归一化,另一方面是增强有用信息的可检测性,例如圈定ROI区域。
归一化
图像归一化是指对图像进行一系列标准的处理变换,使之变换为一固定标准形式的过程,与其他特征归一化的目的相同,都是为了更快地训练算法并达到更高的性能。本文中主要对图像进行形状归一化和灰度归一化,即将所有图像统一调整成512*512的大小,并将每个像素值除以255,使得所有值都在0和1之间。图像归一化效果如图6所示。
图6 图像归一化效果
圈定ROI区域
图像的ROI区域,就是 “感兴趣的区域”(region of interest),从图像中选择重点关注的区域。使用ROI区域,可以减少处理时间和增加精度。本文中使用了两种方式进行ROI区域的圈定,一种是固定区域,通过手动梯形框圈定;一种是动态跟踪,利用帧差法圈定,并将这两种方式和完全不圈定ROI区域方式的建模时间和精度进行了对比。
手动圈定ROI区域,主要是利用背景知识人工指定关注区域,即主要关注关键帧图像中摄像头所拍摄的车辆正前方的道路区域,忽视天空和两旁的区域,再结合近大远小的摄像头成像特点,直接使用梯形框进行ROI区域的圈定,其圈定效果如图7所示。由于归一化后所有图像尺寸统一,所以使用大小唯一固定的梯形框即可。
图7 手动圈定ROI区域效果
利用帧差法圈定ROI区域,顾名思义,就是通过对不同帧的图像做差来圈定感兴趣的区域。帧差法是最为常用的运动目标检测和分割方法之一,其基本原理是在图像序列的相邻两帧或三帧间采用基于像素的时间差分,再通过闭值化来提取出图像中的运动区域。结合本文中的场景,就是利用关键帧前一帧的图像,和关键帧图像做差,利用两帧图像间的差值图像,圈定汽车行驶过程中随着时间推移有明显变动的区域,也就是ROI区域。
这个过程涉及到几个关键步骤,首先是做差后的阈值化,其次是二值图像轮廓的提取,最后是目标检测框的合并,接下来分别进行阐述。
做差后的阈值化,需要提前设定一个阈值。当两帧图像做差之后,先通过形态学上的腐蚀和膨胀操作,减少空洞,然后将得到的差值图像每一个位置的像素值都和阈值比较,比阈值大的地方像素值设为255,比阈值小的地方像素值设为0,这样就得到一个二值化的运动区域图像。cv2图像库中提供了cv2.threshold()方法可以直接进行调用。
二值化的图像需要提取轮廓,也可以借助cv2图像库中的cv2.findContours()和cv2.boundingRect()方法来提取,可以得到运动区域的矩形边框。需要注意一点,由于是车载图像,摄像头本身也在运动,导致两帧图像间变动的地方可能很多,但不是所有有变动的地方都是感兴趣区域,对于提取出来区域面积过小的轮廓框可以忽略。
过滤掉面积过小的轮廓框后,需要进行目标检测框的合并。其原理是将相交面积大于一定阈值的目标检测框合并,根据各目标检测框的坐标值来计算是否相交和相交面积大小。需要注意的是由于只是想圈定ROI区域,所以本文中只是计算出所有相交目标检测框位置的中心点,再结合各目标检测框大小,合并所有的相交目标检测框作为唯一的ROI区域。帧差法圈定ROI区域的整体流程和效果如图8所示。
图8 帧差法圈定ROI区域流程和效果
如果使用帧差法圈定ROI区域,需要在图像归一化之前进行,避免因归一化影响帧差效果,手动圈定ROI区域则没有相关限制。
图像加载和批处理
将图像读入内存时,会遇到的最大挑战是图像太大,会导致内存溢出。所以需要对图像进行批量处理,一次只加载一个批次的图像。本文使用PyTorch里的Dataset类和DataLoader类来实现。
Dataset类主要是实现每张图片的加载,自定义数据集需要重写_init_,_len_,_getitem_三个函数。_init_函数初始化数据集路径、标志文件、等信息,_len_函数返回数据集大小,_getitem函数返回单张图片及其标志信息,包括图片的预处理也在该函数里进行。
DataLoader类主要实现批量图像的加载,自定义加载类需要指定加载的数据集、每批次加载的图片数量、是否打乱排序、以及提取数据的进程数等参数信息。每批次加载图片的数量,也会影响模型训练的收敛速度和准确性。
模型选择和迁移学习
图像分类可以用的深度学习模型很多,例如VGG、AlexNet、ResNet等等。综合流行趋势和分类效果,本文选择了ResNet网络结构进行分类。ResNet又名残差神经网络,指的是在传统卷积神经网络中加入残差学习(residual learning)的思想,解决了深层网络中梯度弥散和精度下降(训练集)的问题,使网络能够越来越深,既保证了精度,又控制了速度。简要的说,深度学习的网络,随着层次的加深,会出现退化,即在训练集上的准确率饱和或者下降。而残差网络通过残差学习和恒等映射,可以很好的避免这个问题,从而可以通过不断加深网络层数,提升模型的准确率。残差网络的具体原理,可以参考相应的论文和介绍,本文不做详细讨论。考虑到训练的效率,本文选择ResNet50展开训练。
在实际训练深度学习的模型时,可以通过迁移学习的方式进行。通俗来讲,就是运用已有的知识来学习新的知识,即可以使用其他数据集上已经训练好的分类模型,拟合我们自己的数据集,这样可以加快拟合。Pytorch中可以直接使用已经预训练好的ResNet50模型,同时为了适应自己的数据集,需要将最后一层Linear层进行替换,使其输出为4通道,对应四种路况。
结论和展望
将数据集按8:2划分成训练集和验证集,使用不圈定ROI区域、手动圈定ROI区域以及通过帧差法圈定ROI区域三种不同图像预处理方式进行模型训练的结果如表1所示。其中评测模型使用的错误率评价函数是交叉熵(Cross Entropy Loss),交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。准确率评价函数使用ACC(Accuracy),指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例。
图像预处理方式 | 训练时间 | 错误率(交叉熵) | 准确率(ACC) |
不圈定ROI区域 | 40m 8s | 0.0187 | 0.898483 |
手动圈定ROI区域 | 43m 15s | 0.0183 | 0.899650 |
帧差法圈定ROI区域 | 40m 38s | 0.0391 | 0.775963 |
表1不同图像预处理方式的模型训练结果
可以通过表1发现,帧差法圈定ROI区域明显在准确率上低于不圈定ROI区域和手动圈定ROI区域,这可能是因为帧差法在处理车载视频图像时,因为摄像头本身也在移动,背景和前景区分度不大,导致圈定的ROI区域有比较大的误差,损失了比较多有用的信息。不圈定ROI区域和手动圈定ROI区域准确率差别不大,但是训练时间上不圈定ROI区域明显比圈定ROI区域要快,这也符合客观认知。
训练过程中各模型随着迭代次数的增加,在训练集和验证集上的误差曲线和准确率曲线如图9所示。
图9误差曲线和准确率曲线示意图
可以发现帧差法圈定ROI的方法,在验证集上的震荡比较明显,可能是因为帧差法容易受到外在因素的影响,比如光线、清晰度、以及拍摄角度等,健壮性不强。而手工圈定ROI和不圈定ROI在训练后期都出现了比较明显的过拟合现象,但是手工圈定ROI的健壮性要比不圈定ROI的强,这大概是因为手工圈定ROI指定了只关注道路所在区域,不易受到其他区域的噪音影响。
即使分类效果最好的模型,验证集上的分类准确率也不过89.96%,在路况识别的实际应用中尚不是很理想,需要进一步优化。图像分类模型的优化可以使用光线均衡、图像增强等方式,也可以考虑使用更深的网络,或者适当结合目标检测、目标追踪等技术。图像分类技术在实际情境中的应用尚有很多困难和挑战,希望本文能对同行业者有所启发。
#欢迎留言在评论区和我们讨论#
看完本文,对于机器学习的图像分类你有什么想说的?
欢迎在评论区留言
我们将在 11 月 24 日精选出 3 条优质留言
赠送《人工智能数学基础》纸质书籍一本哦!
更多精彩推荐
AI 隐身术,能让物体在视频中消失的魔法
程序员奶爸用树莓派制作婴儿监护仪:哭声自动通知,还能分析何时喂奶
强化学习:10种真实的奖励与惩罚应用
全球数百万台 Mac 疑似因 Big Sur 更新险酿计算灾难,苹果官方回应来了!
大神们都是如何在时间序列中进行特征提取的?看完就懂了!