一周一个小朋友系列之——CenterNet paper analysis(未写完)

脑瓜子嗡嗡的小刘炼丹之路—CenterNet paper Analysis


    嘿嘿嘿,脑瓜子嗡嗡的小刘又来了哦,小刘似乎很久没有更新了哇,上次要更新的车内车内空气检测分析系统,因为这个是我同学的毕业设计所以暂时也不能开源,哈哈哈哈(鸽了就鸽了噻)! 然后呢,小刘最近在忙论文和考研的事情,当然也也笔试了几家大厂,如字节跳动这种大厂呢,一定要把数据结构搞清楚,然后就算去刷题,过来人一把心酸了,因为大学没有学过数据结构,次了亏!(想要笔试类型的可以call me) 虽然而自学了,但是也不过家,不过最近准备要考研这些都会循序渐进的!加油吧,后浪们,卷起来就对了,同为搬砖人,如何把砖搬得更好,这是一门技术!

  CenterNet:是2019年的论文了,其核心思想就如同其论文题目一样:Objects as Points,将目标看为一个点,相对于anchor base 的网络:YOLO SSD RCNN来说,CenterNet是一种anchor free的Object Detection Convolutional Neural Network。其在速度和精度上面相对于anchor base较为快一点,但是对比两阶段的可能较弱一点,并且CenterNet的可拓展性非常的强,不仅可用于目标检测,还可以用姿态检测或3D目标检测等。

图1、 姿态检测

  姿态检测:估计图像中每个人的k个二维关节点的位置(coco数据为17),将姿态视为中心点的[K✖2]维属性,并对每个关键点进行参数化,使其偏离中心点,再使用L1 loss(平滑的作用)直接对关节点偏移量进行回归。并且通过 masking the loss来忽略看不到的关键点。

