Cornernet---decode

如何从网络的输出,decode出所需要的信息呢。也就是模型的训练和测试中的测试部分。
首先我们先把网络的输出摆着
heatmap_tl : (batch,128,128,80)
heatmap_br:(batch,128,128,80)
tag_tl : (batch,128,128)
tag_br:(batch,128,128)
offset_tl:(batch,128,2)
offset_br:(batch,128,2)
这里先大概说一下,我们所有的信息都出自于heatmap,而tag,offset则是辅助decode的。
tag是描述左上和右下的embedding 的,也就是每个点对于的dist,用来寻找是否为同一个物体、
这里用来寻找是否为同一个物体除了dist,还有同一个物体左上的坐标y_tl > y_br x_tl < x_tr
offset:是描述坐标偏差的。
接下来进行解析
1 首先对heatmap_tl进行sigmoid变化,把其映射导0-1之间,这个也就是每个坐标点的score得分。

heatmap_tl = tf.nn.sigmoid(heatmap_tl)
heatmap_br = tf.nn.sigmoid(heatmap_br)

2 因为我们要对这些得分取top-k,这里应用max_pooling来简化计算

heatmap_tl_max = tf.nn.max_pooling(heatmap_tl,ksize=[1,3,3,1],strides=(1,1),padding='SAME')
#找到最大值们对于的位置,tf.equal()返回的是对应位置相同的为True,不同为False,
#tf.cast()返回相同的位置为1,不同的为0
mask = tf.cast(tf.equal(heatmap_tl_max,heatmap_tl),tf.float32)
#除了最大值位置有score,其他位置为0
heatmap_tl = heatmap_tl * mask

3 找top-k的score

-因为heatmap_tl的维度为(batch,128,128,80)
我们找每batch的top-k
所有把heatmap_tl,reshape(batch,128*128*80)
heatmap_tl = tf.reshape(heatmap_tl,(batch,-1))
-找top-k对应的值以及对应的索引这个k_indx最大为128*128*80,这个就富含了很多信息
k_value,k_indx = tf.nn.top_k(heatmap_tl,k)
k_class = k_indx // (128 * 128)
#在每一个class对应的128*128中,的位置索引,因为reshape了,所以需要重建
k_position = k_indx % (128 *128)
k_y = k_positon // w
k_x = k_positon % w
#################################总结下从heatmap中可以decode出什么信息
1.top-k的score得分:k_value
2.top-k的对应坐标:k_y,k_x
3.top-k的对应类别:k_class
4.top-k的k_positon
  1. 找了top-k对应score的各个坐标,我们根据左上和右下的heatmap解析出的坐标信息,来找到所有满足条件的坐标组合。(条件,和组合),那么如何组合呢?也就是我们每个左上对应一个右下,这里先下下逻辑
    首先我们在步骤3中已经得到了左上,右下的top-100的heatmap中的点的坐标信息以及score值
    我们已这个为基础,每个左上,需要和又下俩俩组合,如何体现在矩阵中呢?见图
    在这里插入图片描述

这就是为什么在作者代码中要对k_x,k_value,k_classes进行扩展。完了后在扩展后的矩阵中再取top-1000个检测到的物体框。
总结一下就是先在俩个heatmaps中各选top-100个score最大的点为角点,然后这俩部分角点可以组成100100个组合,然后再在这100100个组合中选score(这个score是左上和右下的score的平均值)的top1000,用这个top1000的索引来找到我们组合中的框的坐标。

步骤:
这里在大神代码中用到了一个map_to_vectory()函数,也就是根据indx来找对应值的函数。这里先不解释。
由上述我们得到了top100的k_positon

5.将top100后的x_tl,y_tl,x_br,y_br向对应位置扩展,其实对应的tl,和br只要方向不同即可!

top100后维度扩展后维度扩展方向
x_tl,y_tl(batch,100)(batch,100,100)沿行方向
x_br,y_br(batch,100)(batch,100,100)沿列方向

对value进行扩展

top100后维度扩展后维度扩展方向
value_tl(batch,100)(batch,100,100)沿行方向
value_br(batch,100)(batch,100,100)沿列方向

对class进行扩展

top100后维度扩展后维度扩展方向
class_tl(batch,100)(batch,100,100)沿行方向
class_br(batch,100)(batch,100,100)沿列方向

对tag_tl,tag_br进行扩展,以方便求各个组合下的dist

top100后维度扩展后维度扩展方向
tag_tl(batch,100)(batch,100,100)沿行方向
tag_br(batch,100)(batch,100,100)沿列方向

6.这里分别对offset_tl,offset_br,tag_tl,tag_br 利用map_to_vectory()根据k_positon来获取对应值

网络输出时维度map_to_vectory()后维度
offset_tl,offset_br(batch,128,128,2)(batch,100,2)
tag_tl,tag_br(batch,128)(batch,100)
  1. 将offset值与x,y值相加
    首先将offset维度进行调整
offset_tl=tf.reshape(offset_tl,(offset_tl.get_shape().as_list()[0],k,1,2)) #(batch,k,1,2)
offset_br=tf.reshape(offset_br,(offset_br.get_shape().as_list()[0],1,k,2)) #(batch,1,k,2)
x_tl=x_tl+offset_tl[:,:,:,0]
y_tl=y_tl+offset_tl[:,:,:,1]
x_br=x_br+offset_br[:,:,:,0]
y_br=y_br+offset_br[:,:,:,1]

8.现在所有x_tl,y_tl,x_br,y_br堆在一起就是所有的组合

bboxes=tf.stack((x_tl,y_tl,x_br,y_br),axis=-1)

9.根据tag_tl,和tag_br相减求dist

dists = tf.abs(tag_tl - tag_br)

10,根据values_tl,values_br求score

scores=(value_tl+value_br)/2

11.现在开始我们就可以根据判断条件来过滤不符合条件的组合

invalid=-tf.ones_like(scores)
#左上右下的组合肯定得是同一个class,过滤掉不同class的组合
mask_scores=tf.where(tf.cast(tf.equal(class_tl,class_br),tf.int32)>0,scores,invalid)
#ae_threshold embedding的阈值,所有不满足阈值的过滤掉
mask_scores=tf.where(tf.less(dists,ae_threshold),mask_scores,invalid)
#x_tl < x_br , y_tl > y_br
mask_scores=tf.where(tf.less(x_tl,x_br),mask_scores,invalid)
mask_scores=tf.where(tf.less(y_tl,y_br),invalid,mask_scores)

#在找到所有的满足条件的组合后,需要根据indx找到其bboxes是哪些,class是哪个,values是多少,故利用
#map_to_vectory()需要做以下变化。这个map_to_vectory()会进行详细解释
mask_scores=tf.reshape(mask_scores,(batch,-1))
scores,indexs=tf.nn.top_k(mask_scores,num_dets)

12 现在最后一步根据indexs来找到对应的bboxes,class,values


bboxes=tf.reshape(bboxes,(batch,-1,4))
bboxes=map_to_vector(bboxes,indexs,transpose=False)

class_=tf.reshape(class_br,(batch,-1,1))
class_=map_to_vector(class_,indexs,transpose=False)

value_tl=tf.reshape(value_tl,(batch,-1,1))
value_tl=map_to_vector(value_tl,indexs,transpose=False)

value_br=tf.reshape(value_br,(batch,-1,1))
value_br=map_to_vector(value_br,indexs,transpose=False)

13 最后组合成detection集合

detection=tf.concat([bboxes,scores,value_tl,value_br,class_],-1)

这里所有代码参考为https://github.com/makalo/CornerNet

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值