Categorías
Python

Inmutabilidad en Python

 

Tabla de Contenidos

  • ¿Qué vamos a hacer?
  • ¿Cuál es la imagen de huellas dactilares / hash?
  • Por qué no podemos usar MD5, SHA-1, etc.?
  • Cuando se utiliza la huella dactilar lata imagen? bibliotecas
  • ¿Qué necesitamos?
  • Paso 1: Toma de huellas dactilares un conjunto de datos
  • Paso 2: Búsqueda en un conjunto de datos
  • Resultados
  • la mejora de nuestro algoritmo
  • Resumen

Este es un puesto de invitado por Adrian Rosebrock de PyImageSearch.com, un blog todo sobre la computadora visión, procesamiento de imágenes, y los motores de búsqueda de imágenes edificio.

Actualizaciones : Hace

unos cinco años, que estaba haciendo el trabajo de desarrollo de un sitio web de citas. Eran una etapa temprana de inicio, pero estaban empezando a ver algo de tracción inicial. A diferencia de otros sitios web de citas, esta empresa comercializa a sí mismos con una reputación absolutamente limpio. Esto no era un sitio donde va a ir para engancharte – aquí es donde usted fue a buscar una relación honesta .

Impulsado por millones en capital de riesgo (esto fue antes de la recesión en los Estados Unidos), sus anuncios en línea en relación con el verdadero amor y la búsqueda de un alma gemela convierte como frenética. Estaban cubiertos por Forbes. E incluso se presentan en un breve punto de mira en la televisión nacional. Estos primeros éxitos conducen al crecimiento exponencial codiciado en los arranques – su nave usuario se duplica cada mes . Las cosas se veían muy bueno para ellos.

Pero tenían un grave problema – un problema porno.

Un pequeño subconjunto de usuarios del sitio web de citas eran de subir las imágenes pornográficas y seleccionarla como sus fotos de perfil. Este comportamiento se arruinó la experiencia para muchos de sus clientes – que conduce a ellas cancelar su membresía.

Ahora, tal vez por algunos sitios web de citas algunas imágenes pornográficas aquí y allí puede no ser un problema. O incluso se puede considerar “normal” o “espera”, sólo un subproducto de citas en línea que fue aceptada y simplemente ignorado.

Sin embargo, este comportamiento podría ser aceptada ni ignorado.

Recuerde, este fue un inicio que hubieran comercializado a sí mismos como una datación de refugio superior, libre de la suciedad y la basura que afectó a otros sitios web de citas. En resumen, tenían una reputación muy real con respaldo de riesgo que tenían que mantener.

desesperadamente, el sitio web de citas revueltos para detener el brote de la pornografía. Se contrató a equipos de moderadores imagen que hicieron literalmente nada más que mirar a una página de administración por más de 8 horas al día y eliminar cualquier nuevas imágenes pornográficas que fueron subidos a la red social.

literalmente estaban lanzando decenas de miles de dólares (por no mencionar, un sinnúmero de horas-hombre) en el problema, simplemente tratando de moderar y contener el brote en lugar de parada en su origen.

El brote alcanzó niveles críticos en julio de 2009. Por primera vez en ocho meses, la nave de usuario no se duplique (e incluso había comenzado a disminuir). Peor aún, los inversores estaban amenazando con tirar de su financiación si la compañía no resolvió el problema.

De hecho, las mareas de la suciedad golpeaban contra la torre de marfil, amenazando con derribar en el mar.

Como las rodillas de la datación gigante comenzó a ceder, que propone una solución más robusta y largo plazo: ¿Y si usamos la imagen de huellas dactilares para combatir el brote?

Usted ve, cada imagen tiene una huella digital. Y al igual que una huella digital puede identificar a una persona, sino que también puede identificar una imagen.

Esto condujo a la implementación de un algoritmo de tres etapas:

Nuestro proceso, aunque no es perfecto, funcionó. Poco a poco, el brote se desaceleró. Nunca se detiene por completo – pero mediante el uso de este algoritmo que logró reducir el número de archivos inapropiados en más del 80% .

