伙伴分享|如何快速開發一個AppCube標準頁面
738
2025-04-05
物體檢測作業分享
導語:大家好,我叫胡琦,和大部分小伙伴一樣是個AI小白。今天很榮幸能在這里和大家分享我的學習心得和作業實踐。我相信大家通過這兩周的學習,對AI和一站式AI開發平臺ModelArts有了深入的了解,對圖像分類、物體檢測以及VGG模型、Faster-RCNN模型、YOLO模型等有了一定的認知,甚至可以自己動手實踐一個小小的AI應用。當然,我們在學習過程中和作業實踐中或多或少會遇到一些困惑和難題,有時候可能我們自身無法解決,那么快速的處理方式就是在交流群或者論壇及時反饋我們的難點,相信通過其他小伙伴的熱情解答和社區里眾多大佬的悉心輔導,我們遇到的問題都會迎刃而解。當然我不建議一遇到問題就發到群里問題,做過開發的同學一定聽說過【提問的藝術】,我建議先自己動手解決,如果10分鐘之內都沒法解決那就趕緊請求外部協助,這樣一定程度上能培養我們獨立思考的好習慣。廢話不多說,進入我們的正題,先講講我是怎么完成作業的(PS:CtrC\CtrV要熟練掌握,哈哈)
前言
有些我認為重要的東西我還是想強調三點:一是學習資料的獲取,在群里經常看到有小伙伴說文檔里的鏈接沒法點擊、教程鏈接沒法打開或者教程中的圖片無法顯示,其實資料就在那里,永遠為我們的索取而等候,可能只是我們打開的方式不對而已;這里建議大家訪問ModelArts在gitee上的代碼倉庫進行學習。二是前置知識的學習,這里前置知識值得是學習視頻中介紹部分提到的一些模型、算法、數據集、應用場景的介紹等等;如果僅僅只是把教程中的實踐簡單地走個過場,估計也只是浮于表面的學習,遇到后面會感覺難度越大從而產生畏難情緒直到放棄,別問我怎么知道,親身體會!所以,希望每一位小伙伴都能堅持學習,不忘初心!三是學習過后的總結,知識只有沉淀下來了才屬于自己,這里的總結不僅僅是自我總結,還有分享,現在社區也變著法子鼓勵大家分享內容輸出,而且還是真金白銀的鼓勵,你們心動了嗎?(活動詳見:【精品帖促進計劃】 邊學邊寫、內容輸出,豪華大禮等你來拿!https://bbs.huaweicloud.com/forum/thread-59066-1-1.html)
作業一:優化自動學習人車檢測模型
作業一是在視頻-2.2零代碼人車檢測模型開發的基礎上進行數據集擴充已達到模型調優的目的。零代碼開發,相信大家在第一章的學習中已經領略到了ModelArts的魅力,沒錯,零代碼的確能訓練出一個精度還可以的模型。一般來說,ModelArts上的零代碼開發模型有兩種方式:一是自動學習、二是預置算法(或者市場訂閱算法)。第一章圖像分類中對自動學習和預置算法兩種方式進行了對比,我們知道自動學習后臺采用類似AoutML的算法,使用者無需關注要選用哪種算法,也不需要進行參數調優,所以要進行調優的話可能只有從數據集入手了。擴充數據集、修改訓練集與驗證集的比例等有限的手段在一定程度上能增加模型的識別度。接下開始動手實踐吧!前提已經開通了相關的服務,這里嘗試OBS的操作通過jupyter notebook中使用華為自研的MoXing進行。
借助ModelArts notebook的Terminal拉取學習資料
notebook新建一個Conda-python3文件拉取學習資料
下載學習資料
%%bash wget?https://gitee.com/ModelArts/ModelArts-Lab/repository/archive/master.zip?ref=master&sha=612fc8c07c0215a0e64f806ba4c4b55331dd3810&format=zip&captcha_type=captcha&captcha=cffyra
解壓并刪除學習資料zip包
%%bash unzip?master.zip?ref=master rm?-rf?master.zip?ref=master
執行完,我們發現notebook下多了一個ModelArts-Lab的文件,這個就是官方正版的學習資料,我們進到ModelArts-LabExeMLExeML_Car_And_Person_Detection目錄下打開readme.md并將內容全選復制,新建Conda-python3文件切換到MarkDown模式,粘貼剛復制的內容,點擊保存可以重命名為readme,關閉當前窗口再打開readme.ipynb就能愉快的學習了!
nodebook下載數據集和擴充數據集并上傳到OBS(不一定對,moxing拷貝可能會有問題)
當然我們要建好OBS桶。這里主要是受老師課上講的本地、notebook、OBS三者之間的數據互傳的啟發。
下載數據集
%%bash wget?https://modelarts-labs.obs.myhuaweicloud.com/ExeML/ExeML_Car_And_Person_Detection/car_and_person_150.tar.gz tar?-zxvf?car_and_person_150.tar.gz rm?-rf?car_and_person_150.tar.gz
下載擴充數據集
%%bash wget?https://modelarts-labs-bj4.obs.cn-north-4.myhuaweicloud.com/ExeML/ExeML_Car_And_Person_Detection/VOC2012_select_bus.zip unzip?VOC2012_select_bus.zip rm?-rf?VOC2012_select_bus.zip
上傳數據集到OBS
import?moxing?as?mox if?mox.file.exists('obs://ai-camp/day02/car_and_person')==?False: ??mox.file.make_dirs('obs://ai-camp/day02/car_and_person') ??print('創建OBS文件夾,注意改為您自己的桶名') mox.file.copy_parallel('car_and_person_150/train',?'obs://ai-camp/day02/car_and_person/train') mox.file.copy_parallel('car_and_person_150/test',?'obs://ai-camp/day02/car_and_person/test') print('數據集拷貝完成') mox.file.copy_parallel('VOC2012_select_bus/train',?'obs://ai-camp/day02/car_and_person/train') mox.file.copy_parallel('VOC2012_select_bus/test',?'obs://ai-camp/day02/car_and_person/test') print('擴充數據集拷貝完成') print('Done!')
創建自動學習物體檢測項目并進行標注
這里一個注意點是數據集輸入位置為train目錄,切記!這個坑我在第一章圖像分類的時候就踩過!其他的注意點是數據集輸出位置最好單獨新建一個文件夾,我這邊看到50張未標注的,標注一兩張意思意思一下,不過發現標注有時候鼠標不太好使,需要點下左側的矩形框才能進行標注;而且沒看到標注保存按鈕(應該是自動保存)。
開始訓練
可設置訓練驗證比例、增量訓練版本、預期推理硬件等參數,有些可能對訓練結果會有影響,建議第一次做的話嚴格按照教程來。
部署或者繼續優化
部署要注意只能創建一個免費的CPU或GPU,有明確的提示:在ModelArts中(含自動學習和部署上線),同一免費規格僅能存在一個運行中的在線服務。
另外在預測的時候,有可能遇到只能識別出5個bus或者7個bus,其實不算問題,重新訓練一遍也許就行了!這里也遇到過部署一直在部署中的問題,暫未解決,待排查。建議不要放棄,重新訓練重新部署,實在不行重新建立數據集一切重頭再來,這是最壞的打算了!
作業二:優化FasterRCNN主干網絡
在視頻中老師講解到FasterRCNN的工作原理是首先通過卷積層來提取圖像的特征,得到特征圖。而卷積層可以是vgg16、resnet50或resnet101等網絡結構中的其中一種,不同網絡結構的卷積層可以在此處進行靈活的替換。我。卷積層其實有個專業的名稱,中文名稱為主干網絡,英文名稱為backbone,它的作用是從圖片
中提取特征得到特征圖。業界常用的圖像領域主干網絡有AlexNet、VGG、GoogleNet、Xception、
Inception、ResNet、ResNext、DenseNet、MobileNet、SENet等等。在已經訓練好的主干網絡的基
礎上繼續訓練自己的數據集,這樣可以提升模型訓練效率,不用完全從零開始訓練。這里直接在之前拉取的代碼中進行實現。
我們只需打開?/home/ma-user/work/ModelArts-Lab/notebook/DL_image_object_detection_faster.ipynb?這個文件就能愉快的學習了!
先跑一遍教程,看看大概有哪些步驟,然后再理解一下代碼。再來修改進行優化。
教程案例中使用的主干網絡是vgg16,一個可用的主干網絡由兩部分構成:網絡結構和網絡參數,案例中vgg16主干網絡結構參數儲存在data/imagenet_weights,我們要修改的就是使用另外的主干網絡,所以需要下載其他主干網絡文件(如res101.pth)并進行替換就行。
我們在數據準備后面加上下載res101這個主干網絡的代碼。
#?modify import?moxing?as?mox mox.file.copy('obs://modelarts-labsbj4/notebook/DL_object_detection_faster/res101.pth', './data/imagenet_weights/res101.pth')
下載完畢之后,會發現data/imagenet_weights目錄下除了默認的vgg16.pth(553M大小),還會新增一個res101.pth文件,這個就是我們后面要使用的主干網絡。
當然為了降低難度,官方給出了已經修改過的文件,我們通過簡單的一行命令就能下載到notobook:
`%%bash wget?https://modelarts-labs-bj4.obs.cn-north-4.myhuaweicloud.com/notebook/DL_object_detection_faster/Faster-R-CNN_assiment.ipynb
提示:
1、替換主干網絡需要替換三個內容:網絡結構定義、網絡結構參數文件路徑和網絡配置文件路徑,在
原來的課程案例代碼中只需要修改五處代碼即可完成替換。現在給你提供了一個已經修改了三處的代碼
文件(點此鏈接進行下載,點擊upload上傳到notebook中),已修改的內容請在頁面中按ctrl+F,輸
入“modify”進行頁面內查找查看,還有兩處內容留給你來修改;
2、你可以按ctrl+F,輸入“vgg16”進行查找,依次觀察每一處查找結果,判斷一下哪些地方需要修改;
3、再給一個重要提示,剛才下載的代碼文件中,新增了下面這么兩行代碼,這兩行代碼的作用是從
OBS拷貝了一個resnet101的網絡參數文件“res101.pth”到了Notebook中.
結合提示(有點像找茬游戲),我們發現:
引用有修改,需將vgg16的引用替換為resnet_v1
#?from?nets.vgg16?import?vgg16??#?modifyfrom?nets.resnet_v1?import?resnetv1
模型訓練超參設置的主干網絡路徑肯定是要修改的:
修改之后,我們還有確認文件存在
#?使用的預訓練模型位置#?weight?=?"./data/imagenet_weights/vgg16.pth"weight?=?"./data/imagenet_weights/res101.pth"#?cfg模型文件位置#?cfg_file?=?'experiments/cfgs/vgg16.yml'cfg_file?=?'experiments/cfgs/res101.yml'
設置模型訓練參數,在創建卷積層的時候也是要修改的:
#?創建backbone網絡#?在案例中使用的是VGG16模型,可以嘗試其他不同的模型結構,例如Resnet等#?net?=?vgg16()??#?modifynet?=?resnetv1(num_layers=101)
后面的print(sw.net)輸出resnetv1()驗證了我們成功修改了主干網絡。
訓練前的日志輸出:
Loading?initial?model?weights?from?./data/imagenet_weights/res101.pth Loaded.
再一次驗證了我們成功修改了主干網絡
訓練完畢模型存放在output/res101/voc_2007_trainval/default/res101_faster_rcnn_iter_100.pth
如果需要跑通測試的話,應該還要下載一個res101的預模型,https://drive.google.com/drive/folders/0B7fNdx_jAqhtNE10TDZDbFRuU0E?這是我找到的,然后估計還有修改模型推理代碼。這里就留給大家自由發揮了。
作業三:優化YOLOv3算法anchor參數
在YOLOv3課程案例中,我們使用200張coco數據集的圖片跑通了訓練,這部分圖片在coco/coco_data
目錄中,標注文件是一個txt,路徑是coco/coco_train.txt,如下圖所示,該文件中的每一行是一張圖片
的所有物體框標注,標注的格式是“圖片的路徑 xmin,ymin,xmax,ymax,label_id ...”,物體檢測算法就是
根據這些標注框的信息來進行學習。
anchor這個詞目前沒有一個貼切的中文翻譯,從作用上理解,anchor就是從訓練集的所有標注框中統
計出來的、在訓練集中最經常出現的一些標注框的尺寸大小值和寬高比值。比如,有個檢測行人的任
務,訓練集中出現站立姿態的人非常多,那么常見的寬高比就是0.3:1,這樣模型在學習的時候,就直接
告訴它 “你多嘗試0.3:1的檢測框,放寬松一點的話,你也可以試試0.2:1和0.4:1,就不要瞎嘗試其他比
例的形狀了”,比如10:1的形狀就不要試了,不會有身體寬度是身高10倍的人。這樣,引入anchor其實
是把人的一些先驗知識加了進來,讓模型更有效地學習。
我們在進行這個實踐的時候建議重開一個notebook或者把上一個實踐刪掉.同樣的,我們先試著跑一跑,然后留意一下代碼,根據已有的注釋加深理解。
善于利用print()函數來幫助理解。在完成課程實踐的過程中,我們似乎已經關注到coco數據anchor值文件存儲位置,結合作業,要求,我們
是需要借助代碼中自帶的kmeans.py腳本來重新生成成anchors參數文件。如果您好奇,一定會點開查看kmeans.py文件,雖然可能和我一樣
一臉懵逼,不過憑借我多年的“Copy”經驗,能看到調用txt2clusters函數生成了“model_data/yolo_anchors_v2.txt”文件.那就添加!python kmeans.py看看效果吧。
添加yolo_anchors_v2.txt腳本運行代碼
!python?kmeans.py
修改anchor_path,再依次執行
#?coco數據anchor值文件存儲位置#?anchor_path?=?"./model_data/yolo_anchors.txt"anchor_path?=?"./model_data/yolo_anchors_v2.txt"
如果遇到?File exists: './result/models/,注釋掉代碼:
#?os.makedirs(save_path)
至此,作業已經全部完成,開心地去論壇回帖吧!
總結
多動手,多動腦,多問多總結!
ModelArts
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。