借用一位朋友對創新的理解,第一層是讓人耳目一新的創新,例如Faster RCNN、YOLOv1、SSD;第二層是守正出奇的創新,比如從圖像金字塔到特徵金字塔;第三層是集成改進的創新,堆砌各種其他論文發表的tricks,遷移SOTA方法到其他特定領域。

而今天發表的YOLOv4,從論文角度來看,屬於第二層到第三層之間的創新水平

這篇文章主要有五個創新或改進,但組合試驗了大約20項近幾年來各種深度學習和目標檢測領域的tricks。

我們看看五大改進創新是啥:

  1. Mosaic(馬賽克)數據增強,把四張圖拼成一張圖來訓練,變相的等價於增大了mini-batch。這是從CutMix混合兩張圖的基礎上改進;

Mosaic數據增強

2. Self-Adversarial Training(自對抗訓練),這是在一張圖上,讓神經網路反向更新圖像,對圖像做改變擾動,然後在這個圖像上訓練。這個方法,是圖像風格化的主要方法,讓網路反向更新圖像來風格化圖像(對風格化感興趣,可以看看我寫的一篇介紹谷歌的一個實時任意風格化的文章);

3. 跨最小批的歸一化(Cross mini-batch Normal),在CBN的基礎上改進;

BN, CBN,CmBN的對比

4. 修改的SAM,從SAM的逐空間的attention,到逐點的attention;

SAM和修改的SAM對比圖

5. 修改的PAN,把通道從相加(add)改變為concat,改變很小;

PAN和修改的PAN

可以說上面四個是改進,自對抗訓練算是一個創新(從風格化的方法遷移過來),以前沒見過這種目標檢測數據增強方法。

至於tricks,那就更多了,堪稱目標檢測最強萬花筒,Alexy大佬基本都給試驗對比了一遍。下表是對分類網路的實驗:

分類任務上的消融對比試驗,對比七個tricks

在YOLOv4檢測網路上,對比了四個loss(GIoU、CIoU、DIoU、MSE),標籤平滑,Cosine學習率,遺傳演算法選超參數,Mosaic數據增強等各種方法。下表是YOLOv4檢測網路上的消融實驗結果。

檢測網路上的消融對比tricks

可以說,這篇論文有創新和改進,但多數是微小的改進。然而這篇文章對比了大量的,近幾年新出來的tricks(細數的話有20多項),肯定得花費大量的時間和精力,工作量巨大。

另外,作者Alexy最大的一個額外貢獻是開發適配Windows版本的DarkNet,所以說工程上對技術社區的貢獻也很大。

如果要論突破性的創新,那肯定算不上。但總的來說,這篇論文還是比較良心的,畢竟這篇論文有五個改進創新點,各種tricks的消融對比實驗做的非常多,屬於實打實的勞苦功高了。而且實驗結果也對大家很有啟發。

推薦看一下原版論文,寫的通俗易懂,簡直可以作為深度學習目標檢測方向找工作的面試備查寶典。

關於這篇文章,我也寫了一篇介紹文章,有興趣的可以看一下。

元峰:YOLOv4重磅發布,五大改進,二十多項技巧實驗,堪稱最強目標檢測萬花筒?

zhuanlan.zhihu.com圖標

很榮幸也很尷尬地做了一個和YOLO v4 中的Mosaic技巧部分撞車的工作,嚇得我趕緊把我們的工作放出來。

  • Stitcher: Feedback-driven Data Provider for Object Detection

https://arxiv.org/pdf/2004.12432.pdf?

arxiv.org

