Внутри ИИ

Классификация болезней растений с помощью Monk

Использование поисковика моделей для автоматического определения правильных гиперпараметров

TL; DR



В сельском хозяйстве болезни листьев вызывают значительное снижение как качества, так и количества урожая. Автоматизация обнаружения болезней растений с помощью компьютерного зрения может сыграть роль в раннем обнаружении и профилактике заболеваний.

Что будешь строить!

В этом упражнении мы исследуем, как создать классификатор болезней листьев растений, используя быструю функцию поиска гиперпараметров Монка.

Monk предоставляет инвариантную синтаксическую структуру обучения передачи, которая поддерживает Keras, Pytorch и Mxnet в бэкэнде. (Читать - Документация).

Разработчики компьютерного зрения должны изучить стратегии, выбирая правильную скорость обучения, подходящую архитектуру CNN, использовать правильные оптимизаторы и точно настраивать многие другие параметры, чтобы получить наиболее эффективные модели.

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

Давайте начнем!

Настраивать

Начнем с настройки Monk и его зависимостей от colab. Для дальнейших инструкций по установке на различных платформах загляните в DOCS.

$ git clone https://github.com/Tessellate-Imaging/monk_v1
$ cd monk_v1/installation && pip install -r requirements_cu10.txt
$ cd ../..

Набор данных

Для этого упражнения мы будем использовать набор данных, собранный замечательными людьми из PlantVillage.

Экспериментирование

Перед настройкой нашего анализа мы должны начать с создания нового проекта и поэкспериментировать.

# Step 1 - Create experiment
ptf = prototype(verbose=1);
ptf.Prototype("plant_disease", "exp1");

и настройте пути к наборам данных «По умолчанию»

ptf.Default(dataset_path=["./dataset/train", "./dataset/val"], model_name="resnet18", freeze_base_network=True, num_epochs=5);

Теперь мы готовы провести некоторый анализ и найти лучшие гиперпараметры.

В настоящее время мы можем проанализировать следующие параметры:

  1. Найдите лучшую архитектуру CNN - [DOCS]
  2. Найдите подходящий размер партии - [DOCS]
  3. Найдите подходящую форму ввода - [DOCS]
  4. Выберите хорошую начальную скорость обучения - [DOCS]
  5. Выберите наиболее эффективный оптимизатор - [DOCS]

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

Поиск моделей

Начните с названия анализа. Для каждого анализа создается новый проект с множеством экспериментов внутри.

analysis_name = “Model_Finder”;

Теперь перейдем к списку моделей для анализа.

  • Первый элемент в списке - Название модели
  • Второй элемент в списке - логическое значение, чтобы заморозить базовую сеть или нет
  • Третий элемент в списке - логическое значение для использования предварительно обученной модели в качестве отправной точки или нет
models = [[“resnet34”, True, True], [“resnet50”, False, True],[“densenet121”, False, True], [“densenet169”, True, True], [“densenet201”, True, True]];

Задайте количество эпох для каждого эксперимента.

epochs=5;

Выберите процент от исходного набора данных для экспериментов.

percent_data=10;

Наконец, мы запускаем функцию анализа для поиска наиболее эффективных моделей:

  • «Keep_all» - сохраняет все созданные эксперименты.
  • «Keep_none» - удаляет все созданные эксперименты.
ptf.Analyse_Models(analysis_name, models, percent_data, num_epochs=epochs, state=”keep_none”);

Во время анализа отображается расчетное время для каждого эксперимента.

Running Model analysis
Analysis Name : Model_Finder 
Running experiment : 1/5 
Experiment name : Model_resnet34_freeze_base_pretrained 
Estimated time : 2 min

Наконец, после завершения эксперимента мы получаем следующий вывод о точности и потерях обучения и проверки:

Выберите наиболее эффективную архитектуру CNN, обновите свой эксперимент и продолжайте дальнейший анализ. Не забудьте перезагрузить эксперимент после обновления.

## Update Model Architecture
ptf.update_model_name(“densenet121”);
ptf.update_freeze_base_network(False);
ptf.update_use_pretrained(True);
ptf.Reload();

Дальнейшие инструкции по обновлению параметров эксперимента можно найти в документации.

Остальные четыре анализа следуют аналогичному синтаксису. Мы быстро рассмотрим каждый из них:

Поиск размера партии

# Analysis Project Name
analysis_name = “Batch_Size_Finder”;
# Batch sizes to explore
batch_sizes = [4, 8, 16, 32];
# Num epochs for each experiment to run
epochs = 10;
# Percentage of original dataset to take in for experimentation
percent_data = 10;
ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data, num_epochs=epochs, state=”keep_none”);

Сгенерированный вывод:

Обновите эксперимент:

## Update Batch Size
ptf.update_batch_size(8);
ptf.Reload();

Поиск формы ввода

# Analysis Project Name
analysis_name = “Input_Size_Finder”;
# Input sizes to explore
input_sizes = [224, 256, 512];
# Num epochs for each experiment to run
epochs=5;
# Percentage of original dataset to take in for experimentation
percent_data=10;
ptf.Analyse_Input_Sizes(analysis_name, input_sizes, percent_data, num_epochs=epochs, state=”keep_none”);

Сгенерированный вывод:

Обновите эксперимент:

## Update Input Size
ptf.update_input_size(224);
ptf.Reload();

Анализ скорости обучения

# Analysis Project Name
analysis_name = “Learning_Rate_Finder”
# Learning rates to explore
lrs = [0.01, 0.005, 0.001, 0.0001];
# Num epochs for each experiment to run
epochs=5
# Percentage of original dataset to take in for experimentation
percent_data=10
ptf.Analyse_Learning_Rates(analysis_name, lrs, percent_data, num_epochs=epochs, state=”keep_none”);

Сгенерированный вывод:

Обновите эксперимент:

## Update Learning Rate
ptf.update_learning_rate(0.01);
ptf.Reload();

Оптимизатор анализа

# Analysis Project Name
analysis_name = “Optimiser_Finder”;
# Optimizers to explore
optimizers = [“sgd”, “adam”, “adamax”, “rmsprop”]; #Model name, learning rate
# Num epochs for each experiment to run
epochs = 5;
# Percentage of original dataset to take in for experimentation
percent_data = 10;
ptf.Analyse_Optimizers(analysis_name, optimizers, percent_data, num_epochs=epochs, state=”keep_none”);

Сгенерированный вывод:

Обновите эксперимент:

## Update Optimiser
ptf.optimizer_adamax(0.001);
ptf.Reload();

Обучение

Наконец, после установки правильных гиперпараметров, мы можем начать обучение модели.

ptf.Train();

Копировать эксперимент

Мы можем визуализировать графики точности и потерь, расположенные внутри каталога рабочей области. Из графиков мы видим, что потери могут идти дальше вниз:

Чтобы продолжить обучение, мы копируем наш предыдущий эксперимент и выходим из этого состояния - [DOCS]

Сравнить эксперименты

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

Наш «эксперимент 1» длился 5 эпох, а «эксперимент 2» - 10 эпох. Несмотря на небольшое улучшение точности проверки, увеличение с 96% до 97% могло бы помочь достичь позиций в таблице лидеров для соревнований, проводимых на Kaggle и EvalAi.

Надеюсь, вам понравится создавать нишевые решения с помощью наших инструментов.

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

Удачного кодирования!