在联咏NT9852x上实现汽车影像分割

前言

在自驾车的领域中,为了了解路上车辆、行人的动向,来决定自驾车下一步的动作,可以借由影像分割来判断画面中的物体。

影像分割分为三种 - 语意分割 (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.0OOM
0.522m 48s / epoch
0.256m 28s / epoch

读取图片方式

参考的 GitHub 项目中,和联咏转换工具中预设的是 OpenCV 不同,训练时读取图片的方式是用 PIL。这两个 package 读取出的影像的值会不同,造成训练时和推理时的预测结果差异。

如下图,两者都是推理时使用 OpenCV 读图,但左图是用 PIL 读图去训练的推理结果,右图是用 OpenCV 读图去训练的推理结果:

 

模型

本文模型训练参考 GitHub 项目 (参考2)
本文使用的模型是 UNet,是一个经典的语意分割模型。这个模型输入和输出的 shape 相同,结构上也大致对称。

 

模型前半段会从输入图片的大小开始,用 Convolution 萃取特征,获得逐渐变小的特征图。模型的后半段会用 TransposeConvolution 将特征图 upsampling 回输入图片的大小,以获得原始图片每个像素的分类。

板端执行结果

 

 

 

 

 

 

 

板端上运行模型所需的 buffer 大小

虽然改变输入图片的大小,不会影响到模型的大小,因为权重数量是没有改变的。但进行模型推理时,需要的记忆体除了模型本身大小,也要考虑运算时占用的 buffer。输入图片如果越大的话,运算时 buffer 也需要更多。

Scale    记忆体
1.0需要记忆体过大,转换失败
0.5347 MB
0.2590 MB

后处理

输入进模型的图片是经过 downsampling 的。例如 1920x1080 的图片,设定 scale=0.25,输入模型的大小就是 480x270,所以模型输出的遮罩也会是这个大小。

为了将预测结果恢复到原始输入图片大小,以利和原图做比对或做进一步的计算,可以使用 OpenCV 去 resize 预测结果,并将其存成 JPG。

结语

由于训练用的图片都是在相同光照含背景的情况下拍的,导致这个资料集训练出来的模型对于其它图片的判断能力很差,无法判断背景较为复杂的图片。如果需要改善预测结果,可以把原本汽车影像借由遮罩去背后,将汽车部分贴到马路的影像上,增加资料复杂度去改善模型鲁棒性。

另外在实验过程有注意到,由于影像分割模型通常较耗资源,可能需要为了嵌入式装置而调整原本在PC上可以顺利执行的模型,以符合有限的硬体需求。本案例透过降低图片分辨率的方式,成功在有限的硬体资源上实现了复杂的语意分割任务⁠。

参考

  1. 资料集

    Brian Shaler, DanGill, Maggie, Mark McDonald, Patricia, and Will Cukierski. Carvana Image Masking Challenge. https://kaggle.com/competitions/carvana-image-masking-challenge, 2017. Kaggle.

  2. 前处理和模型讯练程式:GitHub - milesial/Pytorch-UNet: PyTorch implementation of the U-Net for image semantic segmentation with high quality images

问与答

  1. 语意分割、实例分割、全景分割的差别?

    答: 语意分割是将画面中的每个像素都进行分类,达成像素级的判断物体形状和位置。实例分割是将不同的物体个体切割出分别。全景分割是在语意分割的基础上做实例分割,将同属于一种物体类别的像素,根据不同的个体切割出分别。⁠

  2. 在训练过程中,为什么要对输入图片进行 down-scaling?

    答: 对输入图片进行 down-scaling 可以减少训练所需记忆体、缩短模型训练时间、减少模型推论时间、减少板端运行时所需的 IO buffer。但也要注意不要 down-scaling 过头,导致图片中包含的资讯量变得太少⁠

  3. 在训练资料的处理上,使用 PIL 和 OpenCV 读取图片是否有区别?

    答: 有,PIL 和 OpenCV 这两个 package 读取出的影像值会有所不同。这会导致训练时和推理时的预测结果产生差异,不过模型鲁棒性足够的话,应该可以克服⁠读取方式差异。

  4. UNet模型的基本结构是什么?

    答: UNet 是一个输入输出 shape 相同且结构对称的语意分割模型。它的前半段使用 Convolution 萃取特征并产生逐渐变小的特征图,后半段则用 TransposeConvolution 将特征图 upsampling 回原始大小,以获得每个像素的分类结果。

  5. 如何改善模型的预测结果?

    答: 本文中训练出的模型,主要是对复杂背景的判断能力较差,因为训练资料都是在相同光照和背景条件下拍摄的。改善方法是可以将汽车影像透过遮罩去背后,贴到马路的影像上,借由增加资料的复杂度来提升模型的预测准确度。⁠

► 相关视频

在自驾车的领域中,为了了解路上车辆、行人的动向,来决定自驾车下一步的动作,可以借由影像分割来判断画面中的物体。
影像分割分为三种 - 语意分割、实例分割 和全景分割。本文尝试在嵌入式装置上运行语意分割的模型,了解这类的模型在资源有限的硬体上执行会需要做出怎样的调整。

点击此处立即观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值