Faster R-CNN 從實現到部署的那些坑

2021-03-02 Turing Lab

騰訊互娛Turing Lab從創建開始,每周在內部進行分享讀書會,對業界的技術研究和應用進行討論。在此通過公眾號形式把相關有趣內容也推送給對新技術和業界趨勢感興趣的朋友。

和大量的所謂技術公眾號不同,儘管以AI為重心,但我們的分享不局限於AI論文,而是涉獵所有前沿技術領域,和自動化流程、數據處理、人工智慧、架構設計相關的有趣內容均會分享,希望各位在周末閒暇時有空閱讀了解。

分享人:郭雲鏑  騰訊互娛 工程師 | 編輯: 艾長青 騰訊互娛 研究員

我們開發了一個用於通過Web標註數據製作數據集,並一鍵訓練、部署目標檢測模型的系統。

在2019年來看,Faster R-CNN (後文簡稱frcnn)已經可以稱為經典的「老」模型了,由於frcnn足夠經典,可以作為其他算法的基線,所以我們打算在系統裡部署frcnn。而重新實現frcnn算法,一方面是因為能搜到的開源版本或者庫的版本太老,質量也良莠不齊,另一方面也是為了部署時能更為靈活地調整代碼。

經過R-CNN和Fast RCNN的積澱,Ross B. Girshick在2016年提出了新的Faster RCNN,在結構上,Faster RCNN已經將特徵抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一個網絡中,使得綜合性能有較大提高,在檢測速度方面尤為明顯。
—— https://zhuanlan.zhihu.com/p/31426458

本文主要有兩部分內容,一部分是從代碼實現層面,以個人理解出發,儘可能感性地分解frcnn算法實現的關鍵點,不同於系統、理論介紹frcnn的文章,本文試著解決「一看就會,一寫就廢」的問題;另一部分記錄部署過程中踩過的坑,涉及cuda版本、tensorflow版本、keras版本的一系列遭遇。

本文不講R-CNN、Fast R-CNN、Faster R-CNN的演化進程,也不泛泛而談frcnn的理論、結構,網上介紹的文章很多。

本文假定讀者已經了解目標檢測近幾年的方法和基本原理,並對 Fastser R-CNN 有了 PPT 級別的了解

本文主要記錄代碼實現過程中遇到的坑,會講述每個環節更為感性的個人理解。

才疏學淺,如有錯漏,歡迎指正

1. 從 Tensorflow2.0 實現 Faster R-CNN 說起 - frcnn的實現喜聞 Tensorflow 2.0 已經出了 beta 版,新特性這種東西大家肯定都喜歡,最顯著都就是默認使用 eager 模式,可以隨時查看變量,而不是必須預設網絡的情況先建圖了,於是使用 tf2.0 實現,這部分其實挺順利的。了舉例方便,各個地方的參數都用固定數值來描述。1.1. VOC數據集 - 數據預處理VOC2007/2012也是經典的目標檢測數據集了,設計或驗證目標檢測算法繞不開的基本測試,先用一個類解析數據集。在目標檢測任務中,數據集的主要目錄為ImageSets、JPEGImages、Annotations:

/ImageSets/Main/:main裡幾個.txt文件標記了train, val, test, trainval列表,對應圖像的編號。

JPEGImages裡保存著數據集的所有.jpg圖像。

Annotations裡是目標檢測用的標註數據,都是xml文件,用Python的xml.etree.ElementTree來解析,基本信息是filename, width, height,<object>裡會有若干個標註數據,name是類別,然後是矩形框的對角坐標xmin, ymin, xmax, ymax,每個Annotation對應一個圖像和若干目標框。

{
'filepath': '/VOCdevkit/VOC2007/JPEGImages/008807.jpg',
'width': 500,
'height': 375,
'bbox_list': [
{'label': 'person', 'xmin': 254, 'xmax': 320, 'ymin': 78, 'ymax': 206, 'difficult': False},
{'label': 'person', 'xmin': 156, 'xmax': 196, 'ymin': 40, 'ymax': 97, 'difficult': False}
],
'imageset': 'test'
}

