2019年7月的飛槳活動中,第一次接觸飛槳開源深度學習框架,這也是我學習的第一個深度學習框架,一年的時間裡見證了飛槳以簡為先,由簡至精。2020年4月,飛槳正式開源PaddleClas,包含23個系列的分類網路以及117個預訓練模型和效能評估,從資料增廣、骨幹網路設計、損失定義、最佳化器設計、知識蒸餾、特徵遷移學習等不同的角度對影像分類問題進行深入探索。
在本篇文章中,我嘗試使用PaddleClas進行熱軋鋼帶表面缺陷的分類任務,經過除錯最終在測試集上的準確率達到了100%。
專案簡介
類內缺陷在外觀上存在較大差異,類間缺陷相似,類內缺陷在外觀上存在很大相似。例如,劃痕(最後一列)可能是水平劃痕,垂直劃痕和傾斜劃痕等。 同樣,類間缺陷也具有類似情況,例如,氧化皮,裂紋和表面凹痕。 另外,由於照明和材料變化的影響,類內缺陷影像的灰度是變化的。
環境搭建與資料處理 模型選擇與引數配置 模型訓練 模型評估 模型推理
環境搭建與資料處理
01 環境搭建
git clone https://github.com/PaddlePaddle/PaddleClas.git
cd PaddleClas pip install --upgrade -r requirements.txt
export PYTHONPATH=./:$PYTHONPATH
cd PaddleClas import os os.environ['PYTHONPATH']="/home/aistudio/PaddleClas"
02 資料處理
image_path_pre = os.path.join(all_file_dir, class_dir) img = Image.open(os.path.join(image_path_pre, file)) if random.uniform(0, 1) <= train_ratio: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(train_image _dir, file)) train_file.write("{0} {1}\n".format(os.path.join("trainImageSet", file), label_id)) else: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(eval_image_dir, file)) eval_file.write("{0} {1}\n".format(os.path.join("evalImageSet", file), label_id)) train.txt內的部分資料格式如下所示: trainImageSet/Cr_227.bmp 0 trainImageSet/Cr_87.bmp 0 trainImageSet/Cr_194.bmp 0 trainImageSet/Cr_93.bmp 0
模型選擇引數配置
classes_num:6 分類數 total_images:1431 總圖片數 save_interval:10 每隔多少個epoch儲存模型 validate:True 是否在訓練時評估 valid_interval:10 每隔多少個epoch進行模型評估 epochs:50 訓練總epoch數 image_shape: [3, 224, 224] 圖片大小
batch_size: 64 批大小 num_workers: 4 資料讀取器worker數量 file_list: "./dataset/NEU-CLS/train.txt" train檔案列表 data_dir: "./dataset/NEU-CLS" train檔案路徑
模型訓練
python ../download_model.py ResNet50_vd_pretrained mv ../ResNet50_vd_pretrained ./
python -m paddle.distributed.launch --selected_gpus="0" tools/train.py \ -c ../ neu.yaml \ #配置檔案路徑 -o pretrained_model=./ResNet50_vd_pretrained #預訓練模型存放路徑
模型評估
configs/eval.yaml,直接修改 -o,設定需要評估的模型路徑
python -m paddle.distributed.launch --selected_gpus="0" tools/eval.py \ -c .. /eval.yaml \ #配置檔案路徑 -o pretrained_model=output/ResNet50_vd/best_model/ppcls #評估模型路徑
模型推理
persistable模型(fluid.save_persistabels儲存的模型):一般作為模型的 checkpoint,可以載入後重新訓練。persistable 模型儲存的是零散的權重檔案,每個檔案代表模型中的一個 Variable,這些零散的檔案不包含結構資訊,需要結合模型的結構一起使用。 inference 模型(fluid.io.save_inference_model儲存的模型):一般是模型訓練完成後儲存的固化模型,用於預測部署。
預測引擎 + inference 模型 訓練引擎 + persistable 模型 訓練引擎 + inference 模型
Ⅰ 選擇訓練好的模型並轉化為inference 模型
python tools/export_model.py \
--model='ResNet50_vd' \ #模型名稱
--pretrained_model=output/ResNet50_vd/best_model/ppcls \ #需要轉換的模型路徑
--output_path=./inference #輸出的預測模型儲存路徑
儲存在Inference目錄下的預測模型包含 model、params 兩個檔案。
Ⅱ 透過預測引擎和inference模型進行推理
python tools/infer/predict.py --use_gpu=1 \ #是否使用 GPU 預測
-m inference/model \ #模型檔案路徑
-p inference/params \ #權重檔案路徑
-i "dataset/NEU-CLS/Rs/RS_5.bmp" \ #待預測的圖片檔案路徑
心得體會