También logró mantener los inversores feliz. Continuaron para financiar – hasta que la recesión golpeó. Entonces todos estábamos fuera de un trabajo. volver

Mirar, no puedo dejar de reír. Mi trabajo no duró. La compañía no duró. Incluso algunos de los inversores se dejaron patear rocas.

Pero una cosa hizo sobrevivir. El algoritmo de imagen de huellas dactilares. Años después, quiero compartir los conceptos básicos de este algoritmo con usted, con la esperanza de que se pueden utilizar en sus propios proyectos.

Pero la pregunta más importante es, ¿cómo creamos esta huella digital de imagen?

leyendo para averiguarlo.

¿Qué vamos a hacer?

Vamos a utilizar las huellas digitales de imagen para realizar la detección de imagen prácticamente duplicado. Esta técnica se denomina comúnmente “hash imagen perceptual” o simplemente “hash imagen”.

¿Cuál es la imagen de huellas dactilares / hash?

imagen de hash es el proceso de examinar el contenido de una imagen y luego la construcción de un valor que identifica de forma exclusiva una imagen basada en estos contenidos.

Por ejemplo, echar un vistazo a la imagen en la parte superior de este post. Dada una imagen de entrada, vamos aplicar una función hash y calcular un “hash de la imagen”, basada en la apariencia visual de la imagen. Las imágenes que son “similares” deben tener valores hash que son “similares”, así”. Usando algoritmos de hash imagen hace que la realización de sustancialmente más fácil de detección de imágenes casi duplicados.

En particular, vamos a utilizar el “hash de diferencia”, o simplemente dHash algoritmo para calcular nuestras huellas digitales de imagen. En pocas palabras, las miradas dHash algoritmo en la diferencia entre los valores de píxeles adyacentes. Luego, sobre la base de estas diferencias, se crea un valor hash.

Por qué no podemos usar MD5, SHA-1, etc.?

Por desgracia, no se puede utilizar algoritmos hash criptográficas en nuestra aplicación. Debido a la naturaleza de los algoritmos hash criptográficas, muy pequeños cambios en el archivo de entrada se traducirá en un hash sustancialmente diferente. En el caso de la imagen de la huella dactilar, que en realidad queremos que nuestros entradas similares a tiene salida similar hashes también.

Cuando se utiliza la huella dactilar lata imagen?

Al igual que el ejemplo anterior, podría utilizar las huellas digitales de imagen para mantener una base de datos de imágenes inapropiadas – y alerta a los usuarios cuando tratan de subir una imagen tal.

Se puede construir un motor de búsqueda de imágenes inversa como TinEye que realiza un seguimiento de las imágenes y las páginas asociadas que aparecen en.

Incluso puede utilizar la huella dactilar imagen para ayudar a controlar su propia colección personal de fotos. Imagine que tiene un disco duro lleno de copias de seguridad parciales de la biblioteca de fotos, pero necesita una forma de ciruela pasa a través de las copias de seguridad parciales y mantener sólo las copias únicas de una imagen – las huellas digitales de imagen pueden ayudar con eso también.

En pocas palabras, puede utilizar las huellas digitales de imagen / hash en casi cualquier entorno en el que usted se refiere a la detección de casi duplicados copias de una imagen. bibliotecas

¿Qué necesitamos?

Con el fin de construir nuestra solución de imagen de huellas dactilares, vamos a estar utilizando tres principales paquetes de Python:

  • PIL / almohada para facilitar la lectura y carga de imágenes.
  • ImageHash, que contiene nuestra aplicación de dHash.
  • Y NumPy / SciPy, que son requeridos por ImageHash.

Puede instalar todos los pre-requisitos exigidos por la ejecución del siguiente comando:

$ pip install pillow==2.6.1 imagehash==0.3

Paso 1: Toma de huellas dactilares un conjunto de datos

El primer paso es tomar las huellas digitales de nuestro conjunto de datos de imagen.

Y antes de preguntar, no, no vamos a utilizar imágenes pornográficas como mis días de trabajo en el sitio web de citas. En lugar de ello, he creado un conjunto de datos artificial que podemos utilizar.

