Показывая: Компьютерное зрение! Глубокое обучение!

В апреле 2014 года мы с друзьями посетили Big Hack, хакатон Cal vs. Stanford. В то время мы были наивными первокурсниками и использовали термин машинное обучение, как если бы мы были самим Яном ЛеКуном. Естественно, мы решили создать нечто совершенно не подходящее для нашей лиги: приложение, которое распознавало бы отдельные шахматные фигуры на изображении шахматной доски, а затем сообщало бы вам, кто выигрывал и какой был лучший ход.

Последнее было легко: мы просто загружали шахматную позицию в Stockfish, шахматный движок с открытым исходным кодом. Компонент распознавания изображений был намного сложнее, чем мы ожидали, поэтому мы немного изменили направление: теперь вы будете делать снимок после каждого поворота, и приложение будет определять, какие квадраты изменились, и поэтому оно все равно сможет отслеживать игра. Но даже это оказалось для нас слишком сложно, и после 24 часов взлома нам нечего было демонстрировать.

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

Первый шаг к определению шахматных фигур на изображении доски - это обнаружить доску и разделить ее на 64 маленьких квадрата. Я наткнулся на этот пост в блоге, в котором рекомендуется использовать детектор кромок Кэнни, а затем линейный детектор Хафа, и в основном это то, что я сделал. Детектор линий Hough улавливает 9 горизонтальных и 9 вертикальных линий, составляющих шахматную доску 8x8. После Хафа вы можете вычислить все точки пересечения, запустить агломеративную кластеризацию, выбрать угловые точки, выполнить сдвиг перспективы, а затем разделить на 8 по горизонтали и вертикали, чтобы получить квадраты.

Следующий шаг - определить шахматную фигуру на каждом из 64 квадратов. Прежде чем я перейду к этому, полезно сделать шаг назад и взглянуть на современные достижения в области распознавания изображений. Насколько хорошо компьютеры распознают повседневные изображения? Существует конкурс под названием ImageNet Large Scale Visual Recognition Competition (или сокращенно ILSVRC), который позволяет количественно оценить это. Google GoogLeNet выиграл ILSVRC в 2014 году с показателем первой пятерки ошибок в 6,7%, что означает, что в 93,3% случаев фактическая метка для изображения входила в пятерку лучших меток, возвращаемых нейронной сетью. Karpathy создал веб-приложение, которое позволяет попробовать маркировать изображения ILSVRC. Сможете ли вы победить GoogLeNet?

Итак, глубокие сверточные нейронные сети, такие как GoogLeNet, довольно хорошо распознают изображения. Что мы можем сделать, так это взять нейронную сеть, обученную на наборе данных ImageNet, и настроить ее с нашими собственными данными и метками. Этот процесс называется трансферным обучением. Однако для того, чтобы это сработало, мне потребуется тонна данных: изображения шахматных фигур вместе с их метками. Обойти это было невозможно: я сделал кучу снимков и в итоге получил более 10 000 изображений шахматных фигур, которые я пометил вручную. Поскольку шахматные фигуры инвариантны к вращению, я дополнил данные вращениями.

Имея данные в руках, пришло время тренироваться. Используя фреймворк глубокого обучения Caffe и предварительно обученный AlexNet (победитель, ILSVRC 2012), настроенная нейронная сеть быстро достигла 99% точности на тестовом наборе. Милая!

В условиях исследования на этом все и закончится. Но я хотел создать Chess ID, поэтому мне нужно было развернуть модель распознавания изображений на сервере. Оказывается, оценка AlexNet на 64 изображениях требует значительных вычислительных ресурсов, и я был поражен скоростью MacBook Pro.

Как видно из диаграммы, производительность облачных хостов оставляет желать лучшего. Вместо того, чтобы платить 480 долларов в год за инстанс Linode объемом 4 ГБ, я собрал дешевый сервер примерно за 350 долларов. Как это сделать? Он может обрабатывать шахматную доску за 5,75 секунды, что на волосок быстрее, чем экземпляр Linode 4 ГБ. Неплохо для процессора Pentium.

Теперь давайте посмотрим, как работает Chess ID:

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