[Part 1] อัปสเกลรูปภาพด้วย AI ผ่าน OpenCV และ Python

Micky Chanachai
SET-IT-TEAM
Published in
3 min readOct 31, 2023

Introduction

สวัสดีครับทุกคน วันนี้ขอประเดิมบทความแรกใน Medium ด้วย Part 1 ของโปรเจ็คเล็กๆ ตัวนึงที่ผมทำขึ้นเพื่อแก้ปัญหาในชีวิตประจำวันนะครับ เรามาเริ่มกันเลยดีว่า :)

ทุกวันนี้เราใช้ social media กันจนคนคุ้นเคยเป็นอย่างดี เราน่าจะพอทราบกันว่า social media แทบทุกตัวเลยจะมีพฤติกรรมหลายๆ อย่างที่เหมือนกัน หนึ่งในนั้นก็คือการจำกัดขนาดรูปภาพที่เราอัปโหลดลงแต่ละ platform ครับ

ยกตัวอย่างสถานะการที่ทุกคนน่าจะเคยเจอกันก็คือเราเล่น social media แล้ว เจอรูปที่สวยมากๆ อยากเซฟเก็บมาทำ wallpaper แต่พอเซฟมาแล้วพบว่าภาพแตกละเอียด เอาไปใช้อะไรไม่ได้เลยเป็นต้นครับ ปัญหานี้ยิ่งเป็นหนักขึ้นเมื่อนำภาพดังกล่าวไปตั้งเป็น wallpaper ของมือถือในยุคปัจจุบันที่มาพร้อมกับจอขนาดใหญ่ความละเอียดสูง

และเนื่องจากปัญหานี้เป็นสิ่งที่แทบทุกคนเคยเจอกันมากับตัว จึงมีคนพยายามจะแก้ปัญหาด้วยวิธีต่างๆ กันมาเป็นเวลานานแล้ว ด้วยเทคนิคการอัปสเกลภาพ อาทิเช่น Nearest-neighbor interpolation, Bilinear algorithms, lanczos resampling และในปัจจุบัน trend ทางด้าน AI ที่มาแรงจึงทำให้มีคนพัฒนาเทคนิคในการอัปสเกลภาพโดยใช้ machine learning ขึ้น และมีคนนำเทคนิคนี้มาสร้างเป็น application สำหรับอัปสเกลภาพง่ายๆ ในมือถือ เช่น แอพ Remini เป็นต้น

Remini แอพที่ใช้ AI ในการอัปสเกลรูปภาพ

จากที่ใช้งาน Remini มาหลายปี ตัวแอพก็มีการพัฒนาขึ้นเรื่อย จนถึงทุกวันนี้ผลลัพธ์ภาพที่ได้ถือว่าดีเลยครับ แต่ในเวอร์ชั่นหลังๆ การอัพสเกลรูปภาพถูกปรับให้เป็นฟิเจอร์ที่ต้องเสียตังก่อน และโมเดลการจ่ายเงินของแอพเป็นแบบ subscription ซะด้วย ก็เลยเริ่มรู้สึกว่าไม่คุ้มซะแล้ว กลายเป็นที่มาของการมาลองศึกษาค้นคว้าลองทำ Tool แนวๆ นี้ใช้เองดูครับ

ผมมองย้อนกลับไปตอนทำ thesis ปริญญาโท ซึ่งหัวข้อที่ผมทำจะเกี่ยวกับการคิดค้นเทคนิค data augmentation แบบใหม่ที่จะช่วยเพิ่มความแม่นยำให้กับ AI รู้จำรูปภาพต่างๆ ครับ ในช่วงนั้นเรียกได้ว่าได้จับ python, opencv, tensorflow กันเป็นหลัก ผมเลยเริ่มค้นหาจากจุดนี้แหละว่าตัว opencv มีเทคนิคอะไรที่หยิบมาใช้ได้บ้าง และแล้วผมก็ไปเจอสิ่งที่ตามหา…

Super Resolution in OpenCV

OpenCV เป็น lib ที่รวบรวมเครื่องมือทางด้าน computer vision ไว้มากมายและที่สำคัญก็คือเป็น open-source นะครับ ในเวอร์ชั่นตั้งแต่ 4.4.0 เป็นต้นมาได้มีการเพิ่มเครื่องมือในการอัพสเกลรูปภาพที่ใช้เทคนิค machine learning เข้ามาครับ โดยจะมี pre-trained อยู่หลายโมเดลที่เราสามารถดาวน์โหลดมาใช้อัพสเกลภาพได้ง่ายๆ ครับผม

