Упрощение компьютерного зрения с помощью Monk, инструмента глубокого обучения с низким кодом и унифицированной оболочки для компьютерного зрения.

Библиотека монахов

📌Monk - это инструмент с открытым исходным кодом с низким кодом для компьютерного зрения и глубокого обучения.

Особенности монаха

📌 Младший код.

📌 Единая оболочка для основных фреймворков глубокого обучения - Keras, PyTorch, Gluoncv.

📌 Синтаксически инвариантная оболочка.

Позволяет

📌 Пользователи для создания, управления и контроля версий экспериментов по глубокому обучению.

📌 Пользователи могут сравнивать эксперименты по показателям обучения.

📌 Пользователи быстро находят лучшие гиперпараметры.

Оглавление

Установка

Загрузить набор данных

Подробная информация о наборе данных

Быстрое прототипирование - обучение, проверка и вывод

Обучите классификатор с помощью Resnet50

Обучите классификатор с помощью Densenet121

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

Установка

$ !git clone https://github.com/Tessellate-Imaging/monk_v1.git
# If using Colab install using the commands below
$ !cd monk_v1/installation/Misc && pip install -r requirements_colab.txt

Скачать набор данных

Набор данных - рентгеновские снимки грудной клетки (пневмония)

$ ! wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1li6ctqAvGFgIGMSt-mYrLoM_tbYkzqdO' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1li6ctqAvGFgIGMSt-mYrLoM_tbYkzqdO" -O chest_xray.zip && rm -rf /tmp/cookies.txt

Разархивируйте данные

$ ! unzip -qq chest_xray.zip

Подробная информация о наборе данных

Что такое пневмония?

  • Это инфекция одного или обоих легких.
  • Это вызвано бактериями, вирусами и грибками.
  • Пневмония - это инфекция, которая вызывает воспаление воздушных мешков в легких, называемых альвеолами.

Общие симптомы

  • Высокая температура
  • Озноб
  • Кашель
  • Сбивчивое дыхание
  • Усталость

Какие существуют типы бактериальной пневмонии?

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

Бактериальная пневмония на рентгеновском снимке грудной клетки.

Какие бывают типы вирусной пневмонии

  • Вирусы - вторая по частоте причина пневмонии.
  • Многие вирусы вызывают заболевание, в том числе одни и те же вирусы, вызывающие простуду и грипп.
  • Лихорадка, озноб, сухой кашель, который может усиливаться и вызывать образование слизи, заложенность носа.
  • Вирусная пневмония (справа) проявляется более диффузным «интерстициальным» рисунком в обоих легких.

Вирусная пневмония на рентгеновском снимке грудной клетки

Какие бывают типы пневмонии при ходьбе

  • Менее тяжелая форма бактериальной пневмонии. Иногда врачи называют это «атипичной» пневмонией.
  • Симптомы могут быть настолько легкими, что вы даже не подозреваете о них. Вы можете чувствовать себя достаточно хорошо, чтобы заниматься своими обычными делами, отсюда и слово «ходьба» в названии.

Какие бывают типы грибковой пневмонии

  • Грибки - менее частая причина пневмонии. Если вы здоровы, то вряд ли заболеете грибковой пневмонией.
  • Но у вас больше шансов заразиться им, если ваша иммунная система ослаблена из-за серьезной операции, трансплантации органов или ВИЧ.
  • Грибковая пневмония возникает при вдыхании крошечных частиц, называемых спорами грибка.

Необходимость такого приложения

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

Набор данных

  • Помечено в общей сложности 5232 рентгеновских снимка грудной клетки у детей.
  • Учебный набор включает 3883 пациента с пневмонией (2538 бактериальных и 1345 вирусных) и 1349 нормальных из общего числа 5856 пациентов.
  • Набор для тестирования включает 234 нормальных изображения и 390 изображений пневмонии (242 бактериальных и 148 вирусных) от 624 пациентов.

Этикетки

  • Нормальный рентген
  • Рентген пневмонии

Быстрое прототипирование - обучение, проверка и выводы

Передача обучения

Базовая сеть

  • Сверточная нейронная сеть сначала обучается на больших наборах данных, таких как coco или Imagenet.
  • В этих наборах данных есть много классов, например, около 1000, 1500 классов.
  • Таким образом, последний слой нейронной сети имеет такое же количество нейронов.

