В этой статье я расскажу, как мы применяли нейросети для преодоления заградительных мер для независимых кандидатов на выборах.
![](https://habrastorage.org/getpro/habr/upload_files/7b2/dd2/fbc/7b2dd2fbc4ac07be0fdda0ea73ae7961.png)
Статья будет состоять из двух частей: в первой я расскажу о поставленной задаче и абсурдe, а во второй будет техническое решение проблемы.
Персональные данные в некоторых местах заблюрены, так что не удивляйтесь что некоторые места в картинках нечитаемы.
В российской политике есть такая абсолютно глупая заградительная мера как сбор подписей для выдвижения на выборы, если вы независимый кандидат. Для регистрации необходимо собрать 15 тысяч абсолютно идеальных подписей, т.е на практике это выливается в то, что нужно собрать около 25 тысяч, так как треть собирается с "Браком". Этот "Брак" покажу чуть позже.
В двух словах о процессе. Сборщик подписей ходит по квартирам или по улицам, пристает к людям с просьбой записать свои паспортные данные на бумажке. Потом эти подписи сдаются в избирательную комиссию, чтобы доказать, что избиратели не против, появления кандидата в бюллетене. После этого они проверят подписи по своим неполным базам, если захотят смогут корректно прочесть. И в конце, если информация совпадает не менее чем на 95 процентов, вас зарегистрируют. Но это в теории.
![Пример подписного листа Пример подписного листа](https://habrastorage.org/getpro/habr/upload_files/e3b/1e6/a86/e3b1e6a866ac1ef6cacdc072828d1e3b.png)
Итак, с чем мы работаем? Слева вы видите пустой подписной лист, куда избирателям нужно поставить свои подписи. Внизу ее нужно заверить сборщику подписей, а еще ниже кандидату. Т.е один лист нужно подписать трем или четырем людям. Очень много слова подпись, но без него никуда, извиняйте.
Какие у нас есть поля? И кто их должен заполнять?
ФИО — Избиратель
Год рождения — Сборщик
Адрес проживания — Сборщик
Серия и номер паспорта — Сборщик
Дата подписи — Избиратель
Сама подпись — Избиратель
Т.е поле 1, 5 и 6 заполняется избирателем, а 2,3,4 сборщиком...
Но переходим, так сказать, к самому вкусному. Каждую подпись необходимо неоднократно проверить разными специалистами перед сдачей в избирательную комиссию. Что вообще специалисты проверяют?
![Рис.1 Пример проблем с ручкой Рис.1 Пример проблем с ручкой](https://habrastorage.org/getpro/habr/upload_files/477/6b2/8f9/4776b28f95e2d301732fcdf367ed706d.png)
Полноту прописанного текста. (Рис.1) Такую подпись с большой вероятностью признают недействительной, так как тут не пропечатаны несколько букв, хотя спокойно читается Александров Максим Юрьевич.
![Рис.2 Пример двоякочитаемого почерка Рис.2 Пример двоякочитаемого почерка](https://habrastorage.org/getpro/habr/upload_files/838/94b/527/83894b527309b2fe08796309c53e5e72.png)
Проверка на качество почерка. (Рис.2) Избирательные комиссии трактуют двоякочитаемый текст не в пользу независимого кандидата. Например, тут могут придраться, что это Попиков, Горипов, Горинов, Полишов, Горопов и тп. Никто не будет разбираться, что тут на самом деле, хотя с очень высокой вероятностью это Голиков.
![Рис. 3 Пример якобы исправлений Рис. 3 Пример якобы исправлений](https://habrastorage.org/getpro/habr/upload_files/268/74c/834/26874c8344d4fe8a91673ff710dfc53a.png)
Исправления. (Рис.3) Если в тексте есть какие-то черточки и помарки, то избирательная комиссия по закону может признать это исправлением. А если это исправление, то необходимо зачеркивать (((Ошибку))) и приписывать рядом "исправленному верить", и расписываться рядом. Иногда возникает абсурдная картина, если почерк у избирателя или сборщика неидеальный. Пример ниже.
![Иногда количество исправлений уже комично (Персональные данные заблюрены) Иногда количество исправлений уже комично (Персональные данные заблюрены)](https://habrastorage.org/getpro/habr/upload_files/ab3/9db/119/ab39db11926c221d296ef3e50d080b40.png)
Следующие пункты без фоток, иначе статья получится слишком большой.
Рисовка. Наверное, некоторые из читателей думают, а почему нельзя просто взять и нарисовать от себя подписи. Можно, так и делают чтобы испортить жизнь независимым кандидатам, причем в двух случаях: во-первых, чтобы просто заработать больше денег, а во-вторых, чтобы испортить подписи. Для того чтобы не недопустить рисовку, необходимо проверять текст и по почерку.
Проверка паспорта на действительность. Паспорт может быть недействительным как утерянный или как истекший. Такие подписи признаются недействительными.
Дубликаты. Иногда подписи повторяются и нужно проверить их на уникальность.
Секретная проверка. Не буду раскрывать способ, но так мы вскрываем недобросвенных сборщиков.
Сразу скажу, у избирательной комиссии есть доступ ко всем базам, и при добросовестном исполнении закона спокойно можно зайти в них и найти, как правильно читаются данные избирателя.
Объем работы
Для того чтобы оценить эффективность введенного решения, необходимо определить обьем работ и вообще оперировать какими-то цифрами.
Есть примерно 20000 листов, которые должны проверить несколько специалистов. По статистике только каждый пятый лист был заполнен 2 подписями. Плюс после каждого исправления необходимо заново все проверить. Итого необходимо больше десятка итераций с каждым листом, в сумме несколько сотен тысяч.
Ах да! Каждую подпись надо еще сшить в папку и составить по ней итоговый протокол. За 30 дней.
Без модной цифровизации не обойтись никак, те, кто работал даже с 1000 листов, понимают что это уже огромный объем работы.
Для того чтобы выполнить задачу, мы написали CRM(про нее напишу отдельную статью). В ней присутствует цифровой двойник физического листа, с которым мы производили все манипуляции, пока физически лист лежал в папочке. Т.е. мы сокращаем количество дотрагивания до бумаги до минимума.
![Цифровой двойник Цифровой двойник](https://habrastorage.org/getpro/habr/upload_files/ae8/ddf/191/ae8ddf1915ff0ece2bddd5ea3f9b1708.png)
Но возникла новая проблема: чтобы оперировать с двойником, необходимо все эти двадцать тысяч листов отсканировать и вручную перебить их содержание в систему. Плюс после каждого исправления физической подписи необходимо обновить и двойник. По статистике это каждая третья. Итого: необходимо оцифровать 27 тысяч подписных листов. У нас этим занимался целый отдел, сначала сканирование, потом перепечатка, проставление идентификатор и по новой. Процесс оказался трудоемким, средняя скорость одного человека получилась около 110 листов в день
| Количество сканирований листов | Средняя скорость одного оцифровщика | Суммарная работа |
27000 шт | 110 листов в день | 246 человеко-дней |
И не забываем, что у нас всего 30 дней и небольшой офис, который уже переполнен!
В игру вступают нейросети
И тут у нас возникла очевидная идея — а давайте использовать нейросети, чтобы просто автоматически оцифровывать весь текст.
Первой идеей было тупо засунуть весь лист в нейронку, а потом кодом вытащить данные и расставить куда нужно. Мы изучили различные сервисы OCR и начали испытывать их на деле. Одним из первых попробовали сервис от ABBYY, и результат нас удивил:
![Пример обработки подписного листа продуктом от ABBYY Пример обработки подписного листа продуктом от ABBYY](https://habrastorage.org/getpro/habr/upload_files/a61/b6c/402/a61b6c402a7e34657a832c6de913d824.png)
Это какое-то авангардное искусство, но никак не считывание текста. Красиво, но бесполезно.
Попробовав еще пару вариантов нам стало очевидно, что засовывать весь лист целиком в нейронку нет смысла, и было принято решение сначала разрезать лист на кусочки, а только потом скармливать их компьютерному мозгу. Такого ПО в открытом (да и в закрытом скорее всего) доступе нет. Пришлось писать самим.
Саму нейрость-OCR выбрали Яндекса, так как она лучше всего обучена на русский язык и имеет доступный API.
С помощью Opencv мы находим на листах поля с данными и режем на кусочки
![](https://habrastorage.org/getpro/habr/upload_files/01a/7d5/3b0/01a7d53b0e83ac5e6aaa40dcaf17687c.png)
Для повышения процента успешной обработки текста мы переводили изображение в негатив, выделяем и удалялем шум.
![Негатив подписи Негатив подписи](https://habrastorage.org/getpro/habr/upload_files/dc4/cb0/657/dc4cb0657c2edaad15b0608158aba661.jpg)
Маленькими порциями по одному блоку нейросеть переваривает изображение намного лучше.Тем самым мы довели до максимума качество исходных данных с нашей стороны, теперь итоговый результат зависит только от Яндекса.
Теперь стоит задача из разрозненных идей собрать единый бизнес-процесс. Выглядит это так:
![Цепочка передачи данных Цепочка передачи данных](https://habrastorage.org/getpro/habr/upload_files/c5e/06d/8b7/c5e06d8b75aa07f24e84d4523276f577.png)
Процесс стыковки с Яндексом не буду описывать для краткости. Такая схема оказалась на удивление шустрой и рабочей. Финальные штрихи и подключаем нашу конструкцию к CRM. Распихиваем получившуюся инфу от нейронки по полям листа.
Запустили конструкцию в работу, и тут вскрылся любопытный момент. Начались проблемы с нейронкой яндекса, в большинстве случаев она начала выдавать просто набор букв и цифр, иногда это принимало забавный вид, ниже примеры.
![](https://habrastorage.org/getpro/habr/upload_files/40f/860/3b9/40f8603b9aeed7f00f156fc9ded9e448.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/dc7/b8f/d48/dc7b8fd4804949ccc3f66c236db67346.jpeg)
И тут начался настоящий бунт среди оцифровщиков. Они сидели на KPI, и когда нейронка начала проставлять такие значения в поля это сильно замедлило работу и они начали терять деньги. После нескольких применений они просто переставали использовать нейросеть. Стоять над ними и бить палкой, мол, используй новые технологии — не вариант. Столько сил и времени потратить на вещь, которой просто не стали пользоваться, просто неприемлемо.
А теперь статистика
Даты и год рождения нейросеть переваривала довольно хорошо, где-то процентов 80. C фио уже намного хуже, точность падает процентов до 15. Адрес распознать практически нереально: всякие точки, слеши и прочие знаки сбивают нейросеть с толку, поэтому точность примерно 7 процентов. А вот номер паспорта определялся вполне неплохо, около 70 процентов.
Поле | Пример поля | Точность |
ФИО | Лихтарова Диана Дмитриевна | 15% |
Год рождения | 08.02.1982 | 80% |
Адрес проживания | ул. Профсоюзная д.123А стр.2 квартира 127/128 | 7% |
Серия и номер паспорта | 4613 232509 | 70% |
Дата подписи | 22.06.2021 | 80% |
Почему такие низкие результаты? Потому что почерк у людей в среднем далеко не каллиграфический, и это можно понять, этот навык в современном мире требуется все реже и реже.
![Пример с чем обычно работает нейросеть OCR Пример с чем обычно работает нейросеть OCR](https://habrastorage.org/getpro/habr/upload_files/2cc/a86/c0b/2cca86c0b2063e342815387a3871d597.png)
Регулярки.
Мы стали думать дальше, что делать, качество исходных данных мы довели до максимума, а на нейросеть Яндекса мы повлиять не можем.И мы нашли решение, добавили между срм и нейронкой яндекса регулярные выражения. Т.е нейросеть считывает картинку, выдает информацию, мы ее проверяем регулярками на адекватность, и если все хорошо, то вставляем в CRM.
Теперь бизнес-процесс выглядит так:
![](https://habrastorage.org/getpro/habr/upload_files/07c/08d/ab5/07c08dab5e12c54fe3e1d1bcdc7c5a17.png)
Из выдачи нейросети cразу убрали:
Знаки препинания
Латинские буквы
Цифры в ФИО
Текст в датах
Невозможные даты (например 9021 год)
Только 10 символов в паспорте
Времени было очень мало, поэтому мы делали наспех и сразу видно что можно улучшить, например, подключить словари имен.
Но это улучшение не решило главной проблемы применения нейросети, оцифровщики просто ее не используют, так как даже исправление одного поля сильно тормозит работу, им приходится проверять все, что выдает нейросеть, править ошибки, или вообще все сносить и заполнять заново. Поэтому все осталось по-прежнему, автоматическое распознавание текста бросали после 4-5 неудачных попыток.
Поэтому мы приняли решение вообще отключить вывод информации от нейросети для адреса и фио. Оставили только цифровые значения. И вот этот подход уже сработал.
Осталось определиться с порядком использования OCR
Мы проверяли 2 режима
Автоматическое применение. После загрузки изображения всегда идет автоподстановка результата обработки нейросети в поля.
Ручное применение. После загрузки подписного листа оцифровщик на глаз определяет, переварит ли нейронка данное изображение с хорошим результатом, и если ему кажется что да — Запускает OCR в работу
Мы проверили оба способа. По итогу оказалось, что автоматическое применение оказалось абсолютно бесполезным, оцифровщики тратили больше времени, чтобы проверить корректность обработки, очистить это поле и заполнить уже правильно.
А вот ручное применение оказалось достаточно удачным, первое время оцифровщиков приходится заставлять использовать нейронку, потому что поначалу они не понимали когда она сработает, а когда нет. Но после того как они принудительно попробовали использовать пару десятков раз, у них выработалось интуитивное понимание когда текст распознается. Грубо говоря, у них в голове их собственная мозговая нейросеть натренировалась понимать, когда сработает ее цифровой аналог.
Итоги и выводы
Так и что в итоге то? Введение нейросети повысило общую эффективность примерно на 10-15 процентов.
Ну и возникает логичный вопрос, стоили ли все эти пляски того, чтобы увеличить эффективность процентов на 10?
Ответ — Определенно да!
Первое Введение нейросети помогло сократить примерно 24 человека-дня или избежать найма, обучения, контроля одного оцифровщика в переполненном офисе.
Второе Нейросеть яндекса пока еще слаба для распознавания реального почерка, ее обучали, скорее всего, на приближенном к печатному тексту. Реальные рукописные текста программа практически не может корректно определять. Надеюсь, нейросеть Яндекса обучится до такой степени, что сможет делать и это, я так понимаю, это вопрос времени. Надо только подождать, и все будет в кайф, вообще можно будет не использовать людей для такой работы.
Третье Конструкция оказалась удачной, мы не привязаны к Яндексу, через API можно подключить любую другую нейросеть, хоть GPT-4, если это будет эффективней.
Четвертое Даже сейчас можно улучшить качество используя справочники адресов и ФИО.
Пятое. Если отвлечься от политики, то опыт все-равно получился ценным, можете заменить подписи на любую стандартизировнную форму заполняемую от руки и весь опыт окажется релевантном и для нее. Например, анкеты соц.опросов или старые бумажные мед.карты.
Но на самом деле это все мелочи, главный вывод другой:
Все эти подписные листы — это абсолютно идиотская заградительная мера от независимых политиков. Нам приходится извращаться, и вместо того что использовать современные технологии для созидательной деятельности, мы тратим свое время и возможности на то, чтобы собрать 20 тысяч листов а4, бюрократически попрыгать около них с бубном десятком способов, сшить в папочки, положить в коробки и отвезти избирательную комиссию. Конечно же никакого смысла в такой деятельности нет, существует только две причины почему такой абсурд вообще присутствует, это, во-первых, чтобы независимые политики опустили руки и не стали участвовать в выборах, и если они все-таки собрали, то легко завернуть их обратно, якобы в подписях присутствуют ошибки.
Радует лишь одно, они вводят специальные абсурдные заградительные меры, чтобы мы опустили руки, а происходит обратный эффект — мы используем современные технологии для обхода этого абсурда, в процессе прокачиваем наши навыки и применяем их уже для создания чего-то реального и полезного.
Разработка: @Chamie @btseytlin Натан Власенко