Image transfer Night to Day and Day to Night

Nattakorn Kachainthon
6 min readJun 21, 2022

Author: Nattakorn kachainthon

Statement of problem

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

What causes blurry or dark photos?

สาเหตุของการที่รูปภาพเกิด noise รูปไม่ชัดและมืดนั้นอาจเกิดได้จากปัจจัยเหล่านี้

  • ความไวแสง(ISO) การที่เพิ่ม ISO นั้นจะทำให้ภาพสว่างแต่สิ่งที่ตามมาก็คือ noise
  • F-stop เมื่อค่า F-stop ต่ำรูปจะชัดเพียงที่โฟกัสและสว่าง แต่ถ้าค่า F-stop มากก็จะทำให้ชัดทั้งภาพ แต่ภาพก็จะมืด
  • คุณภาพของกล้องและเลนส์

ซึ่งค่าต่างๆเหล่านี้สามารถตั้งค่าได้แค่เพียงก่อนถ่ายภาพเท่านั้น แต่ถ้าภาพนี้ถูกบันทึกมาแล้ววิธีการแก้ก็จำเป็นที่จะต้องแก้ด้วย software เท่านั้น

วิธีการทำให้สว่างขึ้นโดยการใช้ Light room

ภาพที่ถูกเพิ่มแสงขึ้นแสงในแต่ละระดับ

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

ดั้งนั้นจึงเป็นที่จะต้องใช้ solutionอื่นๆนการแก้ไขปัญหา

Night to day and Day to night with CycleGAN

CycleGAN เป็น model deep convolutional neural network ที่ใช้สำหรับการแปลงภาพเป็นภาพ (image-to-image translation) G(X) → Y โดยในที่นี้ก็คือ การพยายามจะแปลงรูปกลางคืนให้เป็นกลางวัน ซึ่ง CycleGAN ก็จะ training ด้วยภาพ 2 class ก็คือ day , night ซึ่งไม่เป็นจำต้องใช้ paired data แต่สามารถใช้ unpaired data ได้

หลักการของ CycleGAN
Paired vs Unpaired

Architecture

Discriminator

สำหรับ Discriminator networks ผมใช้เป็น PatchGANs 70 x 70 เพื่อจะใช้แยกว่าภาพระหว่างรูปปลอมที่ Generator สร้างขึ้นมากับภาพจริง โดยที่เราจะ feed input เป็นรูปภาพเข้าไปใน network สี่งที่ออกเป็น output ก็จะเป็นความน่าจะเป็นในช่วง (0–1) ระหว่าง real or fake ออกมาเป็น vector 30 x 30 เพื่อบอกความความสัมพันธ์ของ 2 ภาพ

PatchGAN architecture

Generator

ในการ generate รูปภาพด้วยรูปภาพนั้นต้องอาศัยหลักการ Autoencoder ประกอบไป Encoder ใช้ในการ downsampling และ Decoderใช้ในการ upsampling ในส่วนของ transformer เป็น 9 residual block สำหรับ ภาพขนาด 256x256 โดยเมื่อ feed input ภาพกลางคืน 256x256 เข้าไปก็จะได้ output เป็นภาพกลางวัน 256x256 หรือถ้า input ภาพกลางคืนเข้าไปก็จะได้ภาพกลางวันเช่นกัน

G(Night_real) → Day_fake

F(Day_real) → Night_fake

Dataset

scope ของ data set ในการ train CycleGAN dataset มีผลต่อ Style ภาพที่ Generator generate ออกมาค่อนข้างมาก ผมจึงเลือก scope ของ dataset เป็นภาพภายในเมืองหรือถนน

Aachen Day-Night dataset เป็น data set ที่ประกอบไปด้วยภาพกลางวัน 5455 และ กลางคืน 102 ภาพ โดยภาพรวของ data set นี้จะเป็นภาพถ่ายทางเดินและมีตึกอาคาร ตอนกลางคืนก็ค่อนข้างมีแสงไฟและมี noise น้อย

Aachen Day-Night

เมื่อดูอัคตราส่วนเห็นได้ว่า dataset ไม่สมดุลเป็นเป็นอย่างมากเราจึงเป็นต้องหา Dataset เพิ่ม

Day-night Dataset kaggle

สำหรับ Dataset นี้เป็นภาพ time lapse จาก 17 สถานที่จำนวน 1722 ภาพ RGB โดยรวมส่วนมากจะเป็นภาพที่ถ่ายจากมุมสูงที่มุมกล้องเดิมของช่วงเวลาต่างๆ

Mapillary Vistas Dataset

Mapillary Vistas Dataset เป็น Dataset ความละเอียดสูง จำนวน 25,000 ภาพ เป็นภาพที่ถ่ายจากมุมกล้องหน้ารถ ซึ่งจริงแล้วมัน Dataset สำหรับทำ instance -segmentation แต่เนื่องทำ CycleGAN จึงจะใช้เพียงรูปภาพที่มีให้

sample images from Mapillary Vistas Datast

แต่ข้อมูลไม่มี labels ที่บอกเวลาหรืออย่างอื่นที่บอกได้เลยว่าแต่ละรูปนั้นเป็นกลางวันหรือกลางคืนผมจึงใช้วิธีการสำรวจข้อมูลด้วยตาแบบ manual ก็พบว่าใน Dataset นี้เป็นภาพกลางวันโดยประมาณ 99 % ผมจึงจะถือ Dataset เป็น Dataset ภาพกลางวัน

Day time and Night time road Images

เป็น Dataset ของภาพที่ถ่ายด้วยมุมกล้องหน้ารถ เป็นภาพต่อเนื่อง จำนวน 31,567 ภาพ โดยมีภาพกลางวัน 14,607 ภาพ และ กลางคืน 16,960 ภาพ ซึ่ง Dataset ค่อนข้างสมดุล

Dataset Night city image

เป็น Dataset ของภาพถนนในตอนกลางคืน จำนวน 4200 ภาพ ซึ่งมีคุณภาพความชัดที่ดีและมี noise น้อย

แต่คุณภาพของรูปภาพในตอนกลางคืนมี noise จากทั้งความมืดและฝนตกจนทำให้ดูไม่รู้เรื่อง

Dataset selection

สุดท้ายนั้นผมได้เลยเลือก Dataset จาก Mapillary Vistas Dataset เป็น Dataset ของภาพกลางวันและ Dataset Night city image เป็น dataset ของภาพกลางคืน

A = day | B =Night

spilt data ออกมาได้ตามนี้

trainA = 2500 images

trainB = 2500 images

testA = 600 images

testB = 600 images

Training

ในการ Train CycleGAN โดยมี Generator 2ตัว ประกอบไปด้วย G(Night) day เป็น model ที่รับ input เป็นภาพตอนกลางคืนแล้วต้องเรียนรู้ที่จะแปลงภาพให้ใกล้เคียงภาพตอนกลางวันมากที่สุด และ F(day) night ก็เป็น model ที่พยายามที่จะเปลี่ยนภาพกลางวันเป็นกลางคืน ผมของใช้ code จากGitHub ซึ่งเป็น opensources จาก paper ของ CycleGAN

Loss function

Adversarial Loss We apply adversarial losses to both mapping func- tions. For the mapping function G : X → Y and its dis- criminator DY , we express the objective as

Cycle Consistency Loss สามารถใช้เพื่อแก้ปัญหาที่เป็น unpaired dataset ด้วยการ loss จาก real image กับ reconstructed image

Full object

เมื่อนำ loss รวมกันก็จะได้สมการเต็มๆแบบนี้ซึ่งจะเอา loss ที่ได้ไป update weight ของ model

เมื่อได้ส่วนประกอบต่างๆครบแล้ว มาเริ่ม train กันเลย

learning = 0.0002

lambda_A = 10.0

lambda_B = 10.0

BATCH_SIZE = 1

epoch = 55

ผลการ generate ในระหว่าง train จำนวน 55 epoch

History loss

หลังจาก training เสร็จก็จะเอา model ไป ทดสอบกับข้อมูลที่ model ไม่เจอมาก่อน

Test

ผลการทดสอบด้วย Test set ของการ generate night to day โดยที่ข้างบนเป็นภาพ fake_Day ที่ Generator สร้างขึ้นและข้างเป็น ภาพกลางคืนจริงๆ

Error analysis

โดยรวม model สามารถแปลงภาพให้เหมือนกลางวันหรือกลางคืนได้แล้ว แต่ยังไม่สามารถเพิ่มรายเอียดที่ขาดหายไปได้อย่างถูกต้อง ความถูกต้องในที่นี้หมายการที่ model ไม่เพิ่มหรือลบวัตถุหรือสิ่งต่างที่มาจากภาพ input ซึ่งผมได้จัดกลุ่มรูปแบบต่างๆในการแปลงภาพไว้หลักๆ ดั้งนี้

ตัวอย่างภาพที่

จะเห็นได้ว่า ภาพจริงนั้นจะมีสะพานอยู่แต่ ภาพที่ generate ขึ้นได้ลบสะพานให้กลายเป็นท้องฟ้า ผมคิดว่าน่าจะเกิดจากการที่สะพานอยู่ซ้อนทับกับท้องฟ้าเลยอาจทำให้ model คิดว่าสะพานเป็นส่วนหนึ่งของท้องฟ้า

ตัวอย่างภาพที่ F(Day) → Night แล้วเกิดดวงไฟขึ้นภายในภาพ

อีกรูปแบบหนึ่งที่เจอบ่อยในการ generate ภาพกลางคืน F(Day) -> Night คือในภาพมักจะมีดวงไฟเกิดในจุดที่ไม่น่ามีเสาไฟหรือหลอดไฟตรงนั้น ผมคิดว่าอาจเกิดจากการที่ใน Dataset มี ภาพที่เป็นแสงไฟจากเมืองรถค่อนข้างมาก จึงอาจทำให้ model bias ได้

Feed random noise to Generator

ผมได้ลองใส่ค่า random values 256 x 256 ลงไปใน models ทั้งสอง

นี้คือผลที่ได้

จากผลลัพธ์ที่ได้จากการ feed noise ลงเหมือนจะเห็น style ภาพที่ model ทั้งสอง generate ออกมาได้อย่างชัดเจน

Metrics

ผมใช้ FID score (Fréchet inception distance) ในการวัดคุณภาพ ในการ generate ภาพ FID score วัดได้โดยการนำรูปที่ generate หลายๆรูปกับภาพจริงจำนวนเท่ามาโยนเข้า inception v3 แล้วนำ distribution ของภาพจริงและภาพที่ generate มาเทียบกัน โดย FID ยิ่งน้อยเท่าไรก็นิ่งดีเท่านั้น

FID model generate night to day 600 images

FID model generate day to night 600 images

เมื่อนำ FID ที่ได้จาก model ทั้งสองมาเปรียบเทียบกันจะเห็นได้ว่า FID ของ model day to night น้อยกว่า night to day เป็นเพราะการเปลี่ยนภาพกลางวันเป็นกลางคืนนั้นเป็นการลดรายละเอียดของภาพซึ่งทำได้ง่ายกว่า night to day ที่เป็นการเพิ่มรายละเอียดของภาพ

Conclusion

โดยสรุปแล้วถึงแม้ว่า model จะไม่ได้สามารถเพิ่มรายละเอียดของภาพได้อย่างถูกต้องและชัดเจนมากนัก แต่ก็สามารถเปลี่ยนแสงเงาหรือจะเป็นท้องฟ้าได้ค่อนข้างดูเหมือนจริง ซึ่งยังสามารถพัฒนาไปได้อีกมาก เช่น การ เพิ่ม Dataset resolution หรือการทำให้สามารถใช้ได้แบบ real time ก็ตาม

Deployment

เมื่อ train และ test model จนพอใจแล้วผมก็นำไป deploy ลง Streamlit เป็น web app ให้ทุกคนสามารถเข้าไปเล่นกันได้

Deploy_link: Streamlit

คำขอบคุณถึงโครงการ AI Builders

สุดท้ายแล้วผมก็ขอบคุณ โครงการดีๆ สำหรับชมรมคนชอบ AI อย่าง AI Builders กับเวลา 10 สัปดาห์จากที่ตอนแรกผมเข้ามาแบบไม่ค่อนรู้อะไรเท่าไรแต่ก็ได้คำแนะจาก Mentor พี่พี และ พี่โอ็ต หรือ Mentor จากกลุ่มอื่นๆกับเพื่อนที่ได้เข้ามาพูดคุยและเปลี่ยนกันหรือติดปัญหาก็ช่วยเหลือกันได้ตลอด ผมชอบคำว่า “ไม่มีคำถามที่โง่” ไม่ว่าจะมีคำถามอะไรพวกพี่ก็พร้อมที่จะตอบ หลายๆครั้งก็ช่วยอ่าน paper ยากๆให้ สำคัญที่สุดคือประสบการณ์และ “conection” ที่ได้ทำให้ค่ายจบลงแล้วก็จริงแค่ก็คงสนิทแบบนี้ต่อไป

References

Github: TENet1010/cycleGAN0-night2day: — GANnight2day (github.com)

Social link:

(8) Ten Nattakorn | Facebook

TENet1010 (Ten) (github.com)

Gmail : Nattakorn2713@gmail.com

--

--