Introducción
Real-Enhanced Super-Resolution Generative Adversarial Networks (Real-ESRGAN) es un algoritmo de código abierto para la restauración de imágenes y videos. Puede usar Real-ESRGAN para restaurar o mejorar imágenes de baja resolución al reducir el ruido y ampliarlas. Esta guía explica cómo crear una aplicación web de imagen de superresolución en un Vultr Cloud uso de GPU Streamlit y Real-ESRGAN .
requisitos previos
-
implementar un vultr Cloud GPU ejecutándose en Ubuntu 22.10 con al menos 4 GB de GPU RAM. Actualice el tamaño de su servidor si desea mejorar las imágenes de baja resolución con un tamaño o dimensión mayor.
-
Actualice el servidor Ubuntu.
-
Cree un usuario no root con sudo acceder e iniciar sesión con SSH.
Cree una aplicación web de imagen de súper resolución
-
Clonar el Repositorio Real-Enhanced Super-Resolution Generative Adversarial Networks (Real-ESRGAN) . Contiene los modelos de Machine Learning que se utilizarán para la aplicación web.
$ git clone https://github.com/xinntao/Real-ESRGAN.git
-
Cambiar el directorio al repositorio clonado
Real-ESRGAN
.$ cd Real-ESRGAN
-
Instale el entorno virtual de Python3.
$ sudo apt-get install -y python3.10-venv
-
Crear un Entorno Virtual para Real-ESRGAN.
$ python3 -m venv esrgan-env
-
Activar el Entorno Virtual.
$ source ~/Real-ESRGAN/esrgan-env/bin/activate
-
Instalar BásicoSR usando pepita . BasicSR se usa tanto para entrenamiento como para inferencia.
(esrgan-env)$ pip install basicsr
-
Instalar CaraXLib y GFPGAN . FaceXLib y GFPGAN se utilizan para la función de mejora de rostros.
(esrgan-env)$ pip install facexlib (esrgan-env)$ pip install gfpgan
-
Instale las dependencias requeridas para Real-ESRGAN .
(esrgan-env)$ pip install -r requirements.txt
-
Configure Real-ESRGAN ejecutando el
setup.py
expediente.(esrgan-env)$ python3 setup.py develop
-
Instale Streamlit. Usarás el marco Streamlit para la interfaz de usuario de la aplicación web.
(esrgan-env)$ pip install streamlit
-
Crear una nueva carpeta llamada
uploads
. Esta carpeta es donde se guardarán las imágenes cargadas.(esrgan-env)$ mkdir ~/Real-ESRGAN/uploads
-
Crear una nueva carpeta llamada
outputs
. Esta carpeta es donde se guardarán las imágenes mejoradas.(esrgan-env)$ mkdir ~/Real-ESRGAN/outputs
-
Crear un
web-ui.py
expediente.(esrgan-env)$ nano ~/Real-ESRGAN/web-ui.py
-
Rellenar el
web-ui.py
archivo con los siguientes códigos:Importe los módulos requeridos:
import streamlit as st import os import subprocess from PIL import Image
Definir el
load_image()
función. Esta función abrirá e identificará el archivo de imagen cargado usando Almohada una bifurcación de Python Imaging Library (PIL).@st.cache # initialize streamlit cache def load_image(image_file): img = Image.open(image_file) return img
Definir el
main()
función.def main():
Configure el título y el subtítulo de la aplicación web.
st.title("Super Resolution Image Server") st.subheader("Upload Image to Enhance")
Cree un widget de cargador de archivos (dropbox) que acepte archivos de imagen con png , jpeg y jpg extensiones
image_file = st.file_uploader("Upload an Image:", type=['png', 'jpeg', 'jpg'])
Compruebe si el widget de Dropbox ya contiene un archivo y luego muestre el nombre de archivo de la imagen, el tipo MIME y la imagen en sí misma con un ancho de 500 px.
if image_file is not None: img_details = {"Image File Name": image_file.name, "Image File Type": image_file.type} st.write(img_details) img = load_image(image_file) st.image(img, width=500)
Guarde el archivo de imagen cargado en el cargas carpeta que creó en el paso 11.
with open(os.path.join("uploads", image_file.name, ), "wb") as file: file.write(image_file.getbuffer())
Real-ESRGAN tiene cinco modelos de mejora y restauración de imágenes: RealESRGAN_x4plus , RealESRNet_x4plus , RealESRGAN_x4plus_anime_6B , RealESRGAN_x2plus y realr-general-x4v3 . Por favor vea el Modelo de documentación del zoológico para más información.
Cree un menú desplegable para seleccionar qué modelo usar.
model = st.selectbox( "Select Model to Use:", ("RealESRGAN_x4plus", "RealESRNet_x4plus", "RealESRGAN_x4plus_anime_6B", "RealESRGAN_x2plus", "realesr-general-x4v3") ) st.write("You selected: ", model)
Cree una casilla de verificación que habilitará o deshabilitará la función de mejora de la cara.
face_enhance = st.checkbox("Enable Face Enhancement Feature")
Cree un botón que ejecutará el
inference_realesrgan.py
con los argumentos apropiados cuando se hace clic. Los argumentos se basarán en el modelo elegido y si la función de mejora de la cara está habilitada o deshabilitada. La salida de imagen mejorada se colocará en eloutputs
carpeta que creó en el paso 12.if st.button("Enhance Image"): if model == "RealESRGAN_x4plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRNet_x4plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRNet_x4plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRNet_x4plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRGAN_x4plus_anime_6B": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRGAN_x2plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x2plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x2plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "realesr-general-x4v3": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n realesr-general-x4v3 -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n realesr-general-x4v3 -i uploads/" + image_file.name + " -o outputs", shell=True)
Obtenga el nombre de archivo de la imagen sin la extensión de archivo.
img_name = os.path.splitext(image_file.name)[0]
Obtenga la extensión de archivo de la imagen.
img_ext = os.path.splitext(image_file.name)[1]
Abra e identifique el archivo de imagen mejorado usando Almohada .
enhanced_image = Image.open('outputs/' + img_name + '_out' + img_ext)
Muestre la imagen mejorada.
st.image(enhanced_image, width=500)
Cree un botón Descargar que descargará la imagen mejorada al hacer clic.
with open("outputs/" + img_name + "_out" + img_ext, "rb") as dl: dl_btn = st.download_button( label= "Download Enhanced Image", data=dl, file_name="enhanced_" + image_file.name, mime=image_file.type, )
ejecutar el
main()
función cuando se ejecuta.if __name__ == '__main__': main()
-
Guardar y salir de la
web-ui.py
archivo presionando CTRL + X luego Y luego ENTER. -
Su
web-ui.py
El archivo debería verse así:import streamlit as st import os import subprocess from PIL import Image @st.cache def load_image(image_file): img = Image.open(image_file) return img def main(): st.title("Super Resolution Image Server") st.subheader("Upload Image to Enhance") image_file = st.file_uploader("Upload an Image:", type=['png', 'jpeg', 'jpg']) if image_file is not None: img_details = {"Image File Name": image_file.name, "Image File Type": image_file.type} st.write(img_details) img = load_image(image_file) st.image(img, width=500) with open(os.path.join("uploads", image_file.name, ), "wb") as file: file.write(image_file.getbuffer()) model = st.selectbox( "Select Model to Use:", ("RealESRGAN_x4plus", "RealESRNet_x4plus", "RealESRGAN_x4plus_anime_6B", "RealESRGAN_x2plus", "realesr-general-x4v3") ) st.write("You selected: ", model) face_enhance = st.checkbox("Enable Face Enhancement Feature") if st.button("Enhance Image"): if model == "RealESRGAN_x4plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRNet_x4plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRNet_x4plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRNet_x4plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRGAN_x4plus_anime_6B": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "RealESRGAN_x2plus": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x2plus -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n RealESRGAN_x2plus -i uploads/" + image_file.name + " -o outputs", shell=True) elif model == "realesr-general-x4v3": if face_enhance: subprocess.call("python3 inference_realesrgan.py -n realesr-general-x4v3 -i uploads/" + image_file.name + " -o outputs --face_enhance", shell=True) else: subprocess.call("python3 inference_realesrgan.py -n realesr-general-x4v3 -i uploads/" + image_file.name + " -o outputs",shell=True) img_name = os.path.splitext(image_file.name)[0] img_ext = os.path.splitext(image_file.name)[1] enhanced_image = Image.open('outputs/' + img_name + '_out' + img_ext) st.image(enhanced_image, width=500) with open("outputs/" + img_name + "_out" + img_ext, "rb") as dl: dl_btn = st.download_button( label= "Download Enhanced Image", data=dl, file_name="enhanced_" + image_file.name, mime=image_file.type, ) if __name__ == '__main__': main()
Ejecute la aplicación web de imagen de súper resolución con Tmux
Cuando ejecuta su aplicación web basada en Streamlit en una sesión SSH normal, el proceso Streamlit se cierra cuando sale de la sesión SSH. Para ejecutar continuamente su aplicación web incluso cuando abandona la sesión SSH, use tmux, un multiplexor de terminal.
-
Para crear un proceso Tmux, ejecute:
(esrgan-env)$ tmux new -s esrgan-webapp
puedes cambiar
esrgan-webapp
con cualquier nombre de sesión que prefiera. Consulte Cómo instalar y usar Tmux para obtener más información sobre Tmux. -
Streamlit se ejecuta en el puerto
8501
de forma predeterminada, por lo que debe permitir el puerto8501
en el cortafuegos.(esrgan-env)$ sudo ufw allow 8501
-
Inicie la aplicación web de imagen de superresolución.
(esrgan-env)$ streamlit run ~/Real-ESRGAN/web-ui.py
-
Cuando ejecute Streamlit por primera vez, se le pedirá que ingrese su dirección de correo electrónico. Si desea recibir actualizaciones de Streamlit, ingrese su dirección de correo electrónico, o puede presionar ENTER para omitirlo.
-
Para desconectarse de la sesión de Streamlit, presione CTRL + B y luego D.
-
Para ver su aplicación web de imagen de superresolución, navegue por el puerto
8501
en su navegador en la dirección IP de su servidor. Para example,https://192.0.1.2:8501
.
Pruebe la aplicación web de imagen de superresolución
-
En su navegador, navegue por el puerto
8501
en la dirección IP de su servidor. Para example,https://192.0.1.2:8501
. -
En el buzón de archivos, cargue cualquier imagen de baja resolución. El buzón de archivos solo acepta imágenes PNG, JPG y JPEG. Después de cargar, la imagen se mostrará con un ancho de 500 píxeles, junto con su nombre de archivo y tipo MIME.
-
Seleccione el modelo ML que se utilizará para mejorar la imagen. Por favor vea el Modelo de documentación del zoológico para más información.
-
Selecciona el Habilitar la función de mejora de la cara casilla de verificación para habilitar la mejora de la cara, o déjela sin marcar de lo contrario.
-
Haga clic en el Mejorar imagen para mejorar la resolución de la imagen cargada. La aplicación descarga los pesos del modelo cuando lo ejecutas por primera vez.
-
Después de mejorar la imagen cargada, mostrará la imagen de salida con un ancho de 500 px.
-
Haga clic en el Descargar imagen mejorada botón para descargar la imagen de salida.
-
Vea las imágenes a continuación para una example.
Ejemplo de ejecución:
Modelo: RealESRGAN_x4plus
Mejora de la cara: deshabilitado
Entrada de imagen de baja resolución:
Imagen mejorada:
Ha creado con éxito un servidor de imágenes de superresolución en un Vultr Cloud GPU usando Streamlit y Real-ESRGAN.
Más información
Para obtener más información sobre Streamlit y Real-ESRGAN, consulte estos recursos:
Título del artículo Nombre (opcional) Correo electrónico (opcional) Descripción
Enviar sugerencia