使用 Vultr 构建超分辨率图像服务器 Cloud 图形处理器

介绍

Real-Enhanced Super-Resolution Generative Adversarial Networks (Real-ESRGAN) 是一种用于图像和视频恢复的开源算法。 您可以使用 Real-ESRGAN 通过降低噪声和放大图像来恢复或增强低分辨率图像。 本指南解释了怎样在 Vultr 上构建超分辨率图像 Web 应用程序 Cloud GPU使用 流光真实 ESRGAN.

先决条件

  • 部署一个 火影忍者 Cloud 图形处理器 在具有至少 4 GB GPU RAM 的 Ubuntu 22.10 上运行。 如果您想用更大的尺寸或尺寸增强低分辨率图像,请升级您的服务器的尺寸。

  • 更新 Ubuntu 服务器。

  • 创建一个非root用户 sudo 使用 SSH 访问和登录。

构建超分辨率图像 Web 应用程序

  1. 克隆 Real-Enhanced Super-Resolution Generative Adversarial Networks (Real-ESRGAN) 存储库. 它包含要用于 Web 应用程序的机器学习模型。

    $ git clone https://github.com/xinntao/Real-ESRGAN.git
    
  2. 将目录更改为克隆的存储库 Real-ESRGAN.

    $ cd Real-ESRGAN
    
  3. 安装 Python3 虚拟环境。

    $ sudo apt-get install -y python3.10-venv
    
  4. 为 Real-ESRGAN 创建一个虚拟环境。

    $ python3 -m venv esrgan-env
    
  5. 激活虚拟环境。

    $ source ~/Real-ESRGAN/esrgan-env/bin/activate
    
  6. 安装 基本SR 使用 点子. BasicSR 用于训练和推理。

    (esrgan-env)$ pip install basicsr
    
  7. 安装 FaceXLibGFPGAN. FaceXLib 和 GFPGAN 都用于人脸增强功能。

    (esrgan-env)$ pip install facexlib
    
    (esrgan-env)$ pip install gfpgan
    
  8. 安装所需的依赖项 真实 ESRGAN.

    (esrgan-env)$ pip install -r requirements.txt
    
  9. 通过运行设置 Real-ESRGAN setup.py 文件。

    (esrgan-env)$ python3 setup.py develop
    
  10. 安装 Streamlit。 您将使用该框架 流光 用于 Web 应用程序的用户界面。

    (esrgan-env)$ pip install streamlit
    
  11. 创建一个名为的新文件夹 uploads. 此文件夹是保存上传图像的位置。

    (esrgan-env)$ mkdir ~/Real-ESRGAN/uploads
    
  12. 创建一个名为的新文件夹 outputs. 此文件夹是保存增强图像的位置。

    (esrgan-env)$ mkdir ~/Real-ESRGAN/outputs
    
  13. 创建一个 web-ui.py 文件。

    (esrgan-env)$ nano ~/Real-ESRGAN/web-ui.py
    
  14. 填充 web-ui.py 包含以下代码的文件:

    导入所需的模块:

    import streamlit as st
    
    import os
    
    import subprocess
    
    from PIL import Image
    

    定义 load_image() 功能。 此功能将使用打开并识别上传的图像文件 枕头,Python 图像库 (PIL) 的一个分支。

    @st.cache # initialize streamlit cache
    
    def load_image(image_file):
    
        img = Image.open(image_file)
    
        return img
    

    定义 main() 功能。

    def main():
    

    设置 Web 应用程序的标题和子标题。

        st.title("Super Resolution Image Server")
    
        st.subheader("Upload Image to Enhance")
    

    创建一个接受图像文件的文件上传器小部件(保管箱) PNG, JPEG, 和 jpg 扩展名。

        image_file = st.file_uploader("Upload an Image:", type=['png', 'jpeg', 'jpg'])
    

    检查 Dropbox 小部件是否已包含文件,然后以 500 像素的宽度显示图像的文件名、MIME 类型和图像本身。

        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)
    

    Save 上传的图片文件到 上传 您在步骤 11 中创建的文件夹。

            with open(os.path.join("uploads", image_file.name, ), "wb") as file:
    
                file.write(image_file.getbuffer())
    

    Real-ESRGAN 有五种图像增强和恢复模型: RealESRGAN_x4plus, RealESRNet_x4plus, RealESRGAN_x4plus_anime_6B, RealESRGAN_x2plus, 和 realesr-general-x4v3. 请参阅 模型动物园文档 了解更多信息。

    创建一个下拉菜单以选择要使用的模型。

            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")
    

    创建一个按钮来运行 inference_realesrgan.py 单击时带有适当的参数。 参数将基于所选模型以及面部增强功能是启用还是禁用。 增强的图像输出将放置在 outputs 您在步骤 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)
    

    获取不带文件扩展名的图像文件名。

                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,
    
                    )
    

    跑过 main() 执行时的功能。

    if __name__ == '__main__':
    
        main()
    
  15. Save 并退出 web-ui.py 按 CTRL + X 然后 Y 然后 ENTER 文件。

  16. 您的 web-ui.py 文件应如下所示:

    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()
    

