Cree un servidor de imágenes de súper resolución con Vultr Cloud GPU

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

  1. 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
    
                              
                            
  2. Cambiar el directorio al repositorio clonado Real-ESRGAN .

                              
                                $ cd Real-ESRGAN
    
                              
                            
  3. Instale el entorno virtual de Python3.

                              
                                $ sudo apt-get install -y python3.10-venv
    
                              
                            
  4. Crear un Entorno Virtual para Real-ESRGAN.

                              
                                $ python3 -m venv esrgan-env
    
                              
                            
  5. Activar el Entorno Virtual.

                              
                                $ source ~/Real-ESRGAN/esrgan-env/bin/activate
    
                              
                            
  6. Instalar BásicoSR usando pepita . BasicSR se usa tanto para entrenamiento como para inferencia.

                              
                                (esrgan-env)$ pip install basicsr
    
                              
                            
  7. 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
    
                              
                            
  8. Instale las dependencias requeridas para Real-ESRGAN .

                              
                                (esrgan-env)$ pip install -r requirements.txt
    
                              
                            
  9. Configure Real-ESRGAN ejecutando el setup.py expediente.

                              
                                (esrgan-env)$ python3 setup.py develop
    
                              
                            
  10. Instale Streamlit. Usarás el marco Streamlit para la interfaz de usuario de la aplicación web.

                              
                                (esrgan-env)$ pip install streamlit
    
                              
                            
  11. Crear una nueva carpeta llamada uploads . Esta carpeta es donde se guardarán las imágenes cargadas.

                              
                                (esrgan-env)$ mkdir ~/Real-ESRGAN/uploads
    
                              
                            
  12. Crear una nueva carpeta llamada outputs . Esta carpeta es donde se guardarán las imágenes mejoradas.

                              
                                (esrgan-env)$ mkdir ~/Real-ESRGAN/outputs
    
                              
                            
  13. Crear un web-ui.py expediente.

                              
                                (esrgan-env)$ nano ~/Real-ESRGAN/web-ui.py
    
                              
                            
  14. 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 el outputs 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()
    
                              
                            
  15. Guardar y salir de la web-ui.py archivo presionando CTRL + X luego Y luego ENTER.

  16. 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.

  1. 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.

  2. Streamlit se ejecuta en el puerto 8501 de forma predeterminada, por lo que debe permitir el puerto 8501 en el cortafuegos.

                              
                                (esrgan-env)$ sudo ufw allow 8501
    
                              
                            
  3. Inicie la aplicación web de imagen de superresolución.

                              
                                (esrgan-env)$ streamlit run ~/Real-ESRGAN/web-ui.py
    
                              
                            
  4. 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.

  5. Para desconectarse de la sesión de Streamlit, presione CTRL + B y luego D.

  6. 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

  1. En su navegador, navegue por el puerto 8501 en la dirección IP de su servidor. Para example, https://192.0.1.2:8501 .

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. Después de mejorar la imagen cargada, mostrará la imagen de salida con un ancho de 500 px.

  7. Haga clic en el Descargar imagen mejorada botón para descargar la imagen de salida.

  8. 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:

Salida - 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

Related Posts