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

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

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

Используемые методы: -

(1) - Быстрее RCNN
(2) - UNet

Описание набора данных:

Итак, первым делом нужно клонировать репозиторий.

https://github.com/aldrin233/RiceDiseases-DataSet.git

Теперь давайте сначала проанализируем, с какими данными мы имеем дело.
После клонирования репозитория git у нас остались три папки - Бактериальный ожог, Blast, Brownspot.

Структура каталога следующая:

./Bacterial Leaf Blight
   ./Orig
   ./Rotated
./Blast
   ./Orig
   ./Rotated
./Brownspot
   ./Orig
   ./Rotated

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

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

Здесь мы можем наблюдать, что: -

(а) - Класс фитофтороза можно легко классифицировать, поскольку его следы распространены на большой территории.

(b) - Классы взрыва и коричневого пятна может быть трудно различить, поскольку пятна маленькие и очень похожи друг на друга. Но давайте погрузимся гораздо глубже.

(c) - Здесь класс Blast содержит меньше изображений по сравнению с двумя другими классами.

(d) - Общее количество ограничивающих прямоугольников класса фитофтороза меньше, чем у двух других классов. Так что на более позднем этапе мы должны выполнить увеличение данных.

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

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

В семействе R-CNN есть разные алгоритмы (R-CNN, Fast R-CNN и Faster R-CNN). Последний - Mask R-CNN. R-CNN извлекает группу областей из данного изображения с помощью выборочного поиска, а затем проверяет, содержит ли какой-либо из этих полей объект. Сначала мы извлекаем эти регионы, и для каждого региона CNN используется для извлечения определенных характеристик. Наконец, эти функции затем используются для обнаружения объектов. К сожалению, R-CNN становится довольно медленным из-за множества этапов процесса. Fast R-CNN, с другой стороны, передает все изображение в ConvNet, который генерирует интересующие области (вместо передачи извлеченных областей из изображения). Кроме того, вместо использования трех разных моделей он использует одну модель, которая извлекает элементы из регионов, классифицирует их по разным классам и возвращает ограничивающие прямоугольники.

Более быстрый R-CNN решает проблему выборочного поиска, заменяя его Сетью предложений региона (RPN). Сначала мы извлекаем карты функций из входного изображения с помощью ConvNet, а затем передаем эти карты через RPN, который возвращает предложения объектов. Наконец, эти карты классифицируются, а ограничивающие рамки предсказываются.

Если вы хотите получить о них полную информацию, пройдите по этой ссылке.

Шаги, выполняемые алгоритмом Faster R-CNN для обнаружения объектов на изображении:

  1. Возьмите входное изображение и передайте его в ConvNet, который возвращает карты функций для изображения.
  2. Примените сеть предложений регионов (RPN) на этих картах функций и получите предложения объектов
  3. Примените слой объединения ROI, чтобы уменьшить все предложения до одного размера
  4. Наконец, передайте эти предложения на полностью связанный слой, чтобы классифицировать любые предсказания ограничивающих рамок для изображения.

Что такое Сеть предложений по регионам?

Результатом сети предложений региона (RPN) является набор блоков / предложений, которые будут изучены классификатором и регрессором, чтобы в конечном итоге проверить наличие объектов. Чтобы быть более точным, RPN предсказывает возможность привязки на заднем или переднем плане и уточняет привязку. Другими словами, RPN берет все блоки ссылок (якоря) и выводит набор хороших предложений для объектов. Это достигается с помощью двух разных выходов для каждого из якорей.
Первый - это вероятность того, что якорь является объектом. «Оценка объективности», если хотите. Обратите внимание, что RPN не заботится о классе объекта, а только о том, что он действительно выглядит как объект (а не как фон). Мы собираемся использовать этот показатель объектности, чтобы отфильтровать плохие прогнозы на втором этапе. Второй результат - это регрессия ограничивающего прямоугольника для настройки якорей, чтобы они лучше соответствовали прогнозируемому объекту.

Постобработка

Подавление не до максимума. Поскольку привязки обычно перекрываются, предложения также перекрывают один и тот же объект. Чтобы решить проблему дублирования предложений, мы используем простой алгоритмический подход под названием Non-Maximum Suppression (NMS). NMS берет список предложений, отсортированных по количеству баллов, и выполняет итерацию по отсортированному списку, отбрасывая те предложения, у которых IoU больше некоторого предопределенного порога, с предложением с более высоким баллом.

Объединение регионов по интересам

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

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

Сверточная нейронная сеть на основе регионов

Сверточная нейронная сеть на основе регионов (R-CNN) - последний шаг в конвейере Faster R-CNN. После получения сверточной карты функций из изображения, использования ее для получения предложений объектов с RPN и, наконец, извлечения функций для каждого из этих предложений (через RoI Pooling), нам, наконец, нужно использовать эти функции для классификации. R-CNN пытается имитировать заключительные этапы классификации CNN, где полносвязный слой используется для вывода оценки для каждого возможного класса объектов.

Настройка системы

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

  • панды
  • matplotlib
  • тензорный поток
  • керас - 2.0.3
  • тупой
  • opencv-python
  • Sklearn
  • h5py

Выполнение:-

Итак, наш первый шаг - клонировать официальный репозиторий скелета.

!git clone https://github.com/kbardool/keras-frcnn.git

Очистка данных: -

(а) - У некоторых файлов изображений нет соответствующего файла .xml. Итак, они были удалены.

(b) - Некоторые изображения имели некоторые заболевания, но в файлах .xml не было поля сегментации (т.е. они были пустыми). Они также были удалены.

Предварительная обработка данных: -

Скелет требует, как должен быть формат входных данных -

filepath,x1,y1,x2,y2,class_name

где,

  • путь к файлу - это путь к обучающему образу.
  • x1 - координата xmin для ограничивающего прямоугольника.
  • y1 - координата ymin для ограничивающего прямоугольника.
  • x2 - координата xmax для ограничивающего прямоугольника.
  • y2 - координата ymax для ограничивающего прямоугольника.
  • class_name - это имя класса в этой ограничивающей рамке.

Итак, давайте подготовим наш набор данных и разделим все файлы на папки train_images и test_images.

Теперь, наконец, наши входные данные готовы. Теперь давайте изменим некоторые параметры по своему усмотрению.

Увеличение данных: -

(а) - Нет необходимости делать вертикальное переворачивание, так как у каждого изображения уже есть повернутое по вертикали изображение.

(b) - Следующее увеличение выполняется в data_augment.py

-> Horizontal Flips
-> Rotate 90 degree Clockwise 
-> Rotate 90 degree Anti-Clockwise
-> Brightness correction

Я обучил свою модель с базовой сетью как resnet50. Вы можете взять VGG или любую другую сеть, какую захотите.
- Сначала я обучил мою сеть повторно сетью без ее предварительно обученных весов, затем с предварительно обученными весами. Наконец-то я добился лучших результатов с предварительно натренированными весами.

ПРИМЕЧАНИЕ. -Пожалуйста, не тренируйтесь, если у вас нет поддержки графического процессора, так как это может занять несколько месяцев. Я работал 2 дня на GPU 1050 Ti только 62/1000 эпох.

Наконец, я достиг точности классификатора 95,21% и общих потерь 0,4356.

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

Теперь посмотрим на наш прогноз: -

Итак, мы видим, что наша модель неплохо справляется со спуском. Производительность можно значительно улучшить, если потренироваться.

UNet

U-net - это сетевая архитектура типа кодер-декодер для сегментации изображений. Название архитектуры происходит от ее уникальной формы, где карты характеристик из части свертки на этапе понижающей дискретизации передаются в часть с повышающей сверткой на этапе повышающей дискретизации. U-net широко используется в биомедицинских приложениях для обнаружения рака, патологий почек, отслеживания клеток и т. Д. U-net оказался очень мощным инструментом сегментации в сценариях с ограниченными данными (в некоторых случаях менее 50 обучающих выборок). Еще одно преимущество использования U-сети состоит в том, что у нее нет полностью связанных слоев, поэтому нет ограничений на размер входного изображения. Эта функция позволяет нам извлекать элементы из изображений разного размера, что является привлекательным атрибутом для применения глубокого обучения к высокоточным данным биомедицинской визуализации. Способность U-net работать с очень небольшим объемом данных и отсутствие особых требований к размеру входного изображения делают его сильным кандидатом для задач сегментации изображений.

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

Входом в U-net является трехканальное RGB-изображение размером 256X256, а на выходе - 256X256 1-канальная маска предсказаний.

Подготовка данных: -

  • Изображения хранились в отдельной папке train_images.
  • Ограничивающая рамка из файлов .xml была преобразована в изображения маски и сохранена в папке train_masks.

Увеличение данных: -

Следующие аугментации были сделаны: -

  • Переворот (вертикальный, горизонтальный, в обе стороны)
  • Повышение резкости изображения
  • Добавление шума

Маски также были увеличены в соответствии с увеличением train_images.

Обучение: -

Модель была обучена на GTX 1050 Ti с размером пакета = 4 (не удалось достичь высокого уровня из-за ResourceExhaustError). Его обучили за 10 эпох.
В качестве ROI мы использовали специальный показатель. Мы определили настраиваемую целевую функцию в keras для вычисления приблизительного пересечения по объединению (IoU) между выходом сети и целевой маской. IoU - популярный показатель для задач, связанных с ограничивающими прямоугольниками.

По тестовым данным мы получили около 0,916 долговых обязательств.

Результаты:-

Здесь мы видим, что наша модель намного лучше справляется с сегментацией изображений, чем Faster-RCNN.

  • Примечание. UNet предназначен для сегментации от пикселя к пикселю, но в нашем случае попиксельные маски ввода отсутствуют, поэтому мы создали маски из предоставленной нам ограничивающей рамки.
  • Здесь мы не можем доверять долговым распискам, потому что наша модель может работать очень хорошо, чем ожидалось.
  • Созданные нами маски содержат пиксели изображений, которые не содержат части, вызывающей заболевание, а некоторые маски даже не покрывают целые пиксели, пораженные болезнью.
  • Если мы посмотрим на наш прогноз, то наша модель сегментировала в основном пораженную болезнью часть, а также некоторые пиксели, которых не было в наземных квадратах истины.
  • Наша модель очень хорошо справляется со своей задачей, поскольку она научилась определять пораженные болезнью части.
  • Мы можем сделать его более точным, обучив его большему количеству эпох, добавив больше методов, а также, если возможно, получить более размеченный набор данных.

Подробности реализации смотрите в моем репозитории.

Конечные заметки

Алгоритмы R-CNN действительно изменили правила игры для задач обнаружения объектов. В последние годы внезапно произошел всплеск количества создаваемых приложений компьютерного зрения, и R-CNN лежит в основе большинства из них.

Unet зарекомендовал себя как отличная архитектура для сегментации изображений.

Keras_frcnn оказалась отличной библиотекой для обнаружения объектов.