1. 程式人生 > 其它 >PaddleClas在windows10下訓練自己的資料

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