Esta es una implementación de Pytorch del documento un algoritmo neural de estilo artístico de Leon A. Gatys, Alexander S. Ecker y Matthias Bethge. El código se basa en el estilo neuronal de Justin Johnson.
El documento presenta un algoritmo para combinar el contenido de una imagen con el estilo de otra imagen utilizando redes neuronales convolucionales. Aquí hay un ejemplo que mapea el estilo artístico de la noche estrellada en una fotografía nocturna del campus de Stanford:
Aplicar el estilo de diferentes imágenes a la misma imagen de contenido ofrece resultados interesantes. Aquí reproducimos la Figura 2 del documento, que hace una fotografía del Tubingen en Alemania en una variedad de estilos:
Aquí están los resultados de aplicar el estilo de varias obras de arte a esta fotografía del Puente Golden Gate:
El algoritmo permite al usuario intercambiar el peso relativo de los términos de reconstrucción de estilo y contenido, como se muestra en este ejemplo donde portamos el estilo del autorretrato de 1907 en Brad Pitt:
Al cambiar el tamaño de la imagen de estilo antes de extraer características de estilo, podemos controlar los tipos de características artísticas que se transfieren desde la imagen de estilo; Puede controlar este comportamiento con la bandera -style_scale . A continuación vemos tres ejemplos de representar el puente Golden Gate al estilo de la noche estrellada. De izquierda a derecha, -style_scale es 2.0, 1.0 y 0.5.
Puede usar más de una imagen de estilo para combinar múltiples estilos artísticos.
En el sentido de las agujas del reloj desde la parte superior izquierda: "La noche estrellada" + "The Scream", "The Scream" + "Composición VII", "Nude sentado" + "Composición VII" y "Sentado desnudo" + "La noche estrellada"
Cuando usa múltiples imágenes de estilo, puede controlar el grado en que se mezclan:
Si agrega la bandera -original_colors 1 , la imagen de salida retendrá los colores de la imagen original.
Dependencias:
Dependencias opcionales:
Después de instalar las dependencias, deberá ejecutar el siguiente script para descargar el modelo VGG:
python models/download_models.py
Esto descargará el modelo VGG-19 original. El modelo VGG-16 original también se descargará. Por defecto, se utiliza el modelo VGG-19 original.
Si tiene una GPU de memoria más pequeña, entonces usar el modelo NIN ImageNet será mejor y ofrece resultados ligeramente peores pero comparables. Puede obtener los detalles sobre el modelo de BVLC Caffe Modelzoo. El modelo NIN se descarga cuando ejecuta el script download_models.py .
Puede encontrar instrucciones de instalación detalladas para Ubuntu y Windows en la guía de instalación.
Uso básico:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
Uso de Cudnn con modelo NIN:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
Para usar múltiples imágenes de estilo, pase una lista separada por comas como esta:
-style_image starry_night.jpg,the_scream.jpg .
Tenga en cuenta que las rutas a las imágenes no deben contener el carácter ~ para representar su directorio de inicio; En su lugar, debe usar una ruta relativa o una ruta absoluta completa.
Opciones :
-image_size : longitud del lado máximo (en píxeles) de la imagen generada. El valor predeterminado es 512.-style_blend_weights : el peso para combinar el estilo de imágenes de múltiples estilo, como una lista separada por comas, como -style_blend_weights 3,7 . Por defecto, todas las imágenes de estilo están igualmente ponderadas.-gpu : ID de índice cero de la GPU para usar; Para modo CPU establecido -gpu a c .Opciones de optimización :
-content_weight : cuánto peso el término de reconstrucción de contenido. El valor predeterminado es 5E0.-style_weight : cuánto peso el término de reconstrucción del estilo. El valor predeterminado es 1E2.-tv_weight : peso de la regularización de la variación total (TV); Esto ayuda a suavizar la imagen. El valor predeterminado es 1e-3. Establecer en 0 para deshabilitar la regularización de la televisión.-num_iterations : el valor predeterminado es 1000.-init : método para generar la imagen generada; Uno de random o image . El valor predeterminado es random que utiliza una inicialización de ruido como en el documento; image se inicializa con la imagen de contenido.-init_image : reemplaza la imagen de inicialización con una imagen especificada por el usuario.-optimizer : el algoritmo de optimización para usar; ya sea lbfgs o adam ; El valor predeterminado es lbfgs . L-BFGS tiende a dar mejores resultados, pero usa más memoria. Cambiar a Adam reducirá el uso de la memoria; Al usar Adam, probablemente necesitará jugar con otros parámetros para obtener buenos resultados, especialmente el peso del estilo, el peso del contenido y la tasa de aprendizaje.-learning_rate : tasa de aprendizaje para usar con Adam Optimizer. El valor predeterminado es 1e1.-normalize_gradients : si esta bandera está presente, los gradientes de estilo y contenido de cada capa se normalizarán L1.Opciones de salida :
-output_image : nombre de la imagen de salida. El valor predeterminado es out.png .-print_iter : imprima progreso cada iteración print_iter . Establecer en 0 para deshabilitar la impresión.-save_iter : guarde la imagen cada iteraciones save_iter . Establecer en 0 para deshabilitar el ahorro de resultados intermedios.Opciones de capa :
-content_layers : lista de nombres de capa separados por comas para usar para la reconstrucción de contenido. El valor predeterminado es relu4_2 .-style_layers : lista de nombres de capas separados por comas para usar para la reconstrucción de estilo. El valor predeterminado es relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .Otras opciones :
-style_scale : escala a la cual extraer características de la imagen de estilo. El valor predeterminado es 1.0.-original_colors : si establece esto en 1, la imagen de salida mantendrá los colores de la imagen de contenido.-model_file : ruta al archivo .pth para el modelo VGG CAFFE. El valor predeterminado es el modelo VGG-19 original; También puede probar el modelo VGG-16 original.-pooling : el tipo de capas de agrupación para usar; Uno de max o avg . El valor predeterminado es max . Los modelos VGG-19 utilizan capas de agrupación máxima, pero el documento menciona que reemplazar estas capas con capas de agrupación promedio puede mejorar los resultados. No he podido obtener buenos resultados usando la agrupación promedio, pero la opción está aquí.-seed : un valor entero que puede especificar para obtener resultados repetibles. Por defecto, este valor es aleatorio para cada ejecución.-multidevice_strategy : una lista separada por comas de índices de capa en la que dividir la red cuando se usa múltiples dispositivos. Consulte la escala de múltiples GPU para más detalles.-backend : nn , cudnn , openmp o mkl . El valor predeterminado es nn . mkl requiere el backend de MKL de Intel.-cudnn_autotune : cuando se usa el backend de Cudnn, pase este indicador para usar el AutoTuner Cudnn incorporado para seleccionar los mejores algoritmos de convolución para su arquitectura. Esto hará que la primera iteración sea un poco más lenta y puede tomar un poco más de memoria, pero puede acelerar significativamente el backend de Cudnn. Problema: el programa se queda sin memoria y muere
Solución: intente reducir el tamaño de la imagen: -image_size 256 (o más bajo). Tenga en cuenta que los diferentes tamaños de imagen probablemente requerirán valores no predeterminados para -style_weight y -content_weight para obtener resultados óptimos. Si se ejecuta en una GPU, también puede intentar ejecutar con -backend cudnn para reducir el uso de la memoria.
Problema: -backend cudnn es más lento que el backend NN predeterminado
Solución: Agregue la bandera -cudnn_autotune ; Esto utilizará el Cudnn Autotuner incorporado para seleccionar los mejores algoritmos de convolución.
Problema: Obtenga el siguiente mensaje de error:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
Solución: debido a una mezcla con ubicaciones de capa, los modelos más antiguos requieren una solución para ser compatible con versiones más nuevas de Pytorch. El script donwload_models.py incluido realizará automáticamente estas correcciones después de descargar los modelos.
Por defecto, neural-style-pt utiliza el backend nn para convoluciones y L-BFG para optimización. Estos dan buenos resultados, pero ambos pueden usar mucha memoria. Puede reducir el uso de la memoria con lo siguiente:
-backend cudnn para usar el backend de Cudnn. Esto solo funcionará en modo GPU.-optimizer adam para usar Adam en lugar de L -BFGS. Esto debería reducir significativamente el uso de la memoria, pero puede requerir el ajuste de otros parámetros para obtener buenos resultados; En particular, debe jugar con la tasa de aprendizaje, el peso del contenido y el peso de estilo. Esto debería funcionar en los modos de CPU y GPU.-image_size 256 para generar una imagen a la mitad del tamaño predeterminado.Con la configuración predeterminada, el estilo neuronal-PT usa aproximadamente 3.7 GB de memoria GPU en mi sistema; Cambiar a Adam y Cudnn reduce la huella de la memoria GPU a aproximadamente 1 GB.
La velocidad puede variar mucho según el backend y el optimizador. Aquí hay algunas veces para ejecutar 500 iteraciones con -image_size=512 en un Tesla K80 con diferentes configuraciones:
-backend nn -optimizer lbfgs : 117 segundos-backend nn -optimizer adam : 100 segundos-backend cudnn -optimizer lbfgs : 124 segundos-backend cudnn -optimizer adam : 107 segundos-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 segundos-backend cudnn -cudnn_autotune -optimizer adam : 91 segundosAquí están los mismos puntos de referencia en un GTX 1080:
-backend nn -optimizer lbfgs : 56 segundos-backend nn -optimizer adam : 38 segundos-backend cudnn -optimizer lbfgs : 40 segundos-backend cudnn -optimizer adam : 40 segundos-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 segundos-backend cudnn -cudnn_autotune -optimizer adam : 24 segundos Puede usar múltiples dispositivos CPU y GPU para procesar imágenes a resoluciones más altas; Se calcularán diferentes capas de la red en diferentes dispositivos. Puede controlar qué dispositivos GPU y CPU se usan con el indicador -gpu , y puede controlar cómo dividir las capas en los dispositivos utilizando el indicador -multidevice_strategy .
Por ejemplo, en un servidor con cuatro GPU, puede dar la bandera -gpu 0,1,2,3 para procesar en GPU 0, 1, 2 y 3 en ese orden; Al dar también la bandera -multidevice_strategy 3,6,12 indica que las dos primeras capas deben calcularse en la GPU 0, las capas 3 a 5 deben calcularse en la GPU 1, las capas 6 a 11 deben estar calculadas en GPU 2, y las -multidevice_strategy restantes deben calcularse en GPU 3.
Podemos lograr resultados de muy alta calidad a alta resolución combinando el procesamiento de múltiples GPU con la generación multiescala como se describe en el documento que controla los factores perceptivos en la transferencia de estilo neuronal por Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann y Eli Shechtman.
Aquí hay una imagen 4016 x 2213 generada en un servidor con ocho GPU Tesla K80:
El script utilizado para generar esta imagen se puede encontrar aquí.
Las imágenes se inicializan con ruido blanco y se optimizan usando L-BFG.
Realizamos reconstrucciones de estilo usando las capas y reconstrucciones de contenido conv1_1 , conv2_1 , conv3_1 , conv4_1 y conv5_1 utilizando la capa conv4_2 . Como en el documento, las cinco pérdidas de reconstrucción de estilo tienen peso igual.
Si encuentra útil este código para su investigación, cíquelo utilizando la cita proporcionada.