Что на самом деле делает OCR и чего не может
OCR распознаёт формы и возвращает символы. Он не читает. За этим нет понимания слов, поэтому «1», принятая за «l», выглядит в результате ровно так же уверенно, как каждый правильный символ вокруг. Поэтому эти страницы показывают рядом с текстом уверенность распознавателя, а не выдают чистый на вид результат, оставляя ошибки на ваше усмотрение. На чётком печатном тексте, сфотографированном прямо и в фокусе, ошибок — несколько символов на тысячу. При бликах, тени или необычном шрифте может быть гораздо хуже, и по результату этого никак не будет видно.
За этими страницами стоят два распознавателя. Первый находит текст в любом месте страницы, не зная, какой это алфавит, и читает около пятидесяти языков по одному словарю. Второй, обученный отдельно для каждого языка, стоит за ним и охватывает более 120. Если оставить выбор языка автоматическим, сначала попробует первый — и это важно, потому что неверно указанный язык — классический способ не получить ничего: польское меню, принятое за кириллицу и прочитанное как русское, уверенно возвращает пустую страницу. Если указать язык самому, задача закрепляется за распознавателем этого языка — это то, что нужно, когда вы точно знаете, что у вас.
Важно разрешение, а не размер файла. Распознавателю нужна определённая высота букв, и всё масштабируется так, чтобы её получить: страницы сканированного PDF для чтения отрисовываются с разрешением 300 DPI, а изображение измеряется по самим буквам, а не по размерам, и затем увеличивается или уменьшается как нужно. С текстом на экране чаще всего и ошибаются: в обычном масштабе буква около десяти пикселей в высоту — примерно треть того, что нужно распознавателю, поэтому скриншот перед чтением увеличивается. Если буква меньше примерно восьми пикселей, увеличивать уже нечего, и никакая обработка деталей не выдумает. В обратную сторону: 48-мегапиксельная фотография меню ничуть не точнее резкой маленькой; после определённого предела лишние пиксели стоят времени и ничего не дают.
Перекос и неравномерное освещение портят больше, чем кажется. Сфотографированная страница повёрнута на градус-другой и освещена с одной стороны, поэтому «Распознать текст с картинки» и «Сканировать документ» измеряют этот угол по всей странице и устраняют его, а затем оценивают яркость бумаги за буквами по участкам и выравнивают её до ровного белого. Это не косметика. Прямые линии сетки позволяют вообще найти таблицу как сетку, а ровный контраст не даёт принять тень от вашей руки за текст. Скриншот ни одной из этих обработок не проходит, и это намеренно: он и так ровный и равномерно освещён, а обработка как фотографии только добавляет ошибок.
Таблицы и многоколоночная вёрстка — по-настоящему трудный случай, и цифры тут полезно знать. Когда разлинованную форму читали как сплошной текст страницы, текст ячеек сливался со следующим столбцом, а треть подписей терялась — неверными были пятнадцать–двадцать процентов символов. Когда сначала находили линии сетки и читали каждую ячейку отдельно, получалось около пяти процентов. Поэтому таблица с видимыми линиями распознаётся как сетка и возвращается строками с табуляцией, которые вставляются прямо в таблицу, а колонки текста читаются в порядке чтения, а не поперёк страницы. У таблицы, выровненной одними пробелами, линий нет, и при вставке она сохраняется по везению, а не по замыслу.
PDF с поиском и извлечённый текст — разные вещи. «Распознать текст в PDF» и «Сканировать документ» оставляют изображение ровно таким, как было, и кладут поверх невидимый слой распознанных слов: страница выглядит так же, Ctrl+F начинает находить, текст можно выделить и скопировать. Ничего не рисуется на странице — а значит, ошибка распознавания прячется внутри документа, который выглядит безупречно. «Распознать текст с картинки» и «Текст со скриншота» делают наоборот: вы получаете символы и больше ничего — ни шрифтов, ни цветов, ни полужирного, ни самого изображения. Одна оговорка о текстовом слое, которую легко пропустить: в нём могут быть только символы, которые умеет писать встроенный шрифт, поэтому китайские, японские и корейские слова пока подсчитываются, а не записываются, — до выхода шрифта для них.
Когда браузер действительно не подходит
Всё дело в том, что изображение не покидает ваше устройство, — и на трудных документах за это приходится платить точностью. Этот компромисс реален, и лучше сказать о нём прямо, чем прятать.
Слитный рукописный текст не распознаётся — ни здесь, ни в любом универсальном OCR. Это распознаватели печатного текста: они узнают формы букв, а в прописи отдельных форм букв нет. Печатные буквы, написанные от руки, часто распознаются достаточно хорошо, чтобы их исправить, а не перепечатывать, — заглавные буквы, заполненная от руки форма, аккуратно написанная записка, — поэтому и существует «Распознать рукописный текст», и поэтому он показывает уверенность рядом с текстом. Чтобы как следует читать пропись, нужен распознаватель, обученный именно на рукописном тексте, а хорошие такие работают на сервере, а не во вкладке.
Облачный OCR справится с трудными документами лучше. Google, Amazon и Microsoft используют распознаватели, обученные на гораздо большем объёме данных, чем помещается во вкладку браузера, и на плохой фотографии, плотной многоколоночной странице, необычном шрифте или заполненной форме они будут заметно точнее. Как и платная программа для компьютера вроде ABBYY FineReader. Если точность на трудном документе важнее, чем то, что он остаётся на вашем компьютере, воспользуйтесь одним из них — это честное сравнение, и выбор стоит делать именно по нему.
Пакетной работе место в командной строке. Эти инструменты читают один документ, когда человек нажимает кнопку. Две тысячи сканов по расписанию — задача для OCR-программы на компьютере вроде OCRmyPDF, которая добавляет текстовый слой ко всей папке PDF одной командой, — бесплатно, с тем же распознаванием и без всяких кликов.
Кое-что просто не делается. Перспектива не исправляется: страница, сфотографированная сбоку, остаётся трапецией, исправляется только поворот, поэтому снимать строго сверху стоит лишней секунды. Сильный сгиб или изгиб у корешка книги так и остаются изогнутыми. И камеры здесь нет — распознаватели кодов декодируют уже имеющееся изображение, а не живой видеопоток.
Одна практическая плата за локальную работу: распознаватель и языковой пакет загружаются с этого сайта при первом использовании языка — это несколько мегабайт, и первый запуск поэтому медленнее последующих. Ничего не загружается с чужих CDN, и ничего не уходит обратно.
Как выбрать между похожими инструментами
Распознать текст с картинки или Текст со скриншота. Один и тот же распознаватель с разной подготовкой изображения, и разница не косметическая. Фотографию выпрямляют и выравнивают освещение; скриншот увеличивают и больше не трогают, потому что у него нет ни перекоса, ни неравномерного освещения, а обработка, будто они есть, делает только хуже. «Текст со скриншота» принимает и вставку — Ctrl+V или Cmd+V на Mac, прямо из буфера обмена, без предварительного сохранения на диск.
Распознать текст с картинки или Сканировать документ. «Распознать текст с картинки» даёт слова и выбрасывает изображение. «Сканировать документ» сохраняет изображение, выпрямляет его, отбеливает бумагу за буквами и выдаёт PDF, похожий на скан, — по желанию с невидимым слоем текста позади. Если нужно куда-то вставить текст — первый. Если нужно кому-то отправить документ — второй.
Сканировать документ или Распознать текст в PDF. «Сканировать документ» начинает с фотографий и создаёт PDF. «Распознать текст в PDF» начинает с уже существующего PDF и добавляет к нему текстовый слой. Ни один не меняет вид страниц. Сфотографировали договор — вам нужен первый; получили скан по почте — второй.
Распознать рукописный текст или Распознать текст с картинки. Тот же распознаватель, но с отключённым поиском таблиц и с показателем уверенности на видном месте, которого он заслуживает, потому что с рукописным текстом это число — самая полезная часть результата. Если текст написан слитно, его не прочитает ни одна из страниц, и страница для рукописного текста прямо об этом скажет, а не вернёт правдоподобную бессмыслицу.
Распознать QR-код или Распознать штрихкод. Квадратные коды против полосатых, и стоит понимать, что у вас в руках. Страница QR читает QR, Micro QR, Data Matrix, Aztec и PDF417 — а это посадочные талоны и водительские удостоверения, чьи коды относятся к квадратным форматам, даже когда выглядят как размазанные точки. Страница штрихкодов читает полосатые форматы розницы и логистики — EAN, UPC, Code 128, Code 39, ITF — и проверяет контрольную цифру, последнюю цифру, вычисленную из остальных: именно она отличает номер, которому можно доверять, от номера, который лишь выглядит правильным. Ни то ни другое не OCR: код — это символ с известной геометрией, поэтому его декодирование — арифметика, а не догадка о формах букв. И ломаются они по-разному. Квадратные коды содержат коррекцию ошибок и переживают царапину или логотип, напечатанный посередине; у полосатых её нет вовсе, поэтому блик поперёк полос означает, что код не прочитается, а не что номер окажется неверным.