PaddleClas在windows10下訓練自己的資料
技術標籤:Windows10pythonPaddleClaspaddlepaddlepythonwindows 10深度學習人工智慧
飛槳影象分類套件PaddleClas是飛槳為工業界和學術界所準備的一個影象分類任務的工具集,助力使用者訓練出更好的視覺模型和應用落地。
https://github.com/PaddlePaddle/PaddleClas
截至2020-12-10最新版本PaddleClas需要需要PaddlePaddle 2.0rc或更高版本,有些新的方法在穩定版本1.8.5中沒有。
安裝方法:https://www.paddlepaddle.org.cn/install/quick/zh/2.0rc-windows-pip
python -m pip install paddlepaddle-gpu==2.0.0rc0 -f https://paddlepaddle.org.cn/whl/stable.html
我的執行環境:
- Python3.7
- CUDA= 10.2
- cuDNN >= 8.0.3
克隆PaddleClas模型庫:
cd path_to_clone_PaddleClas
git clone https://github.com/PaddlePaddle/PaddleClas.git
安裝Python依賴庫:
Python依賴庫在requirements.txt中給出,可通過如下命令安裝:
pip install --upgrade -r requirements.txt
資料準備:
將資料拷貝到專案的dataset目錄下,目錄結構如上圖
battery為名稱目錄
binary_0和binary_1為2個分類目錄,每個目錄下存放對應類別圖片
test.txt train.txt val.txt為存放圖片路徑及分類的檔案
分割資料集程式碼:
import os import numpy as np img_dir = r'battery' classes_dict = {} split_sets = {'train': [], 'val': [], 'test': []} go = os.walk(img_dir) for path, d, fileList in go: for c in d: if len(c) > 0: classes_dict[c] = [] for index, filename in enumerate(fileList): if filename.endswith(('jpg', 'png', 'bmp')): class_name = os.path.basename(path) classes_dict[class_name].append(os.path.join(class_name, filename)+' '+str(list(classes_dict.keys()).index(class_name))) # print(classes_dict) # 按比例劃分打亂後的資料集 train_ratio = 0.8 val_ratio = 0.1 # 打亂資料集 np.random.seed(100) for k, v in classes_dict.items(): np.random.shuffle(v) train_num = int(len(v) * train_ratio) val_num = int(len(v) * val_ratio) split_sets['train'].extend(v[:train_num]) split_sets['val'].extend(v[train_num: train_num + val_num]) split_sets['test'].extend(v[train_num + val_num:]) # 寫txt檔案 for name,list in split_sets.items(): list_file = open(os.path.join(img_dir,'./%s.txt' % (name)), 'w') for l in list: # print(l) list_file.write(l+'\r') list_file.close() print('count:',len(split_sets['train']+split_sets['val']+split_sets['test']))
分割完之後的txt檔案為
空格前為檔案路徑,空格後為類別索引
訓練資料:
採用ResNet50_vd模型
下載預訓練模型
通過tools/download.py下載所需要的預訓練模型。
python tools/download.py -a ResNet50_vd_ssld -p ./pretrained -d True
配置yaml檔案
檔案拷貝於configs/quick_start/ResNet50_vd_ssld_finetune.yaml
mode: 'train'
ARCHITECTURE:
name: 'ResNet50_vd'
params:
lr_mult_list: [0.1, 0.1, 0.2, 0.2, 0.3]
pretrained_model: "./pretrained/ResNet50_vd_ssld_pretrained"
load_static_weights: True
model_save_dir: "./output/"
classes_num: 2
total_images: 5674
save_interval: 1
validate: True
valid_interval: 1
epochs: 20
topk: 1
image_shape: [3, 224, 224]
LEARNING_RATE:
function: 'Cosine'
params:
lr: 0.00375
OPTIMIZER:
function: 'Momentum'
params:
momentum: 0.9
regularizer:
function: 'L2'
factor: 0.000001
TRAIN:
batch_size: 32
num_workers: 4
file_list: "./dataset/battery/train.txt"
data_dir: "./dataset/battery/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
size: 224
- RandFlipImage:
flip_code: 1
- NormalizeImage:
scale: 1./255.
mean: [ 0.485, 0.456, 0.406 ]
std: [ 0.229, 0.224, 0.225 ]
order: ''
- ToCHWImage:
VALID:
batch_size: 20
num_workers: 4
file_list: "./dataset/battery/val.txt"
data_dir: "./dataset/battery/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [ 0.485, 0.456, 0.406 ]
std: [ 0.229, 0.224, 0.225 ]
order: ''
- ToCHWImage:
需要修改幾個引數:
pretrained_model: "./pretrained/ResNet50_vd_ssld_pretrained" 為預訓練模型路徑
classes_num: 2 分類數
total_images: 5674 圖片數 之前程式碼中有輸出
topk: 1 根據分類數調整
image_shape: [3, 224, 224] 圖片大小根據實際情況調整
TRAIN:
file_list: "./dataset/battery/train.txt" 為train.txt路徑
data_dir: "./dataset/battery/"
VALID: 同上
開始訓練:
python -m paddle.distributed.launch --selected_gpus="0" tools/train.py -c ./configs/quick_start/ResNet50_vd_ssld_finetune_battery.yaml
訓練的結果會儲存在output目錄下
一共訓練20輪,配置save_interval: 1 為每次都儲存,我們採用best_model目錄中的權重ppcls.pdopt和ppcls.pdparams
模型評估:
修改configs/leval.yaml檔案
mode: 'valid'
ARCHITECTURE:
name: "ResNet50_vd"
pretrained_model: "./output/ResNet50_vd/best_model/ppcls"
classes_num: 2
total_images: 5674
topk: 1
image_shape: [3, 224, 224]
VALID:
batch_size: 16
num_workers: 4
file_list: "./dataset/battery/val.txt"
data_dir: "./dataset/battery/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
主要修改幾個引數:
pretrained_model: "./output/ResNet50_vd/best_model/ppcls" 為訓練好儲存的權重路徑
classes_num: 2 分類數
total_images: 5674 圖片數
topk: 1根據分類數調整
image_shape: [3, 224, 224]圖片大小根據實際情況調整
執行 python -m paddle.distributed.launch --selected_gpus="0" tools/eval.py -c ./configs/eval.yaml
模型推理:
PaddlePaddle提供三種方式進行預測推理,接下來介紹如何用預測引擎進行推理: 首先,對訓練好的模型進行轉換:
python tools/export_model.py --model=ResNet50_vd --pretrained_model=output/ResNet50_vd/best_model/ppcls --output_path=inference/ResNet50_vd/ --class_dim=2
這裡在pretrained_model後面一定要加ppcls
會在inference資料夾中生成一下檔案
之後,通過預測引擎進行推理:
python ./tools/infer/predict.py -i=./dataset/battery/binary_1/123(7)19_1.jpg --model_file=./inference/ResNet50_vd.pdmodel --params_file=./inference/ResNet50_vd.pdiparams --use_gpu=1
輸出結果:Current image file: ./dataset/battery/binary_1/123(7)19_1.jpg
top-1 class: 1
top-1 score: 0.99908447265625