Тонкая настройка пользовательского набора данных

  • В пользовательском наборе данных обычно разное количество классов.
  • Вы берете сеть и загружаете в нее предварительно обученные веса.
  • Затем удалите последний слой с дополнительным (или меньшим) количеством нейронов.
  • Вы добавляете новый слой с количеством нейронов = количеству классов в вашем пользовательском наборе данных.
  • При желании вы можете добавить дополнительные слои между этим недавно добавленным последним слоем и старой сетью.

Что такое быстрое прототипирование?

  • Каждый проект классификации изображений начинается с основного шага - опробования трансферного обучения.

При переносе обучения вы берете модель глубокого обучения, обученную на очень большом наборе данных

  • Затем обучите его на своем собственном наборе данных.

При этом вам нужно выбрать много гиперпараметров

  • Во-первых, сама модель, такая как ResNet или DenseNet, никогда не знаешь, что использовать.
  • Затем параметры набора данных, такие как размер пакета, форма ввода и т. Д.
  • Затем параметры модели, такие как замораживание слоев, без использования предварительно обученных моделей и т. Д.
  • Затем настройте оптимизатор, функцию потерь, планировщик скорости обучения и т. Д. Для выбора.
  • И, наконец, количество эпох, по которым нужно тренироваться.

Примечание: не все можно сделать на самом первом этапе, поэтому в режиме быстрого прототипирования.

Что позволяет

  • Установите модель.
  • Независимо от того, использовать ли предварительно обученную сеть или обучать с нуля.
  • Количество эпох.

Все остальные параметры установлены по умолчанию в соответствии с их оригинальными исследовательскими работами.

  • Затем его можно изменить в промежуточном и экспертном режимах Монаха.

Создание и управление экспериментами

  • Укажите название проекта.
  • Укажите название эксперимента.
  • По конкретным данным создайте единый проект.
  • В каждом проекте можно создать несколько экспериментов.
  • К каждому эксперименту можно привязать разные гиперпараметры.
$ gtf = prototype(verbose=1);
$ gtf.Prototype("Pneumonia_Classification", "Quick_Prototype");

Выход

Mxnet Version: 1.5.0

Experiment Details
    Project: Pneumonia_Classification
    Experiment: Quick_Prototype
    Dir: /home/abhi/Downloads/webinar_2/workspace/Pneumonia_Classification/Quick_Prototype/

Это создает файлы и каталоги в соответствии со следующей структурой

workspace
    |
    |----Pneumonia_Classification
                    |
                    |
                    |---Quick_Prototype
                              |
                              |--experiment-state.json
                              |
                              |--output
                                   |
                                   |------logs 
                                   |
                                   |------models

Обучение в быстром режиме

- Using Default Function
    - dataset_path
    - model_name
    - num_epochs

Структура папок набора данных

parent_directory
    |
    |
    |
    |----training
            |------Infected
                    |
                    |------img1.jpg
                    |------img2.jpg
                    |------.... (and so on)
            |------Normal
                    |
                    |------img1.jpg
                    |------img2.jpg
                    |------.... (and so on)   
    |
    |
    |----validation
            |------Infected
                    |
                    |------img1.jpg
                    |------img2.jpg
                    |------.... (and so on)
            |------Normal
                    |
                    |------img1.jpg
                    |------img2.jpg
                    |------.... (and so on)

Изменяемые параметры

  • dataset_path: путь к данным
  • model_name: какую предварительно обученную модель использовать
  • freeze_base_network: Обучить уже обученную сеть или нет
  • num_epochs: количество эпох для тренировки
$ gtf.Default(dataset_path="chest_xray/train",
            model_name="resnet18_v1",
            num_epochs=5)
#Start Training
$ gtf.Train();

Train vs Val vs Test Dataset

Поезд

  • Модель видит эти данные и учится на них.
  • В нашем случае 80% исходных данных обучения.

Проверка

  • Выборка данных, используемая для обеспечения объективной оценки соответствия модели обучающему набору данных при настройке гиперпараметров модели.
  • В нашем случае 20% исходных данных обучения.

Тест

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

Выполнение вывода на тестовых изображениях

Загрузить эксперимент в режиме вывода

  • Установите флаг eval_infer как True.
$ gtf = prototype(verbose=1);
$ gtf.Prototype("Pneumonia_Classification", "Quick_Prototype", eval_infer=True);

Выход

Mxnet Version: 1.5.0

Model Details
    Loading model - workspace/Pneumonia_Classification/Quick_Prototype/output/models/final-symbol.json
    Model loaded!

Experiment Details
    Project: Pneumonia_Classification
    Experiment: Quick_Prototype
    Dir: /home/abhi/Downloads/webinar_2/workspace/Pneumonia_Classification/Quick_Prototype/

