Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-08-04

Machine Learning Example Application

Продолжим.
Две предыдущие статьи (раз, два) содержат начало и продолжение рассказа о 10-ой неделе обучения (https://www.coursera.org/course/ml), тема «Large-scale Machine Learning». Были рассмотрены темы: Stochastic Gradient Descent, Mini-batch Gradient Descen, Online Learning, Map-Reduce and Data Parallelism.

Завершилась 10-я неделя обучения (и курс в целом) рассказом о построении комплексного приложения, использующего техники Machine Learning.
Приложение «Photo OCR» должно находить на фотографиях надписи и превращать их в текст.

В отличие от распознавалки текста в документах, разпознавать текст на фотографиях окружающего мира значительно сложнее.

Чтобы построить такое приложение, надо решить целый ряд задач.
Задача первая — нормализация изображений, что означает приведение к общему знаменателю цветности, контрастности, яркости, ориентации в пространстве и тому подобное.

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

В нашем Photo OCR пайплайн будет такой: Image → Text Detection → Character Segmentation → Character Recognition.

Задача Text Detection может быть решена применением техники известной как Sliding window classifier.

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

Имея классификатор (нейросеть), обученный отличать пешеходов от всего остального, мы можем подавать ему на вход куски (patch) интересующей нас картинки, получая ответ — пешеход или нет.

Фишка в том, как готовить эти патчи — техника скользящего окна. Для начала надо выбрать некий исходный размер этого окна и перемещать его по всей картинке, чтобы пошагово в рамку/окно попали все детали изображения. Потом размер окна увеличивается и цикл повторяется. И так столько раз, сколько надо, чтобы покрыть все возможные варианты фигур пешеходов на картинке.

Так вот, с текстом практически также, только вместо пешеходов — буквы.

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

На такую картинку мы натравливаем Expansion Operator. Этот оператор работает так: для каждого пикселя он смотрит, нет ли в его окрестности белого пикселя, если есть, данный пиксель тоже окрашивается белым. Так мы получаем эффект размытия, что дает нам вместо отдельных букв границы надписей. Мы находим регионы с белым цветом и находим для них рамки/боксы. Далее убираем боксы с неправильным aspect ratio — обычно текст ширше чем выше. В результате получаем боксы/рамки для скармливания распознавателю текста.

Следующий этап в pipeline — это character segmentation.
Задача этого этапа: получив на вход изображения надписей (полученный на предыдущем шаге), найти пробелы между буквами. Лично я не очень понял, почему поиск пробелов между буквами проще/легче чем поиск самих букв.

Мы строим и тренируем классификатор (нейросеть, к примеру), умеющий распознавать промежутки между буквами. Для этого нам нужен, разумеется, датасет с тренировочными данными, его надо готовить.

После получения такого классификатора мы можем найти отдельные буквы в надписи методом сдвигающегося окна.

В итоге мы подобрались вплотную к модулю распознавания буков, а это нам знакомо по предыдущим занятиям.

Осталось заключение: как добывать данные для датасетов, что можно сделать, чтобы увеличить/улучшить датасет, что делать для повышения качества продукта — во что вложиться для более точной классификации/предсказания/...
Продолжение следует


original post http://vasnake.blogspot.com/2014/08/machine-learning-example-application.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)