Entre los investigadores de visión por ordenador, el conjunto de datos CALTECH-101 es legendaria. Contiene más de 7.500 imágenes de 101 categorías diferentes, incluyendo personas, motocicletas y aviones.

A partir de estos ~ 7.500 imágenes, que han seleccionado al azar a 17 de ellos.

Luego, a partir de estas 17 imágenes seleccionadas al azar, he creado N nuevas imágenes cambiando el tamaño aleatoriamente en +/- unos pocos puntos porcentuales. Nuestro objetivo aquí es encontrar estas imágenes casi duplicados – algo así como encontrar una aguja en un pajar.

desea crear un conjunto de datos similar a trabajar? Descargar el Caltech-101 conjunto de datos, agarrar 17 o así que las imágenes, a continuación, ejecute la secuencia de comandos gather.py encuentra en el repositorio.

Una vez más, estas imágenes son idénticos en todos los sentidos, excepto para la anchura y la altura. Y ya que no tienen las mismas dimensiones, no podemos depender de las sumas de comprobación MD5 simples. Y lo más importante, las imágenes con contenido similar pueden tener dramáticamente diferente hash MD5. En lugar de ello, podemos recurrir a hash de la imagen, donde las imágenes con contenido similar también tendrán huellas dactilares de hash similares.

Así que vamos a empezar por escribir el código para las huellas digitales de nuestro conjunto de datos. Abrir un nuevo archivo, nombre que index.py, y dejar que manos a la obra:

# import the necessary packages
from PIL import Image
import imagehash
import argparse
import shelve
import glob

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required = True,
help = "path to input dataset of images")
ap.add_argument("-s", "--shelve", required = True,
help = "output shelve database")
args = vars(ap.parse_args())

# open the shelve database
db = shelve.open(args["shelve"], writeback = True)

Lo primero que vamos a hacer es importar los paquetes que necesitaremos. Vamos a utilizar la clase Imagen de PIL o almohada para cargar nuestras imágenes de disco. Entonces la biblioteca imagehash puede ser utilizado para construir el hash perceptual.

A partir de ahí, argparse se utiliza para los argumentos de línea de comandos de análisis sintáctico, estantería se usa como (diccionario de Python) la simple base de datos clave-valor que reside en el disco, y pegote se utiliza para recopilar fácilmente las rutas de acceso a nuestras imágenes.

A continuación, analizar los argumentos de línea de comandos. La primera, –dataset es el camino a nuestro directorio de entrada de imágenes. El segundo, –shelve es la ruta de salida a nuestra base de datos deja de lado.

A continuación, abra la base de datos deja de lado para escribir. Este db almacenará los valores hash de imagen. Más sobre esto a continuación:

# loop over the image dataset
for imagePath in glob.glob(args["dataset"] + "/*.jpg"):
# load the image and compute the difference hash
image = Image.open(imagePath)
h = str(imagehash.dhash(image))

# extract the filename from the path and update the database
# using the hash as the key and the filename append to the
# list of values
filename = imagePath[imagePath.rfind("/") + 1:]
db[h] = db.get(h, []) + [filename]

# close the shelf database
db.close()

Aquí es donde ocurre la mayor parte del trabajo. Empezamos bucle sobre nuestro conjunto de datos de imágenes en, cargarlo desde el disco, y luego crear la huella digital de imágenes.

Ahora, llegamos a las dos líneas más importantes de código en todo este tutorial:

filename = imagePath[imagePath.rfind("/") + 1:]
db[h] = db.get(h, []) + [filename]

Como he mencionado anteriormente en este post, las imágenes con la misma huella se consideran idénticos .

Por lo tanto, si nuestro objetivo es encontrar imágenes casi idénticas, tenemos que mantener una lista de imágenes que tienen el mismo valor de huella digital.

Y eso es exactamente lo que hacen esas líneas.

Los extractos antiguos el nombre de archivo de la imagen. Y luego este último mantiene una lista de nombres de archivos que tienen el mismo hash imagen.

