Практика с вами, чтобы реализовать классификатор мусора на основе глубокого обучения

глубокое обучение

С обновлением PaddlePaddle 2.0 пакет классификации изображений PaddleClas также был обновлен до версии 2.0-rc1. Новая версия пакета PaddleClas уже по умолчанию использует динамические графики для обучения моделей. Теперь мы реализуем простой классификатор мусора с нуля, используя пакет PaddleClas. Приходите и оцените удобство и скорость новой версии PaddleClas, даже новички смогут быстро обучить высокоточные модели. Эта статья разделена на верхнюю и нижнюю части. В верхней части объясняется, как тренироваться с нуля, а в нижней части объясняются некоторые основные коды и методы, используемые в процессе обучения глубокому обучению.

1. Подготовьте набор данных

Адрес загрузки набора данных:Студия любви Baidu.com/love studio/big…После загрузки набора данных сначала необходимо распаковать сжатый пакет.

mkdir dataset
cd dataset
unzip garbage_classify.zip

В наборе данных 43 категории, например: 9 для «кухонных отходов/фруктовой мякоти», 22 для «вторсырья/использованной одежды, 39 для опасных отходов/лекарств с истекшим сроком годности». Конкретные категории см. в файлеgerger_classify_rule.json в файлеgerger_classify.

После того, как у вас есть набор данных, вам нужно разделить набор данных. Создайте файл process_dataset.py в каталоге набора данных и используйте следующий код, чтобы разделить набор данных на обучающий набор, проверочный набор и тестовый набор с соотношением 8:1:1.

import os
import glob
import numpy as np
file_list = glob.glob('./garbage_classify/train_data/*.txt')
np.random.shuffle(file_list)
train_len = len(file_list) // 10 * 8
val_len = len(file_list) // 10
train_list = []

for txt_file in file_list[:train_len]:
    with open(txt_file, 'r') as f:
        line = f.readlines()[0]

        line = line.strip()
        image_file,label = line.split(',')
        image_file = image_file.strip()
        label = label.strip()
        image_path = os.path.join('./garbage_classify/train_data/', image_file)
        train_list.append(image_path + ' ' + label + '\n')
with open('train_list.txt', 'w') as f:
    f.writelines(train_list)

val_list = []
for txt_file in file_list[train_len:train_len + val_len]:
    with open(txt_file, 'r') as f:
        line = f.readlines()[0]

        line = line.strip()
        image_file,label = line.split(',')
        image_file = image_file.strip()
        label = label.strip()
        image_path os.path.join('./garbage_classify/train_data/', image_file)
        val_list.append(image_path + ' ' + label + '\n')
with open('val_list.txt', 'w') as f:
    f.writelines(val_list)

test_list = []
for txt_file in file_list[train_len + val_len:]:
    with open(txt_file, 'r') as f:
        line = f.readlines()[0]

        line = line.strip()
        image_file,label = line.split(',')
        image_file = image_file.strip()
        label = label.strip()
        image_path = os.path.join('./garbage_classify/train_data/', image_file)
        test_list.append(image_path + ' ' + label + '\n')
with open('test_list.txt', 'w') as f:
    f.writelines(test_list)

После запуска приведенного выше кода структура каталогов выглядит следующим образом:

├── garbage_classify
├── process_dataset.py
├── test_list.txt
├── train_list.txt
└── val_list.txt

2. Загрузите комплект PaddleClas

Загрузите исходный код PaddleClas и переключитесь на версию 2.0-rc1. Чтобы установить зависимости пакета, обратитесь к следующим документам:GitHub.com/paddle pad DL…

git clone https://github.com/PaddlePaddle/PaddleClas.git
git fetch
git branch release/2.0-rc1 origin/release/2.0-rc1

3. Измените файл конфигурации

Пакет PaddleClas содержит различные модели нейронных сетей, а также параметры обучения, соответствующие моделям.Параметры конфигурации сохраняются в пути configs. Для этого классификатора мусора я выбрал широко используемую в отрасли сеть ResNet50 в качестве классификатора. Сначала создайте новый файл конфигурации классификатора мусора, скопировав его.

cd PaddleClas/configs/ResNet/
cp ResNet50_vd.yaml garbage_ResNet50_vd.yaml

Затем измените файлgerger_ResNet50_vd.yaml следующим образом:

mode: 'train'
ARCHITECTURE:
    name: 'ResNet50_vd'

pretrained_model: ""
model_save_dir: "./output/"
classes_num: 43
total_images: 1281167
save_interval: 1
validate: True
valid_interval: 1
epochs: 200
topk: 5
image_shape: [3, 224, 224]

use_mix: False
ls_epsilon: 0.1

LEARNING_RATE:
    function: 'Cosine'          
    params:                   
        lr: 0.001               

OPTIMIZER:
    function: 'Momentum'
    params:
        momentum: 0.9
    regularizer:
        function: 'L2'
        factor: 0.000070

TRAIN:
    batch_size: 256
    num_workers: 0
    #这里改成dataset的真实路径,推荐使用绝对路径
    file_list: "../dataset/train_list.txt" 
    data_dir: "../dataset/"
    shuffle_seed: 0
    transforms:
        - DecodeImage:
            to_rgb: True
            to_np: False
            channel_first: False
        - RandCropImage:
            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:
    mix:                       
        - MixupOperator:    
            alpha: 0.2      