Выберите изображение и выполните вывод

$ img_name = "chest_xray/infer/normal-1.jpeg";
$ predictions = gtf.Infer(img_name=img_name);

#Display 
$ from IPython.display import Image
$ Image(filename=img_name)

Выход

Prediction
     Image name:     chest_xray/infer/normal-1.jpeg
     Predicted class:      NORMAL
     Predicted score:      7.098179340362549

$ img_name = "chest_xray/infer/pneumonia-1.jpeg";
$ predictions = gtf.Infer(img_name=img_name);
 
#Display  
$ from IPython.display import Image
$ Image(filename=img_name)

Выход

Prediction
     Image name:         chest_xray/infer/pneumonia-1.jpeg     Predicted class:      PNEUMONIA
Predicted score:      3.6506881713867188

Обучите классификатор с помощью Resnet50

Чтения в ResNet

Очки из статьи На пути к науке о данных

  • Основная идея ResNet заключается во внедрении так называемого «ярлыка идентификации», при котором один или несколько уровней пропускаются.
  • Более глубокая модель не должна давать ошибку обучения выше, чем ее более мелкие аналоги.
  • Решает проблему исчезновения градиентов при увеличении глубины сети.

Очки от Среднего

  • Занял 1-е место в классификационном конкурсе ILSVRC 2015 с коэффициентом ошибок в топ-5 3,57% (ансамблевая модель).
  • Эффективно обученные сети со 100 слоями, а также с 1000 слоями.
  • Замена слоев VGG-16 в Faster R-CNN на ResNet-101. Они отметили относительное улучшение на 28%.

Подробнее здесь

Блок ResNet - 1

Свойства

В этом блоке 2 ответвления

  • Первая ветвь - это идентификационная ветвь, она принимает входные данные и подталкивает их в качестве выходных, Остаточных.
  • Вторая ветвь имеет эти слои
  • batchnorm - ›relu -› conv_1x1 - ›batchnorm -› relu - ›conv_3x3 -› batchnorm - ›relu -› conv_1x1.

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

Последний слой этого блока - Релу.

Узкое место

  • Числовые функции в первой и средней свертках: input_features / 4
  • Последняя свертка имеет features = input_features.

Блок ResNet - 2

Свойства

Блок имеет два стартовых элемента

  • батчнорм - ›Relu

Разместите стартовые элементы в этом блоке 2 ветки

Первая ветвь содержит эти слои

  • conv_1x1

Вторая ветвь содержит эти слои

  • conv_1x1 - ›batchnorm -› Relu - ›conv_3x3 -› batchnorm - ›Relu -› conv_1x1.

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

#Set project and experiment
$ gtf = prototype(verbose=1)
$ gtf.Prototype("Pneumonia_Classification", "Experiment_1")
#Load data and model
$ gtf.Default(dataset_path="chest_xray/train",             model_name="resnet50_v2",freeze_base_network=False,             num_epochs=5)
# Train
$ gtf.Train()

Обучить классификатор с помощью Densenet121

Чтения в Densenet

Очки от Среднего

  • «Эта архитектура возникла из желания улучшить разрабатываемые архитектуры более высокого уровня. В частности, устранение проблемы, заключающейся в том, что многие уровни в высокоуровневых сетях были в некотором смысле избыточными ».

Точки зрения на науку о данных

  • Каждый уровень получает «коллективное знание» от всех предыдущих уровней. (См. Изображение выше).
#Set project and experiment
$ gtf = prototype(verbose=1)
$ gtf.Prototype("Pneumonia_Classification", "Experiment_2")
#Load data and model
$ gtf.Default(dataset_path="chest_xray/train",             model_name="densenet121",freeze_base_network=False,             num_epochs=5)
# Train
$ gtf.Train()

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

# Invoke the comparison class
$ from compare_prototype import compare

Создание сравнительных экспериментов и управление ими

  • Укажите название проекта
# Create a project 
$ gtf = compare(verbose=1);
$ gtf.Comparison("Exp
workspace
    |
    |----Pneumonia_Classification
                    |
                    |
                    |---Quick_Prototype
                              |
                              |--experiment-state.json
                              |
                              |--output
                                   |
                                   |------logs 
                                   |
                                   |------models
vs_2")

Выход

Comparison: - Exp
workspace
    |
    |----Pneumonia_Classification
                    |
                    |
                    |---Quick_Prototype
                              |
                              |--experiment-state.json
                              |
                              |--output
                                   |
                                   |------logs 
                                   |
                                   |------models
vs_2

Добавьте эксперименты

  • Первый аргумент - название проекта
  • Второй аргумент - название эксперимента
$ gtf.Add_Experiment("Pneumonia_Classification", "Experiment_1")
$ gtf.Add_Experiment("Pneumonia_Classification", "Experiment_2")

Выход

Project - Pneumonia_Classification, Experiment - Experiment_1 added Project - Pneumonia_Classification, Experiment - Experiment_2 added

Выполнить анализ

$ gtf.Generate_Statistics()

При этом создаются файлы и каталоги в соответствии со следующей структурой

workspace
    |
    |--------comparison
                    |
                    |
                    |-----Exp_1_vs_2
                                |
                                |------stats_best_val_acc.png
                                |------stats_max_gpu_usage.png
                                |------stats_training_time.png
                                |------train_accuracy.png
                                |------train_loss.png
                                |------val_accuracy.png
                                |------val_loss.png
                    |
                    |-----comparison.csv (Contains necessary details of all experiments)

Кривые точности тренировки

Кривые тренировочных потерь

Кривые точности проверки

Кривые валидационных потерь

Кривые времени тренировки

Максимальное использование графического процессора

Наивысшая точность проверки

Оба одинаково хорошо работали с данными валидации.

Проверим работоспособность на тестовом наборе

ResNet

gtf = prototype(verbose=1);
gtf.Prototype("Pneumonia_Classification", "Experiment_1", eval_infer=True);


# Load test data
gtf.Dataset_Params(dataset_path="chest_xray/test");
gtf.Dataset();


# Test for accuracy
accuracy, class_based_accuracy = gtf.Evaluate();

Выход

Mxnet Version: 1.5.0

Model Details
    Loading model - workspace/Pneumonia_Classification/Experiment_1/output/models/final-symbol.json
    Model loaded!

Experiment Details
    Project: Pneumonia_Classification
    Experiment: Experiment_1
    Dir: /home/abhi/Downloads/webinar_2/workspace/Pneumonia_Classification/Experiment_1/

Dataset Details
    Test path:      chest_xray/test
    CSV test path:  None

Dataset Params
    Input Size:  224
    Processors:   4

Pre-Composed Test Transforms
[{'Normalize': {'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225]}}]

Dataset Numbers
    Num test images: 624
    Num classes:      2

Testing
HBox(children=(IntProgress(value=0, max=624), HTML(value='')))
Result
        class based accuracies
            0. NORMAL - 55.55555555555556 %
            1. PNEUMONIA - 98.2051282051282 %
        total images:            624
        num correct predictions: 513
        Average accuracy (%):    82.21153846153845

DenseNet

$ gtf = prototype(verbose=1);
$ gtf.Prototype("Pneumonia_Classification", "Experiment_2", eval_infer=True);


# Load test data
$ gtf.Dataset_Params(dataset_path="chest_xray/test");
$ gtf.Dataset();


# Test for accuracy
$ accuracy, class_based_accuracy = gtf.Evaluate()

Выход

Mxnet Version: 1.5.0

Model Details
    Loading model - workspace/Pneumonia_Classification/Experiment_2/output/models/final-symbol.json
    Model loaded!

Experiment Details
    Project: Pneumonia_Classification
    Experiment: Experiment_2
    Dir: /home/abhi/Downloads/webinar_2/workspace/Pneumonia_Classification/Experiment_2/

Dataset Details
    Test path:      chest_xray/test
    CSV test path:  None

Dataset Params
    Input Size:  224
    Processors:   4

Pre-Composed Test Transforms
[{'Normalize': {'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225]}}]

Dataset Numbers
    Num test images: 624
    Num classes:      2

Testing
HBox(children=(IntProgress(value=0, max=624), HTML(value='')))
Result
        class based accuracies
            0. NORMAL - 62.39316239316239 %
            1. PNEUMONIA - 98.71794871794873 %
        total images:            624
        num correct predictions: 531
        Average accuracy (%):    85.09615384615384

В этом случае Densenet показал лучшие результаты на тестовой выборке.

Вы можете найти полный блокнот jupyter на Github. Дайте нам ⭐️ в нашем репозитории GitHub, если вам нравится Monk.

Если у вас есть вопросы, вы можете связаться с Абхишек и Акаш. Не стесняйтесь обращаться к ним.

Я очень увлечен компьютерным зрением и глубоким обучением в целом. Я участник библиотек Monk с открытым исходным кодом.

Вы также можете увидеть другие мои работы по адресу: