42 錨框【動手學(xué)深度學(xué)習(xí)v2】

錨框(Anchor box)
- 目標檢測算法中,通常會在輸入圖像中采樣大量的區(qū)域,然后判斷這些區(qū)域中是否包含所感興趣的目標,并調(diào)整區(qū)域邊界從而更加準確地預(yù)測目標的真實邊界框(ground-truth bounding box)
基于錨框的目標檢測算法
- 也有不基于錨框的目標檢測算法,但是基于錨框的目標檢測算法占主流
- 以每個像素為中心,生成多個縮放比(scale)和寬高比(aspect ratio)不同的邊界框(這里的以每個像素點為中心指的是錨框中心點的像素,當中心位置給定時,已知寬和高的錨框是確定的)
關(guān)于生成多個錨框:

- 錨框的寬度和高度分別是 w * s * sqrt(r) 和 h * s / sqrt(r),可得錨框的面積是 w * h * s ^2,因為 s ∈(0,1],可以得到錨框的最大面積是 w * h,也就是輸入圖像的面積(錨框的寬度和高度的表達式好像有錯誤,歡迎小伙伴指出)
- 這里的 n + m - 1 的意思是:在實踐中,只考慮包含 s1 或者 r1 的組合,s1 和 m 個寬高比共有 m 個組合,r1 和 n 個縮放比共有 n 個組合,這兩種情況中(s1,r1)重復(fù)算了一次,所以最終以同一個像素為中心的錨框數(shù)量是 n + m - 1,因為輸入圖像的高度為 h ,寬度為 w,所以輸入圖像總共有 m * n 個像素,因此對于整個輸入圖像,總共生成了 w * h * (n + m - 1) 個錨框

- 錨框和邊緣框的區(qū)別:邊緣框bounding box指的是所標號的真實物體的位置;錨框anchor box指的是算法對邊緣框,也就是物體真實位置的猜測
- 提出多個被稱為錨框的區(qū)域
- 預(yù)測每個錨框里是否含有關(guān)注的物體
- 如果是,預(yù)測從這個錨框到真實邊緣框的偏移
- (因為算法本身并不知道邊緣框,也就是標號物體真實的位置,如果直接對位置進行預(yù)測,預(yù)測邊緣框的四個坐標值的話相對來講比較困難,所以一般算法的操作是先提出一些框,然后首先判斷這些框中是否包含目標物體,如果確定包含目標物體的話,接下來預(yù)測基于該錨框相對于邊緣框的偏移,也就是說基于錨框的目標檢測不是直接對邊緣框的四個坐標值進行預(yù)測,而是先提出一些錨框,然后等到差不多包含目標物體的時候,再對錨框進行調(diào)整到邊緣框的位置)
整個過程中包含兩次預(yù)測:
- 類別:預(yù)測錨框中所包含物體的類別
- 位置:預(yù)測錨框到邊緣框的位置偏移
IoU-交并比

- 用于衡量錨框和真實邊緣框之間的相似度,兩個框之間的交集與兩個框的并集的比值
- 取值范圍[0,1]:0表示沒有重疊;1表示完全重合(越接近1,兩個框的相似度越高)
- 它是Jacquard指數(shù)的特殊情況(給定兩個集合,Jacquard指數(shù)表示兩個集合的交集和兩個集合的并集之間的比值)

