การสร้างโครงข่ายประสาทเทียมสำหรับการปรับสีของภาพ — ตอนที่ 4: การนำไปปฏิบัติ

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

ชุดทั้งหมดประกอบด้วย 4 ส่วนต่อไปนี้:

  1. ส่วนที่ 1: สรุปพื้นฐานของโมเดลเชิงกำเนิดและ ตัวเข้ารหัสอัตโนมัติ
  2. ส่วนที่ 2: นำเสนอแนวคิดพื้นฐานเกี่ยวกับ โครงข่ายประสาทเทียม ประดิษฐ์
  3. ส่วนที่ 3: นำเสนอความรู้พื้นฐานของ โครงข่ายประสาทเทียมแบบ Convolutional
  4. ส่วนที่ 4 (ปัจจุบัน): อธิบายการใช้งานแบบจำลองจริง

ข้อจำกัดความรับผิดชอบ: นี่ไม่ใช่การสอนแต่อย่างใด โดยให้ความรู้พื้นฐานบางประการ แต่เป้าหมายหลักคือการแสดงให้เห็นว่าเราสามารถสร้างแบบจำลองดังกล่าวได้อย่างไร

โมเดลทั้งหมดถูกสร้างขึ้นด้วย PyTorch และการประมวลผลภาพล่วงหน้าทำได้โดยใช้ไลบรารี Scikit-Image รหัสทั้งหมดสามารถพบได้ใน: https://github.com/gkamtzir/cnn-image-colorization

ข้อมูลและการประมวลผลล่วงหน้า

ก่อนที่จะดำเนินการใช้งานจริง เราจำเป็นต้องมีชุดข้อมูลที่ค่อนข้างใหญ่ซึ่งมีรูปภาพที่มีสี โปรดทราบว่าแนวทางของเราไม่จำเป็นต้องใช้ภาพขาวดำที่สอดคล้องกัน เนื่องจากดังที่เราได้กล่าวไว้ใน บทความแรก เราจะใช้รูปแบบ LAB ซึ่งหมายความว่าเราสามารถแยกย่อยภาพของชุดการฝึกและรับ เวอร์ชั่นขาวดำของแต่ละคน ชุดข้อมูลที่ฉันเลือกคือ ชุดข้อมูลการปรับสีรูปภาพ ซึ่งประกอบด้วยรูปภาพที่มีสี 5,000 ภาพสำหรับการฝึกอบรม และ 739 รูปภาพสำหรับการทดสอบ ขนาดของทุกภาพคือ 400x400x3 เนื้อหาแตกต่างกันไปตั้งแต่รูปภาพอาหาร คน สัตว์ ยานพาหนะ ไปจนถึงรูปภาพสถานที่ภายนอกและภายใน

การประมวลผลล่วงหน้าเพียงอย่างเดียวที่เกิดขึ้นคือการแปลงรูปแบบ RGB เป็นรูปแบบ LAB เพื่อจุดประสงค์นี้ ฉันจึงได้ใช้ไลบรารี Scikit-Image ร่วมกับคลาส `Dataset` ที่ PyTorch มีให้เพื่อสร้างกลไกในการอ่านและโหลดรูปภาพ สำหรับรายละเอียดเพิ่มเติม ตรวจสอบไฟล์ `Dataset.py`

สถาปัตยกรรมและการกำหนดค่า

เกี่ยวกับสถาปัตยกรรมของโครงข่ายประสาทเทียม เราได้กล่าวไปแล้วว่าเราจะพยายามนำตัวเข้ารหัสอัตโนมัติไปใช้ โดยที่ตัวเข้ารหัสจะประกอบด้วยเลเยอร์แบบขวักไขว่ และตัวถอดรหัสจะมีเลเยอร์แบบขดแบบสลับตำแหน่ง อินพุตจะเป็นภาพขนาด 400x400 มี 1 ช่อง ค่า L (ความสว่าง) ในผลลัพธ์ เราจะได้ภาพขนาด 400x400 พร้อม 2 ช่องสัญญาณ คือค่า a และ b ภาพสีสุดท้ายจะถูกสร้างขึ้นโดยการรวมค่า a และ b ที่คาดการณ์ไว้เข้ากับอินพุต L

สถาปัตยกรรมของเครือข่ายถูกสร้างขึ้นแบบค่อยเป็นค่อยไป ตั้งแต่เครือข่ายที่มีเพียงไม่กี่เลเยอร์และพารามิเตอร์ไปจนถึงเครือข่ายหลายเลเยอร์ที่มีแนวทางที่ซับซ้อนมากขึ้นเกี่ยวกับการไหลของข้อมูล โดยพื้นฐานแล้ว ฉันได้ปฏิบัติตามหลักการมีดโกนของ Occam โดยค่อยๆ สร้างโซลูชันที่ซับซ้อนมากขึ้น ฉันพยายามสะท้อนความซับซ้อนที่แท้จริงของงานกับความซับซ้อนของแบบจำลอง

สิ่งหนึ่งที่เราไม่ได้พูดถึงคือการทำให้เป็นมาตรฐานแบบแบทช์ระหว่างเลเยอร์ ฉันสัญญาว่าจะเขียนบทความเกี่ยวกับการทำให้เป็นมาตรฐานแบบกลุ่ม แต่สำหรับตอนนี้ คุณสามารถนึกถึงการทำให้เป็นมาตรฐานแบบกลุ่มเป็นเคล็ดลับอันชาญฉลาดที่ช่วยให้เราสามารถเร่งกระบวนการฝึกอบรมให้เร็วขึ้นในขณะที่ดูแลค่าน้ำหนักอย่างดี

การทำให้เป็นมาตรฐานแบบแบตช์มันมากกว่านั้นมาก ฉันจะอธิบายทุกอย่างในบทความต่อไปนี้

ในฐานะฟังก์ชันการเปิดใช้งาน ฉันใช้ ReLUเนื่องจากเป็นหนึ่งในตัวเลือกที่ปลอดภัยที่สุด ขนาดแบทช์ถูกตั้งค่าเป็น 32 ซึ่งแปลว่าเป็นการฝึกฝนเครือข่ายด้วยแบทช์ที่มีรูปภาพ 32 ภาพรวมกัน การสูญเสียการคาดการณ์คำนวณโดย Mean Squared Error หรือ MSE ขณะที่ในการทดลอง เครือข่ายใช้ เครื่องมือเพิ่มประสิทธิภาพ Adam

โดยรวมแล้วฉันได้ทดลองกับ 6 เครือข่ายที่แตกต่างกัน ในส่วนต่อๆ ไป ฉันจะให้การตั้งค่าและผลลัพธ์สำหรับการตั้งค่าทั้งหมด แต่ละคนได้รับการฝึกอบรมเกี่ยวกับชุดการพัฒนาภาพ 200 ภาพสำหรับยุคประมาณ 200 ยุค ชุดการพัฒนาใช้เพื่อทดสอบและเปรียบเทียบสถาปัตยกรรมต่างๆ ก่อนที่จะป้อนชุดข้อมูลทั้งหมดให้กับโมเดล และช่วยประหยัดเวลาได้มาก

สถาปัตยกรรมที่ 1

สถาปัตยกรรมแรกและขั้นพื้นฐานที่สุดคือสถาปัตยกรรมที่แสดงในภาพต่อไปนี้ เราได้ทำการทดลอง 3 แบบแยกกันโดยมีอัตราการเรียนรู้ที่แตกต่างกัน 3 แบบ แต่การทดลองทั้งหมดทำได้ค่อนข้างเหมือนกัน นอกจากนี้ พวกเขาไม่สามารถเรียนรู้ได้แม้แต่อินสแตนซ์การฝึกอบรมซึ่งเป็นธงสีแดงในแง่ของความสามารถในการเรียนรู้

สถาปัตยกรรมที่ 2

สถาปัตยกรรมที่สองนั้นเป็นการปรับปรุงจากสถาปัตยกรรมก่อนหน้า โดยฉันได้เพิ่มเลเยอร์แบบสลับ 1 ชั้นและเลเยอร์แบบสลับแบบย้าย 1 ชั้นในตัวเข้ารหัสและตัวถอดรหัสตามลำดับ ในกรณีนี้ การสูญเสียลดลงเมื่อเทียบกับกรณีแรก ในขณะที่การทดลองที่มีอัตราการเรียนรู้ 0.001 แสดงให้เห็นผลลัพธ์ที่ดีกว่า ถึงกระนั้น เครือข่ายก็ไม่สามารถเปลี่ยนสีของภาพได้ แม้ว่าจะพยายามใส่สีในบางจุดก็ตาม

สถาปัตยกรรมที่ 3

สถาปัตยกรรมที่สามไม่ได้เป็นเพียงการปรับปรุง แต่เป็นการปรับเปลี่ยนทั้งหมด ฉันได้ปรับเครือข่ายให้ใช้งานสิ่งที่เรียกว่า U-Net [1] เค้าโครง U-Net ใช้เอาต์พุตที่คำนวณไว้ก่อนหน้านี้ของตัวเข้ารหัสเป็นอินพุตในส่วนต่อไปนี้ของตัวถอดรหัส ด้วยวิธีนี้ เรามั่นใจว่าเครือข่ายจะไม่สูญเสียข้อมูลสำคัญใดๆ โครงสร้างที่แน่นอนของ U-Net สามารถพบได้ด้านล่าง:

ด้วยแนวทางนี้ เครือข่ายจึงมารวมกันเร็วขึ้นและมีข้อผิดพลาดน้อยลงทั้งในชุดการฝึกและการทดสอบ นอกจากนี้ยังเป็นเครือข่ายแรกที่สามารถใช้สีเฉพาะได้อย่างสม่ำเสมอ

สถาปัตยกรรมที่ 4

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

สถาปัตยกรรมที่ 5

ในระหว่างขั้นตอนนี้ ฉันเลือกที่จะแก้ไขเค้าโครงเครือข่ายโดยแนะนำเลเยอร์การขยาย ซึ่งเรียกอีกอย่างว่าเลเยอร์ “a trous” มีงานวิจัยที่บ่งชี้ถึงการปรับปรุงที่สำคัญในการทำนายในกรณีเช่นเรา [2] อีกครั้งที่การสูญเสียลดลงมากยิ่งขึ้น และแบบจำลองก็สามารถให้สีของภาพได้แม่นยำยิ่งขึ้น

สถาปัตยกรรมที่ 6

สถาปัตยกรรมสุดท้ายคือเวอร์ชันเสริมของเคสที่ห้า ซึ่งฉันได้เพิ่มเลเยอร์เพิ่มเติมอีก 2 เลเยอร์ ผลลัพธ์ไม่ได้แตกต่างจากเวอร์ชันก่อนหน้ามากนัก ซึ่งทำให้สถาปัตยกรรมนี้เป็นจุดแวะพักที่ดี พูดตามตรง สถาปัตยกรรมบางส่วน 5 ดีกว่า 6 แต่เนื่องจากอย่างหลังแสดงให้เห็นถึงการโอเวอร์ฟิตที่ต่ำกว่า ฉันจึงเลือกสิ่งนี้เป็นรุ่นสุดท้าย

ผลลัพธ์สุดท้าย

การฝึกอบรมเกี่ยวกับชุดการพัฒนาสำหรับสถาปัตยกรรมที่ 6 ใช้เวลาประมาณ 40 นาทีบน Google Colab Pro GPU และประมาณ 2.5 ชั่วโมงบน CPU i5–[email protected] เนื่องจากข้อจำกัดด้านเวลาและความพร้อมใช้งานของ GPU ฉันจึงถูกจำกัดให้ใช้เฉพาะ CPU ในการฝึกอบรม นั่นคือเหตุผลที่ว่าทำไมสถาปัตยกรรมขั้นสุดท้ายจึงได้รับการฝึกอบรมกับอิมเมจ 2,000 ภาพ ไม่ใช่กับชุดข้อมูลทั้งหมด ดังนั้นฉันจึงฝึกฝนโมเดลนี้เป็นเวลา 300 ยุค โดยมีอัตราการเรียนรู้ 0.001 เป็นเวลา 3 วัน ผลลัพธ์สุดท้ายเป็นที่น่ายินดี เนื่องจากโมเดลนี้ไม่เพียงแต่สามารถใส่สีสันให้กับภาพที่เจอระหว่างการฝึกเท่านั้น แต่ยังรวมถึงภาพที่ไม่เคยเห็นมาก่อนด้วย!

ชุดฝึกซ้อม

ชุดทดสอบ

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

อ้างอิง

(1) Wei Yao, Zhigang Zeng, Cheng Lian, Huiming Tang, การถดถอยแบบพิกเซลโดยใช้ U-Net และการประยุกต์ใช้กับการแพนความคมชัด, Neurocomputing, เล่มที่ 312, หน้า 364–371, ISSN 0925–2312 , 2018.

[2] Chen, Liang-Chieh และ Papandreou, George และ Kokkinos, Iasonas และ Murphy, Kevin และ Yuille, Alan, DeepLab: การแบ่งส่วนภาพเชิงความหมายด้วย Deep Convolutional Nets, Atrous Convolution และ CRF ที่เชื่อมต่ออย่างสมบูรณ์, ธุรกรรม IEEE เกี่ยวกับการวิเคราะห์รูปแบบและความฉลาดของเครื่องจักร, PP, 10.1109/TPAMI.2017.2699184, 2016