同時為每個類別設置一個序號,方便神經網絡輸出分類。1.2. 基礎網絡(特徵提取網絡)一般會用VGG或ResNet這樣的預訓練網絡先進行特徵提取,使用中間某一層的輸出作為提取到的特徵圖。截取基礎網絡的中間層作為目標檢測的特徵,一般是使用 4 個pool之後的一個激活層的輸出。keras提供了VGG16, VGG19, ResNet50,可以直接用tf.keras.applications.vgg16.VGG16這樣的API獲取基礎網絡,也可以手動構建對應結構,然後讀取網上下載的 weights。1.3. Anchor生成每個 anchor 由 4 個數組成,即 xmin, ymin, xmax, ymax,得到的anchor是一個四元組的 list。生成的方法比較巧妙,在生成 3 * 3 = 9 個 base anchor 之後,利用tf或numpy的各種操作來「並行」地做出全圖的anchor。

不同長寬比,比如1:2、2:1、1:1,假設就這 3 種,參數可調。

不同尺度,比如4倍、8倍、16倍大小,假設就這 3 種,參數可調。

不同位置,比如每間隔 16 個像素設置一個anchor,假設圖像640*640,放 40*40個anchor 則anchor總數是 3 * 3 * 40 * 40 = 14400 個 anchor。

基礎網絡得到了一個長寬都是原圖1/4的 feature map,對這個 feature map 做 1*1 的卷積,分別用兩個卷積層,一個輸出 channel 數為 9 * 2,9 是base anchor 的數量,2 是用來後續計算 softmax 的二分類 score 的;另一個卷積輸出 channel 數為9 * 4,這個 4 略抽象,它不是直接預測 box 的xmin, ymin, xmax, ymax,而是預測一個 delta,通過 delta 和 anchor 的 xmin, ymin, xmax, ymax,計算得到預測的 bounding box 的 bxmin, bymin, bxmax, bymax。這裡我們能看出網絡訓練的目的了,就是要經過訓練,能使網絡輸出有意義的 score 和 delta,從而篩選高分 anchor 作為 RoI ,並得到相對原始 anchor 更精確的目標 bounding box。篩選高分 RoI 用了非極大抑制(non max suppression),tensorflow有這個函數 tf.image.non_max_suppression,篩選出一系列序號。

感性QA:feature map 是方的,anchor是 list,它們怎麼對應?anchor 也是從「方」的圖通過特定間隔得到的,然後做成一個四元組 list,這個「間隔」很重要,剛好對應了基礎網絡幾個 pool 對feature map尺度的影響,從而得到的 score 和 delta 數量以及空間位置和 anchor 是一一對應的。

1.5. Targets這裡有兩步相似的操作,放在一起來說。要訓練就要有 loss, targets 就是把得到的 anchor 和 GT 對應起來的步驟。一步是 anchor target,從所有 anchor 裡,根據每個 anchor 與 GT 的 相交程度(Intersection over Union, IoU),按參數設定的數量,選出一些正樣本(前景)、一些負樣本(背景),保證正負樣本的比例,這些 anchor 與 GT 一一對應了起來。

另一步是 proposal target,從前面篩選的高分 RoI 中類似地根據與 GT 的IoU篩選,只是這一步篩選構建的訓練數據包含了分類信息,由 GT 得到的 targets 做了形似 one hot 的構建。

感性QA:one hot 的構建?比如一個box是 [xmin, ymin, xmax, ymax],而如果有 20 類,它屬於類別 5 的話,構建出來就是 [[0, 0, 0, 0], ...前4個..., [xmin, ymin, xmax, ymax], ...後15個...[0, 0, 0, 0]]

