AI

Stable Diffusion扩展:后期处理图片变高清

背景


当我们用Stable Diffusion生成图片时,由于硬件限制和速度考虑,通常生成的图片size会选城512*512,这样的图片很模糊,我们可以通过下面的方法,修复图片清晰度。

Stable Diffusion的后期处理功能


stable diffusion中,默认生成的图片是512*512尺寸的,分辨率较低,图像质量一般。要想生成高清大图,有两种方法。

一是在文生图的时候,选择下方的hires.fix高分辨率修复,就会将生成图片的512*512尺寸调整成1024*1024的大图。不过,这会导致出图速度变慢。

更值得推荐的是第二种方式:extras附加功能

放大算法多选框里面是各种图片无损放大算法,比如Lanczos、Nearest、4x-UltraSharp、

LDSR、R-ESRGAN 4x+、R-ESRGAN 4x+ Anime6B、SwinlR 4x等。

不同的算法会导致不同的图片放大效果:

Lanczos是传统插值算法,不推荐使用。

LDSR,图片放大质量很好,非常适合照片类图片,但速度非常慢。

4x-UltraSharp,会让图片变得平滑、锐利,非常适合修复表面纹理有问题的图片。

R-ESRGAN 4x+,是一个增强的ESRGAN,可以修复各种真实世界的图像,可以保留图片中的精细细节,并产生清晰锐利的图像。这是一种适用于大多数图像的AI放大算法。在逼真的照片类图像中,表现最佳。

R-ESRGAN-4x+-Anime6B,适合动漫类图片的放大。

SwinIR_4x,适合绘画类图片的放大。

一般情况下,选择R-ESRGAN 4x+就好了。

这些算法,默认是放大4倍,也就是说,会把512×512像素的图片放大成2048×2048 像素 。

对于人物脸部,还可以勾选下面的 CodeFormer 和 GFPGAN 。这两个选项可以修复人脸图片的一些问题,比如GFPGAN可以软化,修复眼睛。

如果勾选GFPGAN和CodeFormer算法来处理脸部细节的话,需要下载相应的模型。这两个算法可以组合起来使用。

补充:4X-UltraSharp放大模型

4x-UltraSharp这个模型也是非常的火,可以从网上搜索下载

R-ESRGAN 4X+ 与 4x-UltraSharp 放大重绘对比

【R-ESRGAN 4X+】所生成的放大图片,总有一种规则感,或者说是总有一种手绘风,缺少一点自然的纷乱感,还不够真实。

【4x-UltraSharp】,听这个名字就知道,开发者对图片放大效果的追求,是一种极致的锋利感。

仅从感官直觉而言:

【R-ESRGAN 4X+】似乎要更明亮一点,显得比较柔和。

【4x-UltraSharp】则稍显厚重,对比度范围更高,立体感更强。

【R-ESRGAN 4X+】放大处理后的图片,更像是一幅高品质的手工画作。

【4x-UltraSharp】放大处理后的图片,则更像是贴近真实的人物照片。

所以,如果用户需要的是生成非拟真性的动漫类画作,则完全可以选择【R-ESRGAN 4X+】作为首选放大工具。而如果用户需要的是生成拟真性的照片,则应该选择【4x-UltraSharp】作为目前的首选。

1.4x-UltraSharp.pth图像放大器百度网盘链接:

链接:https://pan.baidu.com/s/13arXCju-8lTf1K91-rS1hg?pwd=ws4h 

提取码:ws4h

2.4x-UltraSharp 的下载地址
  https://mega.nz/folder/qZRBmaIY#nIG8KyWFcGNTuMX_XNbJ_g

放到下面的目录里面

stable-diffusion-webui/models/ESRGAN/4x-UltraSharp.pth

Stable Diffusion的后期处理也支持api调用


代码例子,先绘图,再修复高清。

let requestData = {
    "prompt": xxxx,
    "negative_prompt": xxxx,
    "width": 512,
    "height": 512,
    "sampler_name": 'DPM++ 2M Karras',
    "batch_size": 1,
    "steps": steps,
    "cfg_scale": 7,
    "override_settings": {
      "sd_model_checkpoint":'dreamshaper_8.safetensors [879db523c3]'
    }
  };

  axios.post('http://xxxx:7860/sdapi/v1/txt2img', requestData, {
    auth: {
      username: 'xxxx',
      password: 'xxxx'
    }
  })
    .then(response => {
      // 将Base64字符串转换为缓冲区
      const base64String = response.data.images[0];

      let requestResizeData = {
        "resize_mode": 0,
        "gfpgan_visibility": 0.3,
        "codeformer_visibility": 0.2,
        "codeformer_weight": 0.1,
        "upscaling_resize": 4,
        "upscaling_resize_w": 512,
        "upscaling_resize_h": 512,
        "upscaler_1": 'R-ESRGAN 4x+',
        "image": base64String
      };

      // 图片进行高清放大
      axios.post('http://xxxx:7860/sdapi/v1/extra-single-image', requestResizeData, {
        auth: {
          username: 'xxxx',
          password: 'xxxx'
        }
      })
        .then(response => {
          // 将Base64字符串转换为缓冲区
          const buffer = Buffer.from(response.data.image, 'base64');
          fs.writeFile(output_image_path, buffer, (err) => {
            if (err) {
              return console.log('文件写入失败!', err.message);
            }     
          });

        }).catch(error => {
          console.error('txt2img Error:', error);
        });
    })
    .catch(error => {
      console.error('txt2img Error:', error);
    });