Extrayendo texto de una imagen usando GOCR

La verdad es que las pocas veces que había necesitado sacar un texto de una imagen había usado tesseract. Pero gracias a @garciademarina he conocido otra librería que me ha ido mucho mejor (esto no significa que sea mejor para todos los casos): GOCR.

Para compararlos voy a realizar los siguientes ejemplos a partir de una misma imagen:

  1. Tesseract: Ejecutar tesseract a partir de una imagen TIFF.
  2. GOCR: Ejecutar GOCR a partir de una imagen PBM.
  3. Tesseract: Ejecutar tesseract a partir de una imagen PBM.
  4. GOCR: Ejecutar GOCR con training.
Imagen de prueba utilizada para realizar la comparación

Imagen de prueba utilizada para realizar la comparación

Requisitos

Será necesario tener instalado: ImageMagick, tesseract y GOCR. Si usáis OS X y usais brew, es tan sencillo como:

$> brew install imagemagick
$> brew install tesseract
$> brew install gocr

1. Tesseract: Ejecutar tesseract a partir de una imagen TIFF

Lo primero que hay que hacer es convertir la imagen a TIFF:

$> convert hn.png hn.tiff

Podríamos intentar procesar la imagen mejor: asegurarnos de que esta en blanco y negro, ampliarla, etc. Pero como es una imagen bastante nítida y sin diferentes colores no lo he hecho.

Después ejecutamos tesseract y hacemos un cat del fichero para ver el resultado:

$> tesseract hn.tiff output > /dev/null 2>&1 && cat output.txt

Resultado

Such a great article, true Hacker News material. Does nm assume much knawledge about
the field, ye! still anaws far a much deeper understanding of mechanks involved.

No esta mal, pero como podéis ver hay algunos errores.

2. GOCR: Ejecutar GOCR a partir de una imagen PBM

En este caso primero deberemos pasar la imagen a PBM ya que GOCR solo acepta ciertos formatos: pnm, pgm, pbm, ppm, pcx…

$> convert hn.png hn.pbm

Después ejecutaremos GOCR y nos devolverá directamente el texto:

$> gocr hn.pbm

Resultado

Such a great article, true Hacker News material. D0es n0t assume much kn0wledge ab0ut
the field, yet still all0ws f0r a much deeper understanding 0f mechanics inv0lved.

En este caso solo ha tenido problemas con las “o”.

3. Tesseract: Ejecutar tesseract a partir de una imagen PBM

$> tesseract hn.pbm output > /dev/null 2>&1 && cat output.txt

Resultado

such a great amde, true Hacker News makenm Does not assume much l<now\edge about
me hem, yet shH aHows for a much deeper understandmg of mechamcs mvoh/ed

Este todavía ha resultado peor que realizarlo a partir de la imagen TIFF.

4. GOCR: Ejecutar GOCR con training

$> gocr hn.pbm -m 162

En este caso no nos ha preguntado por ninguna corrección porque se estaba dentro del umbral de certeza que tiene por defecto: 95%. Por eso en este caso vamos a especificar que queremos un umbral del 100%:

$> gocr hn.pbm -m 162 -a 100

CLI

Resultado

Such a great article, true Hacker News material. Does not assume much knowledge about
the field, yet still allows for a much deeper understanding of mechanics involved.

Como podéis observar en este caso la conversión ha sido perfecta. Si bien es cierto que ha sido porque le hemos ayudado, esta ayuda solo se realiza la primera vez y poco a poco GOCR va aprendiendo a convertir mejor la imagen a texto.

Conclusión

Si sois pacientes os recomiendo que pongáis un threshold del 100% y que vayáis enseñando poco a poco al GOCR a convertir correctamente el texto.

digg reader screenshots

Que caracteres no usar en un fichero de cron

Después de ver que no me funcionaba una cron (en /etc/cron.d) en la que la estructura estaba bien… me he dado cuenta que el problema estaba en el nombre del fichero de la cron. No se puede poner cualquier nombre… en mi caso el fallo estaba en que había usado un punto. Con lo cual… a modo recordatorio, caracteres permitidos en el nombre de un fichero de cron: caracteres en mayúsculas y minúsculas y guiones.

P.S.: Newbie fail :)

Como usar Hubot en TalkerApp

Para los que no conozcan Hubot o TalkerApp, les recomiendo visitar sus webs donde explican detalladamente para que sirven. Por defecto Hubot se creo para Campfire pero existe un adapter para Talker.

Este ejemplo es para usar en un entorno UNIX. Es importante tener en cuenta que vas a necesitar tener instalado:

Primero de todo tendrás que hacer un clone del proyecto:

$> git clone https://github.com/github/hubot.git ~/hubot

Después tendremos que instalar las dependencias y exportarlo al directorio que queramos:

$> cd ~/hubot
$> npm install
$> ./bin/hubot -c ~/hubot-talker

Una vez exportado tendremos que añadir en el fichero composer.json la dependencia de hubot-talker:

{
  ....

  "dependencies": {
    "hubot": ">=2.4.6",    
    "hubot-scripts": ">= 2.4.1",
    "hubot-talker": ">= 1.0.0",
    "optparse": "1.0.3"
  },

  ....
}

Una vez añadida la dependencia tendremos que actualizar los paquetes:

$> npm update

Para finalizar si no queréis usar Redis ya solo os faltará quitar redis-brain.coffee de hubot-scripts.json y exportar:

  • HUBOT_TALKER_ROOMS: Las salas en las que quieres que entre el bot. Si quieres usarlo en más de una sala solo tendrás que separar por comas el número de las salas.
  • HUBOT_TALKER_TOKEN: El token del usuario del bot.
$> chmod +x ~/hubot-talker/bin/hubot
$> export HUBOT_TALKER_ROOMS="<TALKER ROOM>"
$> export HUBOT_TALKER_TOKEN="<TALKER TOKEN>"
$> ~/hubot-talker/bin/hubot -a talker -n hubot

Google Analytics para GlotPress Plugin

En GlotPress también se pueden crear plugins, aunque aquí no hay panel de administración como en WordPress para activarlos y desactivarlos… con lo cual, una vez lo pones ya está activo!

En este caso he creado un plugin para añadir Google Analytics a GlotPress. Simplemente deberíais crear un fichero nuevo en la carpeta de ./plugins que está en la raíz de GlotPress con el siguiente código:

<?php

class Google_Analytics extends GP_Plugin {
    var $ga_id;

    function __construct() {
        parent::__construct();

        $this->add_action( 'gp_footer' );
        $this->ga_id= 'YOUR_GA_TRACKING_ID';
    }

    function gp_footer() {
        $footer = <<<FOOTER
<script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', '$this->ga_id']);
    _gaq.push(['_trackPageview']);

    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
</script>
FOOTER;
        echo $footer;
    }
}

GP::$plugins->google_analytics = new Google_Analytics;

Para acabar, solo tenéis que sustituir YOUR_GA_TRACKING_ID por vuestro tracking id!