VALID:
    batch_size: 64
    num_workers: 0
    #这里改成dataset的真实路径,推荐使用绝对路径
    file_list: "../dataset/val_list.txt"
    data_dir: "../dataset/aistudio/"
    shuffle_seed: 0
    transforms:
        - DecodeImage:
            to_rgb: True
            to_np: False
            channel_first: False
        - ResizeImage:
            resize_short: 256
        - CropImage:
            size: 224
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - ToCHWImage:

4. Начать обучение

Чтобы ускорить сходимость модели и повысить точность модели, здесь я решил сначала загрузить предварительно обученную модель, а затем выполнить точную настройку модели. Сначала вам нужно загрузить предварительно обученные веса.

wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_pretrained.pdparams

Затем начните обучение модели:

python tools/train.py \
    -c configs/ResNet/garbage_ResNet50_vd.yaml \
    -o pretrained_model="ResNet50_vd_pretrained" \
    -o use_gpu=True

Журнал ввода во время обучения выглядит следующим образом:

W1214 20:29:28.872682  1473 device_context.cc:338] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 10.1
W1214 20:29:28.877846  1473 device_context.cc:346] device: 0, cuDNN Version: 7.6.
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1175: UserWarning: Skip loading for out.weight. out.weight receives a shape [2048, 1000], but the expected shape is [2048, 43].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1175: UserWarning: Skip loading for out.bias. out.bias receives a shape [1000], but the expected shape is [43].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
2020-12-14 20:29:33 INFO: Finish initing model from ResNet50_vd_pretrained
2020-12-14 20:29:36 INFO: epoch:0  , train step:0   , loss: 3.78009, top1: 0.00781, top5: 0.11328, lr: 0.001000, batch_cost: 2.94361 s, reader_cost: 2.13878 s, ips: 86.96806 images/sec.
2020-12-14 20:30:01 INFO: epoch:0  , train step:10  , loss: 3.70998, top1: 0.06641, top5: 0.26953, lr: 0.001000, batch_cost: 2.42268 s, reader_cost: 1.62624 s, ips: 105.66822 images/sec.
2020-12-14 20:30:25 INFO: epoch:0  , train step:20  , loss: 3.62013, top1: 0.10938, top5: 0.35938, lr: 0.001000, batch_cost: 2.43433 s, reader_cost: 1.63609 s, ips: 105.16244 images/sec.
2020-12-14 20:30:50 INFO: epoch:0  , train step:30  , loss: 3.53434, top1: 0.21484, top5: 0.41406, lr: 0.001000, batch_cost: 2.46094 s, reader_cost: 1.66256 s, ips: 104.02520 images/sec.

5. Оценка модели

Чтобы быстро увидеть эффект, после 100 эпох тренировок можно сначала прекратить тренировки. Точность текущей лучшей модели в проверочном наборе составляет top1: 0,90589, top5: 0,98966.

Затем мы оцениваем точность лучшей модели на тестовом наборе.

Измените путь проверочного набора в файле PaddleClas/configs/ResNet/garbage_ResNet50_vd.yaml на тестовый набор.

VALID:
    batch_size: 64
    num_workers: 0
    file_list: "/home/aistudio/test_list.txt"
    data_dir: "/home/aistudio/"

приступить к оценке модели,

python tools/eval.py -c \
./configs/ResNet/garbage_ResNet50_vd.yaml -o \
pretrained_model="./output/ResNet50_vd/best_model/ppcls"

Результаты приведены ниже:

2020-12-15 09:08:25 INFO: epoch:0  , valid step:0   , loss: 1.05716, top1: 0.89062, top5: 1.00000, lr: 0.000000, batch_cost: 0.75766 s, reader_cost: 0.68446 s, ips: 84.47009 images/sec.
2020-12-15 09:08:31 INFO: epoch:0  , valid step:10  , loss: 0.89015, top1: 0.92188, top5: 1.00000, lr: 0.000000, batch_cost: 0.58153 s, reader_cost: 0.51459 s, ips: 110.05544 images/sec.
2020-12-15 09:08:36 INFO: epoch:0  , valid step:20  , loss: 0.91526, top1: 0.90625, top5: 1.00000, lr: 0.000000, batch_cost: 0.58075 s, reader_cost: 0.51361 s, ips: 110.20320 images/sec.
2020-12-15 09:08:42 INFO: epoch:0  , valid step:30  , loss: 0.83382, top1: 0.92857, top5: 1.00000, lr: 0.000000, batch_cost: 0.55392 s, reader_cost: 0.48895 s, ips: 25.27445 images/sec.
2020-12-15 09:08:42 INFO: END epoch:0   valid loss: 0.96556, top1: 0.90331, top5: 0.99018,  batch_cost: 0.55392 s, reader_cost: 0.48895 s, batch_cost_sum: 11.63230 s, ips: 25.27445 images/sec.

Видно, что точность текущей оптимальной модели на тестовом наборе составляет top1: 0,90331, top5: 0,99018. Точность может достигать 90%, конечно, эта точность может быть улучшена. Точность модели может быть дополнительно улучшена за счет настройки параметров, замены моделей и дополнения данных.

В следующей статье будет проанализирован основной код пакета PaddleClas и некоторые стратегии настройки.

Адрес склада PaddleClas:GitHub.com/paddle pad DL…

Эта статья была включена в:blog.aistudyclub.com/