真人换装Inpaint Anything


同类案例:https://cloud.tencent.com/developer/article/2365063

实例

正向: A beautiful woman wearing a white wedding dress adorned with lace, walking along the beach at sunset. Her hair is gently lifted by the breeze, and she is holding a bouquet of white roses. dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2, Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare

反向: nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres

例如,你有像這樣的穿著衣服的人台照片,這張是我們自己展示室拍的照片。

image-66-555x800.png.webp
假模特兒真人化原圖

會用 Stable Diffusion ,不用十分鐘,第一張圖就出來了。

image-27-555x800-1

就算要做調整,一小時也都夠了。例如:

image-2-555x800.png.webp
假模特兒真人化 完成1

image-555x800.png.webp
假模特兒真人化 完成2

image-3-555x800.png.webp
假模特兒真人化 完成3

一、假模特兒真人化基本思路

將假人台變真人還要保留衣服,這要怎麼做呢?

這時熟悉 Stable Diffusion 的朋友就會說:我知道,就是用圖生圖裡 Inpaint 功能,然後把衣服外的地方做遮罩,讓 Stable Diffusion 重繪。

那遮罩怎麼做?如果要用手一筆筆做遮罩那太慢了,要是這樣,我就不用特別出這篇。

又會有人說:我知道,先用 photoshop 把遮罩做出來,再用遮罩重繪功能。

這也是個方法,但現在還可以更智慧。

今天我們要使用一個外掛 inpainting anything,給一張照片,他可以把照片用色塊分別出不同的東西。到時候我們只要選哪些色塊要做成遮罩,這樣子遮罩就做出來了。

然後再利用重繪的功能,在保留衣服的情況下,把假人真人化。

雖然基本的思路是這樣,但是如果你自己有操作過,你就會知道路上還是有很多的坑。

所以在這篇文章裡,我不止會手把手教你如何把假人變成真人,重要的事情是我還會告訴你我是怎麼樣把這些坑填平的。

現在就一一跟大家說明。

二、假模特兒真人化準備工具

這篇示範是使用 Automatic 1111 的 WebUI ,並採用 SD 1.5 的模型,我們開始準備吧!

準備 1 :inpaint anything

首先會用到 Inpaint Anything 這個外掛,請檢查您的 Automatic 1111 的 WebUI 看看有沒有頁籤 Inpaint Anything 的外掛,沒有的話請安裝一下

image-6.png.webp

安裝 inpaint anything

到 Install from URL,輸入

https://github.com/Uminosachi/sd-webui-inpaint-anything.git

即可安裝

image-7.png.webp

安裝好後,回到 install 頁籤,按下 Apply and quit 即可

image-8.png.webp

準備 2 :Inpaint 專用的模型

這次AI召喚師我會用 epiCPhotoGasm 示範,這模型出來的品質都像是攝影大師照出來的照片,特別適合用在需要真實畫面的地方。

我們今天要用的不是他的主要模型,而是要用他的 Inpaint 模型。

image-9-1300x789.png.webp

請到下方連結,下載它的 Inpaint 模型並安裝好,準備等下使用。

https://civitai.com/models/132632?modelVersionId=201346

準備 3 :假人照

我們就用我們的例子這張

image-10-555x800.png.webp

這是在自家的展示室拍的,要注意的是他是個黑色的人台,這等一下會惹出些麻煩。這邊先預告。

這 3 個東西準備好後,我們就可以開始了。

三、操作示範

這個教學是用 SD 1.5 的模型來示範整個流程。

第 1 步:選 SAM 模型及下載模型

按下 Inpaint Anything 頁籤,會看到像這樣的畫面

image-11-1199x800.png.webp

選擇要使用的語義分割模型 Segment Model ID,。我們這裡選 sam_vit_l_0b3195.pth 這一個模型。如果你是剛安裝好的話,這些模型還沒有下載,你要 Download model 鈕,它才會下
載。

image-12.png.webp

第 2 步:取得實例分割圖

上傳圖片到 inpaint anything,然後按下 Run Segment Anything 。

image-13.png.webp

你會在右邊看到實例分割圖

image-14-1300x641.png.webp

第 3 步:做出初步的遮罩(mask)

