Распознавание почерка врачей
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Всем привет.
Хочу создать программу для offline-распознавания рукописного текста, заточенную под медицинские тексты. Сканируешь бумажку с рецептом — и видишь транскрипцию на экране.
Аналоги
В Google не смог найти существующий аналог. Может, плохо искал. Тогда подскажите, если знаете.
Есть программы, которые упоминают врачебный почерк. Но они работают с одним конкретным почерком, которому их сначало нужно обучить.
Как это возможно?
Я исхожу из того, что люди умеют распознавать такие тексты. Да, не все, но медработники и фармацевты могут. Значит, и машина сможет — нужно только понять, как её научить.
Как мы распознаём чужой почерк? Можно подумать, что мы разбиваем текст на слова, слова — на буквы, и распознаём каждую букву. Но это не работает. Например, часто нельзя отличить прописную букву «ш» от «т» или от сочетания «ли», пока не ясен контекст.
Представьте рукописный текст на незнакомом языке. Скорее всего, выглядит, как каракули. Даже зная алфавит, мы с трудом сможем распознать хотя бы половину букв. С печатным текстом не так: каждая буква чётко отделена от другой. Их можно легко распознать и собрать в слова.
Но в рукописном тексте гораздо большее значение имеет контекст и словарь. Узнавая всё больше слов какого-то языка, на определённом этапе мы сможем распознавать знакомые слова. Чем больше слов мы выучим, а также чем лучше будем понимать, какие слова лучше сочетаются по смыслу — тем проще будет распознать текст.
Взгляните на это слово: «б_л_н_ца».
С некоторыми усилиями можно распознать слово «больница», хотя часть букв вообще пропущена.
А если так? «Городская б_л_н_ца № 21»
Проще, не так ли? Естественные языки избыточны: можно убрать значительную часть букв, не потеряв смысла. А теперь представьте, что вы иностранец и не знаете русского языка. Вы не сможете прочесть это слово по буквам, ввести его в Google Translator и узнать значение. Для этого нужно сперва однозначно опознать каждую букву, что в условиях рукописного текста (или пропущенных букв) невозможно.
То же самое с почерком врачей. Для нас, простых смертных, это иностранный язык. Для медработников — вполне родной. Если мы посидим несколько недель за медицинскими справочниками и выучим достаточно терминов и названий медикаментов, мы тоже сможем распознавать этот язык в рукописном виде. А что может распознать человек, то может распознать и машина, иногда даже быстрее и точнее. Придётся использовать и распознавание отдельных символов, и контекстуальный анализ, и синтаксический, и много других техник — в общем, всё, что поможет уточнить информацию, запечатлённую в виде точек различной интенсивности на изображении.
Если это так просто — почему никто этого ещё не сделал?
Я не уверен. Может, всё-таки уже сделали (см. «Аналоги»)? А может, это никому не нужно. По крайней мере, не стоит таких усилий. Идеи, описанные мной выше, не новы. Их используют для распознавания печатных текстов. Но с рукописными всё сложнее.
Думаю, одна из причин в том, что нет достаточного количества тренировочных данных. Есть огромные базы данных изображений котиков, машин и проч., уже размеченных и готовых для обучения нейросетей. Есть куча изображений печатных текстов с транскрипциями. А вот рукописных текстов — мало. Я не нашёл базу данных с рукописными текстами и их транскрипциями — ни на английском, ни на русском, ни на украинском. Максимум, что удалось найти — маленькая база рукописных предложений на сайте elmiram.github.io. И уж тем более не найти нужного количества медицинских текстов.
А задача сложная: нужны тысячи и тысячи примеров для обучения. И если можно посадить кого-то распознавать обычные тексты, то для почерка врачей нужно нанять и посадить медицинских работников. В общем, сбор данных для такой программы будет сложнее, чем её проектирование. Можно даже создать большую открытую базу данных в помощь людям, специально для таких целей. Искать волонтёров, собирать изображения, переводить в печатный вид... Это тянет на большой отдельный проект, и если кого-то он интересует, можно отдельно обсудить и его.
Частично проблема данных решается с использованием трансферного обучения (en.wikipedia.org/wiki/Transfer_learning). Сначала обучаем сеть для полноценного распознавания обычных рукописных текстов, которых у нас всё-таки больше, чем врачебных. Затем сбрасываем веса последнего слоя, сохраняя все остальные, и обучаем её заново на меньшем количестве медицинских текстов. Идея в том, что на первом этапе сеть обучится общим принципам распознавания символов; научится определять границы и очертания; и на этой основе сможет «более осмысленно» воспринимать новые данные.
Можно пойти дальше и перед этапом рукописных текстов обучить сеть на огромном количестве обычных печатных текстов. Таким образом она получит достаточно информации о распознавании объектов и использует ограниченные рукописные примеры с максимальной пользой. Но я не уверен, что это сработает. Надо пробовать.
Ну и что?
Вот этот вопрос меня волнует больше всего. Звучит как прикольная идея, но будет ли это востребовано? Кому это нужно? Вы бы скачали такое приложение? А стали бы платить за него? А что насчёт более широкой задачи распознавания всяких рукописных текстов, не только медицинских?
Я хотел бы услышать ваше мнение о целесообразности всего этого, о способах реализации, об озвученных идеях. Может, не стоит и браться — тогда хорошо, что я ограничился текстом на форуме и не потратил на это месяцы жизни. Может, вы проникнетесь идеей и накидаете мне немного отсканированных медицинских рецептов или хотя бы пылящихся конспектов. А может, я найду людей, которые захотят вместе заняться разработкой. Было бы здорово!
UPD 25.09.2017
Вижу, мнений много. Только без реальных тренировочных данных это всё так и останется болтовнёй :)
Кто хочет поддержать, пожалуйста, присылайте сканы или фотографии в хорошем качестве медицинских текстов, которыми не жалко поделиться. Наверняка у каждого что-то завалялось. Над расшифровкой уже потом поработаем, может, наймём фармацевта из ближайшей аптеки.
Если же медицинских текстов нет, можно и обычные рукописные — какой-нибудь конспект из универа с минимумом рисунков/схем и максимумом текста. Тут фотография уже не пойдёт, нужен скан страницы или разворота тетради. Присылайте хоть что-нибудь — это лучше, чем ничего.
Пишите на email [email protected]
UPD 14.10.2017
Хочу подвести итоги по теме. Я услышал много разных мнений насчёт реализации и целесообразности: от «это невозможно ещё лет 100» и «никому это не надо, проще перейти на электронную систему» до «никого не слушай, я готов сотрудничать» и «интересно, я бы даже заплатил за такое приложение» (не все из них были озвучены именно здесь).
Чтобы не быть голословным, я провёл опрос в одной «заблокированной» социальной сети с простым вопросом: «Нужно ли вам приложение для распознавания почерка врачей?». Проголосовало 89 человек. Голоса разделились следующим образом:
— «Нет» — 16 чел. (18%)
— «Не знаю, можно попробовать» — 20 чел. (22,5%)
— «Да, если бесплатно» — 49 чел. (55%)
— «Да, и я готов(а) заплатить за него» — 4 чел. (4,5%)
Хотя голосов и мало, их разделение наметилось с самого начала опроса и почти не менялось всё время. Поскольку вопрос был не «считаете ли вы такое приложение полезным хоть кому-то», а «нужно ли оно вам» — выходит, идея полезная. Даже если бы только четверть была «за» — это уже приличная целевая аудитория. Здесь же более половины проголосовали «за» — а это весомый результат.
Интересно распределение голосов по странам. Из России проголосовало 25 человек, 13 из которых ответили «Нет» или «Не знаю», 10 — «Да, если бесплатно» (40%) и 2 — «Да, готов заплатить».
Из 49 украинцев 31 согласен за бесплатно (69%), 1 — готов заплатить и 17 — не знают или не хотят.
Это логично, ведь в России уже действует электронная система, а у нас — нет.
Хоть эта тема и называется «Распознавание почерка врачей» — меня также интересует тема распознавания рукописных текстов в целом, и её тоже хотелось бы обсудить. Просто тема про врачей привлекает гораздо больше внимания :)
В общем, не знаю насчёт готового продукта, а в качестве pet-проекта и магистерской работы — пойдёт. Сейчас я планирую реализовать простейший функционал:
1) создать маленький словарь из 150 слов (пусть это будут названия лекарств, просто для связи с темой); желательно побольше похожих слов, чтобы убедиться в точности распознавания;
2) собрать много образцов рукописного написания этого словаря; хотя бы человек 100 — получится 15000 примеров слов; найти бы врачей, которые согласятся помочь — было бы идеально;
3) как-то разделить все слова на отдельные маленькие изображения — можно создать сеть, которая будет сама это делать, но это не главная задача пока;
4) обучить нейронную сеть распознавать слова из словаря, не разбивая их искусственно на буквы (т.е. на входе — картинка, на выходе — 150 нейронов, каждый отвечает за слово из словаря, один из них активируется);
5) добиться, чтобы она научилась обобщать почерки; если в итоге она сможет распознать слова из данного словаря, написанные незнакомым ещё почерком — это уже успех;
6) хорошо бы обернуть это в мобильное приложение — это уже дело техники, а разрешения камеры должно хватить на определение отдельных слов.
Самое интересное, что несмотря на бурное обсуждение, ни один человек не скинул ни рецептика, ни странички любого другого рукописного текста мне на email. А без данных даже начать не получится. Поэтому ещё раз прошу всех неравнодушных: уделите минут 20 времени, напишите мне на листке 150 слов и отсканируйте. Поспособствуйте развитию отечественной науки! :)
Пишите сюда: [email protected]. Я дам подробности и вышлю список слов.
Всем спасибо за обсуждение!
177 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів