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
CIFAR-10
Note, this post is from 2011 and slightly outdated in some places.
Примечание: этот пост написан в 2011 году и в некоторых местах слегка устарел.
Statistics. CIFAR-10 consists of 50,000 training images, all of them in 1 of 10 categories (displayed left). The test set consists of 10,000 novel images from the same categories, and the task is to classify each to its category. The state of the art is currently at about 80% classification accuracy (4000 centroids), achieved by Adam Coates et al. (PDF). This paper achieved the accuracy by using whitening, k-means to learn many centroids, and then using a soft activation function as features.
Статистика. CIFAR-10 состоит из 50 000 тренировочных изображений, каждое из которых относится к одной из 10 категорий (показаны слева). Тестовый набор содержит 10 000 новых изображений из тех же категорий, и задача — классифицировать каждое по его категории. На данный момент лучший результат составляет около 80% точности классификации (4000 центроидов), достигнутый Adam Coates et al. (PDF). В этой работе точность была достигнута за счёт отбеливания (whitening), k-means для обучения множества центроидов и последующего использования мягкой функции активации в качестве признаков.
State of the Art performance. By the way, running their method with 1600 centroids gives 77% classification accuracy. If you set the clusters to be random the accuracy becomes 70%, and if you set the clusters to be random patches from the training set, the accuracy goes up to 74%. It seems like the whole purpose of k-means is to nicely spread out the clusters around the data. I’m guessing that the 70% random clusters performance might be because many of the clusters are relatively too far away from data manifolds, and never become activated – it’s as if you had much fewer clusters to begin with.
Результаты state of the art. К слову, запуск их метода с 1600 центроидами даёт 77% точности классификации. Если задать кластеры случайными, точность становится 70%, а если задать кластеры как случайные патчи из тренировочного набора, точность вырастает до 74%. Похоже, вся суть k-means в том, чтобы равномерно распределить кластеры вокруг данных. Я предполагаю, что 70% точности при случайных кластерах объясняются тем, что многие кластеры оказываются слишком далеко от многообразий данных и никогда не активируются — как если бы кластеров было значительно меньше.
Human Accuracy. Over the weekend I wanted to see what kind of classification accuracy a human would achieve on this dataset. I set out to write some quick MATLAB code that would provide the interface to do this. It showed one image at a time and allowed me to press a key from 0-9 indicating my belief about its class category. My classification accuracy ended up at about 94% on 400 images. Why not 100%? Because some images are really unfair! To give you an idea, here are some questionable images from CIFAR-10: 
Точность человека. На выходных мне захотелось узнать, какой точности классификации добьётся человек на этом датасете. Я написал небольшой код на MATLAB, обеспечивающий интерфейс для этого. Он показывал по одному изображению и позволял нажать клавишу от 0 до 9, указывая предполагаемую категорию. Моя точность классификации составила около 94% на 400 изображениях. Почему не 100%? Потому что некоторые изображения откровенно нечестные! Чтобы дать вам представление, вот несколько спорных изображений из CIFAR-10:
CIFAR-10 human accuracy is approximately 94%
Точность человека на CIFAR-10 составляет приблизительно 94%
Observations
Наблюдения
A few observations I derived from this exercise:
Несколько наблюдений, которые я вынес из этого упражнения:
The objects within classes in this dataset can be extremely varied. For example the “bird” class contains many different types of bird (both big birds and small). Not only are there many types of bird, but the occur at many possible magnifications, all possible angles and all possible poses. Sometimes only parts of the bird are shown. The poses problem is even worse for the dog/cat category, because these animals occur at many many different types of poses, and sometimes only the head is shown. Or left part of the body, etc.
My classification method felt strangely dichotomous. Sometimes you can clearly see the animal or object and classify it based very highly-informative distinct parts (for example, you find ears of a cat). Other times, my recognition was purely based on context and the overall cues in the image such as the colors.
The CIFAR-10 dataset is too small to properly contain examples of everything that it is asking for in the test set. I base this conclusion at least on my multiple ways of visualizing the nearest image in the training set.
I don’t quite understand how Adam Coates et al. perform so well on this dataset (80%) with their method. My guess is that it works along the following lines: looking at the image squinting your eyes you can almost always narrow down the category to about 2 or 3. The final disambiguation probably comes from finding very good specific informative patches (like a patch of some kind of fur, or pointy ear part, etc.). The k-means dictionary must be catching these cases and the SVM likely picks up on them.
My impression from this exercise is that it will be hard to go above 80%, but I suspect improvements might be possible up to range of about 85-90%, depending on how wrong I am about the lack of training data. (2015 update: Obviously this prediction was way off, with state of the art now in 95%, as seen in this Kaggle competition leaderboard. I’m impressed!)
Объекты внутри классов в этом датасете могут быть чрезвычайно разнообразными. Например, класс «птица» содержит множество разных видов птиц (как крупных, так и мелких). Мало того что видов птиц много — они встречаются при самых разных масштабах, всевозможных углах и позах. Иногда показана лишь часть птицы. Проблема поз ещё хуже для категорий собак и кошек, потому что эти животные принимают огромное количество разных поз, и иногда показана только голова. Или левая часть тела и т. д. Мой метод классификации ощущался странно дихотомичным. Иногда животное или объект хорошо видны, и классификация основывается на очень информативных характерных частях (например, вы находите уши кошки). В других случаях моё распознавание было целиком основано на контексте и общих подсказках в изображении, таких как цвета. Датасет CIFAR-10 слишком мал, чтобы должным образом содержать примеры всего того, что требуется в тестовом наборе. Я основываю этот вывод как минимум на нескольких способах визуализации ближайшего изображения из тренировочного набора. Я не до конца понимаю, как Adam Coates et al. достигают столь высоких результатов на этом датасете (80%) своим методом. Моя догадка такова: если посмотреть на изображение прищурившись, почти всегда можно сузить категорию до 2–3 вариантов. Финальное разрешение неоднозначности, вероятно, происходит за счёт нахождения очень хороших специфических информативных патчей (например, патч с каким-то типом шерсти, или часть заострённого уха и т. д.). Словарь k-means, должно быть, улавливает эти случаи, а SVM, вероятно, их распознаёт. Моё впечатление от этого упражнения — будет трудно преодолеть порог 80%, но я подозреваю, что улучшения возможны примерно до 85–90%, в зависимости от того, насколько я ошибаюсь по поводу нехватки тренировочных данных. (Обновление 2015 года: Очевидно, этот прогноз оказался совершенно неверным — state of the art теперь на уровне 95%, как видно из таблицы лидеров соревнования на Kaggle. Впечатляет!)
I encourage people to try this for themselves (see my code, above), as it is very interesting and fun! I have trouble exactly articulating what I learned, but overall I feel like I gained more intuition for image classification tasks and more appreciation for the difficulty of the problem at hand.
Я призываю всех попробовать это самостоятельно (см. мой код выше) — это очень интересно и увлекательно! Мне сложно точно сформулировать, что именно я узнал, но в целом я чувствую, что приобрёл больше интуиции в задачах классификации изображений и большее уважение к сложности этой проблемы.
Finally, here is an example of my debugging interface: 
Наконец, вот пример моего отладочного интерфейса: