ในบทเรียนนี้เป็นการนำการนำอัลกอริทึมที่ชื่อว่า 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/
หากคลิกดูที่ภาพจะเห็นว่าในส่วนของใบหน้าที่ 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