English version here.
¿Te gustaría viajar a un lugar turístico y aparecer solo en las fotos?
Person remover es un proyecto que combina la arquitectura Pix2Pix con Yolo para eliminar a las personas y objetos de las fotos. Para Pix2Pix se ha adaptado el código de Tensorflow, y para Yolo, de https://github.com/zzh8829/yolov3-tf2.
Este proyecto es capaz de eliminar objetos tanto en imágenes como en vídeo.
Se ha utilizado Python 3.7 y Tensorflow 2.0-beta.
Pruébalo en Google Colab (en inglés).
Se han combinado YOLO con Pix2Pix para eliminar personas de las fotos. Para ello, se ha tomado una red YOLO preentrenada que se encarga de detectar los objetos de las imágenes (generando una bounding box a su alrededor) y se ha utiilizado después una Pix2Pix que ha aprendido a rellenar huecos en el centro de las imágenes, tomando como referencia las imágenes sin agujero:
- YOLO detecta los objetos
- Se toma una subimagen con cada uno de los objetos, añadiendo píxeles a su alrededor
- De cada subimagen se elimina a la persona, que se encuentra en el centro, y posteriormente se envía al generador de Pix2Pix para que rellene a partir de los píxeles que quedan.
Con el objeto de ilustrar el proceso de entrenamiento de Pix2Pix, se pueden observar las siguientes imágenes, en las que se ha generado un agujero y el generador ha aprendido a rellenarlo.
Estas instrucciones te ayudarán a entrenar un modelo en tu máquina local. Sin embargo, los datos de entrenamiento que se han utilizado para Pix2Pix no son públicos. Este conjunto consta de 14900 imágenes 256x256x3. El código se encarga de crear un agujero en el centro de las imágenes y aprender a rellenarlo con los datos que hay alrededor.
Para utilizar el programa necesitarás Python 3.7 y los paquetes especificados en el archivo requirements.txt
.
Clonar el repositorio
git clone https://github.com/javirk/Person_remover.git
Entrar en la carpeta ./yolo
, descargar los pesos de YOLO, convertirlos y moverlos a la carpeta ./yolo/data
wget https://pjreddie.com/media/files/yolov3.weights -O data/yolov3.weights
python convert.py
Descargar los pesos de Pix2Pix de Google Drive y
colocarlos en ./pix2pix/checkpoint/
.
Para sacar resultados de imágenes tan solo hay que ejecutar el archivo person_remover.py
:
python person_remover.py -i /ruta/a/imagenes/input
En un vídeo, por el contrario:
python person_remover.py -v /ruta/a/video
También es posible especificar el tipo de objeto a eliminar (por defecto serán las personas, mochilas y bolsos). Para hacer esto:
python person_remover.py -i /ruta/a/imagenes/input -ob 1 2 3
Lo que eliminará los objetos especificados como 1, 2 y 3 (empezando desde 0) que aparecen en el archivo yolo/data/coco.names
.
Es decir, bicicletas, coches y motos.
La red YOLO se tomó preentrenada. Las redes que formaban parte del Pix2Pix han sido entrenadas durante 23 épocas en un conjunto de 14900 imágenes de entrenamiento y 100 de test con los parámetros por defecto de Pix2Pix. Nótese que el entrenamiento es tremendamente sensible, por lo que pueden no obtenerse los mejores resultados a la primera prueba.
Para ejecutar el entrenamiento con los parámetros por defecto, tras haber descargado los archivos:
python image_inpainting.py -train /ruta/a/imagenes/entrenamiento -test /ruta/a/imagenes/test -mode /train
Se ha utilizado un vídeo de las calles de París. El resultado completo está disponible para su descarga en este enlace de Google Drive.
Los resultados se pueden mejorar eliminando la red YOLO (detectora de objetos) por una red segmentadora. Así, el generador solo tendria que rellenar la parte correspondiente a la persona, no toda la bounding box. Por motivos de tiempo y capacidad de procesamiento no se ha podido realizar.
Modificación de Pix2Pix por una arquitectura más avanzada, como Pix2PixHD.
Este proyecto tiene licencia MIT. Ver el archivo LICENSE.md para más detalles.
- zzh8829 por el código de YOLO
- Tensorflow por el código de Pix2Pix