使用 Tmux 运行超分辨率图像 Web 应用程序

当您在正常的 SSH 会话上运行基于 Streamlit 的 Web 应用程序时,Streamlit 进程会在您退出 SSH 会话时关闭。 要在离开 SSH 会话时继续运行 Web 应用程序,请使用终端多路复用器 tmux。

  1. 要创建 Tmux 进程,请运行:

    (esrgan-env)$ tmux new -s esrgan-webapp
    

    你可以改变 esrgan-webapp 使用您喜欢的任何会话名称。 有关 Tmux 的更多信息,请参阅怎样安装和使用 Tmux。

  2. Streamlit 在端口上运行 8501 默认情况下,所以你需要允许端口 8501 在防火墙上。

    (esrgan-env)$ sudo ufw allow 8501
    
  3. 启动超分辨率图像 Web 应用程序。

    (esrgan-env)$ streamlit run ~/Real-ESRGAN/web-ui.py
    
  4. 当您第一次运行 Streamlit 时,系统会提示您输入您的电子邮件地址。 如果您想接收 Streamlit 更新,请输入您的电子邮件地址,或者您可以按 ENTER 跳过它。

  5. 要从 Streamlit 会话中分离,请按 CTRL + B,然后按 D。

  6. 要查看您的超分辨率图像 Web 应用程序,请导航端口 8501 在浏览器中的服务器 IP 地址。 为了 example, https://192.0.1.2:8501.

测试超分辨率图像 Web 应用程序

  1. 在浏览器中,导航端口 8501 在您的服务器的 IP 地址。 为了 example, https://192.0.1.2:8501.

  2. 在文件保管箱中,上传任何低分辨率图像。 文件保管箱仅接受 PNG、JPG 和 JPEG 图像。 上传后,图像将以 500 像素的宽度显示,以及文件名和 MIME 类型。

  3. 选择要用于增强图像的 ML 模型。 请参阅 模型动物园文档 了解更多信息。

  4. 选择 启用面部增强功能 复选框以启用面部增强,否则不选中。

  5. 点击 增强图像 按钮以提高上传图像的分辨率。 该应用程序会在您首次运行时下载模型的权重。

  6. 对上传的图片进行增强后,会显示宽度为 500px 的输出图片。

  7. 点击 下载增强图像 按钮下载输出图像。

  8. 请参阅下面的图片 example.

示例执行:

型号:RealESRGAN_x4plus

面部增强:已禁用

低分辨率图像输入:

增强图像:

输出 - 增强图像

您已在 Vultr 上成功创建超分辨率图像服务器 Cloud GPU 使用 Streamlit 和 Real-ESRGAN。

更多信息

要了解有关 Streamlit 和 Real-ESRGAN 的更多信息,请参阅以下资源:

文章标题 名称(可选) 电子邮件(可选) 描述

发送建议

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com