Machine Learning

การปรับปรุงภาพ Generative Art จาก AI ด้วยอัลกอริทึม GFP-GAN

การ Generate กราฟิกจาก AI เป็นที่นิยมแต่ความสมบูรณ์ของมันยังมีข้อปรับปรุง บทเรียนนี้เป็นการนำ GFP-GAN มาปรับปรุงภาพกราฟิก

ในบทเรียนนี้เป็นการนำการนำอัลกอริทึมที่ชื่อว่า GFP-GAN (Generative Facial Prior-Generative Adversarial Network) ซึ่งสายงานวิจัยนั้นจะทราบว่ากลุ่มนักพัฒนาจาก Tencent นั้นเป็นผู้สร้างอัลกอริทึมการทำงานหลักของมันขึ้น โดยมีวัตถุประสงค์แรกคือ ระบบจะทำงานประมวลผลรูปภาพกราฟิกแบบอัตโนมัติโดยใช้ AI เข้ามาทำงานวิเคราะห์รูปภาพและทำเสริมภาพส่วนที่ขาดให้ไปให้สมบูรณ์ ที่เรียกกระบวนการนี้ว่า Restoration จาก Dataset จำนวนมหาศาล ทำให้รูปถ่ายที่เก่า ที่เสียหายนั้น กลับมาเหมือนใหม่

วิจัย: [2101.04061] Towards Real-World Blind Face Restoration with Generative Facial Prior (arxiv.org)

ซึ่งในตอนนี้ GFP-GAN เองอาจจะไม่ได้แค่นำคุณสมบัติของการซ่อมแซมรูปภาพมาใช้ได้อย่างเดียว การนำ AI มาซ่อมแซมหรือเติมเต็มภาพที่ถูก Generate ด้วย AI อีกทีก็เป็นแนวทางที่น่าสนใจ อย่างบางครั้งเราอาจจะใช้ Nueral Style Transfer ของ TensorFlow จาก Google มา Re-Run Pattern ไปบ้างนั้น รอบนี้อาจจะต้องมีการซ่อมแซม ตำแหน่งดวงตาและใบหน้าของคนที่ปรากฏในภาพได้ง่ายขึ้น อย่างใน Photoshop เองก็มีระบบ AI อย่าง Neural Filter ให้ใช้ง่ายๆ ก็แล้วแต่ว่าจะใช้แบบไหนนะครับ ยังไงบทเรียนนี้ลองมาใช้ Colab ของ Google มาทดสอบเขียน AI ใช้เองเป็นกรณีศึกษาดูก่อนดีกว่า

ตัวอย่างของภาพเป็นภาพที่ผม Generate มาจากบริการของ Midjourney เว็บไซต์ https://www.midjourney.com/home/

prompt /imageine: full body portrait of nice woman in a photograph white studio, a Mix of Mai Davika and Baifern Pimchanok, Beautiful woman with dynamic pose, reveal the chest, perfect body, making body movements to play with her hair, realistic, professionally color graded, wearing small trasparent bra and tight-fitting shows navel and small slip , Detailed body, Cinematic lighting, Volumetric lighting, dynamic composition, Photorealism, finely detailed face, finely detailed flowing hair, finely detailed blue eye, with pretty and expressive eyes, strong expressiveness, hyperrealism, round sharp catch light, cinematic lighting, intricate details, extremely detailed, very high details, photorealistic, work hasselblad ventral sight nsanely detailed, intricate, elegant, sony a 7 r –testp –upbeta

หากคลิกดูที่ภาพจะเห็นว่าในส่วนของใบหน้าที่ Generate ดวงตา และปากนั้นค่อนข้างจะมีความเสียหาย และดูผิดปกติซึ่งเราจะมาทำการซ่อมแซมส่วนนี้กันด้วย กระบวนการ Restoration ผ่าน GFP-GAN

ก่อนอื่นเปิดใช้งาน https://colab.research.google.com/ สร้าง Jupyter Notebook หรือ Notebook ของ Google ขึ้นมาก่อน

ทำการ New notebook ขึ้นมาใหม่เลยครับ แล้วให้เปลี่ยน  Runtime โดยคลิกที่ Runtime-> change runtime type

เปลี่ยนการประมวลผลเป็น GPU เป็นหลัก

ทำการเริ่มต้นโดยการโคลน Github ส่วนของ Library ของ GFPGAN จาก https://github.com/TencentARC/GFPGAN.git

%cd /content
!rm -rf GFPGAN
!git clone https://github.com/TencentARC/GFPGAN.git
%cd GFPGAN

ทำการ Run คำสั่งจนกว่าจะประมวลผลบน Notebook สำเร็จใช้เวลาประมาณหนึ่ง