- 如果將任何邊界框的像素區(qū)域中的像素看成是集合中的元素,每個框就可以看成是像素的集合,IoU就等價于Jacquard指數(shù)
在訓(xùn)練數(shù)據(jù)中標注錨框
在訓(xùn)練集中,將每個錨框視為一個訓(xùn)練樣本,為了訓(xùn)練目標檢測模型,需要每個錨框的類別(class,與錨框相關(guān)的對象的類別)和偏移量(offset,真實邊緣框相對于錨框的偏移量)標簽
在預(yù)測的時候,首先為每個圖像生成多個錨框,預(yù)測所有錨框的類別和偏移量,根據(jù)預(yù)測的偏移量調(diào)整它們的位置以獲得預(yù)測的邊緣框,最后只輸出符合特定條件的預(yù)測邊緣框
- 基于錨框的目標檢測是首先提出多個錨框,然后對錨框是否包含所感興趣的物體以及錨框相對于邊緣框的偏移進行預(yù)測
- 所以在訓(xùn)練的時候,每一個錨框是一個訓(xùn)練樣本
- 對于每一個錨框來說,要么被標注成背景(不包含所感興趣的物體,只包含背景),要么關(guān)聯(lián)上一個真實的邊緣框(錨框所框住的物體的標號與所關(guān)聯(lián)的邊緣框所包含的物體的標號相同;錨框相對于邊緣框的偏移就是相對于它所關(guān)聯(lián)的邊緣框的偏移,這個偏移量根據(jù)錨框和真實邊緣框中心坐標的相對位置以及這兩個框的相對大小進行標記)
- 鑒于數(shù)據(jù)集內(nèi)不同的框的位置和大小不同,可以對那些相對位置和大小應(yīng)用變換,使其獲得分布更均勻且易于擬合的偏移量
- 一般來講算法會生成大量的錨框,而只有少量的邊緣框,絕大部分錨框都是背景,背景類別的錨框通常被稱為“負類”錨框,其余的被稱為“正類”錨框
如何賦予錨框標號?
- 目標檢測的訓(xùn)練集中帶有真實邊界框的位置以及其所包圍物體類別的標簽,所以如果要標記所生成的錨框,可以參考分配到的最接近此錨框的真實邊界框的位置和類別標簽
?步驟:

?
錨框 P1 - 09:19
?
- 上圖中的方格表示一個矩陣:4列表示4個邊緣框,9行表示9個錨框,每一個小方格中的值表示對應(yīng)的錨框與邊緣框的交并比
- 然后將整個矩陣中最大的值挑選出來(假設(shè)是x23),那么就會將邊緣框3中的標號給錨框2,并刪除x23所在的行和列的其他值

- 再在剩下的矩陣元素中尋找最大值(假設(shè)是x71),則此時會將錨框7與邊緣框1關(guān)聯(lián)起來,同理刪除掉x71所在的行和列的其他元素

- 以此類推,直到將所有的邊緣框與對應(yīng)的錨框關(guān)聯(lián)起來,找出x54和x92
- 賦予錨框標號的算法不止上面這一種
關(guān)于錨框的生成:
- 固定生成
- 根據(jù)圖片生成錨框
使用非極大值抑制(non-maximum suppression,NMS)輸出

- 在預(yù)測時會為圖像生成多個錨框,然后再為這些錨框逐個預(yù)測類別和偏移量,一個預(yù)測好的邊界框是根據(jù)其中某個帶有預(yù)測偏移量的錨框而生成的。所以最終會得到很多相似的具有明顯重疊的預(yù)測邊緣框,而且都是圍繞著同一個目標,因此需要對這些相似的框進行剔除,最終保留下來比較干凈的預(yù)測輸出結(jié)果
- NMS也是剔除方法之一,首先選中所有預(yù)測框中非背景類的最大預(yù)測值(對類的預(yù)測的softmax值,越接近于1置信度越高),然后去掉所有其它和它IoU值大于θ的預(yù)測值(也就是去掉和最大預(yù)測值相似度比較高的其它錨框),重復(fù)這個過程,直到所有的預(yù)測框要么被選中,要么被去掉,最終得到一個比較干凈的輸出(NMS的輸出)