如果等下我們要用重繪功能,就要把想要重繪的區域做出遮罩。那現在有語義分隔後的色塊,要如何快速的做出遮罩呢?

很簡單,只要拿滑鼠在想要做遮罩的色塊上點一下就好,不必塗整個色塊,只要有點到那個色塊等一下就會變成遮罩。

因為我們希望是背景、假人等等要重繪,所以這些地方要選起來,但是但背景有些複雜,做起
來太麻煩,所以我們可以改將點選衣服上的色塊,然後將 Invert Mask 打勾就好。

image-15

都點選好以後,按下 Create Mask ,你就會看到遮罩結果。

image-16.png.webp

第 4 步: 查看遮罩(mask)結果

檢查遮罩結果,看看有沒有漏掉的,其實畫面如果比較複雜,這樣很難看清楚,這裡有個訣竅,把旁邊的 Mask Only 頁籤開出來。

image-17.png.webp

上面有兩個按鈕:

  1. Get mask as alpha of image
  2. Get mask

這兩鈕按下去以後,你就可以看到遮罩有沒有做好。

image-18.png.webp

注意,這邊的白色,才是遮罩,是未來要 AI 填充的地方,黑色是要保留的部分,不要弄錯了。

第 5 步: 微調遮罩

從這個遮罩圖可以發現,除了衣服以外,還有其它地方還沒有被遮罩到(也就是有不該出現的
黑色線條)。

image-19-555x800.png.webp

這時就手工微調一下。

回到產生遮罩的圖,在上面把要加遮罩的地方塗上。如果有要增加黑色的地方,就手動畫一下,然後按 Trim mask by skatch 鈕,反之,要增加白色的方法,手動畫一下,按 Add mask by skatch 鈕。

如果覺得圖太小不好塗抹,可以用按 S 將圖放大,再按一次 S 即可還原。

image-20-570x800.png.webp

加黑色:Trim mask by skatch 鈕
加白色:Add mask by skatch 鈕

image-21.png.webp

塗好以後,按下 Add mask by sketch。

接著再到 Mask Only 頁籤裡按下 Get mask 及 Get mask as alpha of image ,是不是我們想要
的遮罩。

image-22.png.webp

如果還有其它雜點,就用同樣的方式修掉;如果沒問題,我們就進下一步。

第 6 步:開始在 inpaint anything 裡重繪

當我們的遮罩都做好以後,我們就可以開始請 stable diffusion 幫我們填充背景。

到 inpaint 頁籤,填上提詞和反向提詞。因為我想要生成出來的畫面是:美麗的女人穿著婚紗,手拿著白色玫瑰。所以輸入以下的提詞:

A beautiful woman wearing a white wedding dress while holding a bouquet of white roses. 
Dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2,
Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare

反向提詞如下:

Nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres

image-23

選擇一個 inpaint 模型,這幾個模型是 inpaint anything 他預設的。

image-24

因為我們要做真實的照片,所以使用 Uminosachi/realisticVisionV51_v51VAE-inpainting 這個
模型。

按下 Run Inpainting 後,你就會拿到真人模特兒的圖

image-25-555x800.png.webp

看來不錯,我們來多生幾張。

image-26-555x800.png.webp

image-27-555x800-2

拿到圖以後,你以為這次的教學就結束了嗎?

還沒有!因為真的要用的話,還有些問題

  1. 沒有辦法一次出很多張圖讓我們挑
  2. 沒有辦法使用我們想要的模型

那怎麼辦呢?所以我們需要下一步。

第 7 步: 使用圖生圖的重繪功能

回到 Mask Only 頁籤,按下”Send to img 2 img inpaint”。

image-29.png.webp

當您送出遮照後,會跳到圖生圖的 Inpaint Upload 頁籤。你會看到你的圖片和遮罩都被傳過來了

image-30.png.webp

這時候熟 SD 的人就會很開心,回到熟悉的地方了,終於可以選自己喜歡的模型了。

那來選一個模型吧!這裡我選 chilloutmix。

再來調圖片尺寸,按下三角板後,系統自動把寬高調成和照片一樣,不必我們再輸入。

image-31.png.webp

現在要來填提詞,現在想要改一下,讓美女在海邊穿著婚紗,她的頭髮被微風輕輕吹起,她手裡拿著一束白玫瑰。所以我們修改提詞如下:

A beautiful woman wearing a white wedding dress adorned with lace, walking along the
beach at sunset. Her hair is gently lifted by the breeze, and she is holding a bouquet of white roses. Dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2,
Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare

反向提詞不變:

Nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres

採樣器用 DPM++ 2 M Karras ,採樣步數設到 40。

其它參數都用預設,如下圖:

image-32

應都準備好了,現在就生成吧!

出現了怪東西!

image-33-555x800.png.webp

為什麼 AI 生成的模特兒,不把衣服換好?衣服像是漂在空中一樣。

難道是 Masked content 要調? 目前預設是 original 。

image-34.png.webp

那調成別的看看,先調成 fill

image-35-555x800.png.webp

結果還是沒穿好。那調成 latent noise 看看。

image-36-555x800.png.webp

畫面還更怪了。那難道是要用 latent nothing ?

image-37-555x800.png.webp

一樣沒穿好!這到底怎麼回事?為什麼衣服總是不穿好?

所以在這邊,我們就可以得到一個結論… 它壞了 ….

先別這麼快下結論,這其實是我們選錯模型。

第 8 步: 選擇 epiCPhotoGasm Inpainting 模型重繪

剛剛衣服總是不穿好的原因很簡單,我們現在在做的事是重繪,不是純粹的生成,所以我們要用專門用來做重繪的模型。

ChilloutMix 並不是用來重繪的模型,所以我們現在要改用之前下載好的 epiCPhotoGasm_zinpainting
模型。

image-38.png.webp

換了模型,我們就開始生成吧,這下應該沒問題了吧!

我們來看看結果:

image-39-555x800.png.webp

我們得到了一個穿上衣服的…漂亮的人台。

這又是怎麼回事?剛剛衣服沒穿好,現在人不見了,說好的美女呢?難道是運氣不好,再生成一次看看。

image-40-555x800.png.webp

結果,美女是出現了,但他胸口的黑布是怎麼回事?我們並沒有要這塊布呀!

這原因是因為目前 mask content 的參數是 original ,它在重繪時會參照原圖上的結構和顏色進行重繪,所以才會出現人台及黑布,因為這些在原圖上都有。那我們要怎麼解決這問題?

簡單,換別的參數就好了,例如,我們改用 fill ,會得到像下面這樣的圖。

image-41-555x800.png.webp

image-42-555x800.png.webp

image-43-555x800.png.webp

image-44-555x800.png.webp

如果是用 latent noise ,會是像下面的結果

image-48-555x800.png.webp

image-46-555x800.png.webp

image-47-555x800.png.webp

若是用 latent nothing ,則會出現

image-50-555x800.png.webp

image-51-555x800-1

image-52-555x800.png.webp

這樣的畫面是不是很不錯了?都還沒有精細的微調就可以有這樣子的品質,再優化的話就會更好,那接下來要怎麼優化呢?

四、常見問題

這樣一操作下來,大家可能有些問題,一一為大家說明。

問題 1 :什麼是實例分割?

實例分割指的是指將圖片上的東西進行區分,將不同的東西用不同的顏色標示出來,每一種顏色代表一個東西。

這次就是用實例分割,加速我們製作遮罩的時間。

問題 2 :Inpaint Anything 有不同的 Segment Anything Model ,有什麼區別?

Segment Anything Model ,也叫 SAM ,在 Inpaint Anything 提供了 9 種,

image-53.png.webp

可以分成4類,我們一一說明。

第 1 類:sam_vit 開頭的 – Meta 提供的 SAM 模型

sam_vit 開頭的,是 meta 提供的模型。因為 Meta 把他們的語義分割模型命名為 Segment Anything Model ,我們目前所稱的 SAM 算是從這裡開始算起,應算是這一波 SAM 模型的始祖。

這是一系列的模型是 Meta 在 2023 年 4 月公佈的,其它的 SAM 模型都會拿來和這系列做比較。共有 3 種模型,以大小分別為,h (huge), l (large), b (base),huge > large > base ,精準度理論上也是和大小成正比,計算速度也是。

從效果上看, huge 和 large 的差別不大,但和 base 就有明顯差別。

