การ Upscale คือการเพิ่มขนาดรูปภาพให้ใหญ่ขึ้น พร้อมทั้งคงความคมชัดระดับ Pixel ได้ดี โดยใช้ AI เข้ามาช่วย ทำให้ภาพที่ขยายใหญ่ขึ้นยังมีรายละเอียดที่ดูสมจริง ไม่แตกหรือเบลอจนเกินไป ซึ่งมีหลายเทคนิคและโมเดลให้เลือกใช้งาน
ในบทความนี้เราจะมาดูหลากหลายวิธีที่จะ Upscale ใน ComfyUI กันครับ
สารบัญ
ทำไมต้อง Upscale?
ปัญหาเวลา Generate ภาพขนาดเล็กประมาณ 512×768 คือรายละเอียดในภาพอาจไม่ค่อยชัด โดยเฉพาะในส่วนใบหน้ากรณีที่เป็นภาพระยะไหล (เรียกว่าหน้าเละ หน้าพัง 55) เนื่องจากพื้นที่ Pixel น้อยเกินไป (แต่ถ้าเป็นภาพ Portrait ปกติ Gen แค่ 512 ก็หน้าสวยได้แล้ว)
ถ้าเราอยากจะทำให้ภาพมันสวยขึ้น หน้าดีขึ้น เราจะต้อง Gen ให้ใหญ่กว่านี้ เช่น 1024 ขึ้นไป ถึงจะเห็นหน้าชัดได้
ปัญหาของการ Gen ภาพใหญ่แต่แรก
แต่กับ Model SD1.5 ทั่วไป จะไป Gen ที่ 1024 x 1536 เลย มันก็จะไปไม่รอด คือ ภาพจะมีโอกาสเพี้ยนสูง เช่น รูปแขนอาจผิดรูปผิดร่างไปมันจะมั่วไปหมด (แต่ก็แปลกดี) บางทีก็แขนขางอก 555
เพราะ Model SD1.5 ไม่ได้ถูก Train มาให้ Gen ภาพขนาดใหญ่ (มันเทรนแค่ 512×512 หรือ 768×768 เอง)
Gen ภาพใหญ่แต่แรก ด้วย SDXL
ทางแก้อย่างหนึ่งคือใช้โมเดล SDXL ที่ถูกพัฒนามาให้รองรับการ Generate ภาพขนาดใหญ่ได้ดีขึ้น เช่น ถ้าผมใช้ Realistic Vision แบบ SDXL โดยใช้งานแทนโมเดล Stable Diffusion 1.5 ปกติ ในส่วนของการ Load Checkpoint ถาพที่ได้จะไม่พัง แม้จะ Gen ที่ขนาด ที่ 1024 x 1536 ก็ตาม (จริงๆ มันชอบขนาดประมาณ 1024)
กลับมาที่ SD1.5
ในบทความนี้เราจะมาพูดถึงการ Upscale ซึ่งสามารถเอาไปใช้ Up จากรูปเดิมที่มีขนาดเล็กได้ โดยไม่ต้อง Gen จาก SDXL เสมอไป แล้วเราจะพิสูจน์ว่าภาพของ SD1.5 ที่หน้าพังก็เอาไป Upscale แก้ได้
Upscale แบบทื่อๆ จะไม่ Work
การ Upscale ภาพเล็กๆ เฉยๆ ด้วยโหนด Upscale Latent หรือ Upscale Image จะได้ภาพใหญ่ที่เบลอแตกไม่สวยงาม คล้ายกับการ Resize ภาพปกติ ซึ่งไม่ Work เช่น
ถ้าเรา Upscale Latent แล้วค่อย Decode ออกมาเป็นภาพปกติ ภาพที่ได้จะเน่ามากๆ คือถ้าทำแบบนี้จริงๆ ต้องเอาไปเข้า KSampler ต่อเพื่อ Denoise อีก แต่ภาพจะเพี้ยนนะ
ถ้าใช้ Upscale Image By เฉยๆ จะเหมือนการปรับ Image Size ใน Photoshop เป็น 2 เท่า ภาพก็จะแตกๆ นิดหน่อยอยู่ดี
ทีนี้ต้องทำไงถึงจะ Upscale แล้วไม่เน่า? มาดูกันครับ
วิธีที่ 1 : ใช้ NN Latent Upscale
เป็นการใช้ Custom Node ชื่อ ComfyUI Neural Network Latent Upscale ที่ถูกพัฒนาขึ้นเพื่อ Upscale Latent ให้ภาพใหญ่ขึ้นได้ชัดขึ้น แต่ผลลัพธ์ยังไม่ค่อยดีนัก ควรนำภาพไป Denoise ต่อด้วย KSampler จะช่วยให้ภาพสวยคมขึ้นได้
วิธีนี้ต้องไปโหลด Custom Node อันนี้เพิ่ม ComfyUI Neural Network Latent Upscale (https://github.com/Ttl/ComfyUi_NNLatentUpscale) ซึ่งจะมีความสามารถในการ Upscale Latent ได้แบบไม่เน่า เช่น
อย่างไรก็ตาม ถ้าจะใช้อันนี้ตอนแรกภาพก็จะดีขึ้น แต่ยังไม่ค่อย ok
ผมแนะนำว่าก็ควรเอาเข้า KSampler ไป Denoise อีกรอบ ก็จะดีขึ้น เช่น
ผลที่ได้ก็จะสวยงามขึ้นเยอะ และความหมายไม่เพี้ยนด้วย แต่วิธีนี้อาจจะเปลืองพลังการ์ดจอหน่อย เพราะว่ามันคือ Gen ใหม่ทั้งรูปที่ใหญ่ขึ้น (แต่ Denoise ไม่เยอะ จะไม่เปลืองพลังมาก)
รูปนี้ denoise 0.5 จะดีกว่า
วิธีที่ 2 : ใช้ Upscale Image using Model
วิธีนี้เราจะใช้ Node Upscale Image using Model นะครับ
ซึ่งวิธีนี้เราจะต้องไปโหลด Upscale Model เพิ่มเติม อาจเอาจาก
- https://openmodeldb.info/ หรือ
- https://huggingface.co/uwg/upscaler/ หรือ
- กดหาใน Comfy UI Manager -> Install Model ก็ได้นะ แล้ว search ว่า Upscale
โดยที่ผมแนะนำ Model เหล่านี้ (ในบทความนี้ผมใช้แค่ 4x-Ultrasharp)
- 4x-Ultrasharp : https://huggingface.co/Kim2091/UltraSharp/
- 4x_NMKD-Siax_200k : https://huggingface.co/gemasai/4x_NMKD-Siax_200k
- 8x_NMKD-Superscale_150000_G : https://huggingface.co/uwg/upscaler/tree/main/ESRGAN
- RealESRGAN x4 : https://huggingface.co/ai-forever/Real-ESRGAN
จากนั้นเราเรียกใช้ Node Upscale Image using Model มาใช้คู่กับ Node Load Upscale Model
ถ้าผมใช้ 4x_NMKD-Siax_200k (เป็น Model 4 เท่า) แล้วอยากจะ Upscale แค่ 2 เท่า ผมต้องสั่งให้มัน Resize ให้เล็กลง 50% ด้วย ไม่งั้นมันจะกลายเป็นใหญ่ 4 เท่าไปเลย
อันนี้ใช้ 4X-Ultrasharp
ถ้าคุณไปลองเปลี่ยน Model ดู จะพบว่าไม่ว่าจะ Upscale ด้วย Model แบบไหน ก็ไม่ช่วยให้หน้าเละให้กลับมาปกติได้ เราจะต้องใช้วิธีอื่น
ผมแนะนำว่า ถ้าภาพต้นฉบับเละ ก็ควรเอาเข้า KSampler ไป Denoise อีกรอบ ก็จะดีขึ้น คล้ายๆ กับวิธีก่อนหน้า แต่จะยุ่งกว่าเพราะต้อง VAE Encode อีกรอบก่อน ดังนั้นผมว่าไม่เหมาะแล้ว
ปกติแล้วการ Upscale วิธีนี้จะจะเหมาะกับภาพที่ปกติมันสวยอยู่แล้ว แต่แค่อยากทำให้ภาพมันใหญ่ขึ้นแต่ยังชัดนั่นเอง และข้อดีของมันคือทำได้ค่อนข้างเร็วเลย
วิธีที่ 3 : ใช้ Ultimate SD Upscale
วิธีถัดไป คือ วิธีที่น่าจะเป็นที่นิยมมากที่สุดเลย นั่นคือการใช้ Ultimate SD Upscale ซึ่งมีวิธีต่อ Node ประมาณนี้ ซึ่งผมก็ยังใช้ 4x Ultrasharp เป็น Upscale Model นะ
AI มันจะทำการ Generate ภาพใหม่เป็นกล่องๆ (Tile) ขนาดเท่ากับ tile width, height ที่เรากำหนด แล้วมีการ Denoise ด้วย มันเลยสามารถแก้รูปที่หน้าพังแล้วให้กลับมาเป็นปกติได้
โดยที่ส่วน Positive, Negative Condition เราก็มักจะเอามาจาก Prompt เดิมนั่นแหละ ง่ายดี (แต่ใครอยากจะทำ Prompt ใหม่แยกกันก็ได้)
ผลลัพธ์ที่ได้ หน้าจะไม่เละแล้ว ^^ (ผมลอง denoise 0.3-0.4)
วิธีที่ 4 : ใช้ Iterative Upscale
วิธีนี้เป็นการ Upscale ทีละนิดๆ หลายๆ รอบ ซึ่งเราจะต่อ Node แบบนี้
ตรง Iterative Upscale จะมีให้เลือก 2 ตัวคือ Image กับ Latent ซึ่งเท่าที่ทดลองมา แบบ Image
วิธีนี้ก็ได้ผลค่อนข้างดีเลย แต่เปลืองพลัง และ Gen นานมากพอสมควร เพราะมันต้อง Gen หลายรอบมากๆ
ตัวเปรียบเทียบภาพ
หากต้องการเปรียบเทียบภาพ 2 ภาพเราสามารถใช้ rgthree’s ComfyUI Nodes (https://github.com/rgthree/rgthree-comfy) เพื่อใช้ Node ตัวเปรียบเทียบภาพแต่ละแบบได้ชัดๆ
โดยที่รูป a จะอยู่ฝั่งขวาของ Slider, รูป b จะอยู่ฝั่งซ้าย
ในที่นี้ A คือ Ultimate SD Upscale, B คือ Iterative Upscale
เราอาจใช้เทียบ Before, After ก็ได้
หรือจะเทียบระหว่างวิธีแต่ละแบบก็ได้
ส่วนตัวผมว่า NN Latent กับ Iterative Upscale ให้ผลที่ดูดีกว่า Ultimate SD Upscale นะครับ ซึ่งจริงๆ Upscale แต่ละแบบสามารถทำได้ดีกว่านี้ถ้ามี ControlNet มาช่วยควบคุมภาพด้วย ซึ่งจะทำให้โอกาสภาพเพี้ยนน้อยลง ซึ่งเราจะเรียนในตอนถัดไป
เลือกใช้แต่ละเทคนิคให้เหมาะกับเป้าหมายและทรัพยากรที่มี ลองฝึกทำบ่อยๆ จะช่วยให้ปรับแต่งภาพให้สวยงามได้ตามที่ใจต้องการครับ
คลิปสอน
ตอนต่อไป
ในตอนต่อไปเราจะมาเรียนรู้การใช้ ControlNet เพื่อควบคุมภาพกันครับ เช่น กำหนดท่าทาง กำหนดภาพรวมด้วยความลึก ด้วยสี และอื่นๆ อีกมากมาย