图2、3D 目标检测

  三维包围盒估计,需要回归到目标绝对深度、三维包围盒尺寸和目标方向等,似乎和YOLO3D非常的不同,YOLO3D中提取了Point的高度、密度、光强(反射率)等特征,分别作为像素值,继而将得到鸟瞰图在输入卷积通道中,而centernet似乎采用的是单目摄像头,其backbone为DLA-34,同时也是采用L1 loss((平滑的作用)计3Dbox 的长宽高。因为其方向也是单一的数值,很难回归。CenterNet将方向分成2个bin,每个bin用4个数值表示。每个bin中2个值用于做softmax分类,五个值用于回归角度。

一、anchor base & anchor free
anchor base

  目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含感兴趣(Region of interest)的目标,并调整区域边缘从而更准确地预测目标的真实边界框(ground-truth bounding box)。不同的模型使用的区域采样方法可能不同。anchor base的方法则是以每个像素为中心生成多个大小和宽高比(aspect ratio)不同的边界框。这些边界框被称为锚框(anchor box)。anchor 的设置也讲究着方法,也关系着精度问题,YOLO使用Kmeans聚类得到anchor box 的大小,YOLO2是5个anchor box ,V3为9个anchor box , V4为(忘记了),只记得使用的是Mosaic数据增强的方式。anchor感觉和滑窗是类似的。

anchor free

  其大概分为3种方法吧:
  1、基于角点的anchor free :如CornerNet :直接预测每个点是左上、右下角点的概率,通过左上右下角点配对提取目标框。
  2、基于中心点的anchor:如CenterNet:对特征图的每个位置预测它是目标中心点的概率, 并且在没有锚框先验的情况下进行边框的预测。(本文主要探讨的)
   3、基于全卷积的anchor free:如FCOS:直接将每个位置的目标边界框进行回归,也就是将坐标点而不是锚框作为训练的样本。
  小弟我就了解过一点点CenterNet,大哥不懂就去搜索一下。anchor free的出现应该可以归功于RetinaNet的Focal Loss:较好的解决的样本的类别不均衡导致的问题。ps:说解决有点太绝对了,哈哈哈哈。

  anchor free 的优点:
   1、不需要设置anchor相关的超参数;
   2、避免大量计算GT boxes和anchor boxes 之间的IoU,计算量更小,(似乎可以用于嵌入式设备上)
   3、相对于anchor base的方法,更加灵活。

二、 CenterNet

  首先来看一张图吧,在COCO数据集上CenterNet的AP(Average precision)远远的大于了YOLO,FasterRCNN,RetinaNet等网络,因为是2019年的论文了,没有和YOLOV4,V5 等SOTA网络进行对比,并且现在CenterNet-V2也出来蛮久的了,CenterNet-V2为二阶的检测器(我没看)。要对比的自己可以去做一下实验,菜鸡的我就不做了。ps:这个大哥似乎做了,可以去看看,push here就ojbk了

图1、Speed-accuracy trade-off on COCO
图2、Comparison of the proposed YOLOv4
object as the center point

  前面我们说到,CenterNet的核心就算将object view as a point,主要是利用了目标的中心点,其他如:目标的大小,维度,方向和姿态都可以直接从中心位置的图像特征回归。并且其采用Heatmap,Heatmap峰值对于对象的中心,每个峰值的图像特征用来预测物体的bounding box 的高度和宽度,因为是anchor free的方式,通过heatmap峰值点直接预测出目标中心点,再针对中心点进行其余属性的预测,因为每个目标只有一个 “positive anchor”,同时也没有靠IoU来分配anchor,所以是没有必要使用NMS(Non-maximum suppression)来滤除其他的重复多余的box的。centernet的输出是4倍下采样后的结果,一般的目标检测器输出的是 16 倍下采样的结果,所以 centernet 不需要多个anchor

图3、object as the center point of its bounding box

Preliminary

  CenterNet输入为512 * 512 * 3的图像(具体看直接网络的设置), I ∈ R W × H × 3 I \in R^{W\times H\times 3} IRW×H×3,为了产生heatmap Y ^ ∈ [ 0 , 1 ] W R × H R × C \hat{Y} \in [0, 1]^{\frac{W}{R} \times \frac{H}{R} \times C} Y^[0,1]RW×RH×C 其中R是输出步长,C是关键点类型的个数。默认的输出步长R = 4,即为下采样。结果 Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 Y^x,y,c=1对应于一个被检测的关键点,而 Y ^ x , y , c = 0 \hat{Y}_{x,y,c} = 0 Y^x,y,c=0 则对应背景。 对于类别c中每一个关键点的真实值 p ∈ R 2 p \in R^2 pR2 ,关键点真实值 p = ( x 1 + x 2 2 , y 1 + y 2 2 ) p=(\frac{x_1+x_2}{2},\frac{y_1+y_2}{2}) p=(2x1+x2,2y1+y2),计算了一个低分辨率等价的 p ~ = [ p R ] \tilde{p}=[\frac{p}{R}] p~=[Rp]。之后把所有的真实的关键点分布在一个heatMap上 Y ∈ [ 0 , 1 ] W R × H R × C Y \in [0, 1]^{\frac{W}{R} \times \frac{H}{R} \times C} Y[0,1]RW×RH×C,并使用一个高斯卷积核 Y x y c = e x p ( − ( x − p ~ x ) 2 + ( y − p ~ y ) 2 2 σ p 2 ) Y_{xyc}=exp(- \frac{(x-\tilde{p}_{x})^2+(y-\tilde{p}_{y})^2}{2\sigma^{2}_{p}}) Yxyc=exp(2σp2(xp~x)2+(yp~y)2),生成一个二维的正态分布。如果两个同类别的高斯结果重合,我们就取每个元素的最大值,(感觉也是有点类似于anchor的方法,只不过是从数据中去学习得到中心点,数据在标注的过程中应该是,会得到左上角坐标和右下角坐标,以及label标签)
  上面说到下采样为4(对512的size来说),即输出应该为128 * 128 * 2的heatmap图,其会将每个目标的尺寸回归到heatmap上,而只会预测两个通道,即一个width 和一个height,而并非每个label对于的两个channel。

图3、anchor & center point
  基于anchor的标准检测。anchor与任何对象重叠的IoU>0.7为正,IoU<0.3为负,否则将被忽略。基于center point的检测。中心像素被分配给该对象。附近的各点减少了负损失。

 Heatmap

  我觉得应该好多人不知道这个,哈哈哈哈哈,heatmap是在二维空间中以颜色的形式显示一个现象的绝对量一种数据可视化技术。颜色的变化可能是通过色调或强度,给读者提供明显的视觉提示,说明现象是如何在空间上聚集或变化的
  因为用heatmap做关键点的检测(即输出关键点的位置坐标)。在生成heatmap的时候,会在最大值附近出现多个峰值,即目标附近的点会和目标会有着相似性(不可能用某一个像素来定义),而如果将其作为负样本,会对关键点的位置坐标和训练产生影响,所以使用才采用高斯核来对其预先处理,起到一定的平滑操作,如果周围存在着多个其峰值,对网络的回归会有一定的影响,而加上高斯核,会给网络的训练带来一个方向指引,距离目标点越近,激活值越大,这样网络能有方向的去快速到达目标点,中间区域的概率最大,基本上接近于1,边缘逐渐减小。
计算Heatmap部分code:

def draw_gaussian(heatmap, center, radius, k=1):
    diameter = 2 * radius + 1
    gaussian = gaussian2D((diameter, diameter), sigma=diameter / 6)
    x, y = int(center[0]), int(center[1])
    height, width = heatmap.shape[0:2]
    left, right = min(x, radius), min(width - x, radius + 1)
    top, bottom = min(y, radius), min(height - y, radius + 1)
    masked_heatmap = heatmap[y - top:y + bottom, x - left:x + right]
    masked_gaussian = gaussian[radius - top:radius + bottom, radius - left:radius + right]
    if min(masked_gaussian.shape) > 0 and min(masked_heatmap.shape) > 0:  # TODO debug
        np.maximum(masked_heatmap, masked_gaussian * k, out=masked_heatmap)
    return heatmap

def GaussianHeatMap(shape, sigma=1):
    m, n = [(ss - 1.) / 2. for ss in shape] #image shape
    y, x = np.meshgrid[-m:m + 1, -n:n + 1]
    h = np.exp(-(x * x + y * y) / (2 * sigma * sigma))
    h[h < np.finfo(h.dtype).eps * h.max()] = 0
    return h

def gaussian_radius(det_size, min_overlap=0.7):
    height, width = det_size

    a1 = 1
    b1 = (height + width)
    c1 = width * height * (1 - min_overlap) / (1 + min_overlap)
    sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1)
    r1 = (b1 + sq1) / 2

    a2 = 4
    b2 = 2 * (height + width)
    c2 = (1 - min_overlap) * width * height
    sq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2)
    r2 = (b2 + sq2) / 2

    a3 = 4 * min_overlap
    b3 = -2 * min_overlap * (height + width)
    c3 = (min_overlap - 1) * width * height
    sq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3)
    r3 = (b3 + sq3) / 2
    return min(r1, r2, r3)

  emmm,到这里应该还只是个半成品(其实还不到1/3,因为还有姿态和3D的),但先发出来吧,到时候再补充!嘻嘻嘻,小刘应该快从小鹏离职了,要回学校答辩了,然后复习考研,要是今年12月考研上了,那就继续造车吧,冲冲冲!giao

   没写完就没写完,嘿!我就是玩!
一周一个小朋友系列之——CenterNet paper analysis(未写完)_第1张图片

    脑瓜子嗡嗡的小刘,一名自动驾驶图像算法实习生。同时小刘也是一枚热衷于人工智能技术与嵌入式技术的萌新小白。小刘在校期间也参加过许许多多的国内比赛(主要是嵌入式与物联网相关的),要是大哥们有什么问题,可以随时Call me,希望能和大哥们共同进步!!!同时也希望大哥们看文章的时候也能抽空点个赞!谢谢大哥们了!!!(づ ̄ 3 ̄)づ

——————————THE END——————————

你可能感兴趣的:(CenterNet系列,自动驾驶,深度学习,计算机视觉,人工智能,pytorch)