Tesseract: reconocimiento 贸ptico de caracteres Java simple

    Introducci贸n

    Desarrollar s铆mbolos que tengan alg煤n valor es un rasgo exclusivo de los humanos. Reconocer estos s铆mbolos y comprender las letras de una imagen es absolutamente normal para nosotros. En realidad, nunca captamos las letras como lo hacen las computadoras, basamos completamente nuestra capacidad para leerlas en nuestra vista.

    Por otro lado, las computadoras necesitan algo m谩s concreto y organizado para trabajar. Necesitan una representaci贸n digital, no gr谩fica.

    A veces, esto simplemente no es posible. A veces, deseamos automatizar la tarea de reescribir texto a partir de una imagen con nuestras propias manos.

    Para estas tareas, Reconocimiento 贸ptico de caracteres (OCR) se ide贸 como una forma de permitir que las computadoras “lean” contenido gr谩fico como texto, de manera similar a como lo hacen los humanos. Por supuesto, estos sistemas, si bien son relativamente precisos, a煤n pueden fallar bastante. Incluso si lo son, corregir los errores del sistema sigue siendo mucho m谩s f谩cil y r谩pido que hacer todo desde cero a mano.

    Como todos los sistemas, el software de reconocimiento 贸ptico de caracteres de naturaleza similar se entrena en conjuntos de datos preparados que lo alimentan con suficientes datos para aprender la diferencia entre los caracteres. Tambi茅n es muy importante c贸mo aprenden estas redes, si queremos que sean precisas, aunque este es un tema para otro art铆culo.

    En lugar de reinventar la rueda y encontrar una soluci贸n muy compleja (pero 煤til), tranquilic茅monos un poco y usemos lo que ya se ofrece.

    Tesseract

    El gigante de la tecnolog铆a, Google, ha estado desarrollando un motor OCR, Tesseract, que tiene una historia de d茅cadas desde su inicio original. Ofrece una API para varios lenguajes, aunque nos centraremos en la API de Tesseract Java.

    Tesseract es muy f谩cil de implementar y, por lo tanto, no es demasiado poderoso. Se utiliza principalmente para leer texto generado por computadora en im谩genes en blanco y negro, lo que se hace con una precisi贸n decente. Aunque en realidad no est谩 dise帽ado para texto del mundo real.

    Para el reconocimiento 贸ptico de caracteres avanzado en el mundo real, ser铆a mejor usar algo como Visi贸n de Google, que veremos en otro art铆culo.

    Dependencia de Maven

    Para importar el motor a nuestro proyecto, simplemente tenemos que agregar una dependencia:

    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.2.1</version>
    </dependency>
    

    Reconocimiento 贸ptico de caracteres

    Usar Tesseract es absolutamente sencillo:

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

    Primero instanciamos el Tesseract objeto y establezca la ruta de datos a los modelos LSTM (Long Short-Term Memory) previamente entrenados para su uso.

    Los datos se pueden descargar desde el GitHub oficial cuenta.

    Luego, llamamos al doOCR() m茅todo, que acepta un archivo y devuelve una cadena: el contenido extra铆do.

    D茅mosle una imagen con letras negras grandes y claras sobre un fondo blanco:

    Alimentarlo con una imagen as铆 producir谩 un resultado perfecto:

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

    Sin embargo, esta imagen es extremadamente f谩cil de escanear. Est谩 normalizado, es de alta resoluci贸n y la fuente es consistente.

    Veamos qu茅 pasa si intento escribir algo yo mismo, en un papel, y lo dejamos pasar por la aplicaci贸n:

    Podemos ver instant谩neamente la diferencia que hace:

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

    Algunas palabras est谩n perfectamente bien y podr铆a distinguir f谩cilmente “el texto escrito es diferente al generado por computadora”, pero la primera y la 煤ltima palabra est谩n muy desviadas.

    Ahora, para que esto sea un poco m谩s f谩cil de usar, transfi茅ralo a una aplicaci贸n Spring Boot muy simple para mostrar el resultado de una manera m谩s agradable gr谩ficamente.

    Implementaci贸n

    Aplicaci贸n Spring Boot

    En primer lugar, comencemos generando nuestro proyecto a trav茅s de Spring Initializr. Incluir la spring-boot-starter-web y spring-boot-starter-thymeleaf dependencias. Importaremos Tesseract manualmente:

    Controlador

    La aplicaci贸n no necesita m谩s que un solo controlador, que ofrece nuestras dos vistas y maneja la carga de im谩genes y el reconocimiento 贸ptico de caracteres:

    @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 funciona con Java Files, pero no es compatible MultipartFile, que obtenemos al aceptar un archivo a trav茅s de nuestro formulario. Para mitigar esto, hemos agregado un simple convert() m茅todo, que convierte el MultipartFile en un regular File.

    Una vez que hemos extra铆do el texto usando Tesseract, simplemente lo agregamos al modelo, junto con la imagen escaneada y lo agregamos a la vista redirigida. result.

    Puntos de vista

    Ahora, definamos una vista que podemos usar para simplemente cargar un archivo a trav茅s de un formulario:

    <html>
    <body>
    <h1>Upload a file for OCR:</h1>
    
    <form method="POST" action="/upload" enctype="multipart/form-data">
        <input type="file" name="file" /><br/><br/>
        <input type="submit" value="Submit" />
    </form>
    
    </body>
    </html>
    

    Y la p谩gina resultante:

    <html xmlns:th="http://www.thymeleaf.org">
    <body>
    
    <h1>Extracted Content:</h1>
    <h2>><span th:text="${text}"></span></h2>
    
    <p>From the image:</p>
    <img th:src=""https://Pharos.sh.com/" + ${file.getOriginalFilename()}"/>
    </body>
    </html>
    

    La ejecuci贸n de esta aplicaci贸n nos dar谩 la bienvenida con una interfaz sencilla:

    Agregar una imagen y enviarla resultar谩 en la extracci贸n del texto y la imagen mostrada en la pantalla:

    隆脡xito!

    Conclusi贸n

    Usando el motor Tesseract de Google, creamos una aplicaci贸n extremadamente simple que acepta una imagen a trav茅s de un formulario, extrae el contenido textual y nos devuelve la imagen enviada.

    Esta no es una aplicaci贸n particularmente 煤til en s铆 misma, debido al poder limitado de Tesseract y al hecho de que la aplicaci贸n es demasiado simple para cualquier otro uso adem谩s de los prop贸sitos de demostraci贸n, pero deber铆a servir como una herramienta divertida que podr铆a implementar y probar. con.

    El reconocimiento 贸ptico de caracteres puede resultar 煤til cuando desee digitalizar contenido, especialmente cuando se trata de documentos. Son f谩ciles de escanear y bastante precisos cuando se trata de extraer contenido. Por supuesto, siempre es aconsejable revisar el documento resultante para detectar posibles errores.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *