![](https://static.wixstatic.com/media/292978_1932fbfbf59f49a2ac059a64d61ede88~mv2.jpg/v1/fill/w_980,h_600,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/292978_1932fbfbf59f49a2ac059a64d61ede88~mv2.jpg)
ความทรงจำดี ๆ แม้จะเป็นสิ่งล้ำค่าที่เราอยากจะกรอซ้ำกลับไปดูใหม่ให้ชื่นใจบ่อย ๆ แต่ในความเป็นจริงแล้วเหตุการณ์ที่น่าจดจำแต่ละอย่างล้วนเกิดขึ้นได้เพียงแค่ครั้งเดียว การเก็บภาพถ่ายของแต่ละเหตุการณ์ไว้จึงเป็นวิธีที่จะพาเราย้อนเวลากลับไปหาความทรงจำนั้นอีกครั้ง
และเมื่อเดือนธันวาคมปีที่ผ่านมา Google Photos ได้เปิดตัวเทคโนโลยีใหม่ล่าสุด ช่วยคืนชีวิตให้เหตุการณ์ในภาพถ่ายของเราอีกครั้งด้วยฟีเจอร์ Cinematic photos ที่จะช่วยทำให้พื้นหลังของภาพเคลื่อนไหวได้ด้วยการใส่เอฟเฟ็กต์สามมิติ เปิดโอกาสให้เราได้ดื่มดำกับช่วงเวลาดี ๆ ผ่านภาพถ่ายเหล่านั้นในแบบที่สมจริงกว่าเดิม
ถึงแม้ว่าภาพถ่ายของเราจะมีลักษณะเป็นสองมิติ แต่ Google Photos ก็จะเลือกภาพที่มีคุณสมบัติสามารถปรับพื้นหลังให้เป็นสามมิติได้และปรับให้เราเองโดยอัตโนมัติ เราไม่ต้องทำอะไรเลยแค่เพียงอัปเดตแอปพลิชันให้เป็นเวอร์ชันล่าสุดรอไว้ก็พอ
หลายคนคงสงสัยว่า Google Photos ใช้เทคโนโลยีอะไรในการเปลี่ยนภาพสองมิติให้เคลื่อนไหวแบบสามมิติได้ วันนี้ Sertis เอาข้อมูลเทคโนโลยีเบื้องหลังฟีเจอร์ Cinematic photos สุดล้ำมาฝากทุกคนแล้ว ไปศึกษากันได้เลย เผื่อจะได้ไอเดียดี ๆ ไปพัฒนาเทคโนโลยีใหม่ ๆ ที่ว้าวกว่าเดิม
![](https://static.wixstatic.com/media/292978_c57038cee87a4cfd8b4739e80b79251e~mv2.jpg/v1/fill/w_980,h_980,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/292978_c57038cee87a4cfd8b4739e80b79251e~mv2.jpg)
เริ่มเปลี่ยน 2D ให้เป็น 3D ด้วย Depth estimation
ถ้าหากเราทำภาพแบบ Cinematic ผ่านกล้องสมาร์ทโฟนโดยเป็นการเริ่มถ่ายใหม่ ไม่ใช่การนำภาพที่มีอยู่แล้วมาปรับ เราสามารถใช้เทคโนโลยีที่เรียกว่า Multi-view stereo ซึ่งเป็นการใช้ภาพหลาย ๆ ภาพ จากหลาย ๆ มุมมาสร้างเป็นภาพแบบ Cinematic ได้ แต่สำหรับฟีเจอร์ Cinematic ของ Google Photos นี้เป็นการเปลี่ยนภาพที่ถ่ายมาแล้วจากกล้องธรรมดาให้กลายเป็นภาพสามมิติ จึงต้องใช้สิ่งที่เรียกว่า Depth map หรือภาพที่บอกข้อมูลความลึกของภาพ ซึ่งจะช่วยในการเพิ่มคุณสมบัติแบบสามมิติให้ภาพถ่ายของเรา และทำให้สามารถสร้างภาพที่พื้นหลังขยับได้ในแบบของ Cinematic photos ทีมนักพัฒนาได้อาศัยความช่วยเหลือจากโครงข่ายประสาทเทียมแบบ Convolutional neural network ซึ่งทำงานร่วมกับโครงสร้างแบบเข้ารหัสและถอดรหัส (Encoder-decoder architecture) เพื่อจำลองและคาดคะเน Depth map จากภาพที่อยู่ในอัลบั้มรูปของผู้ใช้งาน ซึ่งภาพที่ถ่ายเก็บไว้นั้นแม้จะเป็นภาพ RBG ธรรมดาภาพเดียวก็สามารถใช้ประมวลผลได้ โดยการจะสร้างภาพที่เป็นสองมิติภาพเดียวให้ออกมาในรูปแบบสามมิติ ต้องอาศัยการประเมินความลึกของภาพผ่านการมองแบบใช้ตาข้างเดียว (Monocular cue) กล่าวคือ เอไอจะเรียนรู้การมองในแบบเดียวกับสายตามนุษย์ ซึ่งโดยปกติแล้วการที่มนุษย์จะเห็นภาพเป็นสามมิติได้นั้นต้องอาศัยการมองด้วยสองตา (Binocular cue) ถ้าหากมองด้วยตาเดียวจะเห็นภาพเป็นสองมิติเท่านั้น แต่การมองด้วยตาเดียวก็ยังคงสามารถคาดคะเนความลึกของภาพด้วยการดูขนาดของวัตถุในภาพ การดูแนวเส้น และการสังเกตความเบลอของภาพ ซึ่งโครงข่ายประสาทเทียมก็สามารถใช้การมองแบบตาข้างเดียวนี้ในการคาดคะเนความลึกของภาพสองมิติได้ ในส่วนของการสอนโมเดล Convolutional neural network ให้จำลอง Depth map นั้น แม้จะมีชุดข้อมูล (Dataset) แบบ Monocular depth estimation ที่มีอยู่แล้ว แต่เนื่องจากชุดข้อมูลนั้นได้รับการออกแบบมาเพื่อใช้กับเทคโนโลยีเช่น AR หุ่นยนต์ และรถยนต์ขับเคลื่อนอัตโนมัติโดยเฉพาะ ซึ่งจะทำงานได้ดีมากกับภาพแบ็คกราวน์เช่น ถนน ห้อง แต่สำหรับภาพถ่ายทั่วไปที่มีภาพของคน สัตว์ สิ่งของนั้นมีองค์ประกอบของภาพและเฟรมภาพแตกต่างกันก็อาจใช้งานชุดข้อมูลที่มีอยู่แล้วได้ไม่ดีเท่า ด้วยเหตุนี้ทาง Google จึงออกแบบชุดข้อมูล Monocular depth estimation ขึ้นมาใหม่โดยเฉพาะ โดยใช้ข้อมูลภาพถ่ายจากอุปกรณ์ Custom 5-camera rig และชุดข้อมูลจากภาพถ่ายแบบ Portrait จากกล้อง Pixel 4 ที่มีข้อมูล Ground-truth depth จาก Multi-view stereo ข้อมูลเหล่านี้เป็นข้อมูลที่สำคัญมากในการเทรนโมเดล โดยการรวมชุดข้อมูลหลายชุดเข้าด้วยกันนั้นเปิดโอกาสให้โมเดลได้เรียนรู้จากภาพพื้นหลังหลายแบบที่มาจากกล้องหลาย ๆ รุ่น ซึ่งช่วยให้โมเดลคาดคะเนความลึกของภาพได้ดีขึ้น ความท้าทายอีกอย่างที่เกิดขึ้นคือ การใช้ข้อมูล Ground-truth depth จากชุดข้อมูลหลาย ๆ ชุดนั้นมีปัญหาเรื่องค่า Scaling factor และ Shift ที่ไม่สามารถระบุได้ ทำให้อาจมีค่าที่แตกต่างกันโดยทีเราไม่รู้ แต่เนื่องจากการจำลองภาพแบบ Cinematic นั้นต้องการค่าความลึกของวัตถุในรูปแบบคร่าว ๆ เท่านั้น ไม่ได้ต้องการค่าที่ตรงเป๊ะ ทำให้ทีมสามารถรวมชุดข้อมูลเข่้าด้วยกันด้วยการใช้ฟังก์ชันแบบ Scale-and-shift-invariant loss ก่อนในขณะที่เทรนโมเดลแล้วจึงค่อยทำการปรับบรรทัดฐานข้อมูล หรือ Normalise ในขั้นตอนที่โมเดลทำการคาดคะเนข้อมูล การทำภาพแบบ Cinematic นั้น ปัจจัยสำคัญคือการแยกตัวคนออกจากพื้นหลังซึ่งเป็นส่วนที่จะเคลื่อนไหว ทำให้ต้องคำนึงถึงความแม่นยำของ Depth map บริเวณกรอบส่วนที่เป็นรูปร่างของคนเป็นอย่างมาก หาก Depth map ในส่วนนี้ผิดพลาดอาจทำให้รูปวัตถุในภาพที่ประมวลผลออกมาในตอนท้ายเกิดความคลาดเคลื่อน หรือที่เรียกว่า Artifact ได้ ทีมพัฒนาจึงใช้การกรองข้อมูลภาพแบบ Median filtering เพื่อเพิ่มความแม่นยำบริเวณกรอบรูปตัวคน รวมถึงใช้คาดคะเนสัดส่วนตัวคนในภาพแต่ละภาพแบบ Segmentation mask ด้วยการใช้โมเดลแบ่งสัดส่วนจาก DeepLap ซึ่งจะใช้ชุดข้อมูล Open Images ในการเทรนโมเดล หาก Depth map คาดคะเนส่วนของตัวบุคคลผิด การแบ่งสัดส่วนนี้จะช่วยดันพิกเซลส่วนที่ Depth map คำนวณพลาดไปออกมาจากพื้นหลัง ทำให้รูปคนถูกแยกออกจากพื้นหลังได้อย่างสมบูรณ์
![](https://static.wixstatic.com/media/292978_b91c4131c502404b9409a3ec50c5a960~mv2.jpg/v1/fill/w_980,h_980,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/292978_b91c4131c502404b9409a3ec50c5a960~mv2.jpg)
2. สร้าง Mesh จาก Depth image
ขั้นตอนแรกในการสร้างภาพจำลองสามมิตินั้นคือการสร้าง Mesh (วัตถุสามมิติ) ด้วยการขึ้นรูปภาพ RGB หรือภาพถ่ายของเราบนพื้นผิวของภาพ Depth map แต่กระบวนการนี้จะทำให้จุดแต่ละจุดบน Mesh นั้นมีความลึกที่แตกต่างกันมาก ซึ่งความแตกต่างนี้อาจเห็นไม่ชัดเท่าไหร่นักหากมองจากมุมตรง แต่เมื่อเราขยับภาพให้เคลื่อนไหวในแบบของการเคลื่อนกล้องเสมือนจริง อาจจะเห็นความลึกที่ไม่สม่ำเสมอ ทำให้เวลาแปลงไฟล์ออกมาในขั้นสุดท้ายแล้วจะให้ความรู้สึกเหมือนว่าองค์ประกอบในภาพถูกดึงยืดออกไป ดังนั้นความท้าทายหลักในการสร้างภาพจำลองแบบเคลื่อนไหวได้ก็คือการหามุมกล้องที่เห็นความ Parallax (ภาพพื้นหลังกับวัตถุในภาพมีตำแหน่งเหลื่อมกัน) ในขณะที่องค์ประกอบในภาพถูกยืดน้อยที่สุด
![](https://static.wixstatic.com/media/292978_f5cbe2539da44992939193f59c2b7951~mv2.jpg/v1/fill/w_980,h_980,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/292978_f5cbe2539da44992939193f59c2b7951~mv2.jpg)
3. วางกรอบภาพโดยเน้นส่วนสำคัญ (Salient region)
ขั้นตอนต่อมาคือการวางกรอบภาพ โดยทั่วไปแล้วภาพพื้นหลังในภาพสามมิติที่จำลองขึ้นจะไม่พอดีกับกรอบสี่เหลี่ยมผืนผ้าแนวตั้งที่กำหนดไว้ โดยอาจมีความกว้างหรือความยาวมากกว่า ทำให้ทีมนักพัฒนาต้องหาวิธีปรับกรอบของภาพที่ได้ให้มีอัตราส่วนที่เหมาะสม ในขณะที่ยังคงรักษาส่วนสำคัญของภาพไว้ได้ ทีมนักพัฒนาได้เลือกใช้ Deep neural network ที่คาดการณ์ค่า Saliency หรือค่าความเด่นของภาพในแต่ละพิกเซลของภาพเต็มทั้งภาพ เมื่อจัดเฟรมกล้องเสมือนจริงในแบบสามมิติ โมเดลจะระบุบริเวณที่เป็นส่วนสำคัญของภาพ หรือ Salient region ให้ได้มากที่สุด และในขณะเดียวกันก็จะตรวจเช็คว่า Mesh ที่ประมวลผลออกมานั้นแสดงผลครบในทุกเฟรมของวิดิโอ แต่ก็ทำให้มีบางครั้งที่ตัวโมเดลต้องลดขอบเขตของการมองเห็นของกล้อง (Field of view) ลงเช่นกัน
![](https://static.wixstatic.com/media/292978_08ec5a8e9e9840b89105e7f88313b12f~mv2.jpg/v1/fill/w_980,h_980,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/292978_08ec5a8e9e9840b89105e7f88313b12f~mv2.jpg)
4. เลือกมุมกล้องที่ตอบโจทย์เพื่อลด Artifact
ในการสร้างภาพจำลองแบบสามมิติขึ้นมาใหม่จะค่อนข้างทำได้อย่างมีอิสระมาก จะสร้างให้ขยับไปในทิศทางใดก็ได้ สำหรับฟีเจอร์ Cinematic นี้ ทางทีมพัฒนาได้แรงบันดาลใจมาจากภาพเคลื่อนไหวที่ได้จากอุปกรณ์ Video camera rig ซึ่งเป็นเหมือนกล้องวิดีโอที่ยึดโยงอุปกรณ์หลายตัวเข้าหากัน ทำให้ภาพเคลื่อนไหวที่ได้มีความนิ่ง เสถียร และเลือกจุดหมุนที่เหมาะสมที่สุดเพื่อให้การขยับภาพพื้นหลังทำได้เสมือนจริง และช่วยดึงดูดสายตาคนให้โฟกัสที่คนหรือวัตถุในภาพ
ความท้าทายหลักของขั้นตอนนี้คือการเลือกมุมกล้องที่เหมาะสมกับแต่ละภาพ เนื่องจากรูปภาพของผู้ใช้มีความหลากหลาย และมีสเปกตรัมที่กว้าง ทำให้การจำลองภาพสามมิติก็จะแตกต่างกัน และไม่สามารถใช้วิถีกล้องแบบเดียวสำหรับทุกรูปได้ นอกจากนี้ยังมีปัจจัยเรื่อง Artifact ในรูปภาพที่เกิดจากขั้นตอนการสร้าง Mesh ซึ่งการเลือกมุมกล้องที่ตอบโจทย์จะช่วยแก้ปัญหาเรื่อง Artifact ได้
ทีมพัฒนาจึงใช้วิธีกำหนดฟังก์ชันแบบ Loss function ที่จะเป็นตัวคาดการณ์ว่าในขั้นสุดท้ายนั้นวัตถุในภาพจะถูกยืดหรือที่เรียกว่าเกิด Artifact ไปมากแค่ไหน ซึ่งวิธีนี้ช่วยให้เราปรับใช้พารามิเตอร์ที่เหมาะสมกับแต่ละรูปได้ โดยฟังก์ชันจะทำงานโดยโฟกัสไปที่พื้นที่ที่มีจำนวนพิกเซลของ Artifact อยู่หนาแน่นแทนที่จะใช้วิธีนับจำนวนพิกเซลทั้งหมดที่เป็น Artifact ตามแบบดั้งเดิม ทำให้นักพัฒนาจะสังเกตเห็น Artifact ได้ง่ายขึ้น
ทีมพัฒนาได้ใช้การ Segmentation mask แบบ Padding ในการแบ่งสัดส่วนรูปร่างคนในภาพออกจากกันเป็น 3 ส่วน ได้แก่ส่วนหัว ส่วนลำตัว และพื้นหลัง ซึ่ง Loss fuction ในสามส่วนนี้จะถูก Normalise หรือปรับบรรทัดฐานข้อมูลก่อนที่จะนำไปคำนวณ Final loss ให้ออกมาเป็นผลรวมน้ำหนักของ Loss ที่ผ่านการ Normalise แล้ว ซึ่งตามหลักการแล้ววิดีโอที่ได้ควรจะไม่มี Artifact แล้ว แต่ในทางปฏิบัติจริงนั้นเป็นไปได้ยาก การให้น้ำหนักในแต่ละส่วนแตกต่างกันจึงจะช่วยให้เอไอมีวิธีคิดที่เอนเอียงไปสู่การเลือกวิถีกล้องที่ไปเน้นตรวจจับ Artifact ที่พื้นหลัง แทนที่จะเน้นส่วนที่เป็นตัวคน ทำให้ภาพที่ออกมานั้นไม่ไปเน้นที่ความผิดพลาดในจุดตัวคนซึ่งเป็นจุดโฟกัสของภาพ
ด้วยความช่วยเหลือจากอัลกอริธึมของแมชชีนเลิร์นนิงที่ใช้ในการประเมินภาพต่าง ๆ ทำให้ทีมพัฒนาสามารถสร้างฟีเจอร์ Cinematic Photo ที่ประมวลผลภาพของผู้ใช้ที่มีความหลากหลายและแตกต่างกันมากในเรื่ององค์ประกอบภาพได้สำเร็จ เปิดโอกาสให้เราได้กรอซ้ำความทรงจำดี ๆ ของเราผ่านฟีเจอร์นี้อีกครั้ง
Comments