เติมชีวิตให้ภาพขาวดำ: สำรวจ Deep Learning เพื่อการลงสีภาพ

โทนสีซีเปียและการไล่ระดับสีเทาของภาพถ่ายเก่ามีเสน่ห์เฉพาะตัว บันทึกช่วงเวลาที่หยุดนิ่งไว้ แต่ก็มักจะขาดความสดใสมีชีวิตชีวาของฉากดั้งเดิม ลองจินตนาการถึงการเติมสีสันแห่งชีวิตกลับเข้าไปในความทรงจำอันล้ำค่าเหล่านี้ เปลี่ยนภาพถ่ายบุคคลขาวดำที่ซีดจางให้กลายเป็นหน้าต่างที่เผยให้เห็นโลกของบุคคลในภาพแบบเต็มสีสัน กระบวนการเปลี่ยนแปลงนี้เรียกว่า การลงสีภาพ (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)

นี่คือการเปลี่ยนแปลงแนวคิด:

  1. ปริภูมิสีแบบ Quantized: สเปกตรัมต่อเนื่องของค่า ‘a’ และ ‘b’ ที่เป็นไปได้จะถูกแบ่งออกเป็นชุดของ “ถัง” (bins) หรือคลาสสีตัวแทนที่กำหนดไว้ล่วงหน้า ลองนึกภาพว่าเป็นการลดจานสีขนาดใหญ่ให้เหลือชุดตัวเลือกสีที่แตกต่างกันที่จัดการได้ แต่ยังคงครอบคลุม ภายในระนาบ ‘a’-‘b’
  2. การทำนายความน่าจะเป็น: สำหรับแต่ละพิกเซลในภาพขาวดำอินพุต CNN ไม่ได้ทำนายค่า ‘a’ และ ‘b’ เพียงค่าเดียว แต่มันจะส่งออก การแจกแจงความน่าจะเป็น (probability distribution) ข้ามถังสีที่ถูก Quantized มันบอกเป็นนัยว่า “สำหรับพิกเซลนี้ มีโอกาส 70% ที่จะอยู่ใน ‘ถังสีแดงสด #5’, โอกาส 20% ที่จะเป็น ‘ถังสีแดงซีด #2’, โอกาส 5% ที่จะเป็น ‘ถังสีน้ำตาล #12’,” และอื่น ๆ
  3. การจัดการกับความกำกวม: แนวทางความน่าจะเป็นนี้จัดการกับความกำกวมของสีโดยเนื้อแท้ หากวัตถุอาจมีได้หลายสี (เช่น แอปเปิ้ล) โครงข่ายสามารถกำหนดความน่าจะเป็นที่สำคัญให้กับถังสีต่าง ๆ หลายถัง ซึ่งสะท้อนถึงความไม่แน่นอนนี้โดยไม่ต้องหันไปใช้ค่าเฉลี่ยที่จืดชืด
  4. การถอดรหัสเป็นสีสดใส: ขั้นตอนสุดท้ายเกี่ยวข้องกับการแปลการแจกแจงความน่าจะเป็นนี้กลับไปเป็นสีเดียวที่เฉพาะเจาะจงสำหรับแต่ละพิกเซล แนวทางที่เรียบง่ายอาจเป็นการเลือกถังสีที่มีความน่าจะเป็นสูงสุด (โหมด) อย่างไรก็ตาม เพื่อส่งเสริมความสดใสและหลีกเลี่ยงปัญหาสีซีดจาง เทคนิคเช่นการคำนวณ ค่าเฉลี่ยแบบอบอ่อน (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 ให้กลายเป็นเครื่องมือเชิงปฏิบัติที่สามารถเพิ่มสีสันที่สดใสและน่าเชื่อถือให้กับภาพขาวดำ เชื่อมช่องว่างระหว่างอดีตและปัจจุบันได้อย่างมีประสิทธิภาพ