[Auto Car] Real-time Segmentation Knowledge
基础认知
参考:小白自动驾驶之路
FCN的优点(贡献)和不足
优点和贡献
1.为深度学习解决语义分割提供了基本思路,激发了很多优秀的工作
2.输入图像大小没有限制,结构灵活
3.更加高效,节省时间和空间
不足
1.结果不够精细,边界不清晰
2.没有充分考虑到语义间的上下文关系
3.padding操作可能会引入噪声
针对上述不足,后续有许多经典工作出现,以后将一一学习介绍。
提到了“概率图模型”的思维方式。
DCNN --> DeepLab
DeepLab是一个很优雅的结构,论文工作在2014年就已经完成了,最终被收录于2017年PAMI,现在的很多工作都是基于这篇论文的基础上完成的,因此很值得一读。
自动驾驶入门日记-4-图像语义分割
接着介绍图像语义分割中解决分割精细度的另一种解决方案--多尺度特征融合。
观察一下深度学习出现以来在计算机视觉领域的应用,你会发现关于分类、识别、分割等任务的网络结构大致相同,最大的区别就是最后几层,原因就是在训练网络的过程中前几层可以看作自动特征提取的过程,后几层用来完成具体的任务(个人理解,有错误欢迎批评指正)。在基于深度学习的分类任务中,我们的目的是找到同一类别之间的共性特征并保留下来,因此后几层得到的往往是粗粒度的图像特征,而语义分割可以看作是像素级别的细粒度分类任务,因此之前基于分类任务改进的分割网络结构就具有了很大的改进空间。
在给予CNN的网络架构中,我们往往认为特征级别越高,具有的语义信息越多而粒度越粗,在语义分割任务中,只使用顶层特征进行语义分割并不是最优的学习方法,因此将高层特征和低层特征融合将会极大改善语义分割任务中边界分割不清晰的问题。
本文的核心思想是提出Hypercolumn(超列)的概念,即将像素点对应的激活网络特征进行串联,进行目标的细粒度定位,同时进行分割(Simultaneous Detection and Segmentation (SDS)为本文作者2014年上发表的文章,用于检测一个类别的所有的 objects,并确定每个 object 覆盖了哪些pixels,本片论文可以视作14年论文的改进)
提到了不错的 “注意力机制”。
相比于图像语义分割,视频语义分割具有高帧数(15-30帧/s),前后帧之间高相关性的特点。并且在自动驾驶任务中,对RGB摄像头传入的视频帧信号处理具有很高的实时性要求,因此针对视频语义分割任务来讲,需要在图像语义分割的任务上做进一步的工作。
作者设计了一个叫做Spatio-Temporal Transformer Gated Recurrent Unit(不会翻译)的单元来融合各帧信息,作者认为相邻两帧之间包含大量冗余信息,但是两帧之间差异较大(漂移形变)的区域包含的信息将十分有意义,作者使用了光流来衡量漂移形变比较明显的区域
SegNet 是Cambridge提出旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,开放源码,基于caffe框架。SegNet基于FCN,修改VGG-16网络得到的语义分割网络,有两种SegNet,分别为正常版与贝叶斯版,同时SegNet作者根据网络的深度提供了一个basic版(浅网络)
实践为王
FCN进行改进的几种架构
Fully Convolutional Networks for Semantic Segmentation
基于全卷积语义分割模型对比
名称、优点、缺点
FCN
可以接受任意大小的图像输入;避免了采用像素块带来的重复存储和计算的问题
得到的结果不太精确,对图像的细节不敏感,没有考虑像素与像素之间的关系,缺乏空间一致性
SegNet
使用去池化对特征图进行上采样,在分割中保持细节的完整性;去掉全连接层,拥有较少的参数
当对低分辨率的特征图进行去池化时,会忽略邻近像素的信息
Deconvnet
对分割的细节处理要强于 FCN,位于低层的filter 能捕获目标的形状信息,位于高层的 filter能够捕获特定类别的细节信息,分割效果更好
对细节的处理难度较大
U-net
简单地将编码器的特征图拼接至每个阶段解码器的上采样特征图,形成了一个梯形结构;采用跳跃连接架构,允许解码器学习在编码器池化中丢失的相关性
在卷积过程中没有加pad,导致在每一次卷积后,特征长度就会减少两个像素,导致网络最后的输出与输入大小不一样
DeepLab
使用了空洞卷积;全连接条件随机场
得到的预测结果只有原始输入的 1/8 大小
RefineNet
带有解码器模块的编码器-解码器结构;所有组件遵循残差连接的设计方式
带有解码器模块的编码器-解码器结构;所有组件遵循残差连接的设计方式
PSPNet
提出金字塔模块来聚合背景信息;使用了附加损失
采用四种不同的金字塔池化模块,对细节的处理要求较高
GCN
提出了带有大维度卷积核的编码器-解码器结构
计算复杂,具有较多的结构参数
DeepLabV3 ASPP
采用了Multigrid;在原有的网络基础上增加了几个 block;提出了ASPP,加入了 BN
不能捕捉图像大范围信息,图像层的特征整合只存在于 ASPP中
DeepLab作 为DilatedFCN的典范还是值得学习的,其分割效果也是极其好的。但是由于存在空洞卷积,DeepLab的计算复杂度要高一些,特别是output_stride=8,对于一些要求低延迟的场景如无人车,还是需要更加轻量级的分割模型,这也是近来的研究热点。
GAN
提出将分割网络作为判别器,GAN 扩展训练数据,提升训练效果;将判别器改造为 FCN,从将判别每一个样本的真假变为每一个像素的真假
没有比较与全监督+半监督精调模型的实验结果,只体现了在本文中所提创新点起到了一定的作用,但并没有体现有效的程度
与 MASK RCNN 的关系是什么呢?
在fatser rcnn的基础上对ROI添加一个分割的分支,预测ROI当中元素所属分类,使用FCN进行预测;
具体步骤:使用fatser rcnn中的rpn网络产生region proposal(ROI),将ROI分两个分支:
(1)fatser rcnn操作,即经过ROI pooling 输入fc进行分类和回归;
(2)mask操作,即通过ROIAlign校正经过ROI Pooling之后的相同大小的ROI,然后在用fcn进行预测(分割)
Is DeepLab-v3 better than Mask R-CNN?
Deeplab-v3 is a semantic segmentation while Mask R-CNN is an instance segmentation. instance segmentation is more complex than semantic segmentation cause it is first trying to detect the object and classifying it within a set of the defined class, then it does segmentation task for that object (classifying pixels into the background or foreground class), while in segmentation task it doses only pixel-wise classification ( binary or multi-class).
The inference time of an Instance segmentation is always greater than semantic segmentation.
For more detail you can read this article: -
Review: DeepMask (Instance Segmentation)
总的来说,Mask R-CNN是个非常简单,灵活并适用于多种场景的实例分割框架。但是Mask R-CNN比较依赖目标识别部分的结果,一旦目标识别不准确,实例分割的结果也会不精确。
语义分割对于分割的精度和效率都有很高的要求,由于实例分割在语义分割的基础上,还需要区分出同一类的不同的个体,因此实例分割同样有着精度和效率的要求。除此之外还面临着和语义分割相似的问题和难点,如深层网络小物体分割细节丢失的问题,如何处理几何变化,处理遮挡,甚至由于源图像被光照射,被压缩带来的图像退化问题。
为了解决速度和效率的问题,后续研究人员还推出了Instance FCN这种单阶段实例分割网络(Single Shot Instance Segmentation)。尽管单阶段分割网络在精度上不如双阶段分割网络,但是其在速度及模型大小方面仍远优于双阶段网络,因此单阶段网络引领了近些年实例分割及目标识别的研究潮流。
令人激动的是,近几年除了出现基于One-stage,Anchor-based的YOLACT和SOLO外,还出现了受到Anchor-free思路启发的PolarMask和AdaptIS等实例分割网络。这些Anchor-free的实例分割网络,也很出色。我会在接下来的几篇文章中更新Anchor-free网络,感兴趣的同学,可以关注我的专栏。
Instance Segmentation
聊一聊今年实例分割领域的进展和未来展望【读来感觉不错】
-
RPN
从MaskRCNN这一开山鼻祖的方法到最新的SOLO,SOLOv2等,精度在不断刷新,速度在不断提高。
通过RPN拿到box的proposal,再接着对这些Proposal进行mask的分割。不得不说,这些方法其实取得了非常大的成功,到目前位置,很多商业级别的算法都是基于MaskRCNN开发的。
但,MaskRCNN实在是太慢了。速度参考如下:
MASK RCNN - Elapsed Time Cost: 4.535 sec. UNET - Elapsed Time Cost: 2.608 sec. MASK RCNN - Elapsed Time Cost: 3.457 sec. UNET - Elapsed Time Cost: 1.247 sec. Elapsed Time Cost: 22.188 sec. MASK RCNN - Elapsed Time Cost: 4.727 sec. UNET - Elapsed Time Cost: 2.632 sec. MASK RCNN - Elapsed Time Cost: 3.311 sec. UNET - Elapsed Time Cost: 1.230 sec. Elapsed Time Cost: 23.226 sec. MASK RCNN - Elapsed Time Cost: 4.217 sec. UNET - Elapsed Time Cost: 2.566 sec. MASK RCNN - Elapsed Time Cost: 3.069 sec. UNET - Elapsed Time Cost: 1.253 sec. Elapsed Time Cost: 21.734 sec.
-
全局Mask表征方式
Yolact: yolact 是第一个做到realtime的实例分割算法,尽管它的精度不是很高 。
回过头去看,你会发现,BlendMask也好,CenterMask也罢,包括ConsInst,他们都是Yolact的扩展。
BlendMask: 最新的BlendMask,个人认为,是一个比较精妙,精度很高,速度也做的很快的方法。你如果仔细思考BlendMask的做法,你会看到MaskRCNN的引子,但是也会看到Yolact的引子。因为它依赖于detector,同时也用到了全局的Mask。这篇paper,在它的Blender模块里面,使用了全局的Mask,同时通过FCOS检测到的position来融合局部的mask和对应位置的全局Mask,进而得到一个更加准确的Mask回归。
结果也确实如此,BlendMask渲染出来的Mask边框更加完美。
SOLO 和 SOLOv2,牛逼,但不好训练?
到目前为止,SOLOv2和ConsInst应该是真正的work,高速并且Box-Free的实例分割算法.
代码:https://github.com/WXinlong/SOLO
Based on PaddleDetection, the result looks good, but the performance on CPU is still a problem. It can be accelerated only based on GPU.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | λ a73c6ace9835 ~/work {master} python3 demo_solo.py --config=2 grep: warning: GREP_OPTIONS is deprecated; please use an alias or script 2.0.2 =============== config message =============== config file: < class 'config.solo.solov2_light_r50_vd_fpn_dcn_512_3x.SOLOv2_light_r50_vd_fpn_dcn_512_3x_Config' > model_path: dygraph_solov2_light_r50_vd_fpn_dcn_512_3x.pdparams target_size: 512 use_gpu: False detect_image(): 4.264363765716553 2021-06-02 04:31:30,177 - INFO - Infer iter 0, num_imgs=7, eta=0:00:29. 2021-06-02 04:31:30,177 - INFO - Detection bbox results save in images/res/5.jpeg detect_image(): 4.44119119644165 2021-06-02 04:31:34,618 - INFO - Infer iter 1, num_imgs=7, eta=0:00:26. 2021-06-02 04:31:34,618 - INFO - Detection bbox results save in images/res/6.jpeg detect_image(): 3.3326244354248047 2021-06-02 04:31:37,951 - INFO - Infer iter 2, num_imgs=7, eta=0:00:20. 2021-06-02 04:31:37,951 - INFO - Detection bbox results save in images/res/7.jpeg detect_image(): 4.057062864303589 2021-06-02 04:31:42,009 - INFO - Infer iter 3, num_imgs=7, eta=0:00:16. 2021-06-02 04:31:42,009 - INFO - Detection bbox results save in images/res/2.jpeg detect_image(): 4.378160238265991 2021-06-02 04:31:46,387 - INFO - Infer iter 4, num_imgs=7, eta=0:00:12. 2021-06-02 04:31:46,387 - INFO - Detection bbox results save in images/res/1.jpeg detect_image(): 4.38402795791626 2021-06-02 04:31:50,772 - INFO - Infer iter 5, num_imgs=7, eta=0:00:08. 2021-06-02 04:31:50,772 - INFO - Detection bbox results save in images/res/3.jpeg detect_image(): 3.644659996032715 2021-06-02 04:31:54,417 - INFO - Infer iter 6, num_imgs=7, eta=0:00:04. 2021-06-02 04:31:54,417 - INFO - Detection bbox results save in images/res/4.jpeg 2021-06-02 04:31:54,417 - INFO - total time: 28.504929s 2021-06-02 04:31:54,417 - INFO - Speed: 4.072133s per image, 0.2 FPS. |
SOLOv2这个思路延续下去,或许会有更好的方法产生。
我不知道SOLOV2难以训练是开源代码存在的问题,还是算法本身就比较难以训练,这里面存在着一些问题值得探寻。
-
PointRend
何恺明团队新作:图像分割精细度空前,边缘自带抗锯齿,算力仅需Mask R-CNN的2.6%
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律