1.6. RoI Pooling這大概是 frcnn 的精華所在,但在代碼實現上,tensorflow帶來了不少便利。 tf.image.crop_and_resize提供了用來切 feature map 的功能,把前面得到的最終最高分 RoI list 的四元組按照函數的預處理需求處理後放進去,就得到了一系列小的 feature map,像一個 batch 似的,接下來對每個切下來的 RoI feature map 做常規操作如 pool,Full Connection 等,得到最後的 score 和 delta。1.7. 輸出train 和 inference 的輸出內容是不同的,train 要的是 loss ,關鍵內容就是兩個 targets 的輸出;而 inference 要的是 box 和 分類,主要就是 RoI Pooling 的輸出了,對 score 和 delta 的後處理也可放在網絡中進行。1.8. 注意的點需要注意的點是,過程中有過濾掉範圍超出圖像的 anchor,那麼在生成 anchor 時,比例設定要夠用,比如一個很扁的圖 80*500,如果最小的 anchor 是 16*8 的,那所有 anchor 都被濾掉了,在計算 Targets 時候正負樣本都為 0 ,沒法訓練。frcnn 的 optimizer 是老生常談了,前人踩過坑,雖然 Adam 好,但是訓練 frcnn 還是 sgd 管用。2. 始於顯卡驅動與CUDA版本 - 踩坑記錄這是踩坑記錄開始的大背景。NVIDIA驅動版本-CUDA版本-Tensorflow版本 是互相對應,齊步升級的,驅動決定了CUDA版本,進而限制了可以使用的Tensorflow版本。CUDA與驅動版本對應參考官網https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html(數據獲取日期20190905): CUDA ToolkitLinux x86_64 Driver VersionWindows x86_64 Driver VersionCUDA 10.1 (10.1.105 general release, and 10.1.168 Update 1 general release)>= 418.39>= 418.96CUDA 10.0.130>= 410.48>= 411.31CUDA 9.2 (9.2.148 Update 1)>= 396.37>= 398.26CUDA 9.2 (9.2.88)>= 396.26>= 397.44CUDA 9.1 (9.1.85)>= 390.46>= 391.29CUDA 9.0 (9.0.76)>= 384.81>= 385.54CUDA 8.0 (8.0.61 GA2)>= 375.26>= 376.51CUDA 8.0 (8.0.44)>= 367.48>= 369.30CUDA 7.5 (7.5.16)>= 352.31>= 353.66CUDA 7.0 (7.0.28)>= 346.46>= 347.6要部署的伺服器,由於已部署應用很多,牽一髮而動全身,無法立即提供最新的顯卡驅動宿主機,需要逐步測試然後再安排計劃來升級,所以沒有最新的顯卡驅動可以用……目前 396.26 的 NVIDIA 驅動將可以使用的 Tensorflow 版本限制在了 1.12,為了能夠及時部署,我們需要適配 frcnn 到 1.12 的tensorflow。於是便有了一系列繞不開的要踩的坑。最初實現的 frcnn 基於tensorflow 2.0,默認eager模式。而其實 tensorflow 的 1.x 某版本開始已經支持 eager 模式了,可以手動開啟eager模式的api。由於要求部署到 tensorflow serving (tfs) 上,對保存的模型有要求,tf 的 checkpoint 和 keras 的 h5 都需要轉換成 tfs 的 pb 模型才可以。2.1. eager 與 graph大家都知道 tensorflow 和 keras 是好基友,傳統的模型構建是先建計算圖,再進行計算,這和隨時獲取數據信息的 eager 模式很不一樣。接下來結合例子粗略地介紹它們的區別:計算圖模式,想知道一個 tensor 的值,必須在 session 裡執行 run,將實際數據丟進去跑出一個結果,所以在構建計算圖時,模型的結構是基於預先假設的。而 eager 模式,有類似 numpy 的體驗,數據就在計算邏輯裡,隨手一個 print, 也可以根據數值 if else ,這在構建計算圖的模式下是無法進行的。也就是說,按 eager 邏輯實現的網絡,難以直接遷移為 graph 模式,而 tfs 的大多文檔目前還是基於 graph 的模型。2.2. 一點曙光的撲滅經查發現,tensorflow 1.14 版本提供 tf.saved_model.save()用於支持 eager 模式保存供serving使用,eager 模型保存的思想是存「對象」,即保存完整計算邏輯,而不是存傳統的計算圖。最新的 tfs 也支持「對象」的部署。然而,上文說到,我們要部署的環境是 tf 1.12 ,它沒有這個 API。。。2.3. eager 能轉 graph 嗎能,但是按照 graph 思想構建的 eager 模型,才能直接用 api 轉成 graph (而且這個api還是 tf1.13 才有的),而這次實現的 frcnn 太「充分利用「 eager 的特性了,它並不是個 graph,沒法直接轉。2.4. 鼓起勇氣,重構用原生 tf 還是用 keras ?考慮到以後顯卡驅動總會升級的,原生 tf 的 api 怕是要大改,不如用高階 API 或許還能享受一些向前兼容的福利。此外組裡舊有的其他模型是 keras 的,用 keras 也能讓代碼維護更單純些。2.5. 計算圖的噩夢2.5.1. 輸入尺度目前的 keras 還沒跟上 eager 的步伐,無論是原生的 keras 還是 tf.keras。構建計算圖是逃不掉了。當然還有一些其他限制,比如支持 batch 什麼的,都是其他的故事了。keras 自定義計算圖還是比較辛苦的,按 batch 輸入,首先一個 batch 的每個數據尺寸就要一樣,意味著奇形怪狀的圖像都要 resize 到個差不多的尺寸,再 padding -1 成一模一樣的形狀,這帶來了一系列的預處理與後處理需求,我們把輸入圖像設置為: img_placeholder = Input(800, 800, 3)不止輸入圖像,那 GT 的 label 和 box 呢,我們就假設每個圖最多不超過 50 個目標,把 label 和 box 都 pad 到 50,用 -1 填充。輸出也是,每個不管有幾個高分 roi,統一輸出 100 個,然後再後處理。2.5.2. batch處理每個 layer 還要處理 batch,沒有 tf2.0 那麼自由的拿來就能做計算。更難受的是,如果想靈活點,不顯式定義batch,那在計算圖裡通過 shape 拿到的 batch 維度是一個 「?」,對,問號,沒法直接for循環去處理。這就用到 tf 的神器tf.map_fn,它把一個batch分別處理。計算圖中,再過濾落到「-1區」的 anchor ,去掉 -1 的 label 和 box,一系列瑣碎的操作。2.5.3. 邏輯判斷在 Targets 那裡,我們要選取固定數量的正負樣本,eager 模式 我們可以 if pos_num > SETTING_NUM,而計算圖中的 tensor 可不能這麼比,因為在構建計算圖時,它是沒有取值的,得用 tf.cond,把 if else 也做成計算圖邏輯。然而這裡都還有坑,tf.cond用tf.size(bg_inds)<=0 是正常的,但是tf.cond用tf.size(bg_inds)==0就無論如何都是 False 了。這裡,需要用 tf.equal、tf.greater 才能保證穩定。2.6. 版本的坑我們有時會有這樣的需求,有一個 list A,一個 list B,還有一系列坐標,我們要把 A 的所有這些坐標位置的數值改為一個定值,或者改為 B 的對應位置的數值。一般處理數組用for循環就好了,可是計算圖卻不能進行向量單個元素的賦值操作。tf2.0 有tensor_scatter_nd_update,tf1.13有tf.tensor_scatter_update,而雖然tf1.12有tf.scatter_nd_update,卻在官方倉庫卻有個 此API有內存洩漏 的issue。最後是各種曲線救國的方式實現功能而避免使用了這個函數。由於 eager 模式能獲取數值,所以在計算時可以 tf 和 np 無縫切換,在正負樣本不足設定數值時,可以用 numpy 的 numpy.random.choice,但是 tf 沒有這個函數,那麼 graph 模式就只好手動實現了一個。Tensorflow 官方說法,是建議使用 tf.keras 而不是 keras,因為 tf.keras 是 keras 的超集,結合了 tensorflow 的許多 API,最新的更新也是在 tf.keras 裡,而 keras 目前也維護著來自社區的少量更新 ——來自座談會但是呢,tf1.12裡的 tf.keras 是 2.1.6版的,最新的 keras 是 2.2.4版的,超集有bug vs 原生缺API,很難取捨。

