PassportVision — простой способ распознавать документы

    Наверняка вам доводилось попадать в такую ситуацию: заходите в какое-нибудь учреждение (почта, банк, больница, кассы и т. п.), где для достижения ваших целей необходимо предъявить паспорт. И вроде очередь-то небольшая, всего 5 человек, но ждать придётся очень долго, ведь тётя Маша тратит по несколько минут на внесение данных с каждого паспорта в компьютер. Вам остаётся только наблюдать, как её указательный палец не спеша планирует над клавиатурой в поисках очередной клавиши.

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



    Сегодня в выпуске:
    • Популярные заблуждения о паспортах
    • Немного об используемых технологиях
    • Наш подход к интерфейсу
    • Как лучше всего отдать данные пользователю

    Популярные заблуждения о паспортах

    Казалось бы — что такого сложного, чтобы распознать данные с паспорта? В конце концов, 2014 год на дворе, человечество уже научилось распознавать текст с картинки. Применил пару фильтров, вызвал метод recognize() — и готово!

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

    Все эти предположения ошибочны.
    1. Текст в паспортах всегда набран одним шрифтом
    2. Есть только два-три шрифта, которыми набирают паспорта
    3. Ладно, но шрифт не может быть жирным или курсивным
    4. Ну, одновременно жирным и курсивным он точно не будет
    5. Все данные паспорта написаны одним шрифтом
    6. Никто не заполняет паспорта от руки
    7. Каждое поле паспорта находится в строго определённом месте
    8. Каждое поле паспорта находится вблизи своего строго определённого места
    9. Ну, по крайней мере фамилия не уползёт на три строчки вниз до места под отчество
    10. И никогда данные не пишутся поверх надписей бланка
    11. Ну, друг на друга-то данные точно наезжать не будут
    12. Текст всегда написан строго горизонтально
    13. Ладно, но угол наклона текста не превышает 10–15 градусов
    14. Все данные находятся под одним и тем же углом
    15. Текст всегда чёрного цвета
    16. Ну, хотя бы все надписи точно одного и того же цвета
    17. Паспорт всегда имеет машиночитаемую зону
    18. Машиночитаемая зона всегда присутствует на паспортах, выпущенных после 1 июля 2011 года
    19. Машиночитаемая зона всегда корректна и соответствует стандартам
    20. Все буквы в паспорте написаны в верхнем регистре
    21. Все данные паспорта написаны в одной регистровой стилистике
    22. Все даты всегда представлены в одном и том же формате
    23. Имя не может быть разбито на две строчки знаком переноса
    24. Все паспорта печатаются на одинаковых бланках с фиксированным фоном
    25. В месте рождения и в месте выдачи не может быть цифр
    26. Личная подпись не может быть поверх данных паспорта
    27. Все данные паспорта всегда присутствуют
    28. Лишних данных точно нет
    29. Место выдачи паспорта всегда укладывается в три строчки
    30. Если в поле «Имя» написано «Анна», то пол обязательно женский
    31. Данные паспорта со временем не стираются
    32. Паспорт не имеет механических повреждений
    33. Паспорт не может быть испачкан вареньем

    Немного об используемых технологиях

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

    Основным языком программирования является C#. Возможно, кому-то такой выбор покажется странным, но он себя полностью оправдал. C# прекрасно подходит для создания масштабной архитектуры, а вёрстка сложного интерфейса даётся достаточно легко (спасибо вам, создатели WPF). Целевая аудитория сидит на Windows, так что с платформой проблем не возникло. Разные внутренние мелкие задачи решаем с помощью Python-скриптов.

    Для обработки изображений используется OpenCV, для распознавания текста — Tesseract (а точнее, их обёртки — OpenCvSharp и Tesseract). Критичные по производительности алгоритмы написаны на C++, но таковых немного. Приходится много работать со сканерами, причём поддерживать как WIA, так и Twain (для последнего используем обёртку TwaintDotNet).

    Общий workflow: система контроля версий — Git, просмотрщик репозитория — FishEye, continuous integration system — Bamboo, bug tracker — JIRA, code review system — Crucible (да, мы любим Atlassian).

    Наш подход к интерфейсу

    Всё было бы хорошо, если бы мы со стопроцентной уверенностью могли распознать данные с любого паспорта. Но, увы, это не так. Если дать программе на вход скан хорошего паспорта на 300 dpi, то, скорее всего, она распознает его без ошибок. А вот если программа столкнётся с фоточкой паспорта печального качества (и вдобавок шрифт окажется очень бледным и под углом, а надписи — не на своих местах), то у нас возникнут проблемы. Поэтому не остаётся другого выбора, как попросить пользователя проверить распознанные данные. И тут очень важно спроектировать чертовски хороший и удобный интерфейс, который позволит сверхбыстро проверить все данные и поправить ошибки. Ведь если время, затраченное на проверку паспорта, будет сравнимо со временем ручного ввода данных, то вся задумка теряет смысл. Мы не претендуем на то, что нам удалось создать лучший в мире интерфейс для подобной задачи, но можем со всей ответственностью заявить, что он хорош. В конце концов, мы сами едим свою собачью еду используем нашу проверялку данных каждый день уже больше года. Поэтому все косяки и неудобства очень быстро бросались в глаза и просили себя исправить. Итак, на что же мы обратили особое внимание, чтобы жить стало легче:
    • Навигация по полям. В главном окне слева размещается найденное изображение паспорта, а справа — распознанные поля. Для каждого поля на изображении паспорта подрисовывается рамка, при клике на которую мы переходим в нужное нам поле. Если у нас одно и то же поле присутствует на картинке в нескольких местах (например, серия и номер паспорта могут встретиться аж три раза), а результаты распознавания разные — то мы превращаем TextBox в ComboBox, чтобы можно было легко выбрать нужный вариант.
    • Подозрительные символы. В процессе распознавания мы помечаем некоторые символы как подозрительные — это такие символы, в правильности распознавания которых мы не очень уверены. Если ошибки и есть, то они почти наверняка находятся среди подозрительных символов. Поэтому мы раскрашиваем их красненьким и обеспечиваем удобную навигацию: по хоткею можно перейти к следующей или предыдущей группе подозрительных символов. Причём навигация достаточно интеллектуальна: если в поле почти все символы подозрительные, то при переходе к ошибке мы выделяем не только красные буквы, а вообще всё поле целиком.
    • Всплывающие подсказки. Изначально, чтобы проверить какое-нибудь поле, нужно было сначала посмотреть на поле, потом перевести взгляд на картинку с паспортом, найти там это поле. Потом обратно на TextBox, потом обратно на паспорт. Потом подумать и соотнести текст. Это долго и неудобно. Поэтому прямо рядом с TextBox-ом мы делаем всплывающую подсказку с соответствующим фрагментом паспорта. А чтобы искать нужные символы было ещё удобней, мы обводим на картинке выделенный пользователем текст. Если пользователь уже успел написать в поле своих символов, то программа умеет неплохо додумывать, где бы они должны быть на изображении и всё равно обводит.
    • Автогенерация формы. А что, если пользователю не нужны все поля? Скажем, требуется только ФИО. Зачем заставлять пользователя проверять все результаты? К счастью, список полей можно настроить так, чтобы отображались только те из них, которые вам действительно нужны.



    А знаете, вообще, мы очень долго пилили UI, очень много всего было сделано, кратко не расскажешь. Лучше мы потом сделаем отдельный пост, в котором подробно расскажем про все юзабилити-решения в программке. Если вы занимаетесь проектированием интерфейсов, то вам, наверное, будет интересно почитать не только про конечный результат, но и про процесс — как мы к такому интерфейсу пришли, почему сделали так, а не иначе.

    Как лучше всего отдать данные пользователю

    Ну, казалось бы, всё готово: изображение обработано, текст распознан, пользователь всё проверил. Чего ещё для счастья не хватает? Давайте подумаем: раз данные распознаются, значит, это кому-то нужно. И, наверное, этот кто-то планирует их потом использовать. И, надо полагать, использовать он их будет в какой-то своей программке. А значит, распознанные данные нужно как-то в эту программку передать. Встаёт логичный вопрос: как мы будем это делать?

    PassportVision Office. Увы, программок существует много, и для каждой нужно искать свой подход. Социологический опрос показал, что большая часть целевой аудитории вводит паспортные данные в документы, которые подготавливаются в MS Word. Поэтому мы сделали отдельную редакцию PassportVision для работы с Word:



    Идея в следующем: на риббон добавляется специальная вкладка, с помощью которой можно сформировать шаблон со специальными метками. Итак, данные распознались, пользователь их проверил, щёлкнул ОК. И, как по волшебству, данные вставляются в шаблон вместо заранее подготовленных меток. Достаточно часто документ оформляется с участием нескольких действующих лиц, поэтому для каждой метки можно указать, к какому лицу относится данный паспорт. Кладём первый паспорт в сканер, затем второй — и наш документ готов! Маркеры ведут себя достаточно интеллектуально. Например, для даты можно указать формат представления, а окончания отдельных слов могут зависеть от пола человека.

    PassportVision Adaptive. Увы, не все используют Word, в мире существует ещё множество программ, в которые можно вводить данные. Для всех писать отдельные редакции не очень целесообразно, поэтому мы написали универсальную редакцию, которую можно приспособить к любому приложению. PassportVision Adaptive эмулирует работу пользователя: где какую клавишу нажать, куда мышкой кликнуть. Нужно только сделать специальный макрос, в котором вы объясните программе, чтобы вы сделали, если бы вам понадобилось использовать результаты распознавания. Да, возможно, макрос для сложного ПО не так просто сделать, но это одноразовая операция. Разок всё настроили, и данные попадут в нужные места вашей целевой программы по нажатию специальных клавиш. А если проблемы с написанием макроса всё-таки возникают — мы помогаем всем клиентам с ними справиться.

    PassportVision SDK. А некоторые пользователи хотят использовать результаты распознавания в собственном ПО. Если вы разработчик, то вы можете использовать специальное API, чтобы получить все данные в нужном формате. Если ваше приложение разрабатывается не под .NET, то не волнуйтесь: мы заботливо завернули API в COM-обёртку, так что SDK можно использовать из-под C++ и Delphi.

    Другие редакции PassportVision. Разработка идёт полным ходом, мы стараемся сделать много разных редакций программы, чтобы каждый мог подобрать удобное для себя решение. Например, скоро на экранах появится версия под 1С (там тоже часто возникает потребность в вводе паспортных данных), а Adaptive-версия пополнится специальными макросами для веб-форм (нужно будет просто указать, в какие поля что заполнять, а волшебный JavaScript сделает всё остальное).

    Вместо заключения

    Если вы хотите использовать нашу программку для того, чтобы избавить людей от ручного ввода паспортных данных и сделать мир лучше, то можете связаться с нами, и мы расскажем про PassportVision подробнее. А если вы не заинтересованы в автоматизации документооборота, но интересуетесь тем, как идёт разработка ПО в разных компаниях, то специально для вас скоро будут посты с подробной информацией про организацию работы, компьютерное зрение и подходы к юзабилити. Разработка активно продолжается, сейчас мы добавляем поддержку разных видов документов (загранпаспорта, свидетельства о рождении и т. д. — они уже работают в альфа-режиме), новые редакции продукта и клёвые фичи. По ходу попадаются очень интересные технические проблемы, для которых приходится придумывать увлекательные пути решения. Если вам будет интересно, то мы также опубликуем посты о решении наиболее любопытных задачек — надеемся, кому-нибудь этот опыт будет полезен.
    Enterra
    42.33
    Company
    Share post

    Comments 124

      +30
      Интересно было бы увидеть примеры самых нестандартных паспортов из списка ошибочных предположений.
        +8
        Увы, 152-ФЗ не позволяет просто так взять и полностью выложить сканы документов. В следующих постах постараемся частично показать фрагменты паспортов (без персональных данных), которые представляют особый интересн в плане компьютерного зрения.
          +23
          Можно воссоздать с помощью фотошопа. Т.е., передать смысл позиции данных с фейковыми данными, наложив на картинку текст нужными способами. Но блин, я понимаю, что это нифига не 5минутная работа…
            0
            Имеется ещё один важный момент: при обсуждении алгоритмов компьютерного зрения очень важно работать именно с оригинальными сканами реальных паспортов, а не с фотошопными поделками.
            Исключительно в целях иллюстрации подобные фейковые документы делать будем, они будут полезны при объяснении нюансов работы некоторых наших алгоритмов.
              +3
              А это нельзя расценивать как подделывание документов и нарушение законов РФ? Просто интересно, у нас же всякое в стране бывает
                +6
                Тут всё сложно. Проблемы будут, если вы этот паспорт напечатаете и попытаетесь его использовать.
                А картинка по типу той, которая приведена в посте, совсем безобидна: все данные явно фейковые (код подразделения 000-000, дата рождения 01.01.1901 и т.п.), фотография рисованная.
                  0
                  А если бы даже выглядели реалистично, то что? Это графический файл, а не документ.
                    0
                    +1, без заверения нотариуса это всё равно абсолютно ничего, просто какая то картинка.

                    Ну т.е. можно заверить ЭТО как копию реально существующего документа… которого в реале нет, вот тогда у всех участников мероприятия могут быть проблемы.
        +12
        Никто не заполняет паспорта от руки

        Мой от руки. 2004 год.
        Когда работал в дилерской точке сотовой связи, в момент бума подключений, сколько я паспортов перевидал… Некоторые реально невозможно прочесть: почерк паспортистки + не совсем простая фамилия = жесть.
          +2
          Полностью с вами согласен. А еще в некоторых регионах были вкладыши на национальных языках (например в Башкортостане). Так теперь из-за этих вкладышей не всегда правильно обрабатываются сканы например в терминалах электронной приемной Президнета РФ.
            +2
            Были.
            Да вообще операторы разрешали регистрировать и на иностранные паспорта, в частности, много клиентов было с украинскими паспортами. Самое интересное — клиентское ПО оператора не позволяло вбить туда некоторые данные. Не помню, длина некоторых полей что-ли ограничена была… Так и регистрировали без некоторых цифр.
          +6
          Интересно было почитать, хоть я и далёк от разработки ПО :) Список мифов о паспортах особенно повеселил, особенно:
          Если в поле «Имя» написано «Анна», то пол обязательно женский
            +14
            А вот нас такие пункты заставили грустить. Дело в том, что если пол не удалось распознать с изображения (одинокая буква «М» спряталась там, где наши алгоритмы не смогли её найти), то мы пытаемся восстановить пол по ФИО. Гражданин Анна Викторович заставил наш алгоритм сконфузиться.
              +6
              Гадя Петрович прям таки
                +2
                Если есть отчество, то можно смотреть на его окончание. Правда, надо уметь отличать отчество от второго имени (а иногда и от фамилии).
                  +4
                  Попадается очень много сложных документов, в которых пол определить не так-то просто. Поэтому мы стараемся догадаться до правильного ответа по каждой части ФИО, а в конце выбираем тот пол, за который имеется больше аргументов.
                    0
                    А что, в российском паспорте не указывается пол?
                      +1
                      А ещё в российском паспорте нет пятен от варенья.

                      Хотя стоп…
                        +1
                        Пол может быть указан настолько волшебно, что ни один шпион ни одна программа не сможет его распознать.
                          0
                          Тремя сообщениями выше:
                          если пол не удалось распознать с изображения (одинокая буква «М» спряталась там, где наши алгоритмы не смогли её найти)
                    +11
                    — Как ребёнка-то назвали?
                    — Леночка!
                    — Хорошее имя!
                    — Да, имя-то хорошее. Но намучается с ним пацан…
                    +4
                    Класс! Скиньте контакт для связи на konstantin@payler.com
                    Мы делаем всякие клевые кейсы для оплата ЖКХ и пр.можем интересное кое что придумать!
                    Так же покажу друзьям из ритейла крупного)
                      0
                      Лендинг без единой явной ошибки, а тут-касяк накасяке…
                        0
                        Вы можете связаться с нами через sales@passportvision.ru.
                          –7
                          А с прямым конкурентом можно связаться через Engine@abbyy.ru :)
                            +8
                            Невежливо это как то в статье чужой компании упомянуть пять раз свой конкурирующий продукт. Одного раза бы хватило.
                          +3
                          Ссылка «Купить» (не кнопка) на сайте — диалог не разворачивается. (FF28)
                            0
                            Спасибо за фидбек, поправим.
                              0
                              Бага исправлена.
                              +3
                              Очень одобряю такую заботу о UI и минимизации количества телодвижений для пользователя. Не планируете заопенсорсить часть, или же добавить в программу функциональность распознавания чеков? Кроссплатформенность? Возможность интеграции для использования на своих вебсайтах?

                              Почему спрашиваю, интересно было бы использовать что-то подобное для сканирования чеков в домашней бухгалтерии.
                                0
                                Не планируете заопенсорсить часть
                                Нет, таких планов нет.

                                или же добавить в программу функциональность распознавания чеков
                                Будем работать в этом направлении.

                                Кроссплатформенность?
                                Наши клиенты-автовокзалы хотят такую возможность, скорее всего будем делать.

                                Возможность интеграции для использования на своих вебсайтах?
                                Если будет интерес, то сделаем виджет.
                                  0
                                  А на чем сидят клиенты-автовокзалы?
                                +1
                                Программка полезная, и задача очень интересная, но… Когда уже будет единая база данных, и будет достаточно предъявить только ID, который автоматически распознается (с помощью скана штрих-кода, например) в любом учреждении без всякого компьютерного зрения и алгоритмов распознавания пола. Мечты, мечты…
                                  +2
                                  Для автоматизации даже база не нужна: достаточно дублировать основные данные QR-кодом. Это позволит отказаться от дополнительного оборудования, как в случае с RFID-метками и прочим, можно использовать любой сканер/камеру + ПО.
                                    +2
                                    > Когда уже будет единая база данных

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

                                    А потом пришли Вы с работы, а там приставы, мол, «не хотите ли начать оплачивать кредит на 10 млн руб., который Вы (точнее, человек с полными вашими данными) взяли неделю назад под 90% годовых?»
                                      +5
                                      Бороться с мошенничеством путем скрытия или усложнения доступа к паспортным данным в век информационных технологий, на мой взгляд, наивно и глупо.

                                      Единая база данных не даст новых проблем с утечкой, т.к. эта утечка прекрасно возможна и сейчас.
                                      Например, сейчас полные паспортные данные требуют даже транспортные компании. В случае единой базы данных разница будет только в полноте покрытия.

                                      Введение единой базы данных как раз может помочь скрывать часть данных от третьих лиц. Оставляя, например, только ID и фото, чего достаточно для идентификации, вместо даты и места рождения, домашнего адреса и семейного положения.
                                        0
                                        Так все, кому надо, будут просто покупать эту, агрегированную базу, да и дело с концом. Спросят у вас ID, проверят по базе, и ок. Полнота покрытия будет 100%, это Вы правы.

                                        Знаете, обладая фрагментами знаний, можно собрать полную баз и сейчас. Но сейчас это труднее. Если бы только не дурные логики («принесите от них справку, что вы у них не брали справку»), я бы с фрагментарной базой лучше жил, просто потому что не у всех хватит сил обощить все и вся, а с готовой агрегированной базой все сразу известно всем купившим.
                                      0
                                      И сразу же будет крик о тоталитарном контроле.
                                      0
                                      Интересно как устроены метки в Word'e как-то делал через сохранение xml внутри документа, причем можно было использовать простые циклы и проверки. Как решается проблема неполноты данных? С юридической точки зрения такой паспорт вообще валиден?
                                        +1
                                        Интересно как устроены метки в Word'e как-то делал через сохранение xml внутри документа
                                        Рассказывать там очень много, сделаем на эту тему отдельный пост.

                                        Как решается проблема неполноты данных?
                                        В некоторых случаях удаётся «додумать» пропущенные данные (пол связан с ФИО, дата выдачи — с серией, орган выдачи — с кодом подразделения и т. п.)

                                        С юридической точки зрения такой паспорт вообще валиден?
                                        Единственная проверка валидности, которую мы автоматизировали — это проверка того, не истёк ли срок действия. Остальные вопросы валидности лучше бы доверять оператору.
                                          0
                                          с вордом проблема одна (docx) если вы впишите переменную %username% только не факт что в xml не будет так
                                          <history> %user </history id="988787">name%

                                          То есть по поиску и замене не сработает. Мы выходили другим способом. два символа крайне редких по бокам от имени переменной. А регулярка просто игнорировала любые теги между ними. Замена происходила без проблем.
                                          Ворд размечается переменными прямо в ворде без проблем и лишними панельками для него. Хотя с ними удобно. Под рукой.
                                        0
                                        А это баг у Вас, что на фотографии 1901, а в программе 1902?
                                          +2
                                          Дата рождения: 1901 год
                                          Дата выдачи паспорта: 1902 год
                                          Всё распозналось верно.
                                            0
                                            Возможно для избежания путаницы стоило разместить поля на форме сообразно с расположением данных в паспорте. Сейчас взгляд постоянно бегает крест-накрест X. Хотя вы конечно попытались это решить, добавив всплывающее окно с фрагментом паспорта соответствующим распознанному тексту.
                                          +4
                                          а почему цены за программу нет на сайте?
                                            0
                                            Мы пока до конца не определились с ценовой политикой, она сейчас достаточно гибкая: цену формируем исходя из потребностей клиента. Вы можете связаться с нами через форму на сайте, и мы обсудим вопрос стоимости индивидуально.
                                              0
                                              Хотелось бы знать хоть примерно. Создайте статистику нажавших кнопку «купить» на сайте и заполнивших форму. От количества обязательных полей глаза кровью наливаются, сразу хочется убежать, громко хлопнув дверью, к тому же, таким образом вы навязываете личное общение.
                                                0
                                                В ближайшие дни цены появятся на сайте. Форму постараемся сделать попроще.
                                            +7
                                            Glory to Arstotzka!
                                              +1
                                              Вам нужно попробовать поработать с банками и судами, там документов проходит уйма. На той неделе переговорю с геном, думаю мы найдем области применения вашей системы в деятельности наших клиентов (сказанул так сказанул).
                                                0
                                                Очень ждем. Уже успешно работаем со многими нотариусами, они весьма довольны)
                                                +3
                                                Чем ваш продукт лучше этого cognitiveforms.com/ru/products_and_services/cognitive_passport? У них уже все типы документов есть, есть даже демо-версия для «скачать-попробовать».
                                                Кроме того, по личному опыту, их движок распознавания оказался гораздо точнее и эффективнее, чем гугловский.
                                                  0
                                                  Чем ваш продукт лучше этого cognitiveforms.com/ru/products_and_services/cognitive_passport?
                                                  Скорость, юзабилити, активный девелопмент, наличие продукта для «домохозяек», которые можно использовать не будучи программистом. Ну и стоимость)

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

                                                  есть даже демо-версия для «скачать-попробовать»
                                                  Демо-версия имеется, вы можете отправить заявку через форму контактов.

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

                                                    +2
                                                    В задаче распознавания важен не сам движок, а препрцессинг изображения которое отдается этому движку.

                                                    Ой ну не скажите, не скажите. Я два года занимался потоковым распознаванием и точно знаю, что при одних и тех же идеализированных изображениях, результаты могут кардинально различаться, в зависимости от движка. Не даром лидер рынка всех европейских языков — наш родной Абби. Но и цена у него, конечно, тоже лидер. Фильтры изображения помогают, безусловно, когда нужно убрать шум, повернуть изображение, отрегулировать баланс и контрастность, но это никак не компенсирует внутренние алгоритмы распознавания.
                                                    У меня стояла задача распознавания бухгалтерских отчетов, т.е. табличный текст. CuneiForms при разрешении от 300 dpi без применения каких либо препроцессингов выдает чистый текст, а вот Tesseract — только кракозябры.
                                                      0
                                                      Ну хорошо, тогда переформулирую: зачастую препроцессинг важен. А в задаче распознавания паспортов и подобных документов он очень важен. Нам удалось добиться того, что Tesseract выдаёт очень хорошие результаты даже на некоторых попорченных паспортах на 100 dpi.
                                                        0
                                                        Кроме того, у нас с вами разные задачи, в нашей без препроцессинга ничего не сделать, специальные бланки как-никак) Конечно, у каждого из движков есть свои плюсы и минусы. Нам Tesseract подошел.
                                                        0
                                                        а кстати про стоимость. почему я не могу просто взять и посмотреть стоимость? прикинуть по деньгам на разные типы лицензий — по количеству машин, сроку действия лицензии, ограничение на количество распознаваний, если есть, и пр.
                                                        или вот вы говорите, что есть демо-версия. почему ее нельзя просто взять, скачать с сайта, протестировать и решить, годится она для проекта или нет? почему надо куда-то писать, что-то просить, ждать ответа… странный подход к распространению, в общем.
                                                        +1
                                                        По личному опыту продукты когнитива какие то интересные
                                                        Вот к примеру
                                                        cognitiveforms.com/files/Capabilities-Cognitive_Passport_API.pdf
                                                        Посмотрите внимательно на скриншоте версию компиляции ScanifyAPI.
                                                        Понимаю, что скрины старые возможно. Но… 2006 год компиляции?? Прям ничего не поменялось за 8 лет?
                                                        Помню, что и Dll ки на их диске были за 2005 год компиляции года два назад. Либо dll-ки достигли дзен, либо продукт не развивается вообще.
                                                        +2
                                                          +1
                                                          Одному мне интересно, как делалась капитализация букв при переводе текста, набранного одними прописными, в нормальный „строчный“ текст?
                                                          Отделом внутренних дел «Гольяново» города Москвы.

                                                          Просто словарные слова из какого-то заранее заданного набора?
                                                          Или это секрет?
                                                            +4
                                                            Могу только сказать, что помимо словарей используется много магии и регулярок =)
                                                              0
                                                              Ну, и на том спасибо, мил человек.
                                                            +2
                                                            Насчёт UI.
                                                            Мне кажется, было бы удобнее размещать поля формы на одной горизонтали с соотв. полями в паспорте (насколько это возможно).
                                                            Тогда сверку можно было бы проводить просто взглядом, а не обходить фокусом все поля по-очереди.

                                                            И, например, даты в поле формы стоит выводить ровно в том же виде, как в документе, а не переформатировать «под ISO». (в связи с пунктом 22)
                                                            Да и в остальных полях хорошо бы сохранить форматирование (разбивку на строки, регистр и пр.). По крайней мере, визуально, на форме.
                                                            Т.е. в идеале, форма с распознанными данными должна выглядеть как можно более похожей на сам документ.

                                                            P.S. Почему у вас на форме «Номер», когда в паспорте «Код подразделения»? Зачем путать пользователя?
                                                              0
                                                              Мне кажется, было бы удобнее размещать поля формы на одной горизонтали с соотв. полями в паспорте (насколько это возможно).
                                                              Привязка к геометрическому расположению полей на исходном изображении не так важна, т.к. у нас при работе с полем появляется всплывающая подсказка, содержащая нужное нам поле. Т.е. вам вообще не нужно смотреть на картинку слева. Намного важнее логический порядок полей: первостепенный интерес для пользователя имеет ФИО.

                                                              И, например, даты в поле формы стоит выводить ровно в том же виде, как в документе, а не переформатировать «под ISO»
                                                              Большинство целевых сценариев предполагают дальнейшую работу с датой именно как с датой, а не как со строкой. Например, день, месяц и год рождения могут пойти в три разных поля в пользовательской программе. Поэтому мы приняли решение приводить дату под общий формат, чтобы потом не было проблем изменить формат даты или работать с ней через SDK.

                                                              Да и в остальных полях хорошо бы сохранить форматирование
                                                              Этот момент настраивается. Если вам не нравится автоформатирование, то можете выключить соответствующую галочку в настройках.

                                                              Почему у вас на форме «Номер», когда в паспорте «Код подразделения»?
                                                              Тут проблема состоит в том, что во многих конечных формах соответствующее поле называется именно «номер», поэтому изначально мы поставили такой вариант названия.

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

                                                                Да, я умею читать. Собственно, об этом я и писал: чтобы увидеть эти подсказки, нужно по-очереди обойти все поля.
                                                                Подозреваю, что в большинстве случаев с качеством всё в порядке, и распознавание отрабатывает на 100%. (или это стоит добавить 34 пунктом в ваш список?) Соответственно, «работать» с каждым полем особой необходимости нет — вполне было бы достаточно визуально убедиться, что данные верны.
                                                                И вот тут как раз помогло бы «подражание» расположению и форматированию оригинального документа.

                                                                Большинство целевых сценариев предполагают дальнейшую работу с датой именно как с датой, а не как со строкой.

                                                                Так дата ведь и останется датой. Вопрос только в том, как её показывать в форме вашего приложения. А в те самые «целевые сценарии» ничто не мешает отправлять как дату в другом формате, так и её отдельные компоненты.
                                                                Даже при наличии той самой всплывающей подсказки, сравнивая 20.04.2003 и 2004-02-03, можно легко сделать ошибку.

                                                                во многих конечных формах соответствующее поле называется именно «номер»

                                                                А вот это они очень зря. Одно поле с названием «номер» ведь уже есть — номер самого паспорта.
                                                                Кроме того, теоретически, код может быть буквенно-цифровым. В то время как номер предполагает скорее число.
                                                                Думаю, если провести «коридорный тест», мало кто догадается, что в поле с названием «номер» нужно, на самом деле, заносить код подразделения.
                                                              +4
                                                              Забавно, сталкивался почти со всеми вашими технологиями\задачами, но в несколько других областях и они действительно очень увлекательные. Немного о моих задачах:

                                                              1) Tesseract и Cognitive OpenOCR для распознавания автомобильных номеров, распознавание текста со скана. Результаты получались очень хорошие при минимуме усилий.
                                                              2) OpenCV для нахождения копий эталонного изображения на больших планах (изображениях). Причем копии могли быть масштабированы на плане, перевернуты и т.д.
                                                              3) Com(Ole) для составления Word-отчетов. Это вообще моя гордость. Все было устроено несколько сложнее чем у вас (вам вероятно такие навороты будут излишни). В «шаблоне» помимо простых меток (мы их называли «полями»), могли быть коллекции, когда вставляется не одно значение, а несколько. Причем, если коллекция разнесена, то копировалась вся область документа на которую распространялась коллекция. Функции, параметрами которых могли быть так же функции с различными фильтрами. Вставка рисунков. Вставка в таблицы, формирование таблиц и прочее и прочее.

                                                              Самое занятное, что на первые две задачи было потрачено не более недели (на каждую), на третью 2 месяца. Опять же первые две были сделаны дабы закрыть формальные задачи проекта, не знаю используют ли их заказчики или нет, а вот третью используют очень активно.
                                                              По сему интересно было бы узнать:

                                                              1) Сколько у вас разработчиков трудится над проектом?
                                                              2) Какой процент распознавания данных?
                                                              3) Стоит ли вообще овчинка выделки при работе с «кривыми паспортами»? Может оператору стоит сразу забивать его руками, а не тратить время на сканирование, исправление ошибок, если программа при работе с такими паспортами все равно сбоит?
                                                                0
                                                                1,2) Это будет описано в следующих постах. Тут есть много нюансов, односложный ответ не так легко дать.
                                                                3) Наша задача — чтобы программа не сбоила =) Работы очень много, но нам удалось довести до вменяемого состояния распознавание таких паспортов, которые ещё полгода назад казались нам совсем безнадёжными. Хочется обеспечить настолько высокий процент успешного распознавания паспортов, насколько это теоретически возможно.
                                                                  –8
                                                                  Мы также экспортируем данные в Word-овские документы через стандартный механизм полей. Пользователь может создать свои шаблоны и автоматически заполнять их данными из любых типов поддерживаемых нами документов.

                                                                  Специальный инструмент для создания Word-овских шаблонов, описанный в статье, безусловно, удобен. Стандартные средства MS Word для работы с полями не так интуитивно понятны. Но в конечном итоге результат получается не хуже.

                                                                  ABBYY PassportReader SDK

                                                                    +1
                                                                    Возможно вы неправильно меня поняли, я не использовал стандартный механизм Word. Мы придумали свой синтаксис разметки (определенные теги, ключевые слова и т.д.) шаблона, после чего анализатор проходил по документу и разбирал конструкции. Получал имена, передавал их условному DataProvider'у и получал подставляемые значения.
                                                                      –4
                                                                      Да, был не внимателен. Меня сбило с толку упоминание «полей» в контексте MS Word, и так как я с этим работал совсем недавно, то подсознание выхватило из контекста именно это. Через word-овские поля такие сложные задачи, как вставка и форматирование таблиц вряд ли решается.
                                                                  +1
                                                                  Ждем версию под 1С
                                                                    –4
                                                                    Ждем версию под 1С


                                                                    Это бы не помешало, хотя рынок акупирован Abbyy пруф
                                                                      0
                                                                      Постараемся составить им конкуренцию)
                                                                      0
                                                                      Скоро будет.
                                                                      +2
                                                                      Свидетельство о регистрации транспортного средства (желток)?
                                                                        +1
                                                                        Будет. Сейчас активно работаем над добавлением новых типов документов.
                                                                          –11
                                                                          А у нас уже есть: ABBYY Passport Reader

                                                                          Но только в специальных билдах, поэтому по ссылке не описано. Спрашивайте

                                                                          Прямой конкурент :)
                                                                            +2
                                                                            Устали от вас.
                                                                              +5
                                                                              Прямой конкурент :)
                                                                              Крупная корпорация переманивает клиентов у компании на <100 человек прямо в их собственном корпоративном блоге. Не стыдно?
                                                                            +2
                                                                            Чем ваше решение лучше чем ABBYY PassportReader SDK? Желательно по пунктам и аргументированно, т.к. я использую ABBYY PassportReader SDK и знаю про него многое и очень им доволен.

                                                                            Как получить демоверсию SDK + примеры программ?
                                                                              +1
                                                                              аналогично. К тому же, очень важно еще сделать замер в скорости на тестовом файле).
                                                                                0
                                                                                Всё обязательно будет.
                                                                                  +1
                                                                                  Плюсом вам будет проверка контрольной суммы MRZ зоны. У Аби ее нет) В этом случае 100% гарантия определеных символов. Алгоритм проверки был где то в сети в каком то документе при каком то законе)
                                                                                    0
                                                                                    У нас есть хитрый учёт MRZ-зоны. Контрольную сумму считаем, но если она не сошлась, то полностью отбрасывать данные MRZ-зоны нельзя: их просто нужно аккуратно использовать. Контрольная сумма может не сойтись по разным причинам (некорректное заполнение, механические повреждения части зоны и т.п.). Поэтому если контрольная сумма сходится, то мы сильнее уверены в правильности результатов (увы, 100% там всё равно не получается), если не сходится — то процент уверенности несколько снижается.
                                                                                      –11
                                                                                      Мы с этим тоже столкнулись. В MRZ зоне бывают ошибки и в случае несовпадения контрольных сумм просто отбрасывать результат нельзя. Используем для повышения общего качества

                                                                                      ABBYY PassportReader SDK
                                                                                –14
                                                                                Статья на хабре про ABBYY PassportReader SDK: http://habrahabr.ru/company/abbyy/blog/174539/
                                                                                  0
                                                                                  Abbyy потихоньку начинает переходить в категорию «Спамеры».
                                                                                  +1
                                                                                  Заказать демо-версию вы можете на официальном сайте.

                                                                                  Скоро планируем делать полноценное исследование по скорости, качеству и удобству работы нашей программы в сравнении с конкурентами. Результаты будут выложены в рамках одного из следующих постов. Прямо сейчас подробно расписать плюсы и минусы каждого решения не готов, ведь хочется не бросать слова на ветер и подкреплять их чёткими аргументами. На подобное сочинение потребуется некоторое время. А пока вы можете самостоятельно сравнить версию Abbyy с нашей демоверсией и составить первое впечатление.
                                                                                    0
                                                                                    Заказал демо SDK + спросил цены, уже часа 4 прошло — никакого ответа. Как то не оперативно Вы реагируете на запросы. Печалька :(
                                                                                      0
                                                                                      Спасибо за интерес, скоро пришлём.
                                                                                        0
                                                                                        Жду кода активации уже второй день… Если у Вас такая и тех.поддержка, то сразу скажу — я точно у вас не куплю ничего, даже за меньшие деньги чем у конкурентов.
                                                                                  0
                                                                                  Если хотите много денег, то обратите внимание на коммент выше относительно 1с! Уже представил, что на моем недавнем месте работы данная вещь будет внедрена на КПП для автоматического оформления пропусков(потом, когда выиграете многомиллионный тендер на поставку в воинские части, возьмете меня на работу)))) Недавно делал похожую вещь с использованием tesseract — результаты впечатляют, если особо не волнует скорость обработки, то идеальное решение. Но во всем этом меня всегда волновало одно — сколько процентов от своих доходов Вы будете отдавать в поддержку проекта tesseract — понимаю, что опенсорс и все такое, но я недавно озадачился этой мыслью, когда понял, что проект, который мне сейчас приносит доход почти полностью состоит из открытых библиотек. Мое — только идея…
                                                                                    +1
                                                                                    Вот хотя выше в комментариях сильно хвалят Tesseract ORC, но у нас при распознавании номеров с ним прямо противоположные разборки были. Работает только если получается точно оконтурить букву. Если буква размазана, потёрта, наклонена, сливается с фоном или с другими буквами, то он напрочь отказывается работать (тобишь на кадрах, сделанных зимой и при плохом освещении), корреляция выдаёт результаты значительно лучше.
                                                                                    Как я понимаю ряд проблем с неизвестным шаблоном буквы, из смазом, грязью и.т.д. встречается и в вашей задаче. И он всё равно работает?
                                                                                      +1
                                                                                      Tesseract достаточно требователен к качеству изображения. Нам удалось подобрать для русских паспортов такую систему адаптивных фильтров, что Tesseract отрабатывает на отлично.
                                                                                        0
                                                                                        У Tesseract есть возможность обучения, использовали ли Вы её или удлось все реализовать со стандартным набором русского словаря?
                                                                                          +1
                                                                                          Короткий ответ: в текущей стабильной продакшн-версии используется стандартный словарь.
                                                                                          Но нас этот словарь не совсем устраивает. Отдельное направление исследований связано с таким обучением тессеракта, которое бы на паспортах давало лучшие результаты, чем стандартный словарь. Увы, пока не получилось обучить так, чтобы улучшение результатов было на всей выборке паспортов: где-то начинает работать лучше, где-то хуже. Поэтому кастомные словари используем только для внутренних целей. В планах есть добить обучение тессеракта и перейти на свой словарь.
                                                                                            0
                                                                                            Не легче ли свою нейросеть под задачу написать? Такие алгоритмы можно значительно лучше конфигурировать и настраивать, чем Tesseract.
                                                                                              0
                                                                                              Я считаю, что не легче. На текущий момент качества тессеракта нам вполне хватает, кастомный словарь был бы просто приятным бонусом. Когда вплотную доберёмся до улучшения части по распознаванию символов — будем смотреть вариант с собственной нейросетью.
                                                                                      0
                                                                                      Где же вы были раньше???!!!
                                                                                      В Сочи в период проведения олимпийских игр ОВД не успевали выдавать регистрации всем приехавшим — приходилось задействовать чуть-ли не добровольцев для вбивания паспортных данных в формы заявок на временную регистрацию. (более 50000 тысяч заявок на 5-7 сотрудников паспортно-визовой службы).
                                                                                      Опять же — волонтеры с аналогичными проблемами.
                                                                                      Идея отличная, желаю вам перспективных госзаказов.
                                                                                        +3
                                                                                        а где вы были раньше?) Продукты на рынке есть точно лет 5.
                                                                                        0
                                                                                        А возможно ли без особого геморра интегрировать с веб-интерфейсами?

                                                                                        Довольно типичный, по-моему, случай: CRM-система с веб-мордой, рабочие станции под линуксом (по сути кроме браузера и программы-сканилки ничего не нужно, значит винда не нужна), девочки операторы вводят паспортные данные в морду, плюс прикладывают файл со сканом паспорта. Может какой-то плагин к браузеру? На худой конец REST или подобный интерфейс, которому отправляется формочка с файлом, а он получает распознанные данные и варнинги в JSON формате.
                                                                                          0
                                                                                          Спасибо за хорошее предложение, будем работать в этом направлении.
                                                                                            0
                                                                                            Мы сделали себе и плагин для браузера и вебморду) Даже для тупых сканеров утилиту

                                                                                            То есть кладем паспорт, жмем кнопку на сканере при открытой в браузере вкладке с регистрацией. Получаем заливку и автоматическую распознавалку.
                                                                                          +13
                                                                                          Если «прямые конкуренты» в вашем посте пять раз в комментах упоминают свой продукт, значит у вас всё получилось хорошо ;)
                                                                                            0
                                                                                            А кто это придумал, что паспорт не может быть испачкан вареньем?
                                                                                              0
                                                                                              По мотивам того, что приходилось встречать на картинках паспортов.
                                                                                                0
                                                                                                А правильно ли стараться распознать такие полуиспорченные паспорта? С пятнами, с всевозможными опечатками паспортистов? Как мне кажется, в таких случаях лучше отправлять человека за новым документом, иначе это сделает другой оператор/чиновник.
                                                                                                  0
                                                                                                  Такая задача ложиться целиком на оператора. А задача программы — стараться максимально хорошо распознать данные в любых условиях.
                                                                                              0
                                                                                              Лилу Далас, мультипаспорт! (с)
                                                                                                0
                                                                                                Как приятно видеть в статье упоминание своего района!

                                                                                                А по делу, штука интересная, но нигде такое внедрять не будут, к сожалению.
                                                                                                О чем говорить, если в 90% бланков до сих пор даже не могут сделать форму, в которую помещается мое место выдачи паспорта (вместо ОВД «Гольяново» канитель на 11 слов)
                                                                                                  0
                                                                                                  А в буквах сколько? У меня вот так:
                                                                                                  ОУФМС России в Советском районе города Владивостока
                                                                                                    0
                                                                                                    У меня чуть побольше будет…
                                                                                                    Отделением по району Гольяново ОУФМС России по гор. Москве в ВАО
                                                                                                      0
                                                                                                      Мериться так мериться.
                                                                                                      Отделом УФМС России по Ханты-Мансийскому автономному округу-Югре в городе Сургуте

                                                                                                      Благо сокращается хорошо.
                                                                                                  +1
                                                                                                  В месте рождения и в месте выдачи не может быть цифр

                                                                                                  А как же Арзамас-16? :)
                                                                                                    +1
                                                                                                    Предложения из списка ошибочны, это именно заблуждения, а не факты. PassportVision это учитывает, так что он легко справится с вашим Арзамасом-16 =)
                                                                                                      0
                                                                                                      Да, я понял. Просто у меня и такого предположения не возникло, я с детства помню о номерных городах.
                                                                                                    0
                                                                                                    В аэропртах, на границе уже используются какие-то автоматизированные системы сканирования и распознования паспортов. Система тормозная, часто быват задержки на паспортном контроле. Может вам в ФМС обратится с предложением?
                                                                                                      0
                                                                                                      Спасибо за предложение.
                                                                                                      0
                                                                                                      Уже сто раз пожалел, что купил у вас.

                                                                                                      Свою поддержку и отдел работы с клиентами можете уволить всю целиком.
                                                                                                      Покупал SDK для реализации своего модуля на Delphi.

                                                                                                      Возникли сложности с подключение вашего модуля к Delphi. Интерфейсы все проинициализировались, и в pas обозначены, но главного класса в pas не оказалось.
                                                                                                      Пишу в поддержку, мол так-то не подключается.
                                                                                                      Отвечают мол максимум что мы вам можем так это скинуть документацию на описание интерфейсов. Либо платная техпомощь.
                                                                                                      Пишу — хорошо, давайте платную.
                                                                                                      Я действительно, реально сидел ждал ответа.
                                                                                                      Прошла неделя. И на этом все, больше ТП не отвечает вообще. Окей, звоню на горячую линию.
                                                                                                      Вызов приняла девушка. Говорю — Прошу соединить меня с ТП.
                                                                                                      Отвечает мол все уже уехали по домам, дайте мне свои контактные данные, мы завтра перезвоним.
                                                                                                      Как вы наверно догадались, никто так и не перезвонил, ни через день, ни через три.
                                                                                                      Ну раз не хотите взаимодействовать напрямую, будем использовать другие способы.
                                                                                                      От неимения выбора решил покопаться в модулях сам, сменил версию Delphi несколько раз, после неутешительного результата вернулся к старой Delphi, напоследок решил еще раз попробовать, и О чудо, в pas появился основной класс, и по весу втрое больше, чем предыдущий.

                                                                                                      Теперь что касается вашего модуля:
                                                                                                      - Удобный API это конечно хорошо, только каким образом это все касается вашего модуля? Почему вы не добавили возможность получить куски изображения, как например фотографию для дальнейшего использования на бейджики, как это сделано у аналогов, или других обрезок, в том числе целиком документа, ту область что выделяет сам распознаватель?
                                                                                                      - Почему я не могу изменить названия столбцов row в которых приходят строки? Они у вас на русском, если же моя система не поддерживает русский язык или языковый пакет не установлен, эти названия столбцов мне приходят с вопросиками.
                                                                                                      - Распознавание с плохим качеством изображения это конечно не ваш конек, но почему я запускаю обычный FineReader и он распознает текст и любые шрифты без проблем.
                                                                                                      - Выявление области документа просто ужасное, мало того что на сером фоне он просто теряется, так в нормальном фоне если документ повернут на 10 градусов, то это конец распознавателю, он берет вырезает оттуда куски и вставляет похоже рандомно.
                                                                                                      Непонятно, почему от изменения области в ручном режиме меняется конечный результат распознавания, он что ищет строки фиксированно?
                                                                                                      И что это такое? он что пропустил документ зато на сером фоне нашел залежи золота?
                                                                                                      Почему мне разработчик за пол дня на коленке смог разработать модуль на Java, который автоматически удаляет фон если он есть, поворачивает документ строго по краям чтобы встал под 90% по горизонтали специально для вашего модуля, который этого не умеет.
                                                                                                      - Вы писали что пол он определяет и по отчеству тоже, так почему он определил отчество, и оно заканчивается на «ВИЧ», а пол указал мужской, и как так почему отчество иногда «МУЖ.»? Почему в имени или фамилии иногда появляется точка? Как в ФИО могут быть знаки препинания? И каким образом месяц может быть 64?
                                                                                                      Невообразимо, как можно было допустить такие детские ошибки?

                                                                                                      Модуль стоит не дешево, впервые встречаю продакшн продукт, с откровенно наплевательским отношением к клиентом и кучей детских ошибок. Ну год же уже прошел.
                                                                                                        0
                                                                                                        Присматривался к этой штуке. Я так понял вы не рекомендуете ее?
                                                                                                          0
                                                                                                          Решать, вам, аналоги дороже.

                                                                                                          Перечень недостатков на самом деле неполный, их куда больше, но самая существенная из них — это утечка памяти, после обработки например 50-ти документов память основного процесса около 1 Гбайт, и это после того как работу с модулем мы закончили, и в какой-то момент после обработки до 100 документов память превышает 2 Гбайта(x86 приложение), и приложение вылетает вместе с модулем, а если «сохранение данных сразу» не предусмотрено, вы их потеряете.

                                                                                                          Если же мы хотим подключить x64 модуль, то ничего у вас не выйдет, ибо при попытке подключения пишет класс не зарегистрирован, а какой вы неузнаете, ибо это спрятано в недрах dll. Инсталятор сам их не регистрирует, или он не оповещает о то, что зарегистрировать не удалось, например если нужных модулей нет.
                                                                                                            0
                                                                                                            компания не фунционирует. Демки на сайте просят либы VC2013
                                                                                                          0
                                                                                                          Вот бы еще реализацию для NodeJS, хотя бы как cli утилиту, возвращающую данные в JSON.

                                                                                                          Only users with full accounts can post comments. Log in, please.