在這個問題下面和大家分享一下我們的工作,正好解釋一下我們和YOLO v4 - Mosaic的區別與聯繫,以及這種類似的做法為什麼能漲點,以及其他可以挖掘的點。

  • Motivation去年打COCO比賽的時候,我負責研究detection的training方式,當時嘗試了Multi-scale training的各種settings、SNIP[1]/SNIPER[2]、CSN[3]等。發現Multi-scale training對模型訓練是真的很有幫助,即使在接近50 AP的高baseline上還有不俗的提升。然而,普通的Multi-scale training太低效了,而SNIPER是真的複雜,需要處理好label assignments, valid range tuning, positive/negative chip selection,費了我們很大的力氣才把它從MXNet源碼遷移到我們自己的框架上。這樣的心態和需求,迫使我們去研究一種更簡潔實用的multi-scale training 方法。不管是普通訓練還是Multi-scale training,我們發現在COCO上訓練出來的模型,小物體的AP永遠是比中物體和大物體低很多。比如,在最常用的baseline: Faster R-CNN + ResNet 50-FPN (1x) 的結果(AP: 36.7 %, AP small: 21.1 %, AP mid: 39.9 %, AP large : 48.1 %)中,AP small 比 AP large 低了兩倍還多。接下來,我們就開始研究,小物體到底出了什麼問題,以及怎樣解決這樣的問題。首先,我們統計了小物體在數據集中的分布,發現訓練集中小物體的數量並不少。如下表所示,在所有boxes中,有41.4 %是小物體,是這三類物體之中最多的;但小物體的分布卻非常不均勻,只有52.3%的圖片中包含了小物體,而中物體和大物體分布都相對均勻。換句話說,小物體數量很多、但分布非常不均勻,有接近50%的圖片中都沒有小物體

接下來,我們又統計了一下,在訓練過程中小物體的loss分布。能直接反應模型學習情況的是loss,進一步發現,還是在這個Baseline: Faster R-CNN + ResNet 50-FPN (1x)的訓練過程中,有超過50% iterations中,小物體所產生的loss都非常低(不到總loss的0.1)。這說明在模型訓練過程中,小物體提供給網路的監督是不足的。

通過上述分析,我們的猜疑鏈形成:數據集中小物體分布不均勻 --&> 訓練中小物體學習不充分(Loss不足) --&> 訓練完的模型小物體精度差。而接下來就是按照這個邏輯逐步設計解決方法。

  • Method

在已經有了前面multi-scale training和SNIPER的實驗結果後,我們想到可以把圖像縮小,並拼接在一起(逆SNIPER而行,SNIPER是裁剪,Stitcher是拼接)。如下圖所示,我們把batch內每4張圖都縮小到同樣大小,之後拼成一張與正常普通同樣大小的圖作為訓練。通過這樣的方式,把大物體和中物體縮小成中物體和小物體,來均衡不同Scale物體在訓練過程中的分布。

(這裡與YOLOv4-Mosaic類似,但不同的是我們沒想到拼接的時候可以調整4張圖為不同大小。 )

接下來就是緊張刺激的實驗環節,完全採用這種拼接圖進行訓練,在上文36.7% 的baseline上得到了32.1%的驚人結果。 然而,就算在32.1% 的 AP 中(AP small: 21.9, AP mid: 36.4, AP large: 36.8)的AP small仍然比36.7% 的baseline中的AP small要高,這讓我們看到了希望。這說明,拼接圖是有用的,只是我們沒用好,所以影響了最終效果。

前面對訓練過程中loss的分析,給我們提供了一個自然而然的思路,就是直接用loss 作為反饋信號,來指導拼接圖的使用。我們採用了一種「缺啥補啥」的簡單思路:如果上一個iteration中,小物體產生的loss不足(比例小於一個閾值),則下一個iteration就用拼接圖;否則就用正常圖片訓練。這個思路將32.1%的結果一下子增長到了38.6%,且統計loss比例幾乎不需要額外的計算量。

  • Experimental Results

(1)我們在Faster R-CNN、RetinaNet的1x / 2x上都進行了實驗,有2個點左右的AP提升,且漲點主要來自於AP small。這符合我們最初的Motivation和方法設計。

(2)此外,我們還在更大的backbone / 更高的baseline (ResNext + Deformable) 、其他數據集 (PASCAL VOC)、Instance Segmentation (Mask R-CNN) 等settings上都做了實驗驗證,都有不同程度的效果提升。

  • Further Analysis除了常規實驗以外,還有一些其他的效果分析可供討論。1. 只能4張 (平方數) 拼接嗎?

    答案是否定的。

    不管是我上文介紹的拼接方式還是YOLO v4,都是在Spatial維度 (h,w)上進行拼接的。如下圖(c)中所示,本文還提供了一種在batch維度n上拼接的等價的實現方式,也能達到一樣的效果。這樣的做法可以帶來如下好處:(1) 拼接圖像的數目不再需要因為spatial的限制局限於平方數,可以自由選擇2、3、4、5、6等張數圖像進行拼接。(2) 對於那些讀寫內存有限制的訓練設備平台,提供了一定的自由度。