tf1.12的tf.keras,Model的inputs、outputs參數不認,提示沒有「inputs」參數,提示outputs不能用keras的Lambda層,繼承Layer層也不行

原生keras沒有諸如add_metric這樣的api,添加 metric 觀察訓練進程需要許多蹩腳的操作

原生keras也有各種不方便的操作。。自定義層的返回值和輸入值只能用list[]不能用tuple()。。。

不過為了bug少,犧牲了便捷性,最後選了先用原生 keras,坐等顯卡驅動升級。此外,目前版本的 keras,在使用了 Lambda 層時,model不能save(),只能save_weights(),有點奇葩。不過最終是要轉 tfs 的 pb 的,keras 讀 weights 再轉 pb 也能用。實現了三種方案(用tf的不同接口)。目前用第2種。

用tf的graph_io.write_graph,得到的是單文件pb,沒有index和data00文件

用tf.saved_model.predict_signature_def註冊輸入輸出,有全套,符合tfs的標準部署需求

比較優雅的方法,調用tf.saved_model.simple_save,但是keras模型會提示沒有做global_initialize

Tensorflow 官方推薦 saved_model 裡的方法,但目前顯卡驅動版本的限制,有些API不能用。2.8.1. 滿足faster rcnn 的運行環境理想的環境是使用conda的env,但是通過搜索研究,Dockerfile無法理想支持 conda env 的activate。conda相對pip的優勢是能夠集成cuda依賴和自動解決tensorflow安裝時的數學包依賴,不需要手動安裝cuda,自動選定tensorflow版本對應的cuda版本。

