(2023版)斯坦福CS231n学习笔记:DL与CV教程 (11) | 目标检测和图像分割(Object Detection and Image Segmentation)

前言
- 📚 笔记专栏:斯坦福CS231N:面向视觉识别的卷积神经网络(23)
- 🔗 课程链接:https://www.bilibili.com/video/BV1xV411R7i5
- 💻 CS231n: 深度学习计算机视觉(2017)中文笔记:https://zhuxiaoxia.blog.csdn.net/article/details/80155166
- 🔥 2023最新课程PPT:https://download.csdn.net/download/Julialove102123/88734395
⚠️ 本节重点内容:
- 语义分割(Semantic Segmentation)
- 目标检测(Object Detection)
- 实例分割(Instance Segmentation)

一、语义分割
语义分割任务目标是输入一个图像,然后对每个像素都进行分类,如下图左,将一些像素分类为填空,一些分类为树等等。需要注意的是,语义分割单纯地对每个像素分类,因此不会区分同类目标,比如下图右边有两头牛,但是分类的结果中不会将两头牛区分开来,而是一视同仁,这也是语义分割的一个缺点。
方法 1:滑动窗口(Sliding Window)
将整张图片以滑动窗口的形式提取出很多微小的图片块,然后将这些图片块放入CNN中,让CNN来区分图片块的中间像素属于哪一类。但这不是最理想的方法,因为这种方法的计算复杂度非常高,因为要对每个像素准备一个单独的小图片块。 但实际上,相邻的像素所属的图片块是有重叠的,这些重叠的计算是可以共享的。实践中,没人使用滑动窗口的方法,但至少是第一个很直观能想到的方法。
方法 2:全卷积(Fully Convolutional)
基础版
直接训练一个全卷积神经网络,网络中包含多个卷积层,不进行下采样等缩小尺寸的操作,并对输入进行0填充使得空间尺寸保持不变,并最终得到一个CHW 的输出,其中 C 代表的是类别个数,每个矩阵代表一个类别在每个像素位置上的预测得分。将输出赋予这样的含义后,就可以设计损失函数,并进行反向传播训练网络了。
值得注意的是,语义分割的数据集是很难制作的,因为需要对每个像素点打标签。由此可以很自然地想到损失函数可以定义成一个交叉熵函数,对每个像素的预测结果和其标注的类别计算交叉熵损失,然后将所有像素的损失相加或求平均得到最终的损失函数。
但这里有个问题,就是我们使用多个卷积层并且通过0填充的方式保持输入和输出的尺寸不变,这会导致计算量也会变得巨大,并且卷积层的参数也会占很大的内存。
改进版
更常见的网络结构先保留原始图像的“清晰度”进行几层卷积层的处理,然后进行下采样操作降低图片的“清晰度”,然后再进行卷积操作,最后将图片上采样恢复回原来的尺寸。
上采样(Unpooling)-固定
常见的上采样操作就是去池化(Unpooling) ,比如说下图中的 最相邻去池化 和 Bed of Nails 池化。最相邻去池化就是将周围用相同的数字填充,而 Bed of Nails 则是直接用0填充。
由于网络讲究对称性,所以比较常用的是最大去池化,如下图所示,网络先使用最大池化操作,然后再使用最大去池化操作恢复输出的尺寸,对于最大去池化,在最大池化操作时会记住每个最大的元素的位置,然后在最大去池化时将每个元素填会最大元素所在的位置,并将其它位置填充为0。这样做的好处是,经过最大去池化操作后,能够一定程度上恢复一些每个像素在空间上的空间关系和信息,有利于不同物体边缘上的像素的分类。

上采样(Unpooling)-卷积转置
二、分类定位
三、目标检测
目标检测模型可以分为单步模型和两步模型,其中单步模型指没有独立地、显示地提取候选区域,直接由输入图像得到其中存在的物体的类别和位置信息的模型,在计算效率上有优势,典型的单步模型有:OverFeat、SSD(Single Shot multibox-Detector )、YOLO(You Only Look Once)等;两步模型指有独立的,显示的候选区域提取过程,即先在输入图像上筛选出一些可能存在物体的候选区域,然后针对每个候选区域,判断其是否存在物体,如果存在,就给出物体的类别和位置修正信息,在检测精度上有优势,典型的两步模型有:R-CNN、SPPNet、Fast R-CNN、Faster R-CNN、R-FCN、Mask R-CNN等
3.1 Two-stage object detector
R-CNN

主要思路是使用无监督的选择性搜索方法将输入图像中具有相似的颜色直方图特征的区域进行递归合并,产生大量的候选区域,然后从输入图像中截取这些候选区域对应的图像,将其裁剪缩放至合适的尺寸,并送入一个CNN提取的网络中提取特征,最后再送入一个SVM分类器中进行分类和非极大值抑制操作即可得到最终结果。
Fast R-CNN

Fast R-CNN通过卷积网络得到图像的高分辨率特征映射,切分图像的像素,基于备选区域投影到卷积特征映射,从中提取属于备选区域的卷积块.然后用兴趣区域池化层(ROI pooling layer)来使卷积块变为固定尺寸,输入全连接层进行分类.同样有一个多任务损失,需要基于全局反向传播同时学习.它可以重复运用卷积计算,因此时间主要消耗在寻找备选区域。
Faster R-CNN

让卷积网络去预测备选区域,其余与Fast R-CNN相同。神经网络同时处理四件事:备选区域是否是待识别物体,校正包围盒,最终物体识别的损失,最终包围盒补偿的损失。
3.2 Single-Stage Object Detectors
YOLO
SSD
RetinaNet
四、实例分割
Mask R-CNN
实例分割做的最好的网络是Mask R-CNN,,首先也是使用一个CNN来提取特征,然后和Faster R-CNN类似,训练一个RPN网络来提取候选区域RoI,然后将每个RoI投影到提取的特征中,接着是两个分支,一个分支预测物体的类别和定位框的坐标,另外一个分支对每个RoI进行一次语义分割,即对每个像素都判断是否属于某个物体。
五、其他应用
目标检测+标记
六、拓展阅读
- TensorFlow Detection API:
https://github.com/tensorflow/models/tree/master/research/object_detection
Faster RCNN, SSD, RFCN, Mask R-CNN, …
- Detectron2 (PyTorch)
https://github.com/facebookresearch/detectron2
Mask R-CNN, RetinaNet, Faster R-CNN, RPN, Fast R-CNN, R-FCN, …
- 拓展阅读:https://blog.csdn.net/pinkshell_1314/article/details/126884273?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170719846116800184185331%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=170719846116800184185331&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduend~default-2-126884273-null-null.nonecase&utm_term=lecture%2011&spm=1018.2226.3001.4450
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)