a la imagen extracto de huellas dactilares de nuestro conjunto de datos y construir nuestra base de datos de hashes, emita el siguiente comando:

$ python index.py --dataset images --shelve db.shelve

El script se ejecutará durante unos segundos y una vez que se hace esto, usted tendrá un db.shelve nombre de archivo que contiene los pares de valores clave de las huellas digitales de imagen y nombres de archivo.

Este mismo algoritmo básico es lo que utilicé hace años, cuando yo estaba trabajando para la puesta en marcha de citas. Llevamos a nuestro conjunto de datos de imágenes inapropiadas, construimos una huella digital de imagen para cada imagen, y luego los almacena en nuestra base de datos. Cuando llegó una nueva imagen, simplemente calculó el hash de la imagen y comprobado a la base de datos para ver si la carga ya había sido marcado para contenido no válido.

En el siguiente paso te voy a mostrar cómo realizar la búsqueda real para determinar si una imagen ya existe en la base de datos con el mismo valor hash.

Paso 2: Búsqueda en un conjunto de datos

Ahora que hemos construido una base de datos de huellas digitales de imagen, que es hora de buscar nuestro conjunto de datos.

abrir un nuevo archivo, nombre que search.py, y nos pondremos de codificación:

# import the necessary packages
from PIL import Image
import imagehash
import argparse
import shelve

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required = True,
help = "path to dataset of images")
ap.add_argument("-s", "--shelve", required = True,
help = "output shelve database")
ap.add_argument("-q", "--query", required = True,
help = "path to the query image")
args = vars(ap.parse_args())

Una vez más vamos a importar nuestros paquetes relevantes en. A continuación, analizar sintácticamente los argumentos de línea de comandos en. Necesitaremos tres interruptores, -dataset, que es el camino a nuestro conjunto de datos original de las imágenes, -shelve, la ruta en la base de datos estantería de pares de valores clave reside, y -query, el camino a nuestra imagen consulta / subido . Nuestro objetivo será tomar la imagen de búsqueda y determinar si ya existe en nuestra base de datos.

Ahora, vamos a escribir el código para realizar la búsqueda real:

# open the shelve database
db = shelve.open(args["shelve"])

# load the query image, compute the difference image hash, and
# and grab the images from the database that have the same hash
# value
query = Image.open(args["query"])
h = str(imagehash.dhash(query))
filenames = db[h]
print "Found %d images" % (len(filenames))

# loop over the images
for filename in filenames:
image = Image.open(args["dataset"] + "/" + filename)
image.show()

# close the shelve database
db.close()

En primer lugar, abrir nuestra base de datos, y luego cargamos nuestra imagen fuera del disco, calcular la huella digital de la imagen, y encontrar todas las imágenes con el mismo valor de huella digital.

Si hay alguna imagen con el mismo valor hash, que bucle sobre estas imágenes y mostrarlas a nuestra pantalla.

El uso de este código que vamos a ser capaces de determinar si una imagen ya existe en nuestra base de datos usando nada más que el valor de huella digital.

Resultados

Como he mencionado anteriormente en este post, he tomado los originales ~ 7.500 imágenes de CALTECH-101 conjunto de datos, seleccionados al azar 17 de ellos y, a continuación generada N nuevas imágenes cambiando el tamaño de azar ellos por unos pocos puntos porcentuales .

Las dimensiones de estas imágenes son sólo diferentes por un puñado de píxeles – pero debido a esto no podemos confiar en el hash MD5 del fichero (este punto se elabora en más detalle en la sección “La mejora de nuestro algoritmo”). En su lugar, tenemos que utilizar hash imagen para encontrar las imágenes casi duplicados.

Abra su terminal y ejecutar el siguiente comando:

$ python search.py --dataset images --shelve db.shelve --query images/84eba74d-38ae-4bf6-b8bd-79ffa1dad23a.jpg

Si todo va bien debería ver los siguientes resultados:

Por izquierda tenemos nuestra imagen de entrada. Tomamos esta imagen, calcular su huella digital de la imagen, y luego buscar la huella digital en nuestra base de datos para ver si cualquier otra imagen tienen la misma huella.

Efectivamente – hay otras dos imágenes de nuestro conjunto de datos que tienen exactamente la misma huella, como se muestra en la derecho . Si bien no es del todo evidente a partir de la captura de pantalla, estas imágenes, si bien tienen exactamente el mismo contenido visual, no son completamente idénticos! Las tres imágenes tienen diferentes anchuras y alturas.

vamos a probar otra imagen de entrada:

$ python search.py --dataset images --shelve db.shelve --query images/9d355a22-3d59-465e-ad14-138a4e3880bc.jpg

Y aquí están los resultados:

Una vez más tenemos la imagen de entrada en la dejó . Nuestro algoritmo de imagen de huellas dactilares fue capaz de encontrar tres imágenes idénticas con la misma huella, como se muestra a la derecha .

Un último ejemplo:

$ python search.py --dataset images --shelve db.shelve --query images/5134e0c2-34d3-40b6-9473-98de8be16c67.jpg

Esta vez nuestra imagen de entrada es una motocicleta en la dejó . Tomamos esta imagen de la motocicleta, ha calculado su huella digital de la imagen, y luego buscó en la base de datos de huellas dactilares. Como se puede ver a la derecha , hemos sido capaces de determinar que hay otras tres imágenes en la base de datos con la misma huella.

Mejorar nuestro algoritmo

Hay muchas maneras de mejorar nuestro algoritmo – pero la forma más crucial es tener en cuenta los valores hash que son similar, pero no idéntica .

Por ejemplo, las imágenes en este post solamente se cambia el tamaño (ya sea hacia arriba o hacia abajo en la escala) por unos pocos puntos porcentuales. Si una imagen se cambia el tamaño por un factor más grande, o si la relación de aspecto fue cambiado, los valores hash no serían idénticas.

Sin embargo, las imágenes fijas sería similar.

Con el fin de encontrar imágenes similares pero no idénticos, tendríamos que explorar la distancia de Hamming. La distancia Hamming se puede utilizar para calcular el número de bits en un hash que son diferente . Por lo tanto, dos imágenes que tienen sólo una diferencia de 1 bit en los hashes son sustancialmente más similares que las imágenes que tienen una diferencia de 10 bits.

Sin embargo, a continuación, ejecute en un segundo problema – la escalabilidad de nuestro algoritmo.

Considere esto: Se nos da una imagen de entrada y se haya indicado para encontrar todas las imágenes similares en nuestra base de datos. entonces tenemos que calcular la distancia de Hamming entre nuestra imagen de entrada y todos y cada imagen en la base de datos .

A medida que el tamaño de nuestra base de datos crece, también lo será el tiempo que toma para comparar todos los hashes. Con el tiempo, nuestra base de datos de hashes alcanzará un tamaño tal en esta comparación lineal no es práctico.

La solución, mientras que fuera del alcance de este puesto, es utilizar árboles K-d y árboles VP para reducir la complejidad del problema de búsqueda de lineal a sub-lineal.

Resumen

En este blog hemos aprendido cómo construir y utilizar los hashes de imagen para realizar la detección de imagen prácticamente duplicado. Estos hashes imagen se construyen utilizando los contenidos visuales de una imagen.

Y al igual que una huella digital puede identificar a una persona, un hash de la imagen se puede identificar de forma exclusiva una imagen así.

Usando nuestro conocimiento de la imagen de la huella dactilar, que luego construyó un sistema para encontrar y reconocer imágenes con contenido similar usando nada más que el hash de la imagen.

A continuación, demostró cómo este hash imagen se puede utilizar para encontrar rápidamente las imágenes con contenido casi duplicado.

Ah, y asegúrese de agarrar el código desde el repositorio.

Aprende visión por ordenador en un fin de semana: Si te ha gustado este post y quiere aprender más sobre la visión por computador, procesamiento de imágenes, y la fabricación de motores de búsqueda de imágenes, simplemente la cabeza a mi blog en PyImageSearch.com.

Salud!

Deja un comentario

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