Prehaircut

2110433 Computer Vision Term Project

Team BLANK

Tananan Tangthanachaikul

Nattapong Ousirimaneechai

Naphan Benchasattabuse

Orakanya Gateratanakul

โปรเจคเราทำอะไร?

เราอาจประสบปัญหาที่เวลาต้องการตัดผมแล้วเราไม่สามารถคาดคะเนได้ว่าทรงผมใดเหมาะกับรูปหน้าเรา โปรเจคนี้จึงเอาความรู้ทางด้าน Computer Vision มาใช้ในการช่วยสร้าง 3D Model จากรูปภาพสองรูป คือรูปภาพด้านหน้า และรูปภาพด้านข้าง นำมาสร้างเป็นโมเดลสามมิติ ที่สามารถนำทรงผมไปใส่ได้ในภายหลัง

Project's Objective

ศึกษาการทำ 3D Reconstruction จากภาพใบหน้า 2D จำนวน 2 รูป

ศึกษาการสร้าง model ศีรษะมนุษย์ โดยใช้สำหรับเป็นโครงสร้างต้นแบบ

ศึกษาการทำ detect ใบหน้าและดวงตา จาก Algorithm ของ Haar Cascade และเลือกไฟล์ .xml ที่เหมาะสม ในการ detect ส่วนประกอบของหน้าทั้งหน้าตรงและหน้าข้าง

ศึกษาการ Filter noise ด้วย Gaussian blur และการเกลี่ยนสีภาพด้วย Median blur

ศึกษาการ segment ส่วนภาพด้วยสี และ การปิดช่องโหว่ของส่วนภาพด้วยการทำ morphology

ศึกษาการหา height map / depth map จากภาพ 2D

นำสิ่งที่ศึกษามาประกอบกันให้ได้แอพพลิเคชั่นตามวัตถุประสงค์ที่วางไว้

Theories and Techniques

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

การสร้าง 3D model ในวิธีที่ทางทีมได้เลือกใช้นั้น ประกอบไปด้วยส่วนสำคัญ 3 ส่วนดังนี้

1.สีพื้นผิวของใบหน้าของศีรษะที่ต้องการจะแสดง (Texture Image)

2.การสะท้อนแสงของศีรษะที่ต้องการแสดง (Specular Image)

3.ระยะความสูงต่ำบนใบหน้าของศีรษะที่ต้องการแสดง (Bump mapping Image)

โดยในส่วนที่1 ทางทีมได้ทำการรับภาพจากผู้ใช้มาจำแนกใบหน้าออกจากภาพด้วย Haar Cascade algorithm และ ทำการลบฉากหลัง และ เส้นผม โดยการทำ segmentation โดยใช้สีในปรภูมิ HSV ซึ่งค่าที่ใช้จำแนกนั้น เลือกมาให้เหมาะกับสีผิวของคนไทยเป็นส่วนใหญ่ ต่อมาหลังจาก segmentation ใบหน้าได้บางส่วนแล้ว ทางทีมได้ทำการ morphology เพิ่มเติมเข้าไป เพื่อเป็นการรวมใบหน้าทั้งหมดที่ไม่ใช่สีเดียวกับผิวหนัง เช่น คิ้ว ตา รูจมูก และ ปาก เป็นต้น ต่อมา ทางทีมได้ทำการนำภาพข้างมาทำวิธีเดียวกัน และได้ เพิ่มการตรวจจับพิกัดดวงตาจากภาพขึ้นมา โดยให้ texture ผลลัพธ์ที่ได้เกิดจากการนำภาพข้าง1ภาพ มา mirror เป็น2ภาพ เป็นภาพซ้ายและขวาของใบหน้า และนำภาพหน้าตรงไปวางทับภาพหน้าข้าง โดยให้ตำแหน่งของดวงตาอยู่ในตำแหน่งเดียวกัน

Texture ที่ได้จากโปรแกรม

ในส่วนที่ 2 ทางทีมพิจารณาแล้วพบว่า การสะท้อนแสงของ model ต้นแบบ กับใบหน้าที่รับมามีค่าความสะท้อนแสงได้ใกล้เคียงกัน จึงได้ใช้ค่าจาก model ต้นแบบแทนที่จะใช้ค่าจริง ในการสร้าง model

ในส่วนที่ 3 เนื่องจากทางทีม เห็นว่าความสูงของหน้าในส่วนที่สำคัญมีเพียงด้านหน้าตรงเท่านั้น เพราะความสูงในภาพด้านข้าง มีความใกล้เคียงกับ model ต้นแบบเป็นส่วนใหญ่ จึงทำการหา height map จากภาพหน้าตรงเท่านั้น โดยได้ใช้ความรู้ในด้านการทำ Stereo Image ในการนำภาพหน้าตรง 1 ภาพ มาหาภาพใบหน้าที่เหลื่อมกัน 5 pixel จากภาพต้นฉบับ ใช้แทนภาพจากกล้อง 2กล้องแทน โดยความหวังว่าจะได้ผลลัพธ์ที่ใกล้เคียงกัน และได้ทำการหา disparity map จากภาพ2ภาพ เพื่อใช้เป็น height map ของรูปใบหน้าต้นฉบับ

Height Map ที่ได้จากโปรแกรม

Demo

ในการ demo application ข้างต้น ทางทีมจะขอนำเสนอตัวอย่างโปรแกรมและฟังก์ชั่นหลักในการทำงานเท่านั้น ยังมิใช่ ตัว application จริงแต่อย่างใด โดยเพื่อเป็น concept ให้ผู้อื่นได้นำไปพัฒนาต่อยอดจนออกมาเป็น application ที่สามารถใช้งานได้จริง และ เพื่อนำมาส่งเป็น Final Project ในวิชา Computer Vision เท่านั้น โดยในส่วนตัวอย่างโปรแกรมนั้นจะทำงานบน Console โดยที่รับ Input เข้ามาสองค่าคือรูปภาพหน้าตรง กับรูปภาพหน้าด้านข้าง ซึ่งเขียนด้วยภาษา C++ และได้ใช้ Library ของ OpenCV ในการ implement ตัวระบบฟังก์ชั่นหลักต่างๆของการแปลงภาพ โดยหากโปรแกรมทำงานได้สำเร็จ (Detect เจอหน้าทั้งสองข้าง) ก็จะแสดงผลว่า Reconstruction Completed จากนั้นก็เปิดไฟล์ชื่อ 3dreconstruction.html ที่อยู่ในโฟลเดอร์ WebGL เพื่อดูผลลัพธ์ที่ได้ ซึ่ง implement โดยใช้ Library ของ Three.js และ OpenGL ในการ Render 3D model ออกมารันผ่าน Web Browser ได้ดังภาพที่ปรากฎ

Result





We Are Not Perfect

รูปใบหน้าด้านข้างบางครั้งไม่สามารถตรวจพบส่วนประกอบของใบหน้าได้ จำเป็นต้องถ่ายใหม่

ตำแหน่งของดวงตามักตรวจสอบได้ผิดตำแหน่ง หรือ ตรวจสอบไม่เจอ

เนื่องจากต้นแบบใบหน้า 3D นั้นเป็นใบหน้าของชาวต่างชาติ จึงทำให่้เวลาทำ mapping อาจทำให้ส่วนประกอบของใบหน้าอยู่ผิดตำแหน่งไป

Height Map มีความไม่เนียนสวย และมี error เกิดขึ้นสูงทำให้ผิวใบหน้าที่ออกมาเป็น หลุม หรือ ขรุขระ

ทิศทางแสงมีผลต่อสีผิวทั้งใบหน้า โดยเฉพาะบริเวณขอบของรูปหน้าตรงกับหน้าด้านข้าง

But there is the way we can make an improvement

พัฒนาตัว Classification ใบหน้า และ ดวงตา ให้มีประสิทธิภาพมากยิ่งขึ้น เพื่อลดการถ่ายภาพใหม่ของผู้ใช้เมื่อไม่สามารถตรวจสอบหาใบหน้าและดวงตาได้เจอ

พัฒนาให้ Model ตันแบบ 3D สามารถปรับและเปลี่ยนแปลงแบบอัตโนมัติให้เข้ากับใบหน้าของ ผู้ใช้งานได้ โดย มีแนวคิดหนึ่งคือมี Model ไว้หลายๆแบบ และใช้การ Train ให้สามารถเลือก model ที่เข้ากับรูปใบหน้าที่เป็น Input ได้

พัฒนาการทำ Height Map ให้สามารถสร้างผิวที่เนียนได้โดยอาจจะใช้ component อื่นๆเช่น Specular Lighting ช่วยในการประมาณ Depth หรือใช้ภาพในหลายทิศทาง มากขึ้น แต่แลกกับการที่ผู้ใช้จะวุ่นวายกับจำนวนมุมที่ต้องถ่ายมากขึ้นเช่นกัน

พัฒนาตัว Detect ทิศทางแสงจากภาพ และ Filter สีเพื่อเกลี่ยความเข้มสีให้เท่ากันทั้งใบหน้า

พัฒนาตัวอย่างโปรแกรมดังกล่าวข้างต้นให้สามารถออกมาเป็น Application ที่ใช้งานได้จริง