Резюме

Я построил контролируемый алгоритм обучения, чтобы предсказать породу собаки из 120 пород на основе изображения. Поезд и тестовые изображения были получены из Стэнфордского набора данных о собаках. Набор данных состоял из 20 580 помеченных изображений собак, каждое из которых принадлежало к одной из 120 пород собак. Из этого набора данных я выбрал случайное, одинаково сбалансированное подмножество из 12 000 изображений, 80 обучающих изображений, 20 тестовых изображений для каждого класса.

Я использовал готовую искусственную нейронную сеть GraphLab, чтобы извлечь глубокие черты из изображений. Я протестировал несколько классификаторов машинного обучения scikit-learn, чтобы предсказать породу, и в конечном итоге остановился на их машинном классификаторе опорных векторов из-за его превосходной производительности (наилучший показатель точности) в этой задаче классификации.

Данные

Набор данных состоял из 20 580 помеченных изображений собак, каждое из которых принадлежало к одной из 120 пород собак. Данные были чистыми, а распределение изображений по классам было достаточно сбалансированным. Каждая порода собак содержала не менее 100 изображений, поэтому я решил разделить тест на поезда 80/20. Ниже приведены примеры изображений:

Мальтийский

японский спаниель

Родезийский риджбек

Ши-тцу

Афганская борзая

Предварительная обработка, извлечение признаков и моделирование

Я использовал Python и pandas для всех операций с данными и создания фреймов данных. Я использовал Graphlab для глубокого извлечения признаков, особенно их DeepFeatureExtractor. Это была действительно простая в использовании предварительно обученная нейронная сеть, которая принимала масштабированное изображение (440 x 380 пикселей) в качестве входных данных и выдавала вектор с плавающей запятой. Эти плавающие значения — линейно преобразованные значения пикселей моего изображения — стали функциями моей модели. Наконец, я поэкспериментировал с рядом моделей классификации scikit-learn. Я попробовал деревья решений Ada Boost, классификатор повышения градиента, классификатор случайного леса, классификаторы дополнительных деревьев, повышение XG, логистическую регрессию и машину опорных векторов. В конечном итоге я остановился на машине опорных векторов из-за ее превосходной точности в этой задаче, 65,5%.

Анализ

Итак, насколько хорошо показала себя эта модель? Давайте сравним его производительность с базовой точностью. Мы можем думать о базовой точности как о наиболее распространенном классе, деленном на общее количество классов. В этом случае не было доминирующего класса — все из 120 классов были одинаково взвешены — поэтому базовый уровень, по сравнению с которым моя модель должна была превзойти, составлял 1/120 или 0,83%.

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

Следующие шаги

Вот несколько вещей, которые я хотел бы изучить, чтобы улучшить этот проект:

  • Я работал над этим проектом в ноябре и декабре 2016 года. Turi, компания, стоящая за GraphLab, была приобретена Apple в августе 2016 года. Пока я работал над этим проектом, Graphlab полностью работал, однако больше не работает. Я хотел бы попробовать сделать это еще раз, на этот раз создав экстрактор функций с помощью Keras.
  • Я хотел бы выполнить дополнительную предварительную обработку изображения, чтобы оценить, улучшит ли это производительность модели. В частности, я хотел бы обучить модель на повернутых, срезанных, увеличенных, вертикально/горизонтально перемещенных, горизонтально перевернутых изображениях.
  • Я перепробовал множество моделей, но хотел бы построить сверточную нейронную сеть, чтобы посмотреть, смогу ли я повысить точность выше 65,5%.

Наконец, для тех, кому интересна отсылка к черепахе, вот полный 12-секундный клип Бората: