23.2.08

ImgSeek - Convirtiendo un recuperador en un clasificador de imágenes pornográficas

Sigo con mis pruebas, que tienen como fin evaluar imgSeek y otros sistemas libres para la tarea de clasificación de imágenes pornográficas. Todas mis pruebas las hago en un Mandriva 2008 virtualizado con VMware Server.

He preparado un script que me permite clasificar una imagen como pornográfica o no, usando imgSeekCmd. Para ello, es necesario:

  1. Acumular en un directorio imágenes pornográficas y no pornográficas. En mi caso, he creado dos carpetas, pornyes y pornnot. dentro del directorio test-dir.
  2. Indexar las imágenes que hay en el directorio usando imgSeekCmd. Para ello, se usan las siguientes opciones: imgSeekCmd add -b porn.db -r -d test-dir. Como resultado, se agregan la imágenes del directorio (-d) llamado test-dir, de manera recursiva (-r), a la base de datos (-b) llamada porn.db.
  3. A continuación se prepara un script que recibe como entrada el archivo de la imagen, recupera un número determinado de imágenes similares, y cuenta en sus rutas cuantas veces a aparece pornyes. Si aparece más del 50% de las veces, se trata de una imagen pornográfica.

El script que he preparado es el siguiente:

#!/bin/bash
# USAGE: ispornclass.sh <image> <results>
# Query the database, count "pornyes" and store in variable
TOT=$2
YES=$(imgSeekCmd query -b porn.db -r $TOT -p $1 2> /dev/null | grep pornyes | wc -l)
# Compute the probability and output it
TOT=$[$TOT+1]
echo $YES/$TOT|bc -l

Seguro que para los gurús de Linux/Unix, no será nada interesante, pero para mí­ ha sido divertido y un poco retador, vamos, una "oportunidad ilusionante" de aprender un poco sobre scripts de Bash. Así­ que lo explicaré. Bueno, explicaré sólo las lí­neas no comentadas (#).

  1. En la primera lí­nea se asigna la segunda opción de la lí­nea de órdenes a la variable TOT.
  2. En la segunda lí­nea se lanza una consulta a la base de datos (-b) porn.db con imgSeekCmd usando la opción query, pidiendo exactamente TOT resultados (-r), buscando imágenes similares al archivo que el primer argumento de la lí­nea de órdenes ($1), y redirigiendo la salida de error (2>) al dispositivo nulo para evitar los warnings de Python tan molestos que ya mencioné en un post previo. A continuación se listan sólo las lí­neas que contienen pornyes buscándolas con grep, y se cuenta cuantas hay usando wc. El resultado de todo esto se asigna a la variable YES.
  3. En la tercera lí­nea se suma 1 a la variable TOT, para resolver un pequeño bug de imgSeek, consistente en que devuelve un resultado de más sobre los pedidos.
  4. En la última lí­nea se contruye la fórmula de la probabilidad y se canaliza a la calculadora de expresiones bc, que la ejecuta interpretándolo como real y no como entero.

Este script está parametrizado para poder regular cuantas imágenes se toman de referencia. Hay que usar números pares (por ejemplo, ispornclass.sh imagen.jpg 10) porque al sumar uno queda impar, y no queremos que nunca aparezca la probabilidad 0.5, que significa "no se".

Nota bene 1: La calidad de la clasificación depende directamente de la muestra de imágenes. Cuanto mayor y más representativa, mejor. También tardará más tiempo en indexar y en buscar, lógicamente. Sin embargo, el número de imágenes similares es un parámetro más complicado, y sólo es posible determinar su valor óptimo para una colección de imágenes concreta y de manera experimental.

Nota bene 2: La proporción entre imágenes pornográficas y no pornográficas debe ser lo más equilibrada posible. Si la proporción es de 25% porno y 75% no, la probabilidad a priori de recuperar una imágen pornográfica es de 0.25. Esto introduce un sesgo en la clasificación, y disminuye la efectividad. Tambiíén se puede utilizar como técnica para lograr un sesgo premeditado por cuestiones de coste. Pero esto es tema para otro post.

Nota bene 3: Un poco de teorí­a. Esta técnica convierte un sistema de recuperación de objetos en un sistema de clasificación de objetos. Se trata de una técnica de aprendizaje automático denominada aprendizaje perezoso (lazy learning), aprendizaje basado en ejemplares (instance based learning), clasificador de los k vecinos más próximos (k-nearest neighbors) o aprendizaje basado en memoria (memory based learning). Se puede aplicar a cualquier recuperador, y en particular, yo me propongo realizar más pruebas con otros clasificadores similares.

Powered by Zoundry