1 语义分割

语义分割是对图像中每个像素作分类,不区分物体,只关心像素。如下:

(1)完全的卷积网络架构

处理语义分割问题可以使用下面的模型:

其中我们经过多个卷积层处理,最终输出体的维度是C*H*W,C表示类别个数,表示每个像素在不同类别上的得分。最终取最大得分为预测类别。

训练这样一个模型,我们需要对每个像素都分好类的训练集(通常比较昂贵)。然后前向传播出一张图的得分体(C*H*W),与训练集的标签体求交叉熵,得到损失函数,然后反向传播学习参数。

然而,这样一个模型的中间层完全保留了图像的大小,非常占内存,因此有下面改进的框架。

(2)先欠采样再过采样的框架

经过欠采样后可以大量节省内存,提高效率,最后再经过过采样来恢复原始图片的大小。我们知道欠采样可以使用卷积层和池化,下面介绍过采样的几种方式。

去池化 Unpooling

去池化有Nearest Neighbor,Bed of Nails等方法:

还有一种被称为Max Unpooling 的方法,该方法记录下之前使用max pooling前各个最大值在数组中的索引,去池化的时候把值放到索引处,其他位置补0:

转置卷积 Transpose Convolution

不同于去池化,转置卷积法是一种可学习的过采样方法。具体步骤是,将输入的每个值作为权重,对滤波器进行加权,然后各个加权的滤波器按照步长拼成输出,重叠部分相加。如下:

我们可以通过学习滤波器,来学习网络应该如何做过采样。

理解转置卷积的一个一维的例子是:

在一些论文里,转置卷积还有一些其他名字,看到的时候要知道:

另外,转置卷积之所以被称为转置卷积,是因为它的矩阵形式。传统的卷积写成矩阵形式如下(注意这里是一维的例子):

其中x是滤波器,a是输入。而转置卷积写成矩阵形式如下:

2 分类+定位

分类+定位的任务要求我们在给图片打标签之后,还要框出物体在什么地方(注意与物体检测的区别,在分类定位中,输出的框的个数是事先已知的,而物体检测中则是不确定的)。如下:

此类任务常用的处理框架如下:

首先我们还是用CNN得到描述图片的特征向量,然后我们接入两个全连接网络,一个网络负责生成最后的类别评分,另一个负责生成红框四个点的坐标值。因此对应两个损失,softmax损失和回归损失。我们将这两个损失加权相加得到总的损失(加权值是超参数),然后进行反向传播学习。

这里应用回归的思路同样可以应用于姿态估计,我们用十四个点来确定一个人的姿态情况:

应用同样的框架(CNN+回归全连接网络)可以训练这个任务:

3 物体检测

与分类+定位任务不同的是,物体检测中需要检测的物体数量是不确定的,因此无法直接使用上面的回归框架。下面简单介绍几个框架。

(1)滑动窗口

滑动窗口的思想是随机选取若干个不同大小不同位置的窗口,对它们应用CNN进行分类。缺点是窗口数量很大,计算代价很高。

(2)RCNN

训练阶段:

a 使用IMAGENet的数据预训练一个CNN

b 构造训练集:首先应用Selective Search算法从每张带标定框的图像中选取2000~3000个候选框。对每个候选框来说,找到与它重叠面积最大的标定框,如果重叠比例大于阈值(0.5),则将该候选框标签设为该标定框的标签,若重叠比例小于阈值(0.5),则标签设为“背景”。同时对于重叠比例大于一定阈值(0.6)的候选框,还要计算出其与标定框的偏移距离。

c 每个候选区域经过预处理,送到CNN中提取出图像特征,然后把图像特征送到SVM分类器中,计算出标签分类的损失。同时图像特征还要送到回归器中,计算偏移距离的L2损失。

d 反向传播训练SVM,回归器,CNN

整体框架图如下:

(3)Fast RCNN

RCNN训练和预测速度很慢,主要是由于不同候选框之间的重叠部分特征重复用CNN提取导致的。因此可以采取先对整个图像进行CNN特征提取,然后在选定候选区域,并从总的featuremap中找到每个候选区域对应的特征。框架如下:

(4)Faster RCNN

Fast RCNN的性能瓶颈是SS算法选定候选区域,在Faster RCNN中,使用网络Region Proposal Network (RPN) 来预测候选区域,整体框架如下:

Faster RCNN是当前很先进的目标检测框架,要了解细节看这篇论文:

Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.

(5)SSD

SSD的思想是将图像划分为很多个格子,以每个格子的中心可以衍生出若干个base boxes。使用神经网络一次性的对这些格子进行分类,对这些baseboxes进行回归。

上图中,一个图像划分为7*7个grid,每个grid有3个base boxes。我们需要用回归为每个base boxes预测五个值,为每个格子进行分类打分。直接使用一个的CNN神经网络输出7*7*(5*B+C)的大小即可。

更多细节参看论文:Liu et al, “SSD: Single-Shot MultiBox Detector”, ECCV 2016

(6)各种物体检测框架的对比

有很多变量可控:

这篇论文对比了各种框架:

Huang et al, “Speed/accuracy trade-offs for modern convolutional object detectors”, CVPR 2017

FasterCNN比SSD具有更高的精度,但是没有SSD快。

(7)Dense Captioning

Dense Captioning 是对图片中的每个事物做检测,并用语言进行描述:

Dense Captioning其实就是Object Detection + Captioning ,其框架可以使用faster RCNN结合LSTM来做。具体参考文献:

Johnson, Karpathy, and Fei-Fei, “DenseCap: Fully Convolutional Localization Networks for Dense Captioning”, CVPR 2016

4 物体分割

物体分割要做的是在物体检测上更进一步,从像素层面把各个物体分割出来。

Mask RCNN是当前很前沿的一种方法,其将faster RCNN和语义分割结合成一个框架,具有非常好的效果!框架为:

如上图,首先将图像使用CNN处理为特征,然后经过一个RPN网络生成候选区域,投射到之前的feature map。到这里与faster RCNN一样。之后有两个分支,一个分支与faster RCNN相同,预测候选框的分类和边界值,另一个分支则与语义分割相似,为每个像素做分类。

mask RCNN具有超级好的效果,有机会一定要拜读一下。

He et al, “Mask R-CNN”, arXiv 2017

5 总结

这些成功的计算机视觉框架和模型给我们的启示是,将具有基本功能的模块整合成一个可训练的端到端系统,可以完成更加复杂的功能。通过向网络中引入多个损失函数的分支,可以让其完成多目标的联合优化。

cs231n---语义分割 物体定位 物体检测 物体分割的更多相关文章

  1. Tensorflow实现Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)

    Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)   导语:Mask R-CNN是Faster R-CNN的扩展形式,能够有效地检测图像中的目标,同时还能为每个实例生成一个 ...

  2. R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构

    原文地址 我对深度学习应用于物体检测的开山之作R-CNN的论文进行了主要部分的翻译工作,R-CNN通过引入CNN让物体检测的性能水平上升了一个档次,但该文的想法比较自然原始,估计作者在写作的过程中已经 ...

  3. R-FCN:基于区域的全卷积网络来检测物体

    http://blog.csdn.net/shadow_guo/article/details/51767036 原文标题为“R-FCN: Object Detection via Region-ba ...

  4. OpenCV 使用光流法检测物体运动

    OpenCV 可以使用光流法检测物体运动,贴上代码以及效果. // opticalflow.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  5. python+opencv实现检测物体聚集区域

    内容涉及:二值图像转换 / 检测连通区域面积 / 在原图上画框等 import cv2 import numpy as np for n in open('list.txt'): # list.txt ...

  6. Unity 检测物体是否在相机视野范围内

    需求: 类似NPC血条,当NPC处于摄像机视野内,血条绘制,且一直保持在NPC头顶. 开始: 网上查找资料,然后编写代码: public RectTransform rectBloodPos; voi ...

  7. js 运动函数篇 (一) (匀速运动、缓冲运动、多物体运动、多物体不同值运动、多物体多值运动)层层深入

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写 匀速运动.缓冲运动.多物体运 ...

  8. segMatch:基于3D点云分割的回环检测

    该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...

  9. OverFeat:基于卷积网络的集成识别、定位与检测

    摘要:我们提出了一个使用卷积网络进行分类.定位和检测的集成框架.我们展示了如何在ConvNet中有效地实现多尺度和滑动窗口方法.我们还介绍了一种新的深度学习方法,通过学习预测对象边界来定位.然后通过边 ...

  10. Mask R-CNN用于目标检测和分割代码实现

    Mask R-CNN用于目标检测和分割代码实现 Mask R-CNN for object detection and instance segmentation on Keras and Tenso ...

随机推荐

  1. springboot不同环境打包

    1. 场景描述 springboot+maven打包,项目中经常用到不同的环境下打包不同的配置文件,比如连接的数据库.配置文件.日志文件级别等都不一样. 2. 解决方案 在pom.xml文件中定义 2 ...

  2. 关于CMTS设备的一些备忘

    博主工作内容包括cable modem,对CM的工作方式有一些了解,但是对CMTS头端怎么带动一个用户小区长久以来一直是一头雾水.今天找了些资料,对这块有了一些了解,并把自己的理解总结下来. 比如我家 ...

  3. Java 新特性总结——简单实用

    lambda表达式 简介 lambda 表达式的语法 变量作用域 函数式接口 内置函数式接口 默认方法 Stream(流) 创建 stream Filter(过滤) Sorted(排序) Map(映射 ...

  4. 「玩转Python」突破封锁继续爬取百万妹子图

    前言 从零学 Python 案例,自从提交第一个妹子图版本引来了不少小伙伴的兴趣.最近,很多小伙伴发来私信说,妹子图不能爬了!? 趁着周末试了一把,果然爬不动了,爬下来的都是些 0kb 的假图片,然后 ...

  5. 8086 IO读写操作

    如图所示,通过8086来读写io口,实现流水灯以及开关.本电路是基于8086最小模式下的三总线结构添加的,三总线结构原理较为复杂本篇就不对其原理进行介绍了,大家可以自行查阅相关引脚的功能从而实现. 本 ...

  6. [剑指offer] 16. 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一: 非递归解 class Solution { public: ListNode *Mer ...

  7. ubuntu16.04服务器上无root权限,配置个人tensorflow环境--cuda9.0+cuDNN7+tensorflow-gpu-1.8

    本人在服务器上已经用Anconda创建好python3.5的环境,这个网上有一大堆教程.接下来是重点. 1. cuda的安装 https://developer.nvidia.com/cuda-dow ...

  8. Java:jdbc连接mysql数据库

    安装eclipse和mysql的步骤这里不赘述了. 1.一定要下jar包 要想实现连接数据库,要先下载mysql-connector-java-5.1.47(或者其他版本)的jar包.低版本的jar包 ...

  9. centOS7启动apache,报错Caused by: java.net.UnknownHostException: wshCentOS:

    测试方法: ping 127.0.0.1 ping localhost 解决方案: vi /etc/hosts 把127.0.0.1和wshCentOS绑定就好 按 i 进入修改模式,按 esc 退出 ...

  10. Java中Random随机数

    java中一般有两种随机数,一个是Math中random()方法,一个是Random类. 一.Math.random() 随即生成0<=x<1的小数. 实例:如何写,生成随机生成出0~10 ...