想學AI開發很簡單:只要你會複製貼上

daqianmen發表於2021-09-11
摘要:本次實踐基於 mobilenetV2 實現貓狗影像分類,貫穿了資料集獲取及處理、預訓練模型微調及遷移、端側部署及推理等環節和知識點,體會到了 MindSpore 簡單的開發體驗和全場景快速部署的魅力。
  • startTime: 2021年1月23日00:43:22
  • endTime: 2021年1月23日11:34:44

(包含學習、睡覺、吃飯、爬坑、水文……的時間)

瞭解MindSpore開源生態

發現一個小秘密。 github 上多三個倉庫,是什麼呢?

想學AI開發很簡單:只要你會複製貼上想學AI開發很簡單:只要你會複製貼上

此處應是 github 過濾的 bug ,實際上mindspore-ai 有 15 個倉庫, 比 gitee 多出來的三個是:  

別看這 3 個不起眼的倉庫,在社群建設方面卻大有作為。比如,是我們之前參加 21 天實戰營的參考程式碼和指導文件,多麼寶貴的學習資料;另外兩個是 MindSpore 的開源基礎建設,其中 包含了用於配置 Mindspore 社群的所有必需 Dockerfile 和 YAML 檔案,並藉助 Github 的 Action 定時自動同步 Gitee 的程式碼到 Github 。

訓練時長截圖

想學AI開發很簡單:只要你會複製貼上

手機識別截圖

想學AI開發很簡單:只要你會複製貼上

學習總結

在學習之前我以為我會了,但真正實踐起來還是磕磕碰碰,所有的程式碼似曾相識,都是 26 個字母加一些符號組成,但真正去理解還是發現基本功不夠:一是不知道怎麼寫,二是不知道為什麼要這麼寫。儘管如此,我大概理順了整個實踐流程:訓練貓狗影像分類模型(雲端) --> 手機端推理及應用 --> 從 “1” 開始 Fine Tune 模型(本地) --> 手機端驗證 ,當然作為學渣,整個操作過程肯定不止一個小時, 深刻體會到“眼睛:學會了,腦子:學廢了!”,因此必須藉此帖記錄一下“學廢了”的過程:

目的

本次實踐基於 mobilenetV2 實現貓狗影像分類,貫穿了資料集獲取及處理、預訓練模型微調及遷移、端側部署及推理等環節和知識點,體會到了 MindSpore 簡單的開發體驗和全場景快速部署的魅力。

專案目錄

MindSporePetClassification               
├─ ADB                          // 支援手機與電腦傳遞檔案工具 
│  ├─ adb.exe                            
│  ├─ AdbWinApi.dll                      
│  ├─ AdbWinUsbApi.dll                   
│  └─ fastboot.exe                       
├─ code                         // Fine tune訓練程式碼及資料集 
│  ├─ dataset                            
│  │  ├─ PetImages                       
│  │  │  ├─ eval                         
│  │  │  │  ├─ Cat
│  │  │  │  └─ Dog  
│  │  │  ├─ train                         
│  │  │  │  ├─ Cat
│  │  │  │  └─ Dog                         
│  │  ├─ MSR-LA - 3467.docx              
│  │  └─ readme[1].txt                   
│  ├─ src                                
│  │  ├─ __pycache__                     
│  │  │  ├─ args.cpython-37.pyc          
│  │  │  ├─ config.cpython-37.pyc        
│  │  │  ├─ dataset.cpython-37.pyc       
│  │  │  ├─ lr_generator.cpython-37.pyc  
│  │  │  ├─ mobilenetV2.cpython-37.pyc   
│  │  │  ├─ models.cpython-37.pyc        
│  │  │  └─ utils.cpython-37.pyc         
│  │  ├─ args.py                         
│  │  ├─ config.py                       
│  │  ├─ dataset.py                      
│  │  ├─ lr_generator.py                 
│  │  ├─ mobilenetV2.py                  
│  │  ├─ models.py                       
│  │  └─ utils.py                        
│  ├─ mobilenetV2.ckpt                    // 預訓練模型檔案   
│  ├─ preprocessing_dataset.py            // 預先處理資料集指令碼
│  └─ train.py                            // 主訓練指令碼
├─ converter                              // 轉換工具MindSpore Lite Converter
│  ├─ converter_lite.exe                 
│  ├─ libgcc_s_seh-1.dll                 
│  ├─ libglog.dll                        
│  ├─ libmindspore_gvar.dll              
│  ├─ libssp-0.dll                       
│  ├─ libstdc++-6.dll                    
│  └─ libwinpthread-1.dll                
└─ kagglecatsanddogs_3367a.zip

依賴安裝

本次實踐依賴opencv-python 和 matplotlib,一個用來處理圖形比如列印圖片和嵌入文字,一個用來將資料集以視覺化圖片的形式展現出來。

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

資料預處理

主要刪除一些不符合要求(如非JPEG格式)的圖片並分割 train 和 eval 資料集,預設9:1:

python preprocessing_dataset.py 您的路徑kagglecatsaData to Dragnddogs_3367a.zip

想學AI開發很簡單:只要你會複製貼上

Fine tune

執行Fine tune指令碼train.py,並生成模型檔案:

python train.py

想學AI開發很簡單:只要你會複製貼上

此時會彈窗提示6張圖片,這是因為指令碼會在正式訓練前從資料集中抽取6張圖片載入當前模型檔案,需要手動關閉才能繼續,這是 AI 很傻,全都識別成了 Dog 。

當然,我這邊由於機器的原因,沒少踩坑,這不“出師未捷身先死”,突然的報錯把我整蒙了,將所有num_parallel_workers引數設定為4之後,繼續訓練!

$ python train.py
start cache feature!
Traceback (most recent call last):
  File "train.py", line 52, in <module>
    data, step_size = extract_features(backbone_net, args_opt.dataset_path, config)
  File "F:dosomethingsserverlessModelArtsMIndSporeMindSporePetClassificationMindSporePetClassificationcodesrcdataset.py", 
line 84, in extract_features
    train_dataset = create_dataset(dataset_path=os.path.join(dataset_path, "train"), do_train=True, config=config)
  File "F:dosomethingsserverlessModelArtsMIndSporeMindSporePetClassificationMindSporePetClassificationcodesrcdataset.py", 
line 41, in create_dataset
    ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)
  File "C:UsershuqiAppDataLocalProgramsPythonPython37libsite-packagesmindsporedatasetenginevalidators.py", line 51, in new_method
    validate_dataset_param_value(nreq_param_int, param_dict, int)
  File "C:UsershuqiAppDataLocalProgramsPythonPython37libsite-packagesmindsporedatasetcorevalidator_helpers.py", line 352, in validate_dataset_param_value
    check_num_parallel_workers(param_dict.get(param_name))
  File "C:UsershuqiAppDataLocalProgramsPythonPython37libsite-packagesmindsporedatasetcorevalidator_helpers.py", line 340, in check_num_parallel_workers
    raise ValueError("num_parallel_workers exceeds the boundary between 1 and {}!".format(cpu_count()))
ValueError: num_parallel_workers exceeds the boundary between 1 and 4!

這一步耗時就和本地機器的效能有關了,我的粗糧渣渣機大概跑廢了。趁著訓練的空檔,學習了一些程式碼。作為新晉調參學徒,我大概知道引數和配置在codesrcargs.py和codesrcconfig.py這兩個檔案,而資料的載入在codesrcdataset.py這個檔案處理,codesrcmobilenetV2.py定義了模型,codesrcmodels.py這個檔案讀取和儲存模型並列印輸出訓練日誌。

想學AI開發很簡單:只要你會複製貼上

訓練完成會,又會呼叫predict_from_net方法來顯示預測的圖片和標籤,這回我們發現 AI 挺棒的,全部識別正確! 當我滿懷信心點選關閉的時候,以為程式立馬會給我一個mobilenetv2.mindir,結果我又蒙了,返回了一串錯誤日誌!!!

early stop! the best epoch is 2
train total cost 4141.2663 s
Traceback (most recent call last):
  File "train.py", line 81, in <module>
    export_mindir(net, "mobilenetv2")
  File "F:dosomethingsserverlessModelArtsMIndSporeMindSporePetClassificationMindSporePetClassificationcodesrcutils.py", line 93, in export_mindir
    export(net, Tensor(input_np), file_name=path, file_format='MINDIR')
  File "C:UsershuqiAppDataLocalProgramsPythonPython37libsite-packagesmindsporetrainserialization.py", line 535, in export
    Validator.check_file_name_by_regular(file_name)
  File "C:UsershuqiAppDataLocalProgramsPythonPython37libsite-packagesmindspore_checkparam.py", line 438, in check_file_name_by_regular
    target, prim_name, reg, flag))
ValueError: 'F:dosomethingsserverlessModelArtsMIndSporeMindSporePetClassificationMindSporePetClassificationcodemobilenetv2.mindir'  is illegal, it should be match regular'^[0-9a-zA-Z_-./\]+$' by flags'256'

一開始我以為是檔案層級太深了,將檔案目錄遷移到盤的根目錄,重來重來!好在不需要再次載入資料集了,不然又得漫長的等待。 滿懷信心結果又被“啪啪啪”打臉,之後群裡請教一遍之後,王輝老師建議我把路徑改成檔名再試試,果然立馬奏效~

- path = os.path.abspath(f"{name}.mindir")
+ path = name

終於如願以償,codemobilenetv2.mindir她來了!

想學AI開發很簡單:只要你會複製貼上

手機端推理及應用

  • 訓練模型轉換
    將.mindir模型檔案轉換成.ms檔案,.ms檔案可以匯入端側裝置並基於MindSpore端側框架訓練。
F:MindSporePetClassificationconverter>call converter_lite --fmk=MINDIR --modelFile=f:MindSporePetClassificationcodemobilenetv2.mindir --outputFile=pet

想學AI開發很簡單:只要你會複製貼上

我們可以下載 MindSpore 官方提供的 Android APP 原始碼: 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2796225/,如需轉載,請註明出處,否則將追究法律責任。

相關文章