- 在執(zhí)行非極大值抑制前,可以將置信度較低的預(yù)測邊緣框移除,從而減少算法中的計算量;也可以對非極大抑制的輸出結(jié)果進行后處理,比如只保留置信度更高的結(jié)果作為最終輸出
總結(jié)
- 目前主流的目標檢測算法都是基于錨框來預(yù)測的
- 首先以圖像的每個像素為中心生成大量不同形狀的錨框(不同的算法生成錨框的方法不同),并對每個錨框賦予標號(對錨框賦予標號的方法也有很多種),這樣每個錨框就會有一個類別標號和相對與邊緣框的偏移,因此每個錨框可以作為一個樣本進行訓(xùn)練
- 交并比用于衡量兩個邊界框的相似性,它等于兩個邊界框像素區(qū)域的交集與并集之間的比值
- 在訓(xùn)練集中,需要給每個錨框兩種類型的標簽:1、錨框中目標檢測的類別;2、錨框相對于真實邊緣框的偏移量
- 在預(yù)測的時候會對每個錨框進行預(yù)測,會生成大量冗余的預(yù)測,可以使用NMS來去掉冗余的預(yù)測,從而簡化輸出
Q&A
- 1、到底是用C++還是python用于三維視覺,主要取決于產(chǎn)品的芯片性能,可以這么理解嗎??QA P3 - 00:00?
- 2、算法能不能僅通過視頻(2D)來推測視頻中物體的前后關(guān)系(3D)??QA P3 - 00:21?
- 3、怎么算錨框框住了一個物體呢?閾值怎么確定??QA P3 - 00:42?
- 4、這里一個錨框只能對應(yīng)一個真實框嗎??QA P3 - 00:55?
- 5、為什么要生成多個訓(xùn)練樣本?直接從一張圖上不同位置CROP多次出來不行嗎??QA P3 - 01:19?
- 6、為什么用錨框后再識別邊緣框效果比直接識別邊緣框效果更好?理論上不應(yīng)該步驟越少誤差累計越少嗎??QA P3 - 01:38?
- 7、不使用anchor box的算法怎樣進行目標的判斷??QA P3 - 01:56?
- 8、最大的預(yù)測值,指的是分類的置信度,還是錨框預(yù)測的置信度?這兩個置信度是混在一起預(yù)測的嗎??QA P3 - 02:14?
錨框預(yù)測沒有置信度,只有分類有置信度(錨框是一個回歸問題,是沒有置信度的)
- 9、如果識別狗之后還需要對狗內(nèi)部進行進一步分類,比如大狗和小狗。這時對大狗和小狗的識別正確率是不是肯定低于對整體狗的預(yù)測?如果是進一步預(yù)測狗頭和狗尾巴呢??QA P3 - 02:44?
- 10、nms是不是和標負類差不多??QA P3 - 03:32?
- 11、標記錨框之后,偏移是怎么計算的呢?怎么根據(jù)錨框,變換到邊緣框??QA P3 - 03:40?
- 12、每次做nms時,是只針對相同類別(只對狗)做循環(huán)過濾去除,還是對不同類別(比如貓和狗)都做過濾去除??QA P3 - 04:18?
- 13、一階段算法是不是就是錨框和分類同時預(yù)測,二階段算法就是分開預(yù)測??QA P3 - 05:05?
- 14、為什么每個像素5個錨框?為什么是單個像素級別的?一個錨框不是包含很多個像素嗎??QA P3 - 05:21?
- 15、assign_anchor_to_box函數(shù)中的真實邊緣框是從哪里得到的?既然不知道真實的邊緣框在什么位置,又怎么計算出每個錨框的IoU呢??QA P3 - 05:55?
- 16、錨框的寬度和高度分別是w*s*sqrt(r)和h*s/sqrt(r)是怎么計算的呢??QA P3 - 07:11?
- 17、藍色、紫色、淡藍色三個框都是0.75,都一樣好?怎么再進一步比較呢?根據(jù)模型預(yù)測的分類置信度?為什么狗沒有更好的錨框來表示他呢?只有一個小錨框?QA P3 - 08:14?
- 18、為什么要給每個像素做錨框?能合并像素來減少嗎??QA P3 - 08:45?
- 19、錨框的損失高數(shù)怎么定義?標記框里面東西是什么的時候用圖片分類么??QA P3 - 08:59?
- 20、目標檢測的loss是怎么計算呢?是看錨框跟實際框的坐標偏差嗎??QA P3 - 09:10?
- 21、兩個真實框離得很近或者重疊的時候怎么辦呢,比如一個行人站在一輛汽車前面,或者兩個離得很近的人??QA P3 - 09:23?
- 22、能根據(jù)特征點篩選像素再進行添加錨框嗎??QA P3 - 10:10?
----end----
其他參考:
1、《動手學(xué)深度學(xué)習(xí)》,課程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_8.pdf
2、《動手學(xué)深度學(xué)習(xí)》,https://zh-v2.d2l.ai/chapter_computer-vision/anchor.html
標簽: