CornerNet讲解和tensorflow复现
Corner Net简介
cornernet是2018ECCV的oral,是检测领域内的一个新的分支,打破了传统的由faster-rcnn和yolo两大派系的壁垒,另辟蹊径。论文
我已经用tensorflow复现了CornerNet ,记得star哦,复现不易。
先看效果图
下面是cornernet的结构
Hourglass
cornernet的backbone是使用hourglass架构,这种架构的优点就是考虑到了多尺度问题,下面就是hourglass的结构图:Stacked Hourglass Networks for Human Pose Estimation
上面就是hourglass的整体的网络结构。就是几个沙漏进行级联。
其中每个沙漏如下:
详细的请看原文,上面提供了连接,这里只是顺带提一下,因为这篇博客的主角不是hourglass。
Corner Pooling
这个运算过程大致为:计算top-left时,1.计算top:对feature map从下往上看,最后一行不变,倒数第二行的数值跟最后一行比较,如果大于最后一行,就保留当前数值,否则就更新成最后一行的数值,以此类推。2.计算left:对feature map从右往左看,最后一列保存不变,倒数第二列的数值跟最后一列比较,如果大于最后一列,就保留当前数值,否则就更新成最后一列的数值,以此类推。然后两者相加,就是top-left的数值。
作用:作者在论文里面说,由于预测的那两个点,并不是在‘’内容‘’上面,而是在‘’内容‘’旁边,例如下图,橘色的点并不是打在人物身上,而是打在了人物旁边,但是这个地方所提供的信息并没有作用,而真正有作用的是人物,所以需要通过corner pool的方式将人物上的信息,转移到旁边来,以便模型在预测点的时候能更准确。
corner pooling的反向传播:你没看错,这部分作者是自己写了反向传播部分(用c语言),因为是新的方法,所以常见的框架都没有提供这种操作的反向传播。我在这部分用tensorflow实现了前向和反向传播的部分,详情请看代码。
def TopPool(inputs):
#forward
def forward(inputs):
out=tf.expand_dims(tf.reduce_max(inputs,1),1)
i=tf.constant(1)
batch,h,w,c=inputs.get_shape().as_list()
def cond(i,out):
return i < h
def body(i,out):
d=tf.expand_dims(tf.reduce_max(inputs[:,i:,:,:],1),1)
out=tf.concat((out,d),1)
i = i + 1
return i,out
_,out = tf.while_loop(cond, body, [i,out],shape_invariants= [i.get_shape(), tf.TensorShape([batch,None,w,c])])
return out
#backward
def backward(inputs,dy):
zeros=tf.expand_dims(tf.zeros_like(inputs[:,-1,:,:])