一个垃圾分类项目带你玩转飞桨(1)
一個垃圾分類項目帶你玩轉飛槳(1)
- 基于PaddleClas實現垃圾分類,導出inference模型并利用PaddleHub Serving進行服務化部署。
更好的體驗記得移步AIStudio喲~
點擊上方Fork即可以運行本項目
Github項目地址
最新數據集地址
大家先看看效果哈
bilibili視頻地址
背景介紹
??垃圾分類是對垃圾收集處置傳統方式的改革,是對垃圾進行有效處置的一種科學管理方法。人們面對日益增長的垃圾產量和環境狀況惡化的局面,如何通過垃圾分類管理,最大限度地實現垃圾資源利用,減少垃圾處置的數量,改善生存環境狀態,是當前世界各國共同關注的迫切問題。
??2019年6月25日,固體廢物污染環境防治法修訂草案初次提請全國人大常委會審議。草案對“生活垃圾污染環境的防治”進行了專章規定。2019年9月,為深入推動全國公共機構做好生活垃圾分類工作,國家機關事務管理局印發通知,公布《公共機構生活垃圾分類工作評價參考標準》,并就進一步推進有關工作提出要求。
??就上海市而言,2019年1月31日《上海市生活垃圾管理條例》[1]獲第十五屆上海市人民代表大會通過,正式成為地方性法規,并于2019年7月1日起強制實施。此條例規定,個人或企業、單位混合投放垃圾將面臨罰款等處罰。同年5月,上海市城市管理行政執法局出臺《上海市生活垃圾分類違法行為查處規定》和《〈上海市生活垃圾管理條例〉行政處罰裁量基準》[2],對垃圾分類違法行為的行政處罰進行詳細闡釋。至此,申城成為全國第一個實行垃圾分類的城市。
??此外,據新聞媒體報道,自2020年11月13日起,東華大學研究生新生入學教育新增一項“垃圾分類考試”。新生需回答垃圾分類相關知識的選擇題,達到90分以上才能過關。而“高校研究生進行垃圾分類考試”再一次將“垃圾分類”推向高潮。
??本項目利用PaddleClas圖像分類套件進行垃圾分類開發,本項目使用 2019華為云AI大賽·垃圾分類數據集進行開發,總體效果具備較好的分類性能。
PaddleClas介紹
??飛槳圖像分類套件PaddleClas是飛槳為工業界和學術界所準備的一個圖像分類任務的工具集,助力使用者訓練出更好的視覺模型和應用落地。PaddleClas 是百度基于PaddlePaddle框架推出的圖像分類開發套件,實現了23個系列豐富的分類模型,多種數據增廣方式,SSLD知識蒸餾高階優化方案,并可以很方便的對訓練出的模型進行工業級部署。PaddleClas
特性:
-
豐富的模型庫:基于ImageNet1k分類數據集,PaddleClas提供了29個系列的分類網絡結構和訓練配置,133個預訓練模型和性能評估。
-
SSLD知識蒸餾:基于該方案蒸餾模型的識別準確率普遍提升3%以上。
-
數據增廣:支持AutoAugment、Cutout、Cutmix等8種數據增廣算法詳細介紹、代碼復現和在統一實驗環境下的效果評估。
-
10萬類圖像分類預訓練模型:百度自研并開源了基于10萬類數據集訓練的 ResNet50_vd模型,在一些實際場景中,使用該預訓練模型的識別準確率最多可以提升30%。
-
多種訓練方案,包括多機訓練、混合精度訓練等。
-
多種預測推理、部署方案,包括TensorRT預測、Paddle-Lite預測、模型服務化部署、模型量化、Paddle Hub等。
-
可運行于Linux、Windows、MacOS等多種系統。
??我們觀察garbage文件目錄,其中需要特別注意的是:
?? - garbage_classify_rule.json 存放著標簽與具體垃圾的對應關系
?? - labels.txt 存放著所有標簽
?? - train.txt 存放著訓練集內圖片的相對地址與對應標簽(例:./29/img_14678.jpg 29)
?? - validate.txt 存放著驗證集內圖片的相對地址與對應標簽(例:./0/img_18.jpg 0)
??本數據集符合ImageNet格式,故在此基礎上使用PaddleClas極其便利!
模型選取
??數據集準備好后,接下來就是在PaddleClas提供的23個系列的模型中選擇一個較為合適本項目的模型。
??由圖可知,模型主要分為兩類:服務器端模型和移動端模型。移動端模型以輕量化為主要設計目標,通常速度快體積小,因此會犧牲一定的精度。而服務器端模型的精度通常很高,然其體積也相對較大。基于本項目實地應用場景,我們在這個項目中選擇服務器端模型,并最終選擇了ResNet_Vd。ResNet_Vd是PaddleClas框架主推的模型,經過了大量精度和速度上的優化。如果在自己的項目中不是很清楚如何選擇模型,從ResNet_Vd開始嘗試是一個不錯的選擇。而由于本項目的數據集還不是特別大,故結合RandomErasing的數據增廣方式進行訓練可以在原有基礎上進一步提升精度。
模型訓練
??下面就到了關鍵的模型訓練時刻!使用PaddleClas訓練模型基本就是編寫config文件。由于PaddleClas很貼心地為開發者提供了一份demo config文件,故而我們可以在此基礎上進行修改。下面筆者將著重介紹幾個關鍵修改處:
?? - |classes_num |分類數|
?? - |total_images|總圖片數|
?? - | epochs |訓練總epoch數|
?? - | file_list |標注訓練集/驗證集圖片地址及其標簽的txt文件地址|
?? - |data_dir|數據集目錄|
??配置完config文件后即可正式開始模型訓練,一般來說PaddleClas的模型訓練是基于tools.py命令行進行的,命令行啟動代碼如下:
!python3 train.py -c ResNet50_vd_ssld_random_erasing_finetune.yaml
??本項目中訓練了60個epoch,大約在第42個epoch處會得到最佳模型。
模型導出
??訓練出滿意的模型后我們會希望用訓練得到的模型進行前向推理,這需要用到訓練過程中保存的權重文件。PaddlePaddle框架保存的權重文件分為兩種:支持前向推理和反向梯度的訓練模型 和 只支持前向推理的推理模型。二者的區別是推理模型針對推理速度和顯存做了優化,裁剪了一些只在訓練過程中才需要的tensor,降低顯存占用,并進行了一些類似層融合,kernel選擇的速度優化。PaddleClas在訓練過程中保存的模型屬于訓練模型,默認保存在 ./output/模型結構 路徑下。
??接下來我們通過PaddleClas中提供的模型轉換腳本將訓練模型轉換為推理模型。
?&emsp執行完畢后我們可以看到轉換之后在./inference中生成了兩個文件,model是模型結構,params是模型權重。轉換完畢,最后一步是進行推理。推理的輸入圖片可以從 數據集文件夾中任意選擇,填入對應的路徑即可。
# 執行預測 %cd The-Eye-Konws-the-Garbage !python predict.py \--image_file "./garbage/0/img_210.jpg" \--model_file "./inference/inference.pdmodel" \--params_file "./inference/inference.pdiparams" \--use_gpu=False \--use_tensorrt=False基于PaddleHub Serving的服務部署
??首先需要在params.py中查看和修改推理模型路徑,即如下圖所示:??然后需要安裝服務模塊,具體代碼如下:
hub install The-Eye-Konws-the-Garbage
??當我們安裝完服務模塊后,我們便可以啟動配置文件,官方提供了兩種啟動方式:
??方式1. 命令行命令啟動(僅支持CPU)
啟動命令:
參數:
| –modules/-m | [必選] PaddleHub Serving預安裝模型,以多個Module==Version鍵值對的形式列出 當不指定Version時,默認選擇最新版本 |
| –port/-p | [可選] 服務端口,默認為8866 |
| –use_multiprocess | [可選] 是否啟用并發方式,默認為單進程方式,推薦多核CPU機器使用此方式 Windows操作系統只支持單進程方式 |
| –workers | [可選] 在并發方式下指定的并發任務數,默認為2*cpu_count-1,其中cpu_count為CPU核數 |
如按默認參數啟動服務: hub serving start -m garbage_classification
這樣就完成了一個服務化API的部署,使用默認端口號8866。
?? 方式2. 配置文件啟動(支持CPU、GPU)
啟動命令:
hub serving start -c config.json
其中,config.json格式如下:
{"modules_info": {"garbage_classification": {"init_args": {"version": "1.0.0","use_gpu": true,"enable_mkldnn": false},"predict_args": {}}},"port": 8866,"use_multiprocess": false,"workers": 2 }- init_args中的可配參數與module.py中的_initialize函數接口一致。其中,
- 當use_gpu為true時,表示使用GPU啟動服務。
- 當enable_mkldnn為true時,表示使用MKL-DNN加速。
- predict_args中的可配參數與module.py中的predict函數接口一致。
注意:
- 使用配置文件啟動服務時,其他參數會被忽略。
- 如果使用GPU預測(即,use_gpu置為true),則需要在啟動服務之前,設置CUDA_VISIBLE_DEVICES環境變量,如:export CUDA_VISIBLE_DEVICES=0,否則不用設置。
- use_gpu不可與use_multiprocess同時為true。
- use_gpu與enable_mkldnn同時為true時,將忽略enable_mkldnn,而使用GPU。
如,使用GPU 3號卡啟動串聯服務:
export CUDA_VISIBLE_DEVICES=3 hub serving start -c config.json # 命令行啟動 %cd /home/aistudio/The-Eye-Konws-the-Garbage/ !hub serving start -m garbage_classification??配置好服務端后,可使用以下命令發送預測請求,獲取預測結果:
項目部署
??隨后我們進行項目的具體部署,具體細節此處我們不予細講,讀者可在本地跑通后執行如下命令:python The-Eye-Konws-the-Garbage/garbage_end_side.py
??相關效果如開頭處所示
總結與反思
- 本項目總體使用PaddleClas實現了垃圾分類,并取得了較好的預測效果。
- 本項目基于PaddleHub Serving 實現了服務部署。
- 本項目后緒將結合PaddleHub增加語音播報功能,提高用戶體驗。
個人相關介紹
- 筆名:左右
- 華東理工大學自動化專業大二在讀
- 號稱:冷板凳常客
- 搞點多智能體的協同控制及路徑規劃
- 熱衷于利用人工智能技術做點有價值的東西,為社會做點小事情;
- 偶爾寫點隨筆、拍點東西、看看天…
AiStudio主頁,歡迎互關喲
Github主頁,歡迎互關喲
CSDN主頁,歡迎互關喲
總結
以上是生活随笔為你收集整理的一个垃圾分类项目带你玩转飞桨(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PaddlePaddle实现波士顿房价预
- 下一篇: 爸,这下你还敢抽烟么?