Computer VisionMachine LearningOpenCVPython

Python การใช้ Deep Learning ปรับภาพขาวดำเป็นภาพสี BW to Color ร่วมกับ OpenCV

ตัวอย่างนี้คุณจะได้เรียนรู้วิธีปรับภาพขาวดำให้เป็นภาพสี Black & White เป็น Colorโดยใช้ OpenCV, Deep Learning และ Python

ตัวอย่างนี้คุณจะได้เรียนรู้วิธีปรับภาพขาวดำให้เป็นภาพสี Black & White เป็น Colorโดยใช้ OpenCV, Deep Learning และ Python

บทเรียนก่อนหน้า:

รอบนี้เราจะใช้ Deep Learning กันซึ่งเราจะใช้ Model มาช่วยในการระบายสีของภาพที่เป็นภาพขาวดำให้กลายเป็นภาพสี (เทคนิค BW2Color) โดยเราจะต้องศึกษากระบวนการที่ว่า เราจะทำให้ภาพขาวดำเป็นภาพสีด้วย Deep Learning ได้อย่างไร

เทคนิคคงต้องใช้ Model ของ Zhang และคณะ จาก Conference นี้: http://richzhang.github.io/colorization/

  • Zhang, Isola, Efros. Colorful Image Colorization. In ECCV, 2016 (oral). (hosted on arXiv)>

มันมีเรื่องของอัลกอริทึม Deep Dream ที่ว่าด้วยภาพและสี การทำให้สีของภาพขาวดำอาศัยการรับรู้แบบ “unbelievable” แน่นอนมันเชื่อไม่ได้หากเทียบสามัญสำนึกของมนุษย์ด้วยจากข้อมูลใน Model ผลลัพธ์ที่ได้อาจจะเป็นสีที่ใกล้เคียง หรือไม่ได้ตรงกับการรับรู้แต่อย่างใด อาจจะไม่ใช่สีที่แท้จริง แต่เป็นการเติมเต็มในรูปแบบของสีที่มนุษย์ยอมรับได้ว่ามันเป็นภาพที่ตกแต่งสีแล้ว

Zhang ใช้วิธีการนำเข้าชุดข้อมูล ImageNet และแปลงรูปภาพทั้งหมดจากพื้นที่สี RGB เป็น Lab color space เช่นเดียวกับพื้นที่สี RGB พื้นที่สี Lab มีสามช่องทาง (R=Red, G=Green, B=Blue) แต่ Lab แตกต่างจากพื้นที่สี RGB Lab จะเข้ารหัสข้อมูลชุดสีแตกต่างกัน:

  • L เข้ารหัสความเข้มของแสงเท่านั้น (Lightness Intensity) หรือ Luminance เป็นการกำหนดความสว่างซึ่งมีค่าตั้งแต่ 0 ถึง 100 ถ้ากำหนดที่ 0 จะกลายเป็นสีดำ แต่ถ้ากำหนดที่ 100 จะกลายเป็นสีขาว
  • a จะเข้ารหัสชุดสีเขียว – แดง (encodes green-red)
  • b เข้ารหัสชุด สีน้ำเงิน – เหลือง (encodes blue-yellow)

กระบวนการของ Lab Color ของ Zhang ก็ Based มาจาก ระบบสีแบบ Lab ตามมาตรฐานของ CIE ซึ่งไม่ขึ้นอยู่กับอุปกรณ์ใดๆ ระบบสีแบบ Lab เป็นค่าสีที่ถูกกำหนดขึ้นโดย CIE (Commission Internationale d’ Eclarirage)ศึกษาได้ที่ https://en.wikipedia.org/wiki/CIELAB_color_space

กลับมากระบวนการนี้ แปลงภาพการฝึกอบรมทั้งหมดจากพื้นที่สี RGB เป็นพื้นที่สี Lab ใช้ช่อง L เป็นสัญญาณเข้าสู่ Train Network ทำการ Predict ช่อง ab รวม Channel L เข้ากับ ab แล้วจึงแปลงภาพ Lab กลับเป็น RGB

โหลด Model ที่จะใช้ Deep Learning ที่นี่: https://drive.google.com/file/d/1Rfxzbe1hfjge9JyKB8d8vtjAkm-K8JDC/view?usp=sharing

ทำการสร้าง โฟลเดอร์ชื่อ model แล้วแตก zip นำไฟล์ model ไปไว้ในโฟลเดอร์นั้นครับ เตรียมไฟล์รูปภาพขาวดำไว้ทดสอบบทเรียนนี้:

ผมใช้รูปขาวดำนี้
ผมใช้รูปขาวดำนี้

สร้างไฟล์ bw_to_color.py ขึ้นมาประกาศตัวแปร:

import numpy as np
import cv2

ใช้ numpy และ OpenCV มาประมวลผลภาพ

net = cv2.dnn.readNetFromCaffe("model/colorization_deploy_v2.prototxt", "model/colorization_release_v2.caffemodel")
pts = np.load("model/pts_in_hull.npy")

ทำการโหลด colorization_deploy_v2.prototxt ใน model มาเทียบ Caffe (คือเจ้า Caffe, http://caffe.berkeleyvision.org/ เป็นชุดคำสั่งสำหรับใช้งาน neural network deep learning ตระกูล convolutional neural network (CNN) ค่อนข้างง่าย และหาโหลดบทเรียนเพิ่มศึกษาได้ง่าย)

ไปเรียก readNetFromCaffe() มาทำงานผ่าน GPU

class8 = net.getLayerId("class8_ab")
conv8 = net.getLayerId("conv8_313_rh")
pts = pts.transpose().reshape(2, 313, 1, 1)
net.getLayer(class8).blobs = [pts.astype("float32")]
net.getLayer(conv8).blobs = [np.full([1, 313], 2.606, dtype="float32")]

เป็นคำสั่งในการ rebalancing ปรับสมดุลปริมาณของสี Channel a และ b โดยเชื่อม Convolutions รูปแบบ 1×1 ไปที่ละส่วน เข้าไปใน model

image = cv2.imread("images/crowd.jpg")
scaled = image.astype("float32") / 255.0
lab = cv2.cvtColor(scaled, cv2.COLOR_BGR2LAB)

imread ทำการโหลดรูปภาพจาก Path ของเรา ทำการเริ่ม Preprocessing ประกอบด้วย การปรับความเข้มของพิกเซลให้อยู่ในช่วง [0, 1] และ การแปลงจาก BGR เป็นพื้นที่สี Lab

resized = cv2.resize(lab, (224, 224))
L = cv2.split(resized)[0]
L -= 50

ประมวลผลภาพต่อเนื่อง ปรับขนาดภาพอินพุตเป็น 224 × 224  ซึ่งเป็นขนาด input ที่จำเป็นสำหรับ network ประมวลผลของ Channel L เป็นหลักก่อนหาค่า intensity และทำการลบค่าเฉลี่ย เมื่อได้ค่า L แล้วเราจะ Predict คาดการณ์ channel a,b ได้

ต่อมาคือการประมวลค่าสีใส่ในภาพ

net.setInput(cv2.dnn.blobFromImage(L))
ab = net.forward()[0, :, :, :].transpose((1, 2, 0))

ab = cv2.resize(ab, (image.shape[1], image.shape[0]))

L = cv2.split(lab)[0]
colorized = np.concatenate((L[:, :, np.newaxis], ab), axis=2)

colorized = cv2.cvtColor(colorized, cv2.COLOR_LAB2BGR)
colorized = np.clip(colorized, 0, 1)

colorized = (255 * colorized).astype("uint8")

คือมัน Resize เพื่อ Predict ให้กับ channel a.b แล้ว เราก็ทำการแสดงผลภาพกันหน่อย

cv2.imshow("Original", image)
cv2.imshow("Colorized", colorized)
cv2.waitKey(0)

ตัวอย่างไฟล์ทั้งหมดของวันนี้:

import numpy as np
import cv2

print("Load Model to Network")
net = cv2.dnn.readNetFromCaffe("model/colorization_deploy_v2.prototxt", "model/colorization_release_v2.caffemodel")
pts = np.load("model/pts_in_hull.npy")

class8 = net.getLayerId("class8_ab")
conv8 = net.getLayerId("conv8_313_rh")
pts = pts.transpose().reshape(2, 313, 1, 1)
net.getLayer(class8).blobs = [pts.astype("float32")]
net.getLayer(conv8).blobs = [np.full([1, 313], 2.606, dtype="float32")]

image = cv2.imread("images/crowd.jpg")
scaled = image.astype("float32") / 255.0
lab = cv2.cvtColor(scaled, cv2.COLOR_BGR2LAB)

resized = cv2.resize(lab, (224, 224))
L = cv2.split(resized)[0]
L -= 50

'print("Post Process Coloring")'
net.setInput(cv2.dnn.blobFromImage(L))
ab = net.forward()[0, :, :, :].transpose((1, 2, 0))

ab = cv2.resize(ab, (image.shape[1], image.shape[0]))

L = cv2.split(lab)[0]
colorized = np.concatenate((L[:, :, np.newaxis], ab), axis=2)

colorized = cv2.cvtColor(colorized, cv2.COLOR_LAB2BGR)
colorized = np.clip(colorized, 0, 1)

colorized = (255 * colorized).astype("uint8")

cv2.imshow("Original", image)
cv2.imshow("Colorized", colorized)
cv2.waitKey(0)

ทดสอบ Run ดูผลลัพธ์

ยากไปนิดถ้าจะพยายามให้มันเป๊ ที่บอกมันมากจาก Model และ Deep Learning ครับมีทางเดียวคือต้อง Train Model เอง

ลองอีกภาพโดยกาจาก Internet

เอามาทดสอบสิ

ลอง Taxi บ้าง

ใกล้เคียงนะครับแม้ว่าจริงๆ เราจะคาดหวังถึงสี เขียว เหลือง

Asst. Prof. Banyapon Poolsawas

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

Related Articles

Back to top button
Game & Mobile Development AR VR XR
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.

Adblock Detected

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