ทำการเลือกใช้เครื่องมือช่วยเหลือที่เป็น Library ของ Python อย่าง BasicSR (Basic Super Restoration) เป็น Opensource Toolbox เครื่องมือที่ลดงานสำหรับกระบวนการการคืนค่ารูปภาพและวิดีโอแบบผ่าน Machine Learning อย่าง PyTorch (คู่แข่งสูสีกับ TensorFlow ของ Google, ส่วนตัวนะ) ซึ่งเราจะใช้ BasicSR ในการปรับคืนค่าคุณสมบัติของภาพหรือสื่อมีเดียเดิม เช่นความละเอียดสูงสุด, การทำ denoise หรือจุดแสง, การเบลอภาพ, การลบวัตถุ หรือลบส่วนที่ไม่สำคัญในภาพ JPEG, PNG (ข้อมูล: https://github.com/XPixelGroup/BasicSR)

อีกตัวคือ Library ของ facexlib ซึ่งเป็น OpenSource ของอัลกอริทึมในการทำงานเจาะจงส่วนของใบหน้า ซึ่งเป็นส่วนหนึ่งของการใช้ PyTorch เป็นหลักในการ Train Model เจาะจงส่วนใบหน้าเพื่อปรับแต่งใบหน้าเดิม ที่ไม่ชัด เสียหาย ให้เป็นเขียนทับด้วยข้อมูลของใบหน้าชุดใหม่ที่ถูก Train เข้าไป (ข้อมูล: https://github.com/xinntao/facexlib)

แน่นอนว่ากระบวนการหลักของเรานั้นคือการปรับปรุงใบหน้า Restoration จำเป็นต้องหาอัลกอริทึมที่น่าสนใจหน่อยนั่นคือ Real-ESRGAN ซึ่งเป็นงานวิจัยเจาะจงในการ Restoration ไฟล์มีเดียทั้งภาพกราฟิก และวีดีโอ (ข้อมูล: https://github.com/xinntao/Real-ESRGAN)

การติดตั้งทิ้ง 3 Library นี้ก็จะใช้คำสั่ง:

!pip install basicsr
!pip install facexlib
!pip install -r requirements.txt
!python setup.py develop
!pip install realesrgan

จะใช้เวลาติดตั้งพักใหญ่ๆ ในการลงเครื่องมือตัวช่วยให้ทำการรอจนกว่า Notebook ของเราจะประมวลผลสำเร็จ

ดาวน์โหลดตัว Pre-Train Model ที่ทาง TencentARC ได้ Provide ให้เราไว้ใช้ฝึก ในบทเรียนนี้เราจะใช้ version ตัว 1.3 สำหรับการนำมาใช้ทดสอบตัวอย่างในบทความ

!wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P experiments/pretrained_models

ใช้เวลาในการฝึก Pre-Training Model ประมาณหนึ่ง

ทำการเขียน Python บน Google Colab สำหรับสร้าง Folder เพื่อให้เราอัพโหลดไฟล์ภาพที่เราสร้างจาก AI หรือภาพที่เราจะซ่อมแซมขึ้นไปบนระบบซึ่งก็จะเชื่อมกับ Google Drive ของเรา ทำการสร้างโฟลเดอร์ inputs/upload

import os
from google.colab import files
import shutil

upload_folder = 'inputs/upload'

if os.path.isdir(upload_folder):
    shutil.rmtree(upload_folder)
os.mkdir(upload_folder)

เพิ่มขั้นตอนในการสร้าง form สำหรับ Upload รูปภาพจากเครื่องคอมพิวเตอร์ของเราขึ้นไปบนระบบของ Notebook

uploaded = files.upload()
for filename in uploaded.keys():
  dst_path = os.path.join(upload_folder, filename)
  print(f'move {filename} to {dst_path}')
  shutil.move(filename, dst_path)

เมื่อทำการ Run ส่วนของ Colab Code จะมี Form Uplaod ปรากฏขึ้นมาให้เราอัพโหลดไฟล์จากเครื่องคอมพิวเตอร์ของเราไปเก็บใน inputs/upload บน Notebook ที่เราสร้างขึ้น

ทำการอัพโหลดรูปภาพจากเครื่องคอมพิวเตอร์ของเราขึ้นไปให้เรียบร้อย รอจนกว่าระบบจะแจ้งว่าอัพโหลดเสร็จสิ้น

กระบวนการต่อไปเราจะใช้ GFPGAN เข้ามา Restore กราฟิกคุณภาพต่ำ (Low Quality) ของภาพที่เราอัพโหลดขึ้นไป ปรับภาพพื้นหลังโดยไม่นำส่วนใบหน้ามาประมวลผล ตัดใบหน้าออกด้วย Real-ESRGAN การประมวลผลจะใช้เวลา Distract ส่วนของใบหน้าเป็น Grid ออกมาเก็บไว้เป็นอีกไฟล์รูปภาพหนึ่งแยกต่างหาก

!rm -rf results
!python inference_gfpgan.py -i inputs/upload -o results -v 1.3 -s 2 --bg_upsampler realesrgan
!ls results/cmp

ทำการ Crop เฉพาะส่วนของใบหน้าในรูปภาพ แล้วมาเปรียบเทียบ Model ที่มาจาก Pre-Train แล้วซ่อมแซมเฉพาะส่วนที่เรา Crop ออกมาผ่าน GFPGAN

import cv2
import matplotlib.pyplot as plt
def display(img1, img2):
  fig = plt.figure(figsize=(25, 10))
  ax1 = fig.add_subplot(1, 2, 1) 
  plt.title('Input image', fontsize=16)
  ax1.axis('off')
  ax2 = fig.add_subplot(1, 2, 2)
  plt.title('GFPGAN output', fontsize=16)
  ax2.axis('off')
  ax1.imshow(img1)
  ax2.imshow(img2)
def imread(img_path):
  img = cv2.imread(img_path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  return img

ทำการสร้าง Folder ชื่อ result ขึ้นมาเพื่อเปรียบเทียบผลลัพธ์การฟื้นฟูและปรับปรุงส่วนของใบหน้าผ่าน GFPGAN

import os
import glob

input_folder = 'results/cropped_faces'
result_folder = 'results/restored_faces'
input_data = sorted(glob.glob(os.path.join(input_folder, '*')))
output_data = sorted(glob.glob(os.path.join(result_folder, '*')))
for input_path, output_path in zip(input_data, output_data):
  image_input = imread(input_path)
  image_output = imread(output_path)
  display(image_input, image_output)

เมื่อ Run ส่วนของการสร้างผลลัพธ์ ระบบจะทำการแสดงผลเปรียบเทียบให้เราเห็น

ใบหน้าโอเคแล้ว ก็ถึงเวลาในการปรับปรุงรูปแบบแบบทั้งภาพเต็มตัวผ่าน  GFPGAN หน่อย

import cv2
import matplotlib.pyplot as plt
def display(img1, img2):
  fig = plt.figure(figsize=(25, 10))
  ax1 = fig.add_subplot(1, 2, 1) 
  plt.title('Input image', fontsize=16)
  ax1.axis('off')
  ax2 = fig.add_subplot(1, 2, 2)
  plt.title('GFPGAN output', fontsize=16)
  ax2.axis('off')
  ax1.imshow(img1)
  ax2.imshow(img2)
def imread(img_path):
  img = cv2.imread(img_path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  return img

ทำการแสดงผลเปรียบเทียบภาพใน Folder ที่เราสร้างใน inputs/upload ที่เราอัพโหลดขึ้นไป และผลลัพธ์ที่เราแก้ไขปรับปรุงในโฟลเดอร์ results/restored_imgs

import os
import glob

input_folder = 'inputs/upload'
result_folder = 'results/restored_imgs'
input_list = sorted(glob.glob(os.path.join(input_folder, '*')))
output_list = sorted(glob.glob(os.path.join(result_folder, '*')))
for input_path, output_path in zip(input_list, output_list):
  img_input = imread(input_path)
  img_output = imread(output_path)
  display(img_input, img_output)

บันทึกไฟล์ทั้งหมดจาก Folder ที่เราสร้างไว้รวมเป็นไฟล์ zip ให้เรียบร้อยด้วยคำสั่ง:

!ls results
print('Download Restoration Images')
os.system('zip -r result.zip results')
files.download("result.zip")

กด Run ระบบจะ Pack File ทั้งหมดให้เราเป็น zip ไฟล์ที่ชื่อ result

มาดูภาพผลลัพธ์กันดีกว่า:

จะเห็นว่าหากเรามีการ Generate Art ผ่าน AI ด้วยระบบโปรแกรมใดๆ แล้วมีปัญหาในส่วนของความผิดปกติบนใบหน้าเราสามารถใช้กระบวนการซ่อมแซม ได้แล้วผ่านอัลกอริทึมของ GFPGAN ซึ่งจริงๆ จะเป็น Library ของเครื่องมืออย่าง Neaural Filter ของ Adobe Photoshop เองก็ดีแต่ถ้าหากเราไม่ License ของ Adobe ไม่มีเครื่องมือแต่งภาพ ก็ลองใช้ Colab และชุด code ของ GFPGAN แนวนี้ในการปรับปรุงก็พอใช้ได้อยู่สมควร

สามารถ Copy Notebook จาก Link นี้ได้ครับ: https://colab.research.google.com/drive/1N_S7zDAb1N7KWP7biLRJaLeWh9P7CNWj?usp=sharing

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน