Рубрики
Без рубрики

Тессеракт: Простое Оптическое Распознавание Символов Java

Автор оригинала: David Landup.

Вступление

Разработка символов, которые имеют определенную ценность, – это черта, присущая только людям. Распознавание этих символов и понимание букв на изображении абсолютно нормально для нас. Мы никогда по-настоящему не схватываем буквы, как это делают компьютеры, мы полностью основываем нашу способность читать их на нашем зрении.

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

Иногда это просто невозможно. Иногда мы хотим автоматизировать задачу переписывания текста с изображения своими руками.

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

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

Вместо того, чтобы изобретать велосипед и придумывать очень сложное (но полезное) решение, давайте немного успокоимся и воспользуемся тем, что уже предложено.

Тессеракт

Технологический гигант Google разрабатывает OCR-движок Tesseract , история которого насчитывает десятилетия с момента его первоначального создания. Он предлагает API для множества языков, хотя мы сосредоточимся на Java API Tesseract.

Тессеракт очень прост в реализации и впоследствии не является чрезмерно мощным. Он в основном используется для чтения компьютерного текста на черно-белых изображениях, что выполняется с приличной точностью. Хотя на самом деле это не предназначено для реального текста.

Для реального, продвинутого оптического распознавания символов нам было бы лучше использовать что-то вроде Google Vision , о чем мы поговорим в другой статье.

Зависимость от Maven

Чтобы импортировать движок в наш проект, нам просто нужно добавить зависимость:


    net.sourceforge.tess4j
    tess4j
    3.2.1

Оптическое Распознавание Символов

Использование Тессеракта абсолютно не требует усилий:

Tesseract tesseract = new Tesseract();
tesseract.setDatapath("E://DataScience//tessdata");
System.out.println(tesseract.doOCR(new File("...")));

Сначала мы создаем экземпляр объекта Tesseract и задаем путь к данным для моделей LSTM (долговременной кратковременной памяти), предварительно подготовленных для вашего использования.

Данные можно загрузить с официального аккаунта GitHub .

После этого мы вызываем метод door () , который принимает файл и возвращает строку – извлеченное содержимое.

Давайте скормим ему картинку с большими четкими черными буквами на белом фоне:

Подав ему такую картинку, вы получите идеальный результат:

Optical Character Recognition in Java is made easy with the help of Tesseract'

Однако это изображение чрезвычайно легко сканировать. Он нормализован, с высоким разрешением и одинаковым шрифтом.

Давайте посмотрим, что произойдет, если я попытаюсь что-то записать сам, на листе бумаги, и мы пропустим это через приложение:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Мы можем мгновенно увидеть разницу, которую это имеет:

A411", written texz: is different {mm compatar generated but

Некоторые слова идеально подходят, и вы легко можете разобрать “написанный текст отличается от сгенерированного компьютером”, но первое и последнее слова сильно отличаются.

Теперь, чтобы сделать это немного проще в использовании, давайте перенесем его в очень простое приложение Spring Boot, чтобы представить результат в более наглядном виде.

Реализация

Применение Пружинной Загрузки

Во-первых, давайте начнем с создания нашего проекта через Spring Initializr . Включите зависимости spring-boot-starter-web и spring-boot-starter-thymeleaf . Мы импортируем Тессеракт вручную:

Контроллер

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

@Controller
public class FileUploadController {
    
    @RequestMapping("/")
    public String index() {
        return "upload";
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public RedirectView singleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes, Model model) throws IOException, TesseractException {

        byte[] bytes = file.getBytes();
        Path path = Paths.get("E://simpleocr//src//main//resources//static//" + file.getOriginalFilename());
        Files.write(path, bytes);

        File convFile = convert(file);
        Tesseract tesseract = new Tesseract();
        tesseract.setDatapath("E://DataScience//tessdata");
        String text = tesseract.doOCR(file2);
        redirectAttributes.addFlashAttribute("file", file);
        redirectAttributes.addFlashAttribute("text", text);
        return new RedirectView("result");
    }

    @RequestMapping("/result")
    public String result() {
        return "result";
    }

    public static File convert(MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        convFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
    }
}

Tesseract работает с Файлами Java, но не поддерживает Составной файл , который мы получаем, принимая файл через нашу форму. Чтобы смягчить это, мы добавили простой метод convert () , который преобразует Составной файл в обычный Файл .

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

Просмотры

Теперь давайте определим представление, которое мы можем использовать для простой загрузки файла через форму:



Upload a file for OCR:



И получившаяся страница:




Extracted Content:

>

From the image:

Запуск этого приложения встретит нас простым интерфейсом:

Добавление изображения и его отправка приведет к извлечению текста и отображению изображения на экране:

Успех!

Вывод

Используя движок Google Tesseract, мы создали чрезвычайно простое приложение, которое принимает изображение через форму, извлекает из него текстовое содержимое и возвращает нам отправленное изображение.

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

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