【深度之眼cs231n第七期】笔记(二十二)
语义分割
概念:输入图像,对每一个像素做分类,而不是对一整幅图像做分类。训练的数据还是图像,标签是每个像素分别归为哪一类。比如说,某一个像素是属于猫的,某一个像素是属于草地的。
语义分割会把同一类的多个物体归为一类,比如这两个牛就被分为同一类了(同一种颜色)
语义分割只用分类就能实现,所以可以使用滑动窗口来实现。对于每个小窗口,对中心像素进行分类。
问题是,我们要为每一个像素准备一个滑动窗口,而许多滑动窗口是类似的,每个滑动窗口拿去做分类时,会重复计算重叠区域的特征,所以效率非常低,尤其对正向和反向传播。
其实可以共享各个滑动窗口间的计算,因为相邻的卷积特征是类似的。
如果把用来做图像分类的卷积神经网络的最后一层(全连接层)换成卷积层,这样整个网络就都是由卷积层组成的了,所以才叫全卷积网络。
最后一个卷积层得到的是C*H*W大小的分数,C是类的个数,对于每一个类里的每一个像素给出评分,而不是对一整个类进行评分。
然后对每一个像素计算交叉熵损失函数,再用反向传播进行训练
如果在全卷积网络中我们一直保持输入图像的大小,这会耗费大量的计算量,因为你可能会有很多的卷积通道(64、128甚至256),也有很多层。
所以实际上会先做下采样再做上采样。
如何实现上采样?
1.最近距离去池化:就是直接把输入复制n份
2.钉床函数去池化:直接把输入放左上角,其他地方补零
3.进行最大池化的时候,记住取最大值的地方,然后在上采样的时候放回原来的位置。
因为语义分割是像素级别的,而最大池化会丢失一些空间信息,如果没有记住原来的位置,在最后的结果可能没有那么精确。而且储存这些位置信息占用的空间并不大。
卷积转置
上面讲的方法都是固定的方法,并没有在学习如何做上采样。比如跨卷积就是在学习如何做下采样,学习如何做上采样的就叫做卷积转置,实际上就是一种卷积方式。
输入直接数乘卷积核,然后把卷积核复制到相应的位置,如果复制的地方重叠了,把它们加起来就好
这是一个一维的具体例子:
卷积转置的来由:卷积可以写成矩阵相乘的形式,我们使用相同的权重转置后和输入相乘,就得到卷积转置
左边的输入是一维向量[a,b,c,d],补零后是[0,a,b,c,d,0],卷积核为[x,y,z]
右边的输入是一位向量[a,b,c,d],卷积核为[x,y,z]
步长为2时的例子
图像分类和定位
分类定位在分类的同时,还进行物体的定位。
它和目标检测的不同之处在于:对于分类定位,输入的图像只含有一个目标
和分类的网络架构类似,这里有个全连接层拿来做分类,但我们还有另一个全连接层用来做包围框。所以我们会有两个损失函数,一个softmax损失,关于分类的;另一个可以使用L2距离来计算损失函数,实际中人们也会用L1距离、平滑L1等。两个损失函数间会有一个权重来平衡它们。
预测图像固定点的位置的想法(包围框)还可以应用到人体姿势估计上:输入一张人类的图像,输出人的关节
输入一幅图像后,输出14个参数,然后用回归损失(不是交叉熵损失函数和softmax损失函数,而是L2或L1,分类和回归的区别在于你的输出是连续的还是离散的)来评估,用反向传播训练网络