![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZhNWNzMjZkZTYhNmYlZzNihzYmZjYkhzYiJWO4ETMy8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
計算機視覺(Compute Vision,CV)給計算機裝上了“眼睛”,讓計算機像人類一樣也有“視覺”能力,能夠“看”懂圖檔裡的内容。作為深度學習領域的最重要的應用場景之一,在手機拍照、智能安防、自動駕駛等場景均有廣泛的應用,而檢測類任務作為CV領域的一類經典任務,也在以上場景中廣泛應用。
本文以經典的目标檢測網絡FasterRcnn為例,介紹一下如何使用MindSpore來完成一個檢測模型的開發及部署。
FasterRCNN是一個two-stage結構的目标檢測網絡架構,其中主體結構包含4個部分,包括由Resnet50構成的網絡主幹,由FPN(Feature Paramid Network)構成的高分辨率特征融合子產品,由RPN(Region Proposal Network)構成的興趣區域(ROI)檢測子產品,以及由卷積和全連接配接層構成的分類和位置調整子產品(RCNN)。
下圖是論文中給出的FasterRcnn網絡的結構圖。在本文中,我們對整體結構做了一些調整:在網絡結構上使用ROIAlign模組代替了ROIPooling,并增加了FPN作為高分辨特征的融合元件。
從圖中可以看到,一張圖檔通過FasterRcnn網絡,就可以擷取到目标的位置與目标的類别,是以,我們可以将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。
2. 網絡結構
網絡結構的定義是整個代碼的核心部分,在FasterRcnn中,這一部分代碼在src/FasterRcnn檔案夾内,其中總體網絡結構入口在src/faster_rcnn.r50.py
檔案中,其餘檔案是網絡中各個子子產品的網絡結構,如下圖:
每個子產品的定義是:
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檔案:
接下來,我們就可以在MindSpore中定義網絡的執行順序了,在MindSpore中,執行順序參考construct函數,整網執行順序如下:
3. Lr定義
為了得到更好的訓練效果,我們可以使用動态學習率來進行訓練,在本文中,我們結合了warmup與cosine學習率來進行訓練:
4. 資料生成與資料增強
MindSpore中提供了MindRecord的接口來存儲資料,友善使用者使用,我們可以先把圖檔與标簽資料生成MindRecord格式的資料,友善後續使用:
在訓練與推理的時候,因為采用的資料增強方式不同,是以我們可以通過is_training标志位來區分資料處理,并且MindData中提供了大量高效的資料增強方式,我們可以快速調用這些資料增強,來提升我們的網絡精度。
如下圖所示,我們為訓練增加了随機的圖檔翻轉,來提升模型精度:
5. 訓練FasterRcnn網絡
做完上面一系列準備後,我們就可以着手開始訓練我們的網絡了:
在訓練過程中,我們可以在loss.log中看到loss列印:
6. 推理FasterRcnn網絡
當我們完成訓練後,想檢視我們訓練的效果,這時候可以加載我們訓練好的模型,來擷取推理的精度:
推理完成後,我們可以看到如下推理結果:
本文介紹了如何在MindSpore上實作FasterRcnn網絡的訓練與推理,通過使用MindSpore可以很友善、高效地完成CV典型應用的建構、訓練、驗證、部署等過程。感興趣的朋友們可以試一試~
MindSpore官方資料
GitHub:https://github.com/mindspore-ai/mindspore
Gitee:https://gitee.com/mindspore/mindspore
官方QQ群: 871543426
微信掃碼關注MindSpore,擷取最新資訊