"Углубленный анализ"

Классификация изображений пчел с использованием CNN и Keras

Всем добро пожаловать в мой первый крупный проект в области науки о данных! Я работал над рядом небольших проектов, таких как:

  1. Прогнозирование цен на жилье с использованием набора данных Ames Housing
  2. Прогнозирование благосостояния района с использованием данных о ценах Yelp« $ »
  3. Использование Reddit API для различения двух субреддитов
  4. Использование нейронных сетей с прямой связью и сверточных нейронных сетей для классификации набора данных MNIST (Конкурс Kaggle)
  5. и многое другое, связанное с линейной регрессией, GLM, данными временных рядов (ARIMA) и деревьями ... множество деревьев!

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

Во-первых, небольшая предыстория вдохновения для этого пчелиного проекта.

Постановка проблемы:

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

Обновление (13.11.19): поговорив с профессиональными пчеловодами, я понял, насколько неэффективна предлагаемая мной система. Таким образом, если варроа можно визуализировать на пчелах, то уже слишком поздно начинать профилактическое лечение. Лучше смотреть на базовую плату. Хотя это откровение сводит на нет мою первоначальную цель этого проекта, я оставлю оставшееся содержание доступным для других в качестве учебного опыта. На заметку: заранее изучите больше!

План атаки:

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

Я пчела буду использовать точность в качестве показателя.

Данные:

Эти данные можно найти на Kaggle в Набор данных аннотированных изображений медоносной пчелы.

Я буду включать весь необходимый код для репликации моего процесса, так что не стесняйтесь писать код, если хотите! Кроме того, весь мой код можно найти в репозитории проекта на GitHub.

Исследовательский анализ данных:

Вот пакеты, которые я буду использовать:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import imageio
from skimage.transform import rescale, resize, rotate
from skimage.color import rgb2gray
from sklearn.metrics import confusion_matrix, auc, accuracy_score
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam, RMSprop, SGD
from keras import callbacks
from keras.models import load_model
# For reproducibility
random_state = 42
np.random.seed(random_state)

Затем я загружу данные и выберу только наблюдения, классифицированные как «здоровые» или «варроа».

data = pd.read_csv('./data/bee_data.csv')
health_counts = data["health"].value_counts()
target_categories = [name for name in health_counts.index if "varr" in name.lower() or "health" in name.lower()]
data = data[[status in target_categories for status in data["health"]]]
data["has_varroa"] = (data["health"] != "healthy").astype(int)
data["has_varroa"].value_counts(normalize = True)

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

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

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

data = data[["file","has_varroa"]]

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

Это какие-то… интересные изображения! Меня сразу же беспокоит разница в размерах, так как CNN должен иметь изображения той же ширины и высоты, что и входные. Качество изображения также нестабильно, что может затруднить понимание того, что происходит в модели. Наконец, вызывает беспокойство фон. Поскольку все изображения varroa взяты из одного и того же места, я беспокоюсь, что CNN может просто узнать цвет фона IS varroa. Возможно, мне придется решить эту проблему, используя оттенки серого или изменив яркость изображения.

Код модели:

К моделированию! Обещаю, это не ужалить.

Приведенное выше изображение является представлением типичного CNN (оно не отображает топографию моей модели).

Для простоты я расскажу здесь только о структуре модели, а также о коде Keras. Если вы пишете код, я просто скажу, что использовал класс ImageDataGenerator из Keras для пакетной загрузки, изменения и подгонки модели! Подробнее читайте в разделе репо.

В итоге я стандартизировал все изображения до 54x50.

После долгой настройки и экспериментов ... я начал модель с 3 пар сверточных слоев, за каждым из которых следовали слой максимального объединения и выпадение. Затем я сглаживаю данные в одномерный массив и загружаю его в 2 плотных слоя, за каждым из которых следует Dropout. Наконец, я передаю это в единственный узел для выходного слоя Dense.

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

Я использовал binary_crossentropy для функции потерь и оптимизировал с помощью RMSProp, хотя Адам тоже работал нормально.

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

Оценка модели:

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

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

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

Первое изображение пчелы с темным экзоскелетом на светлом фоне, что может затруднить определение ориентации модели. Второе изображение слишком запутанно, чтобы разобрать его даже для человека! Последнее изображение, вероятно, имело продолговатую форму, что могло вызвать значительное искажение изображения при масштабировании до стандартного размера 54x50. Кроме того, цвет фона, возможно, оказалось слишком трудно отличить от цвета пчелы.

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

Выводы:

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

Мусор на входе, мусор на выходе

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

Я хотел бы еще раз вернуться к этой проблеме с пчелами 🐝 из большего количества мест И иметь одинаковую ширину и высоту.

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

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

Думаю, я бубнил достаточно долго, так что пока что это все! Вы нашли эту разбивку полезной? Достойен ли этот проект шума? Было ли приемлемо соотношение содержания и каламбура? Если у вас есть предложения по улучшению этих сообщений, дайте мне знать! Я всегда стремлюсь стать лучше!

Мой следующий пост должен стать еще одной проблемой для кодирования. Я очень взволнован, чтобы попрактиковаться в чем-то более техническом. Думаю, я попробую более традиционный вопрос на собеседовании по программированию. До скорого!