Lessons learned from manually classifying CIFAR-10
Andrej Karpathy описывает эксперимент по ручной классификации изображений из датасета CIFAR-10 — набора из 50 000 тренировочных и 10 000 тестовых изображений в 10 категориях. Он достиг точности около 94% на 400 изображениях, тогда как лучший алгоритм на тот момент (Adam Coates et al.) показывал около 80%. Karpathy отмечает, что некоторые изображения крайне трудны даже для человека из-за неоднозначности, обрезки объектов и разнообразия поз. Он предположил, что точность вряд ли превысит 85–90%, однако в обновлении 2015 года признал ошибку: state of the art достиг 95%. Статья подчёркивает разрыв между человеческим и машинным восприятием и сложность задачи классификации изображений.
CIFAR-10
Примечание: этот пост написан в 2011 году и в некоторых местах слегка устарел.
Статистика. CIFAR-10 состоит из 50 000 тренировочных изображений, каждое из которых относится к одной из 10 категорий (показаны слева). Тестовый набор содержит 10 000 новых изображений из тех же категорий, и задача — классифицировать каждое по его категории. На данный момент лучший результат составляет около 80% точности классификации (4000 центроидов), достигнутый Adam Coates et al. (PDF). В этой работе точность была достигнута за счёт отбеливания (whitening), k-means для обучения множества центроидов и последующего использования мягкой функции активации в качестве признаков.
Результаты state of the art. К слову, запуск их метода с 1600 центроидами даёт 77% точности классификации. Если задать кластеры случайными, точность становится 70%, а если задать кластеры как случайные патчи из тренировочного набора, точность вырастает до 74%. Похоже, вся суть k-means в том, чтобы равномерно распределить кластеры вокруг данных. Я предполагаю, что 70% точности при случайных кластерах объясняются тем, что многие кластеры оказываются слишком далеко от многообразий данных и никогда не активируются — как если бы кластеров было значительно меньше.
Точность человека. На выходных мне захотелось узнать, какой точности классификации добьётся человек на этом датасете. Я написал небольшой код на MATLAB, обеспечивающий интерфейс для этого. Он показывал по одному изображению и позволял нажать клавишу от 0 до 9, указывая предполагаемую категорию. Моя точность классификации составила около 94% на 400 изображениях. Почему не 100%? Потому что некоторые изображения откровенно нечестные! Чтобы дать вам представление, вот несколько спорных изображений из CIFAR-10:
Точность человека на CIFAR-10 составляет приблизительно 94%
Наблюдения
Несколько наблюдений, которые я вынес из этого упражнения:
Объекты внутри классов в этом датасете могут быть чрезвычайно разнообразными. Например, класс «птица» содержит множество разных видов птиц (как крупных, так и мелких). Мало того что видов птиц много — они встречаются при самых разных масштабах, всевозможных углах и позах. Иногда показана лишь часть птицы. Проблема поз ещё хуже для категорий собак и кошек, потому что эти животные принимают огромное количество разных поз, и иногда показана только голова. Или левая часть тела и т. д. Мой метод классификации ощущался странно дихотомичным. Иногда животное или объект хорошо видны, и классификация основывается на очень информативных характерных частях (например, вы находите уши кошки). В других случаях моё распознавание было целиком основано на контексте и общих подсказках в изображении, таких как цвета. Датасет CIFAR-10 слишком мал, чтобы должным образом содержать примеры всего того, что требуется в тестовом наборе. Я основываю этот вывод как минимум на нескольких способах визуализации ближайшего изображения из тренировочного набора. Я не до конца понимаю, как Adam Coates et al. достигают столь высоких результатов на этом датасете (80%) своим методом. Моя догадка такова: если посмотреть на изображение прищурившись, почти всегда можно сузить категорию до 2–3 вариантов. Финальное разрешение неоднозначности, вероятно, происходит за счёт нахождения очень хороших специфических информативных патчей (например, патч с каким-то типом шерсти, или часть заострённого уха и т. д.). Словарь k-means, должно быть, улавливает эти случаи, а SVM, вероятно, их распознаёт. Моё впечатление от этого упражнения — будет трудно преодолеть порог 80%, но я подозреваю, что улучшения возможны примерно до 85–90%, в зависимости от того, насколько я ошибаюсь по поводу нехватки тренировочных данных. (Обновление 2015 года: Очевидно, этот прогноз оказался совершенно неверным — state of the art теперь на уровне 95%, как видно из таблицы лидеров соревнования на Kaggle. Впечатляет!)
Я призываю всех попробовать это самостоятельно (см. мой код выше) — это очень интересно и увлекательно! Мне сложно точно сформулировать, что именно я узнал, но в целом я чувствую, что приобрёл больше интуиции в задачах классификации изображений и большее уважение к сложности этой проблемы.
Наконец, вот пример моего отладочного интерфейса:
Код на Matlab, использованный для получения этих результатов, можно найти здесь