Классификация персика на основе PaddleHub
-
Для получения дополнительных предварительно обученных моделей (изображение, текст, голос, видео и т. д.) см.:PaddleHub
-
Дополнительные учебные материалы см.Платформа глубокого обучения Flying Paddle
1. История дела
Со стремительным развитием времени современное общество вступило в эпоху искусственного интеллекта. Сила искусственного интеллекта установила ускорители для китайского сельского хозяйства. В настоящее время люди могут начать использовать спутниковую технологию дистанционного зондирования, чтобы наблюдать за ростом урожая, сортировке фруктов могут помочь системы сортировки, а орошение и внесение удобрений можно автоматизировать с помощью механизации...
Возьмем в качестве примера сцену сортировки фруктов. Большая фруктовая плантация наймет большое количество сортировщиков, чтобы сортировать фрукты в сезон сбора урожая. Это приводит к большим трудозатратам. При этом уровень ручной сортировки разный, что сильно влияет на доход фермеров. Однако с появлением интеллектуальных систем сортировки фруктов, которые могут автоматически сортировать в соответствии с сортами культур, таких как фрукты, снижать трудозатраты, повышать эффективность обработки и обеспечивать точность сортировки, возникает проблема.
Как построить полную интеллектуальную систему сортировки фруктов? Так совпало, что PaddleHub может помочь вам выполнить полную настройку системы!
Сегодня мы познакомим вас с PaddleHub для создания сети ResNet50_vd для достижения персиковой классификации, чтобы вы могли лично ощутить прелесть классификации изображений.
Эта практика направлена на то, чтобы дать каждому предварительное представление о проблеме классификации изображений с помощью классификации персиков, и в то же время понять и освоить, как использовать PaddleHub для построения классической сверточной нейронной сети.
Общая структура этого дела выглядит следующим образом:
2. Строительство и подготовка среды
Установите PaddlePaddle: СправочникБыстрая установка, aistudio имеет предустановленный PaddlePaddle.
Установите PaddleHub: чтобы обеспечить стабильность последней версии, рекомендуется выполнить следующую команду для установки.
!pip install paddlehub==2.0.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
3. Подготовка данных
В файлах данных, представленных в этом учебном пособии, были предоставлены разделенный обучающий набор, проверочный набор и файлы индекса набора тестов и аннотаций. Если пользователи используют PaddleHub для переноса задач CV и использования пользовательских данных, им необходимо разделить набор данных самостоятельно и разделить набор данных на набор для обучения, набор для проверки и набор для тестирования. Для записи соответствующих путей к изображениям и меток требуются три текстовых файла, а для записи имен меток требуется файл меток. Связанные методы могут относиться кпользовательский набор данных. Система сортировки персиков делится на 4 сорта в зависимости от персиков.
в:
- R0 лучший: ярко-красный цвет и более крупный плод.
- B1 на втором месте: плод крупнее, а цвет краснее.
- М2 средний: плод средний
- S3 плохой: плод относительно маленький
Данные разделены на обучающий набор, проверочный набор и тестовый набор.Обучающий набор составляет 1500 штук каждого вида персиков, проверочный набор составляет 100 штук каждого вида персиков, а тестовый набор составляет 15 штук каждого вида персиков. .
├─data: 数据目录
├─train_list.txt:训练集数据列表
├─test_list.txt:测试集数据列表
├─validate_list.txt:验证集数据列表
├─label_list.txt:标签列表
└─……
Формат файлов списка данных для обучающего набора, набора проверки и набора тестов следующий, а столбцы разделены пробелом.
图片1路径 图片1标签
图片2路径 图片2标签
...
Формат label_list.txt следующий:
分类1名称
分类2名称
...
Затем распакуйте набор данных:
!unzip -q -o ./data/data67225/peach.zip -d ./work
После подготовки данных вы можете использовать PaddleHub для завершения построения устройства чтения данных.Метод реализации следующий: создайте класс Python для чтения данных и наследуйте класс paddle.io.Dataset для завершения построения средства чтения данных. При определении набора данных необходимо предварительно определить операции предварительной обработки набора данных и установить схему данных. В определении набора данных необходимо переопределить__init__
,__getitem__
и__len__
три части. Пример выглядит следующим образом:
#coding:utf-8
import os
import paddle
import paddlehub as hub
class DemoDataset(paddle.io.Dataset):
def __init__(self, transforms, num_classes=4, mode='train'):
# 数据集存放位置
self.dataset_dir = "./work/peach-classification" #dataset_dir为数据集实际路径,需要填写全路径
self.transforms = transforms
self.num_classes = num_classes
self.mode = mode
if self.mode == 'train':
self.file = 'train_list.txt'
elif self.mode == 'test':
self.file = 'test_list.txt'
else:
self.file = 'validate_list.txt'
self.file = os.path.join(self.dataset_dir , self.file)
self.data = []
with open(self.file, 'r') as f:
for line in f.readlines():
line = line.strip()
if line != '':
self.data.append(line)
def __getitem__(self, idx):
img_path, grt = self.data[idx].split(' ')
img_path = os.path.join(self.dataset_dir, img_path)
im = self.transforms(img_path)
return im, int(grt)
def __len__(self):
return len(self.data)
Прежде чем вводить обучающие данные в модель, нам обычно необходимо выполнить некоторую работу по обработке исходных данных, например, нормализовать формат данных или добавить некоторые стратегии улучшения данных.
Средство чтения данных, которое строит модель классификации изображений, отвечает за предварительную обработку данных набора данных персика, организацию их в определенном формате и ввод их в модель для обучения.
Следующие стратегии обработки данных выполняют только три операции:
1. Укажите размер входного изображения и равномерно обработайте все образцы данных до этого размера.
2. Обрежьте входное изображение и оставьте без изменений центральную точку изображения.
3. Нормализация всех входных данных изображения.
Ниже приведены примеры предварительной обработки данных и загрузки наборов данных:
import paddlehub.vision.transforms as T
transforms = T.Compose(
[T.Resize((256, 256)),
T.CenterCrop(224),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])],
to_rgb=True)
peach_train = DemoDataset(transforms)
peach_validate = DemoDataset(transforms, mode='val')
peach_test = DemoDataset(transforms, mode='test')
PaddleHub предоставляет расширенные методы предварительной обработки данных.предварительная обработка.
4. Подготовка модели
Нам нужно выбрать подходящую предварительно обученную модель для точной настройки в PaddleHub, Поскольку классификация персиков является задачей классификации изображений, здесь используется модель Resnet50, и это предварительно обученная версия с использованием набора данных ImageNet. Эта модель предварительного обучения представляет собой универсальную модель для задач с изображениями. Resnet в настоящее время является более эффективной сетевой структурой для обработки изображений. 50 слоев — это выбор как для точности, так и для производительности, а ImageNet является крупнейшим доступны в области компьютерного зрения Категориальные наборы данных. Поэтому, когда неясно, какую модель выбрать, эту модель можно использовать в качестве базовой.
Использование PaddleHub для загрузки модели ResNet50 очень просто и может быть реализовано всего одной строкой кода. Дополнительные сведения о предварительно обученных моделях см.Введение в модель PaddleHub
#安装预训练模型
!hub install resnet50_vd_imagenet_ssld==1.1.0
# 加载模型
import paddlehub as hub
model = hub.Module(name='resnet50_vd_imagenet_ssld', label_list=["R0", "B1", "M2", "S3"])
5. Модельное обучение
В данном случае мы используем оптимизатор Adam, предложенный Kingma и Lei Ba в декабре 2014 года. Всесторонне рассматриваются оценка момента первого порядка градиента (оценка первого момента, то есть среднее значение градиента) и оценка момента второго порядка (оценка второго момента, то есть нецентрированная дисперсия градиента). и рассчитывается размер шага обновления. Он имеет преимущества простой реализации, высокой вычислительной эффективности, меньших требований к памяти, обновления параметров не зависят от градиентного масштабирования, гиперпараметры хорошо интерпретируются и обычно не требуют настройки или требуют лишь небольшой тонкой настройки. Мы устанавливаем скорость обучения на 0,001 и тренируем 10 эпох.
from paddlehub.finetune.trainer import Trainer
import paddle
optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
trainer = Trainer(model, optimizer, checkpoint_dir='img_classification_ckpt', use_gpu=True)
trainer.train(peach_train, epochs=10, batch_size=16, eval_dataset=peach_validate, save_interval=1)
вpaddle.optimizer.Adam
:
-
learning_rate
: Глобальная скорость обучения. По умолчанию 1e-3; -
parameters
: параметры модели, которые необходимо оптимизировать.
запустить конфигурацию
Trainer
В основном управляет тренировкой Fine-tune, включая следующие контролируемые параметры:
-
model
: оптимизированная модель; -
optimizer
: выбор оптимизатора; -
use_vdl
: Использовать ли vdl для визуализации тренировочного процесса; -
checkpoint_dir
: адрес, по которому сохраняются параметры модели; -
compare_metrics
: сохранить метрики оптимальной модели;
trainer.train
Он в основном контролирует конкретный тренировочный процесс, включая следующие контролируемые параметры:
-
train_dataset
: набор данных, используемый для обучения; -
epochs
: количество тренировочных раундов; -
batch_size
: размер партии обучения, при использовании графического процессора отрегулируйте размер партии в соответствии с реальной ситуацией; -
num_workers
: количество работ, по умолчанию 0; -
eval_dataset
: набор проверки; -
log_interval
: Интервал для печати журналов, единица измерения — количество раз для выполнения пакетного обучения. -
save_interval
: Сохраните интервальную частоту модели, единицей измерения является количество эпох для выполнения обучения.
Когда тонкая настройка завершена, мы используем модель, чтобы сделать следующие прогнозы:
6. Оценка модели
Здесь мы используем тестовый набор для оценки обученной модели.
# 模型评估
trainer.evaluate(peach_test, 16)
7. Предсказание модели
Здесь мы используем обученную модель для прогнозирования изображения в тестовом наборе и наблюдаем, согласуются ли прогнозируемые результаты с реальными результатами.
import paddle
import paddlehub as hub
from PIL import Image
import matplotlib.pyplot as plt
img_path = './work/peach-classification/test/M2/0.png'
img = Image.open(img_path)
plt.imshow(img)
plt.axis('off')
plt.show()
label = img_path.split('/')[-2]
result = model.predict([img_path])
print("桃子的真实类别为: {},被预测为:{}".format(label, result))
Выше приведен фактический результат прогнозирования после загрузки модели (здесь тестируется только одно изображение), и фактический эффект прогноза возвращается.Можно видеть, что мы передаем в категорию M2 персиковую фотографию, которую нужно предсказать, и модель прогноз после тонкой настройки. Эффект также M2, что позволяет успешно завершить перенос обучения классификации персика.
8. Развертывание модели
Поскольку AIStudio не поддерживает доступ по IP, следующий код является лишь примером, при необходимости запустите его на локальном компьютере.
Если мы хотим использовать собственные обученные сетевые параметры для сортировки персиков, сначала настроимconfig.json
документ:
{
"modules_info": {
"resnet50_vd_imagenet_ssld": {
"init_args": {
"version": "1.1.0",
"label_list":["R0", "B1", "M2", "S3"],
"load_checkpoint": "img_classification_ckpt/best_model/model.pdparams"
},
"predict_args": {
"batch_size": 1
}
}
},
"port": 8866,
"gpu": "0"
}
С PaddleHub развертывание на стороне сервера также очень простое, просто используйте командную строку, чтобы запустить модель классификации resnet50 на сервере:
$ hub serving start --config config.json
Да, на стороне сервера все в порядке. По сравнению с ручной настройкой различных параметров или вызовом различных фреймворков сервер развертывания PaddleHub действительно полезен.
NOTE:Если вы используете предсказание GPU, вам необходимо установить переменную среды CUDA_VISIBLE_DEVICES перед запуском службы, в противном случае не устанавливайте ее.
Отправить запрос на сервер, скрипт запроса следующий:
import requests
import json
import cv2
import base64
import numpy as np
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
def base64_to_cv2(b64str):
data = base64.b64decode(b64str.encode('utf8'))
data = np.fromstring(data, np.uint8)
data = cv2.imdecode(data, cv2.IMREAD_COLOR)
return data
# 发送HTTP请求
org_im = cv2.imread('/PATH/TO/IMAGE')
data = {'images':[cv2_to_base64(org_im)], 'top_k':1}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/resnet50_vd_imagenet_ssld"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
data =r.json()["results"]['data']
Я считаю, что пока есть некоторая основа Python, нет проблем с локальным прогнозированием и развертыванием на стороне сервера.PaddleHub of PaddleHub уже помог нам выполнить различные процедуры обработки.
9. Больше информации о PaddleEdu
1. Универсальная онлайн-энциклопедия глубокого обучения PaddleEdu.awesome-DeepLearningЕсть и другие способности, вы можете рассчитывать на это:
- Введение в глубокое обучение
- Вопросы глубокого обучения
- специальный класс
- производственная практика
Если у вас возникнут вопросы во время использования PaddleEdu, обращайтесьawesome-DeepLearningОтправьте вопрос, и для получения дополнительных материалов для углубленного изучения, пожалуйста, обратитесь кПлатформа глубокого обучения Flying Paddle.
не забудьте заказатьStar⭐ Любимый О~~
2. Группа технического обмена PaddleEdu (QQ)
В настоящее время в группе QQ более 2000 студентов, которые учатся вместе, добро пожаловать, чтобы отсканировать код, чтобы присоединиться.