為整體部署穩定起見,使用非最新的conda版本,對應python==3.6,不使用env環境。為了優雅,我用包管理安裝。。。然而conda install 也遇坑

在安裝看似很小的庫的時候,也會帶上一系列依賴包,在安裝完之後,conda指令失效!就是 conda -V 都不能用了那種。背後有許多坑要踩,所以放棄純 conda install,結合 pip 來安裝。處理原則上,依賴複雜的庫使用conda,依賴簡單的庫使用pip。所有存在依賴的包在install時指定版本號。指定版本號是因為,舊代碼裡有很多地方是 2018 年實現的,有些 包 今年 的更新,裝進去會和其他 包 衝突……3. 小結本文首先介紹了基於 tf2.0 實現 frcnn 算法過程中的感性認識,相對於很多更專業的 frcnn 介紹文章,這部分可作為理解的輔助。然後介紹了強轉舊版本 keras 過程中遇到的一些非常具體的問題,希望可幫助新手趟過一些坑。

frcnn論文:

開源參考:

https://github.com/yizt/keras-faster-rcnn

https://github.com/chenyuntc/simple-faster-rcnn-pytorch

https://github.com/irvingzhang0512/tf_eager_object_detection

VOC2007數據集:

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

公眾號介紹:

      Turing Lab於2018年初正式成立,隸屬騰訊互娛公共研發運營體系品質管理部。以探索前沿技術,針對遊戲研發過程中難點問題實現對應的人工智慧解決方案為目標。以AI技術為重點,但不局限於AI領域,積極採用多種技術方案推動人工智慧在互動娛樂領域的實際應用發展,並熱烈歡迎一切熱愛技術研究的朋友加入!

       

歡迎關注Turing Lab微信公眾號:

相關焦點

  • 實戰 | 源碼入門之Faster RCNN
    前言學習深度學習和計算機視覺,特別是目標檢測方向的學習者,一定聽說過Faster Rcnn;在目標檢測領域,Faster Rcnn表現出了極強的生命力,被大量的學習者學習,研究和工程應用。為了節約顯存,作者將前四層卷積層的學習率設置為0,Conv5_3的輸入作為圖片的特徵輸入到RPN網絡中。
  • Faster R-CNN
    該論文即是本篇推送的主角——Faster R-CNN:使用RPN實現趨於實時的物體檢測。論文原文請移步: https://www.arxiv.org/abs/1506.01497[2] He K, Gkioxari G, Dollár P, et al.
  • 目標檢測合集 | 4 Faster R-CNN解析
    3x3+背景前景分類+初步定位ROI Pooling層:該層收集輸入的feature map和候選區域,將候選區域映射到feature map中並劃分網格池化為統一大小的區域特徵圖,將送入下面的全連接層判定目標類別。同fast rcnn一樣Fast R-CNN檢測網絡:分類+位置精確定位。利用區域特徵圖計算候選區域的類別,同時再次通過區域回歸獲得檢測框最終的精確位置。
  • 【他山之石】從編程實現角度學習Faster R-CNN(附極簡實現)
    分類與回歸:將rois和圖像特徵features,輸入到RoIHead,對這些rois進行分類,判斷都屬於什麼類別,同時對這些rois的位置進行微調。022.1 數據圖片進行縮放,使得長邊小於等於1000,短邊小於等於600(至少有一個等於)。
  • 詳解Faster R-CNN目標檢測的實現過程
    本文轉載自:機器之心Faster R-CNN 實現代碼:https://github.com/tryolabs/luminoth/tree/master/luminoth/models/fasterrcnnFaster R-CNN最早在2015年的NIPS發布。其在發布後經歷了幾次修改,這在之後博文中會有討論。
  • 一文讀懂Faster RCNN
    圖2 faster_rcnn_test.pt網絡結構 (pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt)本文不會討論任何關於R-CNN家族的歷史,分析清楚最新的Faster
  • 經驗 | 詳解 Faster R-CNN目標檢測的實現過程
    :https://github.com/tryolabs/luminoth/tree/master/luminoth/models/fasterrcnn背景Faster R-CNN 最早在 2015 年的 NIPS 發布。
  • 像玩樂高一樣拆解Faster R-CNN:詳解目標檢測的實現過程
    Luminoth 實現:https://github.com/tryolabs/luminoth/tree/master/luminoth/models/fasterrcnn去年,我們決定深入了解 Faster R-CNN,閱讀原始論文以及其中引用到的其他論文,現在我們對其工作方式和實現方法有了清晰的理解。
  • 一文帶你讀懂Faster RCNN
    圖2 faster_rcnn_test.pt網絡結構 (pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt)本文不會討論任何關於R-CNN家族的歷史,分析清楚最新的Faster
  • 目標檢測技術之Faster R-CNN詳解
    通過閱讀原論文以及相關的參考文獻,我們對其工作原理及如何部署已經有了清晰的了解。最終,我們將Faster R-CNN安裝到Luminoth上,Luminoth是基於TensorFlow的計算機視覺工具包,我們在公開數據科學大會(ODSC)的歐洲和西部會場上分享了這一成果,並收到了很多關注。
  • mask rcnn訓練自己的數據集
    3D視覺工坊的第67篇文章前言最近迷上了mask rcnn,也是由於自己工作需要吧,特意研究了其原始碼,並基於自己的數據進行訓練~本博客參考:https://blog.csdn.net/disiwei1012/article/details/79928679#commentsedit實驗目的
  • 專欄 | Detectron精讀系列之一:學習率的調節和踩坑
    Detectron 精讀系列會從細小的調參開始,到一些重要的函數分析,最後掌握 Detectron 函數庫的全貌。在這個過程中,我們也會幫大家提前踩坑,希望大家可以從 Detectron 函數庫學到更多通用的計算機視覺技能。Detectron 函數庫有一點複雜,在這次的解讀中我們主要介紹 multi-gpu 訓練的時候,學習率如何調節的問題。
  • MaskRCNN源碼解讀
    沒有多餘的問文件,源碼都放在mrcnn中,readme裡面有詳細的介紹,為了了解maskrcnn的運行流程,最好的辦法就是將代碼邊運行邊調試。從samples下面的coco文件開始運行:首先要看的就是模型的搭建,也就是maskrcnn的基礎網絡結構。1--模型搭建
  • 【從零開始學Mask RCNN】二,Mask RCNN框架整體把握
    的網絡結構示意圖,來自博主疊加態的貓:Mask RCNN總覽,來自疊加態的貓博主這個結構圖裡面包含了很多細節,我們先大概理一下,後面在源碼詳解中會更詳細的說明:首先是BackBone,可以看到原始圖片輸入後首先經過一個以ResNet101為基礎的FPN特徵金字塔網絡進行特徵的提取,並且可以發現這裡的實現和原始的
  • 修訂版 | 目標檢測:速度和準確性比較(Faster R-CNN,R-FCN,SSD,FPN,RetinaNet和YOLOv3)
    實際上,single shot and region based detectors 現在在設計和實現上越來越相似。但是有些保留,我們可以說:比較SSD MobileNet,YOLOv2,YOLO9000和Faster R-CNN實測視頻已上傳到b站【30分鐘時長】https://www.bilibili.com/video/av75557343/Report by Google Research (https://arxiv.org
  • YOLOv5 對決 Faster RCNN,誰贏誰輸?
    YOLOv5 的實現是在 PyTorch 中完成的,與之前基於 DarkNet 框架的開發形成了鮮明的對比。這使得該模型的理解、訓練和部署變得更加容易(目前暫時沒有使用 YOLO-v5 的論文發表)。以我的理解來看,在架構上,它和 YOLO-v4 很相似。一個不同之處可能是使用了 Cross Stage Partial Network(CSP)來降低計算成本。
  • CNN+BLSTM+CTC的驗證碼識別從訓練到部署
    提前預警,若是自己編譯將會苦難重重,坑很多,這裡就不展開了。requirements.txt2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN網上看到過很多教程,我自己也部署過很多次,Ubuntu 16.04遇到的坑還是比較少的。
  • ResNet、Faster RCNN、Mask RCNN是專利算法嗎?盤點何愷明參與發明的專利
    點擊上方「3D視覺工坊」,選擇「星標」乾貨第一時間送達前段時間OpenCV正式將SIFT算法的實現從Non-free
  • CNN 10 - October 30, 2020
    本期視頻連結:  https://pmd.cdn.turner.com/cnn/big/cnn10/2020/10/28/ten-1030.cnn_3461383_768x432_1300k.mp4本期內容簡介:U.S.