天天看點

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

計算機視覺(Compute Vision,CV)給計算機裝上了“眼睛”,讓計算機像人類一樣也有“視覺”能力,能夠“看”懂圖檔裡的内容。作為深度學習領域的最重要的應用場景之一,在手機拍照、智能安防、自動駕駛等場景均有廣泛的應用,而檢測類任務作為CV領域的一類經典任務,也在以上場景中廣泛應用。

本文以經典的目标檢測網絡FasterRcnn為例,介紹一下如何使用MindSpore來完成一個檢測模型的開發及部署。

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理
fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

FasterRCNN是一個two-stage結構的目标檢測網絡架構,其中主體結構包含4個部分,包括由Resnet50構成的網絡主幹,由FPN(Feature Paramid Network)構成的高分辨率特征融合子產品,由RPN(Region Proposal Network)構成的興趣區域(ROI)檢測子產品,以及由卷積和全連接配接層構成的分類和位置調整子產品(RCNN)。

下圖是論文中給出的FasterRcnn網絡的結構圖。在本文中,我們對整體結構做了一些調整:在網絡結構上使用ROIAlign模組代替了ROIPooling,并增加了FPN作為高分辨特征的融合元件。

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

從圖中可以看到,一張圖檔通過FasterRcnn網絡,就可以擷取到目标的位置與目标的類别,是以,我們可以将FasterRcnn應用到安防,自動駕駛等各種場景,讓自動一定程度上減少人工的工作量。

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

使用MindSpore來複現FasterRCNN這個經典的檢測網絡。這裡僅列出了部分重要代碼片段,完整代碼請參考:

https://gitee.com/mindspore/mindspore/blob/master/model_zoo/official/cv/faster_rcnn

FasterRcnn主體的網絡結構定義在src/FasterRcnn内,生成資料集的相關代碼在src/dataset.py中,src/network_define.py封裝放了訓練相關的類,src/config.py中存放了配置資訊。

1. 配置資訊

配置檔案裡包含了網絡中各種參數配置,包括resnet的層數,fpn的特征層數,學習率,batchsize,momentum等等,下圖列舉了部分參數,完整參數可以檢視src/config.py。

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理
fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

2. 網絡結構

網絡結構的定義是整個代碼的核心部分,在FasterRcnn中,這一部分代碼在src/FasterRcnn檔案夾内,其中總體網絡結構入口在src/faster_rcnn.r50.py

檔案中,其餘檔案是網絡中各個子子產品的網絡結構,如下圖:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

每個子產品的定義是:

ResnetFea:

resnet的網絡結構定義,為FasterRcnn的backbone的網絡結構

· FeatPyramidNeck:

FPN(特征金字塔網絡)的網絡結構定義,為FasterRcnn提供不同的高分辨率特征

· RPN:

RPN(Region proposal network)的網絡結構定義,為FasterRcnn第一階段計算分類與回歸loss的子產品

· BboxAssignSample:

為RPN子產品的子子產品,為RPN選擇固定比率的正負樣本參與loss計算

· Proposal:

選取候選框的子產品,後續第二階段,隻對這一子產品輸出的候選框進行計算

· BboxAssignSampleForRcnn:

對Proposal子產品輸出的候選框,再次進行一輪正負樣本的篩選,用于第二階段的計算

· SingleRoIExtractor:

該子產品主要是用來提取每個候選框的對應特征,并保證特征大小一緻

· RCNN:

為FasterRcnn第二階段計算分類與回歸loss的子產品

· AnchorGenerator:

預先生成anchor框 的子產品

通過以上這些子產品的組合,結合之前的網絡結構介紹,我們就可以擷取到一個完整的FasterRcnn網絡的模型定義,下圖就是部分整網定義的代碼,完整的整網定義可以檢視src/faster_rcnn.r50.py檔案:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

接下來,我們就可以在MindSpore中定義網絡的執行順序了,在MindSpore中,執行順序參考construct函數,整網執行順序如下:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理
fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理
fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

3. Lr定義

為了得到更好的訓練效果,我們可以使用動态學習率來進行訓練,在本文中,我們結合了warmup與cosine學習率來進行訓練:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

4. 資料生成與資料增強

MindSpore中提供了MindRecord的接口來存儲資料,友善使用者使用,我們可以先把圖檔與标簽資料生成MindRecord格式的資料,友善後續使用:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

在訓練與推理的時候,因為采用的資料增強方式不同,是以我們可以通過is_training标志位來區分資料處理,并且MindData中提供了大量高效的資料增強方式,我們可以快速調用這些資料增強,來提升我們的網絡精度。

如下圖所示,我們為訓練增加了随機的圖檔翻轉,來提升模型精度:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

5. 訓練FasterRcnn網絡

做完上面一系列準備後,我們就可以着手開始訓練我們的網絡了:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

在訓練過程中,我們可以在loss.log中看到loss列印:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

6. 推理FasterRcnn網絡

當我們完成訓練後,想檢視我們訓練的效果,這時候可以加載我們訓練好的模型,來擷取推理的精度:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

推理完成後,我們可以看到如下推理結果:

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理
fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

本文介紹了如何在MindSpore上實作FasterRcnn網絡的訓練與推理,通過使用MindSpore可以很友善、高效地完成CV典型應用的建構、訓練、驗證、部署等過程。感興趣的朋友們可以試一試~

MindSpore官方資料

GitHub:https://github.com/mindspore-ai/mindspore

Gitee:https://gitee.com/mindspore/mindspore

官方QQ群: 871543426

fasterrcnn論文_使用MindSpore實作FasterRCNN網絡的訓練和推理

微信掃碼關注MindSpore,擷取最新資訊