幾個關於 ssd 與 yolo 無法理解的地方


幾個關於 ssd 與 yolo 無法理解的地方,拜託各位了
我自己想用Tensorflow實現一次,但弄了好久 loss 都無法下降
 
1 . 請問哪一張 paper 開始 卷积神经网络 使用 回歸 來偵測物件?
最近在做目標檢測,看了一些 paper 想自己實現一次但是都失敗,如 yolo ssd ,
regression 偵測物件的部分沒有看得很懂

2 . 像 yolo 將影像切成 7 x 7 是怎麽個切法,我在代碼裡沒看到,是不是經過 卷积層 就直接切完了?
 
3 . ssd 與 yolo predict 的值(未經過任何處理的,conv 或是 fc 層輸出的) 
  • 這 4 個值是 x y w h 還是 x1 y1 x2 y2 呢
  • 這 4 個值需要 限制在 [0, 1] 之間嗎, 還是可以直接 train

 
4 . ssd 與 yolo 四個參數 x y w h 的使用方法也沒有很懂 , 像是參數是怎麽使用 ?    default box 的 x y 是 bounding box 的中心 ,predict 的 x y 是對於default box 的offset 是指 :          
  • 如果將影像切成 2 x 2 格,左上角default box 的中心點就是 ( 0.25 , 0.25 ) 而 predict 的 ( x , y ) 的 範圍就只能在 正負0.25    ( 正負0.5 / 2, 除以 2 是因爲切成 2 x 2 ) ,這樣對嗎

 
  • 那 w h 要怎麽預測偏移值呢 , w h 不像 x y 是一個點 

 
5 . 爲啥麼 ssd 需要使用 defaultbox 呢
  • 是因爲用default box 當基礎點 ,再預測偏移值所以才需要default box嗎
  • 在最後再把 default box + predict offset 加在一起嗎


6 . 爲啥麼 ssd 不需要 confidence score 只有 分類的 score
  • 是不是 ssd 的分類 output 要乘以 iou overlap rate

已邀请:

uestc_yang - UESTC

赞同来自: jun_wei_chen_x 辛淼 epleone

你的这个繁体字看得有点吃力啊,我来回答第二个问题吧,yolo 7*7的切割是在代码里面看不出来的,yolo是直接使用整张图片的特征进行回归,这里以7*7 b=2,class=20来说,后面全连接直接回归1470个值,1470是按照yolo自己定义的方式表示具体的含义。
第三个问题:yolo和ssd预测的都是x,y,w,h。yolo里面x,y,w,h都是【0-1】直接,最后面一个全连接层直接进行回归(没有加激活函数)。ssd没有进行x,y,w,h是实际的值,没有归一化。
第四个问题: yolo的处理方式,这里result表示最后预测的四个值
 x = image.cols*(result[0]+j)/7;//i表示gride的位置
y = image.rows*(result[1]+i)/7;//j表示gride的位置
w = image.cols*result[2]*result[idx++];
h = image.rows*result[3]*result[idx];
ssd的举例使用先验的方式
//prior_data_mean表示的是先验框的位置的均值,prior_data_std表示先验框的位置的方差,loc_pre表示预测
    prior_w = prior_data_mean[2] - prior_data_mean[0];//先验的宽
    prior_h = prior_data_mean[3] - prior_data_mean[1];//先验的高
    prior_x = (prior_data_mean[2] + prior_data_mean[0])/2;//先验的中心位置x坐标
    prior_y = (prior_data_mean[1] + prior_data_mean[3])/2;//先验的中心位置y坐标

    bb_x = prior_data_std[0]*loc_pre[0]*prior_w + prior_x;
    bb_y = prior_data_std[1]*loc_pre[1]*prior_h + prior_y;
    bb_w = exp(prior_data_std[2]*loc_pre[2])*prior_w;
    bb_h = exp(prior_data_std[3]*loc_pre[3])*prior_h;
第六个问题:
ssd是有confidence值回归的。

joshua_1988 - https://joshua19881228.github.io/

赞同来自: dawenxi110

1. CNN用regression的方法最早可能是OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks,文献可以在这里下载到http://arxiv.org/abs/1312.6229
2. 第二个问题@uestc_yang解释的很棒了
3. 这个问题我和uest_yang的理解是不同的。在训练时,其实学习的是一种offset,比如ssd的每个位置都对应3种或者6种不同尺度或长宽比的default box(或者称之为prior box,anchor),这其实就是一种先验知识,那么ssd得到的四个值是针对这些先验的offset,或者说网络学习的是groundtruth与default box的残差,我个人理解这是有助于回归器的训练的,因为我们有了一个很强的先验,目标离先验很近,那么回归器就比较容易训练,不用费太大力气就可以给出不错的结果。基于相同的原因,我们训练[0,1]也为了让我们的回归器更简单,CNN的网络的输出就倾向于0-1之间,所以归一化之后的值更接近cnn的输出。楼主可以看看ssd的代码,在detection_output_layer.cpp里,top是这一层的输出,他的数据结构是[image_id, label, confidence, xmin, ymin, xmax, ymax],后面是做了进一步处理才得到了xywh。
5. 你的理解是没有问题的
6. ssd和yolo的输出几乎是一样的,在yolo里每个box有一个confidence和20类的分类score,而ssd是每个box有一个21类的score,其中一类为背景类,剩下20类和yolo一样都是voc里面的类别。ssd就利用这个背景类来处理非物体的区域

jun_wei_chen_x - xx

赞同来自:

@uestc_yang
 
1 . 請問 ssd 的 negative sample 的 confidence的值要怎麼取得呢,還是直接設 1 就可以了
 
2 . 請問 ssd 的 negative sample 與 positive sample 沒有按 3 : 1 的比例,而是全部 negative 都下去訓練會造成無法收斂嗎,我目前 bbox 位置 與 condifence score 都無法收斂...

要回复问题请先登录注册