Meta SAM 參考資料:

  1. https://segment-anything.com/
  2. https://github.com/facebookresearch/segment-anything
  3. https://huggingface.co/facebook/sam-vit-base/tree/main
  4. https://huggingface.co/facebook/sam-vit-large
  5. https://huggingface.co/facebook/sam-vit-huge

第 2 類: sam_hq_vit 開頭的 – Segment Anything in High Quality 系列

若是 sam_hq_vit 開頭模型就是蘇黎世聯邦理工學院視覺智慧與系統小組 (Visual Intelligence and Systems Group at ETH Zürich) 提供的高品質語義分割模型。根據根據他們的論文提供的數據,他們的切割準度比 Meta 還來得好,所以稱為high quality。雖然他們分割出來的區域是比 Meta 還來得細,但在我們的例子裡面分別不大。

SAM HQ 參考資料:

  1. https://github.com/SysCV/sam-hq
  2. https://huggingface.co/lkeab/hq-sam/tree/main

第 3 類:FastSAM 開頭的 – FastSAM 系列

如果要效果不錯,又省些記憶體,可以用 FastSAM 系列,它是由 CASIA-IVA 實驗室 (CASIA-IVA-Lab) 提供的。我自己在小 VRAM 的機器上會用這個模型。

它的有 2 種型號,X 和 S。

X 這個型號在我們這次婚紗的例子,效果還可以,但 S 就不適合我們的例子。

FastSAM 資料如下:

  1. https://github.com/CASIA-IVA-Lab/FastSAM
  2. https://huggingface.co/An-619/FastSAM

第 4 類:Mobile SAM

又小又快的 SAM ,用 CPU 也可以跑得很快的 SAM 。但,效果也是最差的一個,只適合分辨大區塊的東西。

image-62.png.webp
Mobile SAM

Mobile SAM 參考資料:

  1. https://github.com/ChaoningZhang/MobileSAM
  2. https://huggingface.co/dhkim2810/MobileSAM/tree/main

問題 3 : Inpaint 的 Masked content 參數控制了什麼?

image-63.png.webp

Masked content 的選項有4個,說明如下:

選項 1 :Fill

fill 選項會將重繪區域的圖像最大程度地模糊化,僅保留大致的結構和色彩。因此,在需要大規模重繪會使用它。

在我們的範例中,海平面的位置、沙難的走向,都是一致的,連夕陽的顏色也都差不多。

masked_content_fill-1300x731-1

選項 2 : Original

Original 會參考原圖,生成出的圖,區塊、顏色等等會和原圖很像。

在我們的範例中,這選項會留人台黑色的部份,並且沙灘的走向也會保留。

masked_content_original-1300x731.png.webp

選項 3 : Latent noise

Latent noise 把要重繪的部份給雜訊,容易產生不相關內容,適用於需要創意的地方。

在我們這次的示範中你會發現,用 latent noise 生成的圖,若 prompt 裡有提到小東西(如我們的是白玫瑰),則會重覆出現這小東西。

masked_content_latent_noise-1300x731.png.webp

選項 4 : Latent nothing

Latent nothing 會參考要重繪的區域附近的顏色,找出附近顏色的平均值,再填回重繪區。這種方式非常適用於移除不需要的物件。

但在我們這次的範例中,因為我們是大範圍的重繪,所以感覺不出有移除東西。但你觀察用 latent nothing 生成的圖,你會發現他們的配色和構圖會很像,例如沙的顏色也都很像。

masked_content_latent_nothing-1300x731.png.webp

五、回顧延伸問題

我們回顧一下剛剛做了什麼?

簡單說,就是 2 大步驟:

  1. 用 Inpaint Anything 的語義分割功能做遮罩。
  2. 再傳送到圖生圖用 inpaint upload 以及 inpaint 專用模型重繪。

光是這樣,就可以做出來像今天一樣的成果了。

image-2-555x800.png.webp-1

image-1-555x800.png.webp

image-3-555x800.png.webp-1

image-48-555x800.png.webp

凡事都還可以更好,如果用目前這種方式,仍然還會有幾個問題:

  1. 我要的模型沒有 inpaint 模型怎麼辦?可以用一般模型嗎?
  2. 要怎麼改變衣服上的光影?
  3. 有時會有P圖的感覺,要如何才會更自然?
  4. 如何生成更豐富的圖片,不是現在做出來的這幾個樣子。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注