2. 過擬合問題(更長訓練時間的增益)

在後續實驗中,我們還發現Stitcher可以起到防止過擬合的作用。在不用SyncBN之類的騷操作的情況下,把一個最普通的Faster R-CNN + FPN模型直接訓練時間較長(6x)是會有嚴重的過擬合的(36.7--&>35.6),但Stitcher卻沒有這個問題。因為在Stitcher訓練過程中,拼接圖像的挑選組合是隨機的,拼接圖像的多樣性防止了過擬合的發生。

3. 計算量代價

(1)對於Inference階段,Stitcher 沒有做任何修改,不需要調multi-scale testing之類的操作。所以,如果使用者只關心Inference time 的話,Stitcher帶來的漲點可以說是完全免費的。

(2)對於Training階段,Stitcher 額外引入的操作包括:image stitching 和 loss ratio calculation這兩步。經實測,後者可以忽略不計,額外的耗時集中在於前者對圖像的interpolation. 我們在同一台 8 GPUs RTX 2080 TI 的機器上實測,對於Faster R-CNN + ResNet 50 + FPN的baseline上,加上Stitcher需要額外多訓練15分鐘左右。這相比於8個多小時的訓練來說,多等15分鐘也是可以接受的。

  • Conclusion總結一下,我們這篇工作從小物體精度低這個問題入手分析,提出了一種新的multi-scale training方式 Stitcher,在常用的數據集、檢測器、訓練方式上均漲點明顯,沒有引入任何Inference負擔,有一定的簡潔實用性。代碼和模型都會在近期開源。
  • 歡迎各位大佬對我們的文章提出意見建議!

參考

  1. ^An Analysis of Scale Invariance in Object Detection - SNIP http://openaccess.thecvf.com/content_cvpr_2018/papers/Singh_An_Analysis_of_CVPR_2018_paper.pdf
  2. ^SNIPER: Efficient Multi-Scale Training https://papers.nips.cc/paper/8143-sniper-efficient-multi-scale-training.pdf
  3. ^Consistent Scale Normalization for Object Recognition https://arxiv.org/pdf/1908.07323.pdf


通讀論文以後,結合yolov4.cfg看了一下,有幾點感受:

bag of freebies和bag of specials確實總結的很不錯,這裡我也用思維導圖梳理了一下整個文章

pprp梳理

涉及到yolov3的方方面面,裡邊有些地方還不是很了解,之後需要在研究一下。

文章一部分是梳理trick,另外一部分其實應該是創新點了。

這篇論文零零散散集齊了5個創新點,但是感覺這些創新之處描述的不夠詳細,常常就是一筆帶過,比如SAT, 感覺是不是再深入解釋一下比較好呢。(也可能是我太菜了)

另外其中一個創新點SAM,感覺在yolov4.cfg中並沒有體現,emm... 我根據yolov4.cfg畫了整體架構,backbone就是CSDarknet50, 然後接了SPP, 然後就是PANet中的FPN,並沒有找到SAM額,issue裡邊也木有。。。。


很有價值但沒有什麼太大的意思,試了很多trick,最後選了一組最優的,相當於幫工程師試了一遍錯。其實適用範圍有限,工作中用到的數據集很多都是奇奇怪怪的,你怎麼就知道這文章的結論適用你的數據集呢?像giou diou, ciou啥的,最後自己還是會親自試的。

而且這已經不是Yolo系列的風格了,沒什麼好激動的,甚至讓人感到失望。

為啥Yolo這麼多人喜歡,工業界用的多(不出意外,應該是最多的),不是因為什麼精度速度trade off 最優,比Yolo更快更好的模型多了去了,無數輕量級網路都是以YoloV3為base line的,不打敗YoloV3都不好意思發論文。但工業界用的最多的還是YoloV3,主要原因還是簡潔。

所謂的簡潔,就是結構簡單,一眼就懂,隨便哪個框架,哪怕caffe 1.0都能順手寫出來。一路conv max pool relu到底,通透。隨便接個自己的數據一跑都能work,想要改大改小都很簡單。

這感覺很過分,但很多時候都是不得已的,工業界使用的硬體五花八門,各自有各自的支持範圍。但無論哪個硬體,他們一定會支持Yolo,Yolo就是所有硬體的交集。你比如一個推銷FPGA的廠商要來演示,肯定會演示Yolo,能跑這個,就算保底了,客戶也也就沒那麼多廢話可問,Yolo嘛,大家都能背的。

雖然已經2020了,很多硬體都是不支持depth wise conv的,甚至還有硬體只支持relu這一種激活函數的。沒有sigmoid,那Attention相關的都可以不用想了。最近新出來的各種激活函數也不用想了,dilated conv是不可能的,什麼,你還想Deformable和dynamic conv?怕不是在做夢吧?

所以這個新的Yolo v4,很多工程師大概率就是跟我一樣了,極其興奮的打開論文,然後心越看越涼。。。緊跟時代用新版Yolo秒殺客戶的企圖就這麼泡湯了。。。最終,大家的demo仍然會定格在Yolo V3,然後根據硬體的需要魔改一番。Yolo如果放棄了他簡潔通透conv到底的特點,和其他各路檢測框架就沒區別了,泯然眾人矣。

不過有一說一啊,文章本身還是很好的,肯定要細細研讀,這對我而言就是目標檢測的trick綜述,而且還有很多訓練端的方法可以用,許多trick我之前都不知道…


謝邀!YOLOv4名正言順!YOLOv4的一作是碼怪!

1777次commits。試想一下,你一天提交一次更新,那麼就需要你連續近5年不停更!

這裡,我只針對一些高頻的"疑問",介紹一下我自己的看法。關於YOLOv4的細節,大家可以看一下這篇文章:大神接棒,YOLOv4來了!

作者都換了,你憑什麼叫YOLOv4?

對YOLO不熟悉,僅聽過其名的人,看看了標題就會"破口大罵":這一點也不YOLO?看著情況,換其他人也能出YOLOv4、YOLOv5、YOLOvx了。

你知道YOLO(v1-v3)官方代碼庫darknet都親自掛上了YOLOv4的論文和代碼鏈接了么?目前有153次pull,時隔兩年,darknet更新了README,接收了來自論文一作AlexeyAB的pull requests

YOLO(v1-v3)源代碼庫:https://github.com/pjreddie/darknet

這是來自YOLO系列(v1-v3)作者 Joe Redmon的認同!

個人猜測YOLOv4的作者團隊本可以掛上Joe Redmon的名字的,但其之前已經聲明不在繼續CV方向的學術研究,那麼自然本可以掛,但還是沒掛上。

再來看看YOLOv4的一作憑什麼能讓原作者通過pull requests。

一開始我調侃Alexey Bochkovskiy是碼怪了,主要是其對另一版的darknet維護太用力了!1777次提交,再看看大神寫的README目錄:

其實用過YOLO,特別是Windows版YOLO的同學,一定聽過AlexeyAB。我喜歡把Alexey Bochkovskiy稱為YOLO社區推動者

看看人家的維護:

還有很多人噴YOLOv4沒有創新,都是各種tricks堆疊的,太工程性了,毫無新意。

這裡我想說,如果你能堆料堆成這樣,實驗給我做出這樣:

然後最終給我丟出來一篇論文和開源的代碼,那麼我肯定給你點贊,star,fork。如果你做不到,就別BB(小心真香警告)。Show me your code,OK?

算了,說再多,也會有人噴你。

最後多聊幾句:

  • YOLOv4的代碼庫star數已到7500。據我了解,超過這個數量的目標檢測代碼庫應該就只有Facebook家的Detectron(v1-v2)、港中文mmlab的mmdetection和YOLO(v1-v3)官方代碼庫。

  • YOLOv4或者說YOLO系列代碼都是基於C語言寫的。試問一句,現在還有哪些同學能用C語言寫個目標檢測框架出來,或者寫個backbone出來,再或者說站在原版YOLO上進行改進(用C語言寫)

創新度不高,其實從YOLOv3就是看出端倪,但人家YOLOv3壓根都沒投稿到任何會議/期刊,至於YOLOv4不知道會不會投稿,也不知道會投稿到哪裡。我覺得真正work的論文才是好論文,你站在學術界的大門喊YOLOv4 創新度不行;工業界的大門開的越狠,YOLOv4真香。

最後說一下,你將來會在很多很多目標檢測論文中看到YOLOv4的引用。

YOLOv4名正言順!


推薦閱讀:
相关文章