基于MindSpore Lite端側框架的圖像分類應用的全流程體驗

      網友投稿 870 2025-03-31

      有幸參加了MindSpore 21天實戰營,本篇其實是實戰營的第一堂課,作業體驗相對簡單,指導老師何蘆微。但因為我之前參加過MindSpore2日集訓營,之前略微有些基礎,已經不滿足于單純跑通或者完成作業了,想要來點更深入的體驗,于是嘗試走通全過程。在此過程中幾度遭遇波折,在某些關鍵點,我遇到的難度遠超我能力。嘗試的念頭幾近放棄,本文也遲遲未成文。幸得高手指點,我才完成了全流程的體驗,也才有了本文的發表。


      接下來就是基于MindSpore Lite端側框架的移動端圖像分類應用的全流程體驗 ,請高手指正,也希望本文能成為不具備GPU硬件的小伙伴體驗的參考。

      體驗的流程主要記錄為四個部分:

      “一個艱難的開始”——Docker方式下CPU模式訓練Mobilenetv2

      “步入正途”——Docker方式下CPU模式增量訓練Mobilenetv2

      “修成正果”——Mslite生成android手機APP

      “豎掃物體”——手機物體檢測APP掃描體驗

      [Docker方式下CPU模式訓練Mobilenetv2]

      首先,對小白來講要拿到Mobilenetv2的代碼,高手飛過。對代碼進行組織、除錯和訓練,這是開發的過程。其實,課上就被告知,代碼可以在GPU或者Ascend環境去訓練。但個人的本本是沒有配nvdia GPU的,這就有些尷尬了。聽大家在群里講WSL+Docker,我除了了解一下外并無感興趣的基礎。相反,之前在MindSpore 2日集訓營使用過本地CPU跑通Lenet模型的經歷,讓我十分有勇氣相信可以嘗試Docker+CPU環境,我覺得應該是能跑通的,以往都是可以修改代碼嘛。這個我懂!!!

      1、Docker 安裝mindspore-cpu:0.7.0-beta環境;

      1.1 管理員方式運行Microsoft PowerShell;

      1.2 執行docker pull mindspore/mindspore-cpu:0.7.0-beta獲取mindspore 0.7.0 cpu beta版本image文件;

      1.3 執行docker run -it -v /c/test:/mslite mindspore/mindspore-cpu:0.7.0-beta /bin/bash運行mindspore-cpu:0.7.0-beta容器環境;并在windows下C盤根目錄建立test文件夾,該文件夾與docker內mslite文件夾具有通用存儲空間。

      2、mindspore-cpu:0.7.0-beta容器環境下,獲取github下mindspore/mindspore-21-days-tutorials/chapter1/mobilenetv2主倉文件;

      2.3 在./mslite目錄下執行git init,初始化倉庫;

      2.4執行git clone https://github.com/mindspore-ai/mindspore-21-days-tutorials.git獲取mobilenetv2主倉文件;

      進入/mindspore-21-days-tutorials/chapter1#目錄,執行復制命令cp -r mobilenetv2 /mslite,將mobilenetv2文件夾復制到我設置的工作目錄./mslite目錄下。

      3、下載CIFAR-10 phython version (suitable for Python programs)并解壓、拷貝至程序對應路徑。

      3.1 下載完成后解壓縮;

      3.2 在mslite目錄下執行mkdir –p /mslite/data/train和mkdir –p /mslite/data/eval,新建train和eval兩個文件夾,準備填充訓練和測試數據;將5個訓練數據集copy到/mslite/data/train目錄中;將1個訓練數據集copy到/mslite/data/eval目錄中。

      Ps:因為本次運行container時,將c:\test目錄跟容器內\mslite目錄做了掛載操作,所以,copy文件就可以在windows下直接常規操作了。解壓也是如此。

      3.3 執行git add mindspore-ai/,將mslite目錄添加到倉庫;

      3.4 執行 git commit -m提交更改;

      3.5 執行 git branch,可見對應的”master”主干;執行 git branch mobilenet_v2,新建mobilenet_v2的分支;執行 git checkout mobilenet_v2切換到mobilenet_v2分支;

      Ps:在此執行3.3-3.5步,因為數據集基本操作完成,在此提交,有利于程序修改版本的維護!

      4、使用vscode在windows環境下對args.py中訓練模式進行修改;

      錯誤信息:

      路徑

      文件

      v

      原因:

      硬件無GPU,默認訓練的模式值由“GPU”更改為“CPU”;

      ./mobilenetv2/src/

      Args.py

      Line31

      parser.add_argument('--platform', type=str, default="GPU", choices=("CPU", ? "GPU", "Ascend"),??????????????????????? help='run platform, ? only support CPU, GPU and Ascend')

      parser.add_argument('--platform', type=str, default="CPU", choices=("CPU", ? "GPU", "Ascend"),??????????????????????? help='run platform, ? only support CPU, GPU and Ascend')

      結果

      OK!

      5、執行python train.py進行訓練時,遇到了幾個錯誤,記錄如下:

      錯誤信息:

      ImportError: cannot import name ? 'set_seed' from 'mindspore.common'

      路徑

      文件

      v

      原因:

      本段程序是基于MindSpore_r1.0.0,而我運行的版本是MindSpore_r0.7.0beta,兩者set_seed所調用的位置是不同的。

      ./mobilenetv2/

      train.py

      Line31

      from mindspore.common import set_seed

      import mindspore.dataset as ds

      Line41

      set_seed(1)

      ds.config.set_seed(1)

      結果

      OK!

      錯誤信息:

      AttributeError: 'ParameterTensor' object ? has no attribute 'set_data'

      路徑

      文件

      v

      原因:

      本段程序是基于MindSpore_r1.0.0,而運行的版本是MindSpore_r0.7.0beta,兩者set_data方法及所調用的位置是不同的。

      ./mobilenetv2/src/

      mobilenetV2.py

      Line215

      m.weight.set_data

      m.weight.set_parameter_data

      Line218

      m.bias.set_data

      m.bias.set_parameter_data

      Line221

      m.gamma.set_data

      m.gamma.set_parameter_data

      Line223

      m.beta.set_data

      m.beta.set_parameter_data

      Line281

      m.weight.set_data

      m.weight.set_parameter_data

      Line284

      m.bias.set_data

      m.bias.set_parameter_data

      結果

      OK!

      錯誤信息:

      ValueError: num_parallel_workers exceeds ? the boundary between 1 and 2!

      路徑

      文件

      v

      原因:

      并行數目超出>2

      ./mobilenetv2/src/

      dataset.py

      Line56

      ds = de.Cifar10Dataset(dataset_path, ? num_parallel_workers=8, shuffle=do_shuffle)

      ds = de.Cifar10Dataset(dataset_path, ? num_parallel_workers=1, shuffle=do_shuffle)

      結果

      OK!

      錯誤信息:

      RuntimeError: Currently dataset sink mode ? is not supported when the device target is CPU.

      路徑

      文件

      v

      原因:

      數據下沉模式是針對asic芯片做的優化 默認是開啟的,CPU不支持這種模式。CPU is not supported ? when?dataset_sink_mode is true. If dataset_sink_mode is True, data will ? be sent to device.

      ./mobilenetv2/

      train.py

      Line44

      if args_opt.platform =="CPU":

      args_opt.dataset_sink_mode ? = False

      Line91

      model.train(epoch_size, dataset, callbacks=cb)

      model.train(epoch_size, dataset, ? callbacks=cb,dataset_sink_mode=args_opt.dataset_sink_mode)

      結果

      OK!

      在老師的指導下,處理完顯性錯誤,訓練時停滯幾分鐘并輸出killed,走到這一步基本就沒思路了。后來安裝了mindspore-cpu:r1.0.0,重新開始,處理完顯性錯誤,跟之前是一樣的,訓練時停滯幾分鐘并輸出killed。這時,我意識到自己挖了一個大坑......老師也是建議可以做CPU增量訓練......

      直到后來檢查batch_size值過大,改為15,之后又輸出了一個錯誤。

      錯誤信息:

      停滯并輸出killed

      路徑

      文件

      v

      原因:

      batch_size=150,此值過大

      ./mobilenetv2/src/

      config.py

      28

      batch_size":?150

      batch_size":?15

      結果

      OK!

      錯誤信息:

      [WARN]Not registered CPU kernel:op[Tile]

      路徑

      文件

      v

      原因:

      查閱Tile算子,目前其對CPU是不支持的。也就是說Docker跑mindspore-cpu這條路是走不通的,除非去改底層算子。

      結果

      Failed!

      請教大神并查閱Tile算子,認為Docker容器中用CPU這條路是跑不通了,認定方向走CPU增量訓練的方式!

      [Docker方式下CPU模式增量訓練Mobilenetv2]*官方教程

      代碼:Gitee例倉? ./model_zoo/cv/mobilenetv2

      1、下載checkpoint文件

      查看目錄及文件,其中沒有預訓練完成的checkpoint文件。用戶需要根據不同處理器種類下載CPU/GPU預訓練模型或下載Ascend預訓練模型到以下目錄:./pretrain_checkpoint/

      Ps:此處需要下載的是CPU訓練適用的預訓練模型。

      在代碼目錄中建立路徑:

      mkdir pretrain_checkpoint

      下載預訓練完成的文件mobilenetv2_cpu_gpu.ckpt:

      wget -P ./pretrain_checkpoint https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/mobilenetv2_cpu_gpu.ckpt

      2、準備數據

      準備ImageFolder格式管理的數據集,運行run_train.sh時加入[dataset_path]參數,運行train.py時加入--dataset_path?[dataset_path]參數:

      數據集結構如下:

      └─ImageFolder

      ├─train

      │?? class1Folder

      │?? class2Folder

      │?? ......

      └─eval

      class1Folder

      class2Folder

      ......

      因為下載的cifar-10數據集為非文件目錄的,需要轉換。可以編寫python轉換程序進行轉換。代碼及cifar-10數據集在例倉中./mobilenetv2/data/目錄中。

      3、開始增量訓練

      python train.py --platform CPU --dataset_path ./data/train/ --pretrain_ckpt ./pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt --freeze_layer backbone

      4、錯誤處理:

      錯誤信息:

      ValueError: num_parallel_workers exceeds the boundary between ? 1 and 2!

      路徑

      文件

      v

      原因:

      并行運算數目超過1

      ./mobilenetv2/src/

      dataset.py

      Line61

      ds ? = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)

      ds ? = de.ImageFolderDataset(dataset_path, num_parallel_workers=1, shuffle=True)

      Line86

      ds ? = ds.map(operations=trans, input_columns="image", num_parallel_workers=8)

      ds ? = ds.map(operations=trans, input_columns="image", num_parallel_workers=1)

      Line87

      ds ? = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)

      ds ? = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=1)

      結果

      OK!

      錯誤信息:

      停滯并輸出killed

      路徑

      文件

      v

      原因:

      batch_size=150,此值過大

      ./mobilenetv2/src/

      config.py

      Line28

      batch_size":?150

      batch_size":?15

      結果

      OK!

      錯誤信息:

      AttributeError:’EasyDict’ object has no ? attribute ‘run_distribute’

      路徑

      文件

      v

      原因:

      參數缺少run_distribute項

      ./mobilenetv2/src/

      config.py

      Line43

      "run_distribute": ? args.run_distribute,

      結果

      OK!

      終于…...程序輸出打印batch信息……

      經過漫長的等待,最終在./ckpt_0目錄下生成了15個.ckpt文件。

      5、測試

      python eval.py --platform CPU --dataset_path ./data/test --pretrain_ckpt ./ckpt_0/mobilenetv2_15.ckpt

      精度尚可~~~

      6、模型轉出

      python export.py –platform CPU –pretrain_ckpt ./ckpt_0/mobilenetv2_15.ckpt

      7、使用convert_lite離線轉換工具,生成端側模型.ms文件

      執行bash build.sh -I X86_64 -j4 得到轉換所需的conver_lite工具。

      使用mindspore lite離線工具convert_lite工具,將生成的.mindir模型轉換成 MindSpore Lite端側使用的.ms模型文件。

      一行命令解決問題:./convert_lite --fmk =MINDIR?--modelFile=mobilenetv2-10_1562.mindir

      [Mslite生成android手機APP]

      參考教程鏈接:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/lite/object_detection?基本參考本教程,在此不復贅述!

      [手機物體檢測APP掃描體驗]

      通過本堂課的學習,使我們了解了作為端側APP使能AI的基本流程,對日后的學習和應用大有裨益。部分地方尚需深入學習!

      基于MindSpore Lite端側框架的圖像分類應用的全流程體驗

      -------------------------------------------------------------End----------------------------------------------------------------------

      MindSpore 輕量級操作系統 LiteOS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS文檔中輕松批量保存文檔圖片 它適用于大量圖片
      下一篇:用Excel制作簡單的星級評分圖 如顧客滿意度 產品滿意度 電影評分(excel制作五星評分)
      相關文章
      亚洲五月午夜免费在线视频| 亚洲国产精品无码久久98| 国产成人人综合亚洲欧美丁香花| 亚洲女人影院想要爱| 亚洲精品无码久久一线| 亚洲男人的天堂一区二区| 色天使色婷婷在线影院亚洲| 亚洲αⅴ无码乱码在线观看性色 | 亚洲国产人成中文幕一级二级| 亚洲AV日韩AV一区二区三曲| 亚洲AV永久无码精品一福利| 亚洲国产精品无码久久久秋霞1| 亚洲精品伦理熟女国产一区二区| 亚洲成_人网站图片| 亚洲午夜成人精品无码色欲| 亚洲午夜理论片在线观看| 亚洲日韩一区二区一无码| 亚洲欧美日韩中文高清www777| 在线观看亚洲AV日韩AV| 亚洲熟妇av午夜无码不卡| 亚洲欧美日韩国产成人| 亚洲日韩精品国产一区二区三区 | 国产色在线|亚洲| 亚洲一线产区二线产区区| 亚洲熟妇av午夜无码不卡| 国产成人精品久久亚洲高清不卡| 国产亚洲美女精品久久久久| 亚洲综合精品网站| 亚洲午夜未满十八勿入网站2| 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲午夜久久久精品影院| 亚洲黄色在线观看网站| 亚洲国产成人精品久久| 亚洲色大成网站www尤物| 精品无码专区亚洲| 久久伊人亚洲AV无码网站| 亚洲av无码国产精品夜色午夜 | 亚洲第一se情网站| 91麻豆国产自产在线观看亚洲| 国产亚洲一区二区在线观看| 97久久精品亚洲中文字幕无码|