Болезни растений представляют собой серьезную угрозу для местной и национальной экономики, в значительной степени зависящей от сельского хозяйства, бросают вызов продовольственной безопасности из-за снижения урожайности, а также влияют на общие средства к существованию фермеров и специалистов-практиков в сельском хозяйстве. Традиционные методы выявления болезней растений, такие как визуальный осмотр людьми, оказались очень неэффективными, поэтому крайне необходимо разработать улучшенные методы идентификации и классификации болезней растений для предотвращения потенциальных потерь урожая.
В этом руководстве я научу вас, как комплексно решить эту проблему, используя методы глубокого обучения для мультиклассовой классификации изображений и Tensorflow.js для развертывания построенной модели и выполнения логических выводов в браузере. В этом подробном руководстве подробно описаны все основные этапы, от загрузки наборов данных через Kaggle API до создания модели с помощью передачи обучения с помощью Keras (MobileNet) и, наконец, развертывания модели с помощью Tensorflow.js.
Требование / предварительные условия
Это руководство для новичков, однако от вас ожидаются базовые знания Python, Javascript, работы с записной книжкой Jupyter и построения моделей машинного обучения или глубокого обучения. Не волнуйтесь, если вы не соответствуете этим требованиям. В руководстве будут упрощены шаги, которые помогут хотя бы получить свежую информацию. Другие очень необходимые требования:
- Учетная запись Google для доступа к диску Google и блокнот Google для совместной работы (мы будем использовать эту среду и блокнот Google colab, чтобы упростить процесс построения / обучения модели и получить доступ к бесплатному графическому процессору, отметьте здесь, чтобы начать),
- Учетная запись Kaggle для загрузки необходимых наборов данных для обучения нашей модели с помощью учетных данных Kaggle API. Пожалуйста, проверьте «https://www.kaggle.com/ru, чтобы начать работу,
- IDE (например, VSCode) для написания кодов Javascript,
- И самое главное, те, кто не хочет учиться.
Начиная
Первый шаг к началу работы - настройка вашей среды.
- Зайдите на свой Google диск на https://drive.google.com/ и создайте новую папку РАСПОЗНАВАНИЕ ЗАБОЛЕВАНИЙ.
- Создайте новый файл совместной работы Google в этой папке, чтобы настроить среду, например, plantdiseaserecognition.ipynb.
- Измените среду выполнения Google Colab на графический процессор, чтобы оптимизировать процесс обучения модели. Среда выполнения ›Изменить тип среды выполнения› Выберите графический процессор в качестве предпочтительного аппаратного ускорителя.
Итак, ребята, приступим!
Коды и реализация
Раздел реализации будет структурирован в виде последовательности подробных шагов, я знаю, что вы очень к этому подготовлены.
ШАГ 1. - Настройка среды и подключение Google Colab к нашей учетной записи на Google Диске
Этот шаг включает в себя настройку среды и каталогов, в которых мы будем сохранять наборы данных, которые будут использоваться для обучения нашей модели, через подключение к нашей учетной записи на Google Диске.
Во-первых, вам необходимо подключить среду Google colab к своей учетной записи на диске Google и изменить рабочий каталог на папку, созданную вами ранее на диске Google «РАСПОЗНАВАНИЕ ЗАБОЛЕВАНИЙ». Запустите эту ячейку в своей записной книжке и авторизуйтесь при необходимости.
# Connecting Google drive to Google colab environment from google.colab import drive drive.mount('/content/drive') # Change working directory to folder created previously cd '/content/drive/My Drive/PLANT DISEASE RECOGNITION'
Следующим шагом является создание необходимых папок, которые нам понадобятся для хорошей структуры проекта. Это папки «config» (для сохранения наших файлов конфигурации), «models» (для сохранения наших обученных моделей и весов), «datasets» (для сохранения наших загруженных наборов данных), «checkpoints» (для сохранения наших контрольных точек обучения модели). Вы можете легко сделать это, запустив эту команду в другой ячейке кода: -
# Creating neccesary directories !mkdir config datasets checkpoints models
ШАГ 2. - Загрузка необходимых наборов данных из Kaggle с помощью Kaggle API
Этот шаг влечет за собой загрузку необходимых наборов данных для обучения из kaggle. Мы будем использовать набор данных о новых болезнях растений, общедоступный на Kaggle, и загрузим его через сгенерированный токен API.
Чтобы получить свой API-ключ, войдите в свою учетную запись kaggle на https://kaggle.com и перейдите в раздел своей учетной записи: -
Прокрутите вниз до раздела API на странице своей учетной записи и нажмите «Создать новый токен API». На ваш локальный компьютер будет загружен файл «kaggle.json», содержащий ваши учетные данные API.
Перейдите на свой диск Google и загрузите загруженный файл json в каталог «config». В качестве альтернативы вы можете запустить следующие коды в Google colab для автоматизации процесса: -
# Change directory to the previously created 'config' folder cd config # Upload the downloaded json file from your computer to Google drive from google.colab import files files.upload()
Файл «kaggle.json» успешно загружен в папку «config».
Внутри записной книжки Colab запустите эту ячейку кода, чтобы предоставить записной книжке доступ к файлу «kaggle.json»: -
import os os.environ['KAGGLE_CONFIG_DIR'] = "/content/drive/My Drive/PLANT DISEASE RECOGNITION/config"
Отличная работа. Измените рабочий каталог на «наборы данных» в новой ячейке кода, куда мы будем загружать наборы данных.
cd '/content/drive/My Drive/PLANT DISEASE RECOGNITION/datasets'
Мы будем использовать новый набор данных о болезнях растений на kaggle, который содержит 87 тысяч изображений здоровых и инфицированных листьев сельскохозяйственных культур, разделенных на 38 различных классов. Перейдите › https://www.kaggle.com/vipoooool/new-plant-diseases-dataset в своем браузере, чтобы получить доступ к набору данных. Щелкните значок с тремя точками ›Скопируйте команду API› и вставьте новую ячейку кода, чтобы загрузить заархивированные наборы данных в текущий каталог наборы данных.
!kaggle datasets download -d vipoooool/new-plant-diseases-dataset
После загрузки разархивируйте загруженные наборы данных, используя эту команду в новой ячейке кода: -
#Unzipping the zip files to extract the dataset folder and deleting the zip files !unzip \*.zip && rm *.zip
Замечательно! После распаковки назначьте базовый каталог для наборов данных переменной «base_dir».
base_dir = './New Plant Diseases Dataset(Augmented)/New Plant Diseases Dataset(Augmented)' # Check the directories in the base_dir , OUTPUT = ['train', 'valid'] os.listdir(base_dir)
Конец ШАГА 2, перейдем к следующему разделу
ШАГ 3. - Импорт необходимых библиотек и загрузка наборов данных для обучения и проверки с помощью ImageDataGenerator (для увеличения данных)
Этот раздел влечет за собой загрузку наборов данных, необходимых для обучения нашей модели.
Первым шагом является импорт / загрузка необходимых библиотек в новую ячейку кода: -
Как было показано ранее, общий набор данных делится на набор для обучения и проверки в соотношении 80/20 и сохраняется в разных каталогах для сохранения структуры каталогов. Папка «поезд» содержит набор данных поезда, а папка «действительный» содержит набор для проверки.
Мы будем использовать класс ImageDataGenerator, импортированный из keras.preprocessing.image, чтобы генерировать случайные пакеты данных тензорного изображения, а также выполнять на них увеличение данных в реальном времени. С помощью Data Augmentation мы можем выполнять случайную нормализацию, методы масштабирования и преобразования в нашем наборе данных, чтобы предотвратить переоснащение и обеспечить правильное обобщение нашей модели.
ImageDataGenerator также предоставляет методы для загрузки расширенных изображений из каталогов наборов данных с помощью метода «flow_from_directory ()», а также из фреймов данных pandas с использованием метода «flow_from_dataframe ()». Генераторы также могут быть переданы в качестве входных данных методам модели keras, которые принимают входные данные генератора, такие как fit_generator (), для обучения нашей модели.
Запустите этот код в новой ячейке кода, чтобы выполнить увеличение и преобразование данных для набора данных для обучения и проверки: -
Следующим шагом является загрузка изображений (с помощью метода flow_from_directory () в генераторах) из родительских каталогов, содержащих папки для каждой отдельной категории / класса. В нашем случае родительскими каталогами являются «поезд» (для набора данных поезда) и «действительный» (для набора данных проверки). Имена классов / меток будут автоматически сгенерированы из имен подкаталогов, поэтому нам не нужно определять их явно.
Запустите это в новой ячейке кода, чтобы выполнить эту операцию: -
Выход :-
Удивительно !, вы успешно загрузили изображения из соответствующих каталогов. Следующим шагом является сохранение файла class_indices, который представляет собой словарь, в котором закодированный индекс является ключом, а имя метки - значением. Он будет сохранен как файл json для использования в будущем.
import json classes_dict = train_set_from_dir.class_indices with open('/content/drive/My Drive/PLANT DISEASE RECOGNITION/class_indices.json','w') as f: json.dump(classes_dict, f)
Отличная работа, затем мы можем легко загрузить случайную выборку из загруженных изображений и построить ее с помощью matplotlib.
ШАГ 4. - Создание и обучение модели MobileNet V2 с помощью Transfer Learning
Трансферное обучение - это стратегия построения модели в машинном обучении, которая включает в себя «повторное использование» предварительно обученной модели для конкретной задачи для повышения производительности аналогичной задачи (например, «передача» или «повторная передача»). используя ' модель, обученную для конкретной задачи другой задаче). Мы используем переносное обучение с весами ImageNet (вместо создания с нуля) для этой задачи, потому что это помогает ускорить время обучения и сходимость, а также позволяет нам использовать передовые модели, разработанные другими экспертами по глубокому обучению.
Модель MobileNet будет использоваться специально для этой задачи из-за ее легкой архитектуры, скорости и совместимости с Tensorflow.js. Тем не менее, вам рекомендуется попробовать другие модели трансферного обучения, такие как ResNet, InceptionV3, DenseNet, VGG, чтобы оценить их соответствующую производительность. Пожалуйста, обратитесь к разделу ссылки, чтобы получить больше теоретических знаний об архитектуре MobileNet (слои и используемые свертки / вычисления).
Итак, наша задача сейчас - повторно использовать модель MobileNet, заморозить базовые слои и добавить несколько необходимых верхних слоев для обучения нашего классификатора.
Запустите следующие коды в новой ячейке кода, PS: - При необходимости вы можете выполнить рефакторинг этого раздела: -
Мы успешно построили архитектуру модели с использованием предварительно обученных весов из набора данныхImageNet, слоев MobileNet и дополнительных плотных слоев для нашей проблемы. Затем мы замораживаем только первые 20 слоев и проверяем их веса. Тем не менее, вам рекомендуется продолжить настройку этой модели.
PS: - Обратите внимание, что это не лучшая модель для данного случая, это только базовая архитектура для целей данного руководства. Рекомендуется создать модель CNN с нуля или настроить эту модель путем точной настройки или добавления дополнительных слоев для получения более оптимальной производительности.
Затем вы можете получить сводную информацию о структуре и параметрах модели:
# Compiling the model with the optimizer and loss function # categorical_accuracy is used as the loss function because it is a multi-class classification task mobilenet_model.compile(optimizer = Adam(), loss = 'categorical_crossentropy', metrics = ['accuracy'] )
Отличная работа! Следующий шаг - настроить обратные вызовы для нашей построенной модели и обучить модель на нашем сгенерированном наборе данных.
Запустите следующий код в новой ячейке кода: -
Аргумент steps_per_epoch установлен на 128 для обучающего набора и 100 для набора проверки, это определяет количество пакетов выборок для обучения для каждой эпохи. Поскольку мы определили размер нашей партии как 32 для генератора данных обучения и проверки, это означает, что мы обучаемся с (128 * 32 = 2¹² выборками) для каждой эпохи обучения и (100 * 32 = 3200 выборок) для каждой эпохи проверки.
Замечательно!, если вы уже сделали это, получите холодную бутылку вашего любимого напитка и сделайте паузу, пока ваша модель тренируется.
Наша модель прошла обучение, затем мы можем оценить производительность набора данных проверки.
Хорошая производительность, мы можем легко создать график производительности за эпоху с помощью matplotlib, чтобы получить более наглядное представление.
n = 6 plt.figure(figsize = (8,5)) plt.plot(np.arange(1,n+1), history.history['loss'], label = 'train_loss') plt.plot(np.arange(1,n+1), history.history['val_loss'], label = 'val_loss') plt.plot(np.arange(1,n+1), history.history['accuracy'], label = 'train_accuracy') plt.plot(np.arange(1,n+1), history.history['val_accuracy'], label = 'val_accuracy') plt.grid(True) plt.legend(loc = "best") plt.savefig('/content/drive/My Drive/PLANT DISEASE RECOGNITION/performance.jpg') plt.show()
Отлично !, Вы легко можете проверить работоспособность модели на случайных изображениях из тестового набора (см. Блокнот). Следующим шагом является сохранение модели в каталоге models, созданном ранее (для повторного использования). Модель сохраняется в формате HDF5 (.h5) (формат файла с открытым исходным кодом, который поддерживает хранение сложных / разнородных данных).
# Save model as HDF5 format mobilenet_model.save('/content/drive/My Drive/PLANT DISEASE RECOGNITION/models/mobilenet_model.h5')
Следующий шаг включает преобразование модели, созданной в Keras (python), в модель Tensorflow.js, чтобы мы могли встроить ее в веб-приложение для вывода на основе браузера.
Эти и другие шаги будут обсуждаться во второй части этой серии. Я очень надеюсь, что вам понравилось это руководство, и рекомендую вам прочитать ЧАСТЬ 2 также здесь. Записную книжку Jupyter для этого руководства можно найти здесь: - https://colab.research.google.com/drive/1_VBVthqVSvj8QqSvlfm2k1ZviOlcSK2o?usp=sharing
И все используемые файлы также доступны в этом репозитории GitHub: -
использованная литература
- Https://keras.io/api/applications/mobilenet/
- Https://towardsdatascience.com/transfer-learning-using-mobilenet-and-keras-c75daf7ff299
Пожалуйста, ознакомьтесь со второй частью статьи ниже, где мы развернем модель MobileNet в браузере с помощью Tensorflow.js.
Пожалуйста, свяжитесь со мной в LinkedIn, если у вас есть какие-либо вопросы или предложения.
Оставайтесь в безопасности, ребята, и продолжайте использовать полезные знания. Спасибо за внимание!