前言
在自驾车的领域中,为了了解路上车辆、行人的动向,来决定自驾车下一步的动作,可以借由影像分割来判断画面中的物体。
影像分割分为三种 - 语意分割 (Semantic Segmentation)、实例分割 (Instance Segmentation) 和全景分割 (Panoramic Segmentation)。本文尝试在嵌入式装置上运行语意分割的模型,了解这类的模型在资源有限的硬体上执行会需要做出怎样的调整。
数据集
为了将路上的汽车和背景中的其它东西分辨出来,需要使用包含汽车的影像,搭配遮盖汽车部分的遮罩进行训练。以下左图就是作为模型输入的汽车影像,右图是作为正确答案的遮罩。
本文使用的资料集是 Kaggle 上 Carvana Image Masking Challenge 竞赛的资料(参考1)。里面包含了 5089 张在摄影棚中拍摄的各种车辆的不同角度照片,以及如上图的对应的遮罩。
资料处理和训练
本文资料处理方式参考 GitHub 项目 (参考2)
对于训练图片的前处理,只有将 RGB 值做 Normalize,没有进行 Data augmentation。
输入图片做 downscaling
值得注意的是有对输入的图片进行 downsampling 1.0/0.5/0.25 倍后,再输入模型进行运算。
这样做的目的可以有效减少训练所需记忆体、模型训练时间、模型推论时间,也可以大幅减少在板端运行模型所需的 io buffer,并且预测的结果在不同 scale 设定下不会相差太多。
模型训练时间:
Scale | 训练花费时间 |
---|---|
1.0 | OOM |
0.5 | 22m 48s / epoch |
0.25 | 6m 28s / epoch |
读取图片方式
参考的 GitHub 项目中,和联咏转换工具中预设的是 OpenCV 不同,训练时读取图片的方式是用 PIL。这两个 package 读取出的影像的值会不同,造成训练时和推理时的预测结果差异。
如下图,两者都是推理时使用 OpenCV 读图,但左图是用 PIL 读图去训练的推理结果,右图是用 OpenCV 读图去训练的推理结果:
模型
本文模型训练参考 GitHub 项目 (参考2)
本文使用的模型是 UNet,是一个经典的语意分割模型。这个模型输入和输出的 shape 相同,结构上也大致对称。
模型前半段会从输入图片的大小开始,用 Convolution 萃取特征,获得逐渐变小的特征图。模型的后半段会用 TransposeConvolution 将特征图 upsampling 回输入图片的大小,以获得原始图片每个像素的分类。
板端执行结果
板端上运行模型所需的 buffer 大小
虽然改变输入图片的大小,不会影响到模型的大小,因为权重数量是没有改变的。但进行模型推理时,需要的记忆体除了模型本身大小,也要考虑运算时占用的 buffer。输入图片如果越大的话,运算时 buffer 也需要更多。
Scale | 记忆体 |
---|---|
1.0 | 需要记忆体过大,转换失败 |
0.5 | 347 MB |
0.25 | 90 MB |
后处理
输入进模型的图片是经过 downsampling 的。例如 1920x1080 的图片,设定 scale=0.25,输入模型的大小就是 480x270,所以模型输出的遮罩也会是这个大小。
为了将预测结果恢复到原始输入图片大小,以利和原图做比对或做进一步的计算,可以使用 OpenCV 去 resize 预测结果,并将其存成 JPG。
结语
由于训练用的图片都是在相同光照含背景的情况下拍的,导致这个资料集训练出来的模型对于其它图片的判断能力很差,无法判断背景较为复杂的图片。如果需要改善预测结果,可以把原本汽车影像借由遮罩去背后,将汽车部分贴到马路的影像上,增加资料复杂度去改善模型鲁棒性。
另外在实验过程有注意到,由于影像分割模型通常较耗资源,可能需要为了嵌入式装置而调整原本在PC上可以顺利执行的模型,以符合有限的硬体需求。本案例透过降低图片分辨率的方式,成功在有限的硬体资源上实现了复杂的语意分割任务。
参考
-
资料集
Brian Shaler, DanGill, Maggie, Mark McDonald, Patricia, and Will Cukierski. Carvana Image Masking Challenge. https://kaggle.com/competitions/carvana-image-masking-challenge, 2017. Kaggle.
问与答
-
语意分割、实例分割、全景分割的差别?
答: 语意分割是将画面中的每个像素都进行分类,达成像素级的判断物体形状和位置。实例分割是将不同的物体个体切割出分别。全景分割是在语意分割的基础上做实例分割,将同属于一种物体类别的像素,根据不同的个体切割出分别。
-
在训练过程中,为什么要对输入图片进行 down-scaling?
答: 对输入图片进行 down-scaling 可以减少训练所需记忆体、缩短模型训练时间、减少模型推论时间、减少板端运行时所需的 IO buffer。但也要注意不要 down-scaling 过头,导致图片中包含的资讯量变得太少
-
在训练资料的处理上,使用 PIL 和 OpenCV 读取图片是否有区别?
答: 有,PIL 和 OpenCV 这两个 package 读取出的影像值会有所不同。这会导致训练时和推理时的预测结果产生差异,不过模型鲁棒性足够的话,应该可以克服读取方式差异。
-
UNet模型的基本结构是什么?
答: UNet 是一个输入输出 shape 相同且结构对称的语意分割模型。它的前半段使用 Convolution 萃取特征并产生逐渐变小的特征图,后半段则用 TransposeConvolution 将特征图 upsampling 回原始大小,以获得每个像素的分类结果。
-
如何改善模型的预测结果?
答: 本文中训练出的模型,主要是对复杂背景的判断能力较差,因为训练资料都是在相同光照和背景条件下拍摄的。改善方法是可以将汽车影像透过遮罩去背后,贴到马路的影像上,借由增加资料的复杂度来提升模型的预测准确度。
► 相关视频
在自驾车的领域中,为了了解路上车辆、行人的动向,来决定自驾车下一步的动作,可以借由影像分割来判断画面中的物体。
影像分割分为三种 - 语意分割、实例分割 和全景分割。本文尝试在嵌入式装置上运行语意分割的模型,了解这类的模型在资源有限的硬体上执行会需要做出怎样的调整。