โทนสีซีเปียและการไล่ระดับสีเทาของภาพถ่ายเก่ามีเสน่ห์เฉพาะตัว บันทึกช่วงเวลาที่หยุดนิ่งไว้ แต่ก็มักจะขาดความสดใสมีชีวิตชีวาของฉากดั้งเดิม ลองจินตนาการถึงการเติมสีสันแห่งชีวิตกลับเข้าไปในความทรงจำอันล้ำค่าเหล่านี้ เปลี่ยนภาพถ่ายบุคคลขาวดำที่ซีดจางให้กลายเป็นหน้าต่างที่เผยให้เห็นโลกของบุคคลในภาพแบบเต็มสีสัน กระบวนการเปลี่ยนแปลงนี้เรียกว่า การลงสีภาพ (image colorization) ซึ่งเป็นที่สนใจของศิลปินและนักประวัติศาสตร์มานานแล้ว ปัจจุบัน ด้วยความก้าวหน้าของปัญญาประดิษฐ์ โดยเฉพาะอย่างยิ่ง Deep Learning การลงสีภาพอัตโนมัติกำลังบรรลุผลลัพธ์ที่ครั้งหนึ่งเคยเป็นเพียงเรื่องในนิยายวิทยาศาสตร์
การเติมสีให้กับภาพขาวดำนำเสนอความท้าทายที่น่าสนใจ ข้อมูลจำนวนมาก – ข้อมูลสีดั้งเดิม – สูญหายไปโดยธรรมชาติเมื่อภาพถูกแสดงผลเป็นขาวดำ อัลกอริทึมจะรู้สีที่แท้จริงของดอกไม้ ชุดเดรส หรือท้องฟ้าจากค่าความสว่างเพียงอย่างเดียวได้อย่างไร? คำตอบอยู่ในร่องรอยอันละเอียดอ่อนที่ฝังอยู่ในภาพขาวดำนั่นเอง: พื้นผิว รูปร่าง บริบท และปฏิสัมพันธ์ของแสงและเงา แม้ว่าการระบุสีดั้งเดิมที่ แน่นอน อาจเป็นไปไม่ได้ (ดอกกุหลาบนั้นเป็นสีแดงเข้มจริง ๆ หรืออาจจะเป็นสีชมพู?) เป้าหมายจึงเปลี่ยนไปเป็นการสร้างการลงสีที่ น่าเชื่อถือ และสวยงามน่ามอง จุดมุ่งหมายคือการสร้างภาพที่ผู้สังเกตการณ์ที่เป็นมนุษย์จะพบว่าน่าเชื่อถือ หรือแม้กระทั่งอาจแยกไม่ออกจากภาพถ่ายสีต้นฉบับ
โมเดล Deep Learning มีความยอดเยี่ยมในการค้นพบรูปแบบที่ซับซ้อนและความสัมพันธ์ทางสถิติภายในชุดข้อมูลขนาดใหญ่ ด้วยการฝึกโมเดลเหล่านี้บนภาพหลายล้านภาพ เปรียบเทียบเวอร์ชันขาวดำกับภาพสีต้นฉบับ อัลกอริทึมเรียนรู้ที่จะเชื่อมโยงพื้นผิวและโครงสร้างเฉพาะกับสีที่เป็นไปได้ พวกมันเรียนรู้ว่าหญ้ามักจะเป็นสีเขียว ท้องฟ้ามักจะเป็นสีฟ้า และพื้นผิวบางอย่างสอดคล้องกับลายไม้หรือผ้า มันคล้ายกับการเดาอย่างมีหลักการ แต่เป็นการเดาที่ได้รับข้อมูลจากสารานุกรมภาพขนาดใหญ่ อัลกอริทึมไม่ได้ ‘รู้’ สีที่แท้จริงในความหมายของมนุษย์ แต่มันสามารถทำการคาดการณ์ที่มีความน่าจะเป็นสูงโดยอิงตามความสัมพันธ์ที่เรียนรู้มา
ภาษาของสี: CIELab และโครงข่ายประสาทเทียม (Neural Networks)
เพื่อจัดการกับการลงสีภาพในเชิงคำนวณ เราต้องการวิธีที่เหมาะสมในการแทนค่าสี แม้ว่า RGB
(แดง เขียว น้ำเงิน) จะเป็นเรื่องปกติสำหรับจอแสดงผล แต่มันผสมผสานข้อมูลความสว่าง (luminance) และข้อมูลสี (chrominance) เข้าด้วยกัน ระบบที่ได้เปรียบกว่าสำหรับงานนี้คือ ปริภูมิสี CIELab
โมเดลนี้แยกสีออกเป็นสามองค์ประกอบที่แตกต่างกันอย่างสง่างาม:
- L (Lightness): ช่องนี้แสดงข้อมูลระดับสีเทา ตั้งแต่สีดำสนิทไปจนถึงสีขาวบริสุทธิ์ โดยพื้นฐานแล้วมันคือข้อมูลอินพุตที่เรามีอยู่แล้วในภาพขาวดำ
- a: ช่องนี้เข้ารหัสสเปกตรัมจากสีเขียว (ค่าลบ) ไปยังสีแดง (ค่าบวก)
- b: ช่องนี้เข้ารหัสสเปกตรัมจากสีน้ำเงิน (ค่าลบ) ไปยังสีเหลือง (ค่าบวก)
ความงดงามของ CIELab
อยู่ที่การแยกส่วนนี้ โมเดล Deep Learning ของเราสามารถมุ่งเน้นไปที่การทำนายช่องสีสองช่อง (‘a’ และ ‘b’) โดยอิงจากช่องความสว่าง (‘L’) ที่เป็นอินพุตเท่านั้น งานหลักกลายเป็น: เมื่อพิจารณาจากข้อมูลระดับสีเทา (L) ค่า ‘a’ และ ‘b’ ที่สอดคล้องกันที่เป็นไปได้มากที่สุดสำหรับแต่ละพิกเซลคืออะไร?
ความพยายามในยุคแรก ๆ มักใช้ Convolutional Neural Networks (CNNs
) – ซึ่งเป็นสถาปัตยกรรม Deep Learning ประเภทหนึ่งที่เก่งกาจในการประมวลผลข้อมูลแบบกริด เช่น รูปภาพ โครงข่ายเหล่านี้ได้รับการฝึกฝนบนชุดข้อมูลรูปภาพขนาดใหญ่ (เช่น ImageNet
) เพื่อทำนายค่า ‘a’ และ ‘b’ โดยตรงสำหรับแต่ละพิกเซล โดยถือว่าเป็นปัญหาการถดถอย (regression) (การทำนายค่าต่อเนื่อง) อย่างไรก็ตาม มีข้อผิดพลาดทั่วไปเกิดขึ้น: การลงสีที่ได้มักจะดู สีซีดจางหรือหม่นหมอง ทำไม? ลองพิจารณาวัตถุเช่นแอปเปิ้ล มันอาจจะเป็นสีแดง เขียว หรือแม้แต่เหลืองก็ได้ หากโครงข่ายพยายามหาค่าเฉลี่ยความเป็นไปได้เหล่านี้ในระหว่างการถดถอย มันอาจจะลงเอยด้วยสีน้ำตาลทึม ๆ แทนที่จะเป็นสีสดใสเฉพาะเจาะจง ผลกระทบจากการหาค่าเฉลี่ยข้ามสีที่เป็นไปได้หลายสีนี้มีแนวโน้มที่จะทำให้ผลลัพธ์ดูจืดชืด
การเปลี่ยนกระบวนทัศน์: การลงสีภาพในฐานะการจำแนกประเภท (Classification)
เพื่อเอาชนะปัญหาสีซีดจางและสร้างสีที่สดใสและสมจริงยิ่งขึ้น แนวทางที่ซับซ้อนมากขึ้นได้ปรับกรอบปัญหาใหม่ แทนที่จะมองว่าการทำนายสีเป็นการถดถอย (regression) กลับมองว่าเป็น งานจำแนกประเภท (classification task)
นี่คือการเปลี่ยนแปลงแนวคิด:
- ปริภูมิสีแบบ Quantized: สเปกตรัมต่อเนื่องของค่า ‘a’ และ ‘b’ ที่เป็นไปได้จะถูกแบ่งออกเป็นชุดของ “ถัง” (bins) หรือคลาสสีตัวแทนที่กำหนดไว้ล่วงหน้า ลองนึกภาพว่าเป็นการลดจานสีขนาดใหญ่ให้เหลือชุดตัวเลือกสีที่แตกต่างกันที่จัดการได้ แต่ยังคงครอบคลุม ภายในระนาบ ‘a’-‘b’
- การทำนายความน่าจะเป็น: สำหรับแต่ละพิกเซลในภาพขาวดำอินพุต
CNN
ไม่ได้ทำนายค่า ‘a’ และ ‘b’ เพียงค่าเดียว แต่มันจะส่งออก การแจกแจงความน่าจะเป็น (probability distribution) ข้ามถังสีที่ถูก Quantized มันบอกเป็นนัยว่า “สำหรับพิกเซลนี้ มีโอกาส 70% ที่จะอยู่ใน ‘ถังสีแดงสด #5’, โอกาส 20% ที่จะเป็น ‘ถังสีแดงซีด #2’, โอกาส 5% ที่จะเป็น ‘ถังสีน้ำตาล #12’,” และอื่น ๆ - การจัดการกับความกำกวม: แนวทางความน่าจะเป็นนี้จัดการกับความกำกวมของสีโดยเนื้อแท้ หากวัตถุอาจมีได้หลายสี (เช่น แอปเปิ้ล) โครงข่ายสามารถกำหนดความน่าจะเป็นที่สำคัญให้กับถังสีต่าง ๆ หลายถัง ซึ่งสะท้อนถึงความไม่แน่นอนนี้โดยไม่ต้องหันไปใช้ค่าเฉลี่ยที่จืดชืด
- การถอดรหัสเป็นสีสดใส: ขั้นตอนสุดท้ายเกี่ยวข้องกับการแปลการแจกแจงความน่าจะเป็นนี้กลับไปเป็นสีเดียวที่เฉพาะเจาะจงสำหรับแต่ละพิกเซล แนวทางที่เรียบง่ายอาจเป็นการเลือกถังสีที่มีความน่าจะเป็นสูงสุด (โหมด) อย่างไรก็ตาม เพื่อส่งเสริมความสดใสและหลีกเลี่ยงปัญหาสีซีดจาง เทคนิคเช่นการคำนวณ ค่าเฉลี่ยแบบอบอ่อน (annealed mean) ของการแจกแจงจึงถูกนำมาใช้ วิธีนี้ให้น้ำหนักมากขึ้นกับการคาดการณ์ที่มีความน่าจะเป็นน้อยกว่าแต่มีสีสันมากกว่า (ความอิ่มตัวของสีสูงกว่า) ซึ่งเป็นการ “ตัดสิน” อย่างมีประสิทธิภาพโดยเลือกความสดใสในขณะที่ยังคงเคารพการแจกแจงที่คาดการณ์โดยรวม
กรอบการจำแนกประเภทนี้ เมื่อรวมกับการออกแบบฟังก์ชันการสูญเสีย (loss function) อย่างระมัดระวัง (เมตริกที่ใช้ในการประเมินประสิทธิภาพของโมเดลระหว่างการฝึก) โดยเฉพาะสำหรับการลงสีภาพ ช่วยให้โมเดลสามารถเรียนรู้ความสัมพันธ์ที่ซับซ้อนระหว่างคุณลักษณะระดับสีเทาและ การแจกแจง ของสีที่เป็นไปได้ ผลลัพธ์ที่ได้คือภาพที่ไม่เพียงแต่มีสีที่น่าเชื่อถือเท่านั้น แต่ยังมีความสมบูรณ์และความน่าดึงดูดทางสายตา ซึ่งมักขาดหายไปในวิธีการที่ใช้การถดถอยในยุคก่อนหน้า
มองลึกลงไปใต้ฝากระโปรง: เวิร์กโฟลว์ Deep Learning เชิงปฏิบัติ
แม้ว่าการฝึก CNN
ที่ซับซ้อนเช่นนี้ตั้งแต่ต้นจะเป็นงานที่ยิ่งใหญ่ซึ่งต้องใช้ทรัพยากรการคำนวณมหาศาลและชุดข้อมูลขนาดใหญ่ แต่การใช้ประโยชน์จากโมเดลที่ ฝึกไว้ล่วงหน้า (pre-trained) ทำให้เทคโนโลยีนี้เข้าถึงได้ ลองมาดูขั้นตอนเชิงแนวคิดที่เกี่ยวข้องกับการใช้โมเดล Deep Learning ที่ฝึกไว้ล่วงหน้า (โดยเฉพาะโมเดลที่สร้างขึ้นโดยใช้เฟรมเวิร์ก Caffe
ดังตัวอย่างดั้งเดิม) สำหรับการลงสีภาพ ซึ่งนำไปใช้โดยใช้ Python และไลบรารีทั่วไป
1. การรวบรวมชุดเครื่องมือ:
รากฐานโดยทั่วไปเกี่ยวข้องกับ Python ซึ่งเป็นภาษาโปรแกรมอเนกประสงค์ที่ได้รับความนิยมในสาขาวิทยาศาสตร์ข้อมูลและ AI ไลบรารีหลักมีบทบาทสำคัญ:
NumPy
: จำเป็นสำหรับการดำเนินการเชิงตัวเลขที่มีประสิทธิภาพ โดยเฉพาะอย่างยิ่งการจัดการอาร์เรย์หลายมิติที่ใช้แทนรูปภาพOpenCV
(cv2
): ไลบรารีทรงพลังสำหรับงานคอมพิวเตอร์วิทัศน์ มีฟังก์ชันสำหรับการอ่าน เขียน จัดการ และแสดงรูปภาพ และที่สำคัญคือมีโมดูล Deep Neural Network (DNN
) ที่สามารถโหลดและรันโมเดลที่ฝึกในเฟรมเวิร์กต่าง ๆ เช่นCaffe
,TensorFlow
และPyTorch
Argparse
: ไลบรารีมาตรฐานของ Python สำหรับสร้างอินเทอร์เฟซบรรทัดคำสั่งที่ใช้งานง่าย ช่วยให้ผู้ใช้สามารถระบุพารามิเตอร์อินพุต เช่น เส้นทางไฟล์รูปภาพ ได้อย่างง่ายดายOS
: ใช้สำหรับการโต้ตอบพื้นฐานกับระบบปฏิบัติการ เช่น การสร้างเส้นทางไฟล์ในลักษณะที่ทำงานได้บนระบบต่าง ๆ (Windows, macOS, Linux)
2. การได้รับข้อมูลอัจฉริยะที่ฝึกไว้ล่วงหน้า:
แทนที่จะสร้างโครงข่ายประสาทเทียมทีละส่วน เราใช้ไฟล์ที่แสดงถึงโครงข่ายที่ได้รับการฝึกฝนสำหรับการลงสีภาพแล้ว โดยทั่วไปจะรวมถึง:
- ไฟล์สถาปัตยกรรมโมเดล (
.prototxt
สำหรับCaffe
): ไฟล์นี้กำหนดโครงสร้างของโครงข่ายประสาทเทียม – เลเยอร์ ประเภท การเชื่อมต่อ และพารามิเตอร์ มันคือพิมพ์เขียวของโมเดล - ไฟล์น้ำหนักที่ฝึกแล้ว (
.caffemodel
สำหรับCaffe
): ไฟล์นี้มีค่าน้ำหนักเชิงตัวเลขที่โครงข่ายเรียนรู้ระหว่างกระบวนการฝึกฝนที่กว้างขวาง น้ำหนักเหล่านี้สรุป “ความรู้” ที่โมเดลได้รับเกี่ยวกับการจับคู่คุณลักษณะระดับสีเทากับความน่าจะเป็นของสี มันคือความฉลาดที่กลั่นกรองแล้ว - ข้อมูล Quantization สี (ไฟล์
.npy
): ไฟล์NumPy
นี้มักจะเก็บจุดศูนย์กลางของถังสีที่ถูก Quantized ซึ่งใช้ในแนวทางการจำแนกประเภทที่อธิบายไว้ก่อนหน้านี้ มันทำหน้าที่เป็นจานสีอ้างอิงสำหรับความน่าจะเป็นของสีที่คาดการณ์ไว้
ไฟล์เหล่านี้แสดงถึงจุดสุดยอดของการฝึกฝนที่อาจใช้เวลาหลายสัปดาห์หรือหลายเดือนบนฮาร์ดแวร์ที่ทรงพลัง
3. การโหลดกลไกการลงสี:
เมื่อมีไฟล์ที่จำเป็นแล้ว โมดูล DNN
ของ OpenCV
จะมีกลไกในการโหลดโครงข่ายที่ฝึกไว้ล่วงหน้าเข้าสู่หน่วยความจำ ฟังก์ชัน cv2.dnn.readNetFromCaffe
(หรือฟังก์ชันที่เทียบเท่าสำหรับเฟรมเวิร์กอื่น ๆ) รับไฟล์สถาปัตยกรรมและไฟล์น้ำหนักเป็นอินพุตและสร้างอินสแตนซ์ของโครงข่าย ทำให้พร้อมสำหรับการอนุมาน (inference) (กระบวนการทำนายข้อมูลใหม่) จุด Quantization สีจากไฟล์ .npy
ก็ถูกโหลดเช่นกัน โดยทั่วไปจะใช้ NumPy
4. การปรับแต่งส่วนประกอบของโครงข่าย (หากจำเป็น):
บางครั้ง เลเยอร์เฉพาะภายในโครงข่ายที่ฝึกไว้ล่วงหน้าจำเป็นต้องมีการปรับเปลี่ยนเล็กน้อยก่อนการอนุมาน ในบริบทของโมเดลการลงสีตามการจำแนกประเภทที่กล่าวถึง:
- การปรับเลเยอร์เอาต์พุต: เลเยอร์สุดท้ายที่รับผิดชอบในการส่งออกการคาดการณ์ช่อง ‘a’ และ ‘b’ (เช่น ชื่อ
class8_ab
ในโมเดลอ้างอิง) อาจจำเป็นต้องโหลดอย่างชัดเจนด้วยจุดศูนย์กลางถังสีจากไฟล์.npy
สิ่งนี้ทำให้มั่นใจได้ว่าความน่าจะเป็นเอาต์พุตของโครงข่ายจับคู่กับจานสีที่กำหนดไว้ล่วงหน้าได้อย่างถูกต้อง จุดต่าง ๆ มักจะถูกปรับรูปร่าง (reshape) และแปลงชนิดข้อมูล (cast) เป็นประเภทข้อมูลที่เหมาะสม (เช่นfloat32
) ก่อนที่จะกำหนดให้กับ “blobs” ของเลเยอร์ (คำศัพท์ของCaffe
สำหรับคอนเทนเนอร์ข้อมูล) - การปรับสมดุลสี: เลเยอร์อื่น (เช่น
conv8_313_rh
) อาจถูกปรับเพื่อมีอิทธิพลต่อความสมดุลระหว่างสีต่าง ๆ ในเอาต์พุต ซึ่งอาจเพิ่มความอิ่มตัวของสีหรือแก้ไขความเอนเอียง (bias) ที่เรียนรู้ระหว่างการฝึกฝน ซึ่งมักเกี่ยวข้องกับการตั้งค่า blobs ของเลเยอร์เป็นค่าที่เรียนรู้เฉพาะ (เช่น ค่า2.606
ที่กล่าวถึงในโค้ดดั้งเดิม ซึ่งน่าจะได้มาจากการทดลองหรือระหว่างการฝึก)
ขั้นตอนเหล่านี้ปรับแต่งโมเดลที่ฝึกไว้ล่วงหน้าทั่วไปสำหรับความแตกต่างเฉพาะของงานลงสีโดยใช้วิธีการจำแนกประเภท
5. การเตรียมภาพอินพุต:
ภาพขาวดำอินพุตจำเป็นต้องผ่านขั้นตอนการประมวลผลล่วงหน้าหลายขั้นตอนก่อนที่จะป้อนเข้าสู่โครงข่ายประสาทเทียม:
- การโหลด: ภาพถูกอ่านจากเส้นทางไฟล์ที่ระบุโดยใช้
cv2.imread
แม้ว่าจะเป็นภาพขาวดำOpenCV
อาจโหลดเป็นภาพBGR
3 ช่องสัญญาณตามค่าเริ่มต้น โดยทำซ้ำค่าสีเทาข้ามช่องสัญญาณ - การทำให้เป็นมาตรฐาน (Normalization): ค่าพิกเซล ซึ่งโดยทั่วไปอยู่ในช่วง 0 ถึง 255 จะถูกปรับขนาดให้อยู่ในช่วงที่เล็กลง ซึ่งมักจะเป็น 0.0 ถึง 1.0 โดยการหารด้วย 255.0 การทำให้เป็นมาตรฐานนี้ช่วยให้กระบวนการเรียนรู้และการอนุมานของโครงข่ายมีเสถียรภาพ
- การแปลงปริภูมิสี: ภาพถูกแปลงจากปริภูมิสี
BGR
เริ่มต้นเป็นปริภูมิสีCIELab
โดยใช้cv2.cvtColor
นี่เป็นสิ่งสำคัญสำหรับการแยกช่องความสว่าง (L) - การปรับขนาด:
CNNs
ที่ฝึกไว้ล่วงหน้าส่วนใหญ่คาดหวังภาพอินพุตที่มีขนาดคงที่ (เช่น 224x224 พิกเซล ซึ่งเป็นมาตรฐานทั่วไปที่ได้รับอิทธิพลจากชุดข้อมูลเช่นImageNet
) ภาพLAB
จะถูกปรับขนาดตามนั้นโดยใช้cv2.resize
การทำให้เป็นมาตรฐานนี้ช่วยให้มั่นใจได้ถึงความเข้ากันได้กับสถาปัตยกรรมของโครงข่าย - การแยกช่อง L และการจัดกึ่งกลาง: ช่องความสว่าง (L) ถูกแยกออกจากภาพ
LAB
ที่ปรับขนาดแล้ว บ่อยครั้ง ค่าของมัน (โดยทั่วไปคือ 0-100 ในLAB
) จะถูกจัดกึ่งกลางรอบศูนย์โดยการลบค่าเฉลี่ย (เช่น 50) การจัดกึ่งกลางนี้เป็นอีกหนึ่งแนวปฏิบัติทั่วไปที่สามารถปรับปรุงประสิทธิภาพของโครงข่ายได้
ช่อง L ที่ผ่านการประมวลผลล่วงหน้าอย่างพิถีพิถันนี้พร้อมที่จะนำเสนอต่อโครงข่ายแล้ว
6. ขั้นตอนการอนุมาน: การทำนายสี:
นี่คือจุดที่ความมหัศจรรย์เกิดขึ้น:
- การสร้าง Blob: ช่อง L ที่ประมวลผลแล้ว (ตอนนี้เป็นอาร์เรย์ 2 มิติ) ถูกแปลงเป็น “blob” ซึ่งเป็นรูปแบบอาร์เรย์ 4 มิติที่โมดูล
DNN
คาดหวัง (cv2.dnn.blobFromImage
) รูปแบบนี้โดยทั่วไปจะรวมถึงมิติสำหรับขนาดแบตช์ (batch size), ช่องสัญญาณ, ความสูง และความกว้าง - การส่งผ่านไปข้างหน้า (Forward Pass): blob ถูกตั้งค่าเป็นอินพุตของโครงข่ายที่โหลดโดยใช้
net.setInput
จากนั้น เมธอดnet.forward()
จะถูกเรียกใช้ สิ่งนี้กระตุ้นการคำนวณ: ข้อมูลอินพุตไหลผ่านเลเยอร์ของโครงข่าย ผ่านการแปลงที่กำหนดโดยน้ำหนักที่เรียนรู้ ในที่สุดก็สร้างเอาต์พุตที่คาดการณ์ไว้ สำหรับโมเดลการลงสีของเรา เอาต์พุตแสดงถึงช่อง ‘a’ และ ‘b’ ที่คาดการณ์ไว้ (หรือมากกว่านั้นคือ การแจกแจงความน่าจะเป็นเหนือถังสี) - การปรับรูปร่างเอาต์พุต: เอาต์พุตดิบจากโครงข่ายจำเป็นต้องถูกปรับรูปร่างและสลับแกน (transpose) กลับเป็นรูปแบบเชิงพื้นที่ 2 มิติที่สอดคล้องกับช่อง ‘a’ และ ‘b’
ตอนนี้โครงข่ายได้สร้างการคาดเดาที่ดีที่สุดสำหรับข้อมูลสีโดยอิงจากภาพขาวดำอินพุต
7. การสร้างภาพสีขึ้นใหม่:
ขั้นตอนสุดท้ายเกี่ยวข้องกับการรวมข้อมูลสีที่คาดการณ์ไว้กับข้อมูลภาพต้นฉบับ:
- การปรับขนาดช่องที่คาดการณ์: ช่อง ‘a’ และ ‘b’ ที่คาดการณ์ไว้ (ซึ่งปัจจุบันมีขนาด 224x224 ซึ่งตรงกับอินพุตของโครงข่าย) จำเป็นต้องปรับขนาดกลับไปเป็นขนาด ดั้งเดิม ของภาพอินพุตโดยใช้
cv2.resize
สิ่งนี้ทำให้มั่นใจได้ว่าข้อมูลสีจะสอดคล้องกับโครงสร้างภาพต้นฉบับอย่างถูกต้อง - การแยกความสว่างดั้งเดิม: ที่สำคัญ ช่องความสว่าง (L) ถูกแยกออกจากภาพ
LAB
ต้นฉบับ ขนาดเต็ม (ที่สร้างขึ้นระหว่างการประมวลผลล่วงหน้าก่อนการปรับขนาด) การใช้ช่อง L ดั้งเดิมจะรักษาความละเอียดและโครงสร้างความสว่างดั้งเดิมของภาพ ซึ่งจะลดลงหากใช้ช่อง L ที่ปรับขนาดแล้ว - การต่อกัน (Concatenation): ช่อง L ดั้งเดิมถูกรวม (ต่อกัน) กับช่อง ‘a’ และ ‘b’ ที่ปรับขนาดและคาดการณ์ไว้ ตามแกนช่องสี สิ่งนี้เป็นการประกอบภาพ
LAB
แบบเต็มขึ้นใหม่ ซึ่งตอนนี้มีสีที่คาดการณ์ไว้ - การแปลงกลับเป็นรูปแบบที่แสดงผลได้: ภาพ
LAB
ที่ได้จะถูกแปลงกลับเป็นปริภูมิสีBGR
โดยใช้cv2.cvtColor
เนื่องจากนี่คือรูปแบบมาตรฐานที่คาดหวังโดยฟังก์ชันแสดงภาพส่วนใหญ่ (เช่นcv2.imshow
) - การตัด (Clipping) และการปรับสเกล: ค่าพิกเซลในภาพ
BGR
ซึ่งปัจจุบันอยู่ในช่วงที่ทำให้เป็นมาตรฐาน (น่าจะ 0.0 ถึง 1.0) จะถูกตัดเพื่อให้แน่ใจว่ายังคงอยู่ในช่วงที่ถูกต้องนี้ (บางครั้งค่าอาจเกินขอบเขตเล็กน้อยเนื่องจากกระบวนการคาดการณ์) จากนั้น จะถูกปรับสเกลกลับขึ้นไปเป็นช่วงจำนวนเต็มมาตรฐาน 0-255 ที่จำเป็นสำหรับการแสดงผลหรือบันทึกเป็นไฟล์ภาพมาตรฐาน
8. การแสดงภาพ:
สุดท้าย ฟังก์ชันเช่น cv2.imshow
สามารถใช้เพื่อแสดงภาพขาวดำต้นฉบับควบคู่ไปกับภาพที่ลงสีใหม่ ทำให้สามารถเปรียบเทียบด้วยสายตาได้ทันที
การดำเนินกระบวนการ:
โดยทั่วไป สคริปต์ที่ใช้ขั้นตอนเหล่านี้จะรันจากบรรทัดคำสั่ง การใช้การตั้งค่า argparse
ผู้ใช้จะระบุเส้นทางไปยังภาพขาวดำอินพุตเป็นอาร์กิวเมนต์ (เช่น python colorize_image.py --image my_photo.jpg
) จากนั้นสคริปต์จะดำเนินการตามขั้นตอนการโหลด การประมวลผลล่วงหน้า การอนุมาน และการสร้างใหม่ ในที่สุดก็แสดงหรือบันทึกผลลัพธ์ที่ลงสีแล้ว
เวิร์กโฟลว์นี้ ซึ่งใช้ประโยชน์จากโมเดลที่ฝึกไว้ล่วงหน้าและไลบรารีที่ทรงพลัง ได้เปลี่ยนทฤษฎีที่ซับซ้อนของการลงสีด้วย Deep Learning ให้กลายเป็นเครื่องมือเชิงปฏิบัติที่สามารถเพิ่มสีสันที่สดใสและน่าเชื่อถือให้กับภาพขาวดำ เชื่อมช่องว่างระหว่างอดีตและปัจจุบันได้อย่างมีประสิทธิภาพ