使用 Vultr 的云 GPU 构建超分辨率图像服务器 教程

一、介绍

真实增强超分辨率生成对抗网络(Real-ESRGAN)是一种用于图像和视频恢复的开源算法。您可以使用 Real-ESRGAN 通过减少噪点并对其进行放大来恢复或增强低分辨率图像。本指南解释了如何使用 Streamlit和Real-ESRGAN 在 Vultr Cloud GPU 上构建超分辨率图像 Web 应用程序。

二、准备工作

  • 部署在 Ubuntu 22.10 上运行的 Vultr Cloud GPU,至少具有 4 GB 的 GPU RAM。如果要使用更大的尺寸或尺寸增强低分辨率图像,请升级服务器的大小。
  • 更新 Ubuntu 服务器。
  • 创建一个具有 sudo 访问权限的非 root 用户并使用 SSH 登录。

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

  1. 克隆真实增强的超分辨率生成对抗网络 (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. 为真实的ESRGAN创建一个虚拟环境。
    $ python3 -m venv esrgan-env
    
  5. 激活虚拟环境。
    $ source ~/Real-ESRGAN/esrgan-env/bin/activate
    
  6. 使用pip 安装BasicSR。BasicSR用于训练和推理。
    (esrgan-env)$ pip install basicsr
    
  7. 安装FaceXLib和GFPGAN。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. 安装流光。您将对 Web 应用程序的用户界面使用框架Streamlit
    (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
    

    定义函数。此函数将使用 Python 映像库 (PIL) 的一个分支Pillow 打开并识别上传的图像文件。load_image()

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

    创建一个文件上传器小部件 (dropbox),用于接受扩展名为pngjpeg 和 jpg 的图像文件。

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

    检查保管箱小部件是否已包含文件,然后以 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)
    

    将上传的图像文件保存到您在步骤 11 中创建的上传文件夹。

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

    Real-ESRGAN有五种图像增强和恢复模型:RealESRGAN_x4plusRealESRNet_x4plusRealESRGAN_x4plus_anime_6BRealESRGAN_x2plusrealesr-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")
    

    创建一个按钮,单击该按钮时将运行相应的参数。参数将基于所选模型以及是否启用或禁用面部增强功能。增强的图像输出将放置在您在步骤 12 中创建的文件夹中。inference_realesrgan.pyoutputs

            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]
    

    使用 Pillow 打开并识别增强的图像文件.

                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. 保存并通过按 +然后退出文件。web-ui.pyCTRLXYENTER
  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 应用程序时,当您退出 SSH 会话时,Streamlit 进程将关闭。要在离开 SSH 会话时持续运行 Web 应用程序,请使用终端多路复用器 tmux。

  1. 要创建 Tmux 进程,请运行:
    (esrgan-env)$ tmux new -s esrgan-webapp
    

    您可以使用您喜欢的任何会话名称进行更改。请参阅如何安装和使用 Tmux 了解有关 Tmux的更多信息。esrgan-webapp

  2. 默认情况下,Streamlit 在端口上运行,因此您需要允许端口在防火墙上。85018501
    (esrgan-env)$ sudo ufw allow 8501
    
  3. 启动超分辨率图像 Web 应用程序。
    (esrgan-env)$ streamlit run ~/Real-ESRGAN/web-ui.py
    
  4. 当您第一次运行 Streamlit 时,系统会提示您输入您的电子邮件地址。如果您想接收Streamlit更新,请输入您的电子邮件地址,或者您可以按跳过它。ENTER
  5. 要从流光会话中分离,请按+然后。CTRLBD
  6. 要查看超分辨率图像 Web 应用程序,请在浏览器中导航到服务器的 IP 地址。例如。8501http://192.0.1.2:8501

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

  1. 在浏览器中,导航端口服务器的 IP 地址。例如。8501http://192.0.1.2:8501
  2. 在文件保管箱中,上传任何低分辨率图片。文件保管箱仅接受 PNG、JPG 和 JPEG 图像。上传后,图像将以 500 像素的宽度显示,以及其文件名和 MIME 类型。
  3. 选择要用于增强图像的 ML 模型。有关详细信息,请参阅模型动物园文档。
  4. 选中“启用人脸增强功能”复选框以启用人脸增强,否则将其保留为未选中状态。
  5. 点击 增强图像 按钮以增强上传图像的分辨率。应用程序会在您首次运行时下载模型的权重。
  6. 增强上传的图像后,它将显示宽度为 500px 的输出图像。
  7. 单击下载增强图像按钮以下载输出图像。
  8. 有关示例,请参阅下图。

示例执行:

型号: RealESRGAN_x4plus

面部增强:已禁用

示例 - 超分辨率图像 Web 应用程序

低分辨率图像输入:

输入 - 低分辨率图像

增强图像:

输出 - 增强图像

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

赞(0)
未经允许不得转载:主机百科 » 使用 Vultr 的云 GPU 构建超分辨率图像服务器 教程