一、介绍
真实增强超分辨率生成对抗网络(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 应用程序
- 克隆真实增强的超分辨率生成对抗网络 (Real-ESRGAN) 存储库。它包含要用于 Web 应用程序的机器学习模型。
$ git clone https://github.com/xinntao/Real-ESRGAN.git
- 将目录更改为克隆的存储库。
Real-ESRGAN
$ cd Real-ESRGAN
- 安装 Python3 虚拟环境。
$ sudo apt-get install -y python3.10-venv
- 为真实的ESRGAN创建一个虚拟环境。
$ python3 -m venv esrgan-env
- 激活虚拟环境。
$ source ~/Real-ESRGAN/esrgan-env/bin/activate
- 使用pip 安装BasicSR。BasicSR用于训练和推理。
(esrgan-env)$ pip install basicsr
- 安装FaceXLib和GFPGAN。FaceXLib和GFPGAN都用于面部增强功能。
(esrgan-env)$ pip install facexlib (esrgan-env)$ pip install gfpgan
- 安装真实 ESRGAN 所需的依赖项。
(esrgan-env)$ pip install -r requirements.txt
- 通过运行文件来设置 Real-ESRGAN。
setup.py
(esrgan-env)$ python3 setup.py develop
- 安装流光。您将对 Web 应用程序的用户界面使用框架Streamlit。
(esrgan-env)$ pip install streamlit
- 创建一个名为的新文件夹。此文件夹是保存上传图像的位置。
uploads
(esrgan-env)$ mkdir ~/Real-ESRGAN/uploads
- 创建一个名为的新文件夹。此文件夹是保存增强图像的位置。
outputs
(esrgan-env)$ mkdir ~/Real-ESRGAN/outputs
- 创建文件。
web-ui.py
(esrgan-env)$ nano ~/Real-ESRGAN/web-ui.py
- 使用以下代码填充文件:
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),用于接受扩展名为png、jpeg 和 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_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")
创建一个按钮,单击该按钮时将运行相应的参数。参数将基于所选模型以及是否启用或禁用面部增强功能。增强的图像输出将放置在您在步骤 12 中创建的文件夹中。
inference_realesrgan.py
outputs
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()
- 保存并通过按 +然后退出文件。
web-ui.py
CTRLXYENTER - 您的文件应如下所示:
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。
- 要创建 Tmux 进程,请运行:
(esrgan-env)$ tmux new -s esrgan-webapp
您可以使用您喜欢的任何会话名称进行更改。请参阅如何安装和使用 Tmux 了解有关 Tmux的更多信息。
esrgan-webapp
- 默认情况下,Streamlit 在端口上运行,因此您需要允许端口在防火墙上。
8501
8501
(esrgan-env)$ sudo ufw allow 8501
- 启动超分辨率图像 Web 应用程序。
(esrgan-env)$ streamlit run ~/Real-ESRGAN/web-ui.py
- 当您第一次运行 Streamlit 时,系统会提示您输入您的电子邮件地址。如果您想接收Streamlit更新,请输入您的电子邮件地址,或者您可以按跳过它。ENTER
- 要从流光会话中分离,请按+然后。CTRLBD
- 要查看超分辨率图像 Web 应用程序,请在浏览器中导航到服务器的 IP 地址。例如。
8501
http://192.0.1.2:8501
四、测试超分辨率图像 Web 应用程序
- 在浏览器中,导航端口服务器的 IP 地址。例如。
8501
http://192.0.1.2:8501
- 在文件保管箱中,上传任何低分辨率图片。文件保管箱仅接受 PNG、JPG 和 JPEG 图像。上传后,图像将以 500 像素的宽度显示,以及其文件名和 MIME 类型。
- 选择要用于增强图像的 ML 模型。有关详细信息,请参阅模型动物园文档。
- 选中“启用人脸增强功能”复选框以启用人脸增强,否则将其保留为未选中状态。
- 点击 增强图像 按钮以增强上传图像的分辨率。应用程序会在您首次运行时下载模型的权重。
- 增强上传的图像后,它将显示宽度为 500px 的输出图像。
- 单击下载增强图像按钮以下载输出图像。
- 有关示例,请参阅下图。
示例执行:
型号: RealESRGAN_x4plus
面部增强:已禁用
低分辨率图像输入:
增强图像:
您已经使用 Streamlit 和 Real-ESRGAN 在 Vultr Cloud GPU 上成功创建了超分辨率图像服务器。