ณ ตอนที่เขียนบทความนี้ฟังก์ชั่นอัปสเกลที่ว่าทำงานได้ในภาษา C++ และ Python เท่านั้น และในส่วนของบทความนี้ผมจะยกตัวอย่างแค่เฉพาะ python เป็นหลักนะครับ (ถ้าสนใจโค้ดที่เป็น c++ ผมจะแนบ link ตัวอย่างไว้ใต้บทความครับ)

เรามาเริ่มลงมืออัปสเกลกันเลยดีกว่า ผมจะแบ่ง step ออกเป็นสามขั้นตอนหลักๆ นะตามนี้นะครับ

  1. ติดตั้ง OpenCV และโมดูลที่จำเป็น
  2. ดาวน์โหลด Pre-trained โมเดล
  3. อัปสเกลรูปภาพ

1. ติดตั้ง OpenCV และโมดูลที่จำเป็น

ถ้าไม่เคยติดตั้ง opencv มาก่อนเลย ให้ติดตั้งด้วยคำสั่งนี้ครับ

pip install opencv-contrib-python

ส่วนถ้าใครมี opencv อยู่ก่อนแล้วและเป็นเวอร์ชั่นเก่า (เก่ากว่า 4.4.0) ให้อัพเกรดด้วยคำสั่งนี้ครับ

pip install opencv-contrib-python — upgrade

จุดนี้อยากจะให้สังเกตุว่า opencv ที่เราจะใช้งานนี้ต้องมาพร้อมกับ contrib modules นะครับ (สังเกตุได้จากคำสั่งตอนติดตั้ง) เพราะฟังชั่นการทำอัพสเกลรูปภาพอยู่ในโมดูลนี้นะครับ

2.ดาวน์โหลด Pre-trained โมเดล

อันดับต่อไปเราจะเป็นการโหลดโมเดลที่เทรนไว้แล้วมาใช้งานครับ เหตุผลหลักๆ เลยที่โมเดลพวกนี้ไม่ได้ติดมากับ OpenCV เลยก็เพราะว่าบางตัวมีขนาดค่อนข้างใหญ่ แล้วก็ไม่ใช่ทุกคนที่ใช้ lib ที่ต้องการฟังก์ชั่นนี้นั่นเองครับ

สามารถดาวน์โหลดโมเดลได้ ที่นี้ โดยในตัวอย่างนี้ผมจะเลือกโหลดโมเดล ESPCN_x3.pb มาใช้งานนะครับ ตัว x3 ในชื่อหมายความว่าเป็นโมเดลที่จะขยายขนาดภาพให้เป็น 3 เท่าจากภาพตั้งต้น

3. อัปสเกลรูปภาพ

import os
import cv2

image_path = './group_test1/IMG_1503.JPG'
img = cv2.imread(image_path)

model_path = os.path.join('./model', 'ESPCN_x3.pb')
super_res = cv2.dnn_superres.DnnSuperResImpl_create()
super_res.readModel(model_path)
super_res.setModel('espcn', 3)

upscaled_img = super_res.upsample(img)
cv2.imwrite('./upscaled_image.jpg', upscaled_img)

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

จากนั้นจะทำการ setup ตัวโมเดล ESPCN_x3.pb ที่ได้ทำการดาวน์โหลดมา ลงในตัวแปรที่ชื่อว่า super_res

และสุดท้ายจะเป็นการนำตัว super_res ไปใช้อัปสเกลรูปภาพ (upsample) และบันทึกลงเครื่องครับ

ซ้าย: ก่อนอัปสเกล / ขวา: หลังอัปสเกล

ว่ากันด้วยเรื่องของ Model

ปัจจุบัน opencv superres รองรับโมเดลสำหรับการอัปสเกล 4 โมเดลด้วยกัน โดยแต่ละโมเดลผมได้แนบลิงค์ที่ paper สำหรับผู้ที่สนใจดูรายละเอียดเทคนิค machine learning เพิ่มเติมและแนบลิงค์สำหรับดาวน์โหลดแต่ละโมเดล ดังนี้ครับ

  1. EDSR [paper] เป็นโมเดลที่อัปสเกลได้ดีที่สุด แต่ก็เป็นโมเดลที่มีขนาดใหญ่ที่สุด ส่งผลให้ใช้เวลานาน(มาก) ในการอัปสเกลรูปภาพ รองรับการอัปสเกลสามขนาดได้แก่ x2, x3, x4 สามารถโหลดได้ ที่นี่
  2. ESPCN [paper] โมเดลขนาดเล็กที่มีประสิทธิภาพดีพอสมควร นอกจากนี้ยังสามารถใช้ในการอัปสเกลวีดีโอได้ด้วย (ขึ้นกับขนาดภาพ) รองรับการอัปสเกลสามขนาด ได้แก่ x2, x3, x4 สามารถโหลดได้ ที่นี่
  3. FSRCNN [paper] ตัวนี้ยังคงเป็นโมเดลที่มีขนาดเล็กละมีความแม่นยำในการอัปสเกลรูปภาพ สามารถใช้ในการอัปสเกลวีดีโอได้เช่นกัน รองรับการอัปสเกลสามขนาด ได้แก่ x2, x3, x4 สามารถโหลดได้ ที่นี่
  4. LapSRN [paper] เป็นโมเดลขนาดกลางแต่มีความพิเศษที่สามารถอัปสเกลได้สูงสุดถึง x8 (รองรับ x2 และ x4 ด้วย) สามารถโหลดได้ ที่นี่

สำหรับความเร็วในการอัปสเกลของแต่ละโมเดล ทดสอบกับภาพขนาด 500x333 โดยใช้เครื่องที่มี cpu Intel i5–7200U ความเร็วของแต่ละโมเดลเป็นดังนี้

+--------+-----------------------------+
| Name | Time (upscale x2) in second |
+--------+-----------------------------+
| EDSR | 32.501 |
| ESPCN | 0.049 |
| FSRCNN | 0.074 |
| LapSRN | 0.501 |
+--------+-----------------------------+

จะเห็นได้ว่า EDSR ซึ่งเป็นโมเดลขนาดใหญ่สุด ใช้เวลานานกว่าโมเดลอื่นๆหลายเท่า ดังนั้นถ้าจะเลือกใช้โมเดลนี้แนะนำให้ใช้กับภาพขนาดเล็กๆ และอัปสเกลไม่มาก (x2) จะช่วยผลลัพธ์ออกมาได้เร็วขึ้นครับ

ตัวอย่างภาพอัปสเกล

ซ้าย: ภาพต้นฉบับ / กลาง: อัปสเกลด้วยเทคนิค bicubic algorithms / ขวา: อัปสเกลด้วยโมเดล ESPCN
ซ้าย: ภาพต้นฉบับ / กลาง: อัปสเกลด้วยเทคนิค bicubic algorithms / ขวา: อัปสเกลด้วยโมเดล ESPCN
ซ้าย: ภาพต้นฉบับ / กลาง: อัปสเกลด้วยเทคนิค bicubic algorithms / ขวา: อัปสเกลด้วยโมเดล ESPCN
ซ้าย: ภาพต้นฉบับ / กลาง: อัปสเกลด้วยเทคนิค bicubic algorithms / ขวา: อัปสเกลด้วยโมเดล ESPCN

สรุป

รูปตัวอย่างได้แสดงให้เห็นว่าการอัปสเกลด้วยเทคนิค machine learning ให้ผลลัพท์ที่ดีกว่าเทคนิคอื่นอย่างชัดเจน อย่างไรก็ตามเทคนิคนี้ยังมีจุดอ่อนอยู่บ้าง เช่น ทำให้เกิด artifact ในภาพ และคุณภาพของรูปที่ได้ยังสู้กับแอพ Remini ไม่ได้

ซ้าย: ภาพต้นฉบับ / ขวา: อัปสเกลด้วย ESPCN (สังเกตุ visual artifact ในกลุ่มผลไม้)

ใน part ต่อไปผมจะมา improve ภาพที่ผ่านการอัปสเกลแล้ว โดยใช้เทคนิคในการ process รูปภาพของ opencv กันครับ แล้วเรามาดูกันว่าจะออกมาสู้กับ Remini ได้มั้ยนะ

--

--

Micky Chanachai
SET-IT-TEAM

Senior Application Engineer • MIS • The Stock Exchange of Thailand