ตัวอย่างการใช้ DeepFake ในแง่สร้างสรรค์
ตัวอย่าง Video DeepFake ในการแข่งขัน credit ให้เจ้าของ channel youtube คร้าบ
ไอเดียการสร้างสร้างโมเดล “Face Forensic” เพื่อจำแนก DeepFake Video
สวัสดีครับเพื่อนๆ ในคราวก่อนเราได้พูดถึงเรื่องการแข่งขัน DeepFake ซึ่งเราต้องสร้างโมเดลเพื่อตรวจจับ “วิดิโอปลอม” ที่มีการเปลี่ยนใบหน้าหรือคำพูดของผู้อยู่ในวิดิโอ
จากที่ได้แลกเปลี่ยนความรู้กับเพื่อนๆ บน Kaggle พบว่า ในงานนี้คนส่วนใหญ่ออกแบบโมเดลบนแนวคิดพื้นฐานที่เรียกว่า “Face Forensic” หรือการ “ชันสูตรใบหน้า” นั่นเองครับ ไอเดียของ Face Forensic นั้นเรียบง่ายแต่ทรงพลังครับ นั่นคือ ในภาพวิดิโอทั้งหมดนั้น เนื่องจากส่วนที่เปลี่ยนแปลงจะอยู่บนใบหน้าของผู้พูดในวิดิโอเป็นหลักเท่านั้น ดังนั้น แทนที่เราจะให้ input ของโมเดลเป็นภาพทั้งหมดบนวิดิโอ วิธีการ Face Forensic นี้จะใช้โมเดล “Face Detection” เพื่อจับภาพเฉพาะใบหน้าขึ้นมาก่อน แล้วค่อยให้โมเดลเรียนรู้ว่าใบหน้านี้จริงหรือปลอม
ไอเดีย Face Forensic ง่ายๆ นี้พบว่าสามารถเพิ่มความแม่นยำของการใส่ input ลงไปทั้งภาพถึง 10-20% เลยทีเดียว (ดูอ้างอิง 1)
สำหรับการเรียกใช้ Face Detection นั้นสามารถเรียกใช้โมดูลใดๆ ที่มีอยู่แล้วได้ทันที ตัวอย่างหนึ่งคือ MTCNN (Multi-Task Cascaded Convolutional Networks) ซึ่งเป็นโมเดลตรวจจับใบหน้าด้วย Deep Learning และให้ความแม่นยำสูง ซึ่งเรียกใช้ได้ง่ายมากๆ เพียง 1 บรรทัดครับ (รายละเอียดดูอ้างอิง 2)
โดยเรียก initial MTCNN ดังนี้
from facenet_pytorch import MTCNN mtcnn = MTCNN() และเรียกใช้งานเพียง 1 บรรทัด coordinate_list, confidence_list = mtcnn.detect(img)
โดย img คือตัวแปร numpy array 3 มิติของรูปภาพที่ใช้กันทั่วไป และ MTCNN ก็จะให้ค่า list ของ Coordinates (กรอบ x1,y1,x2,y2) ของใบหน้าที่ตรวจจับเจอออกมา (ในกรณีมีหลายใบหน้า ก็จะมีหลาย coordinates) และค่าความมั่นใจ (Confidence) ที่ตรวจพบว่ามั่นใจว่าจะเป็นใบหน้ามากน้อยแค่ไหนครับ (ถ้าความมั่นใจต่ำ อาจจะตรวจจับผิดให้ Coordinate ของสิ่งของในรูปแทนใบหน้าก็เป็นได้)
เมื่อเราเข้าใจแนวคิดพื้นฐานเรื่อง Face Forensic แล้ว การสร้างโมเดลสำหรับวิดิโอนั้นสามารถออกแบบได้หลายแนวคิด เนื่องจากวิดิโอแท้จริงแล้วก็คือรูปภาพหลายๆ เฟรมที่มีความต่อเนื่องกันนั่นเอง ซึ่งแต่ละแนวคิดนั้นสามารถเขียนได้ไม่ยากเมื่อเราใช้ Keras ซึ่งจะทยอยเล่าไอเดียในบทความถัดๆ ไปครับ
อ้างอิง
- Face Forensic Models : https://github.com/ondyari/FaceForensics
- ตัวอย่าง Face Detection หลายวิธีบน Kaggle ซึ่งเพื่อนๆ สามารถทดลองเล่นได้ทันที โดยไม่มีค่าใช้จ่ายใดๆ : https://www.kaggle.com/timesler/comparison-of-face-detection-packages
ไอเดียเพิ่มเติมเกี่ยวกับ DeepFake
ไอเดียการดูว่าภาพไหนเป็น DeepFake
https://medium.com/@jonathan_hui/detect-ai-generated-images-deepfakes-part-1-b518ed5075f4
https://medium.com/@jonathan_hui/detect-ai-generated-images-deepfakes-part-3-9c3fdf97d572
Opensource ที่นิยมใช้ทำ DeepFake
ว่าด้วยเรื่องการทำ Audio DeepFake
DeepFake ที่ใครก็ทำได้ไม่ยากอีกต่อไป
ทีม ThaiKeras จบที่อันดับ 29 ของโลกจาก 2,265 ทีมทั่วโลก ในการแข่งขัน DeepFake ของ Google, Facebook และ Amazon --- มาดูวิธีการออกแบบโมเดลกันครับ
By ThaiKeras 26 เมษายน 2020
สวัสดีครับเพื่อนๆ ในที่สุดการแข่งขัน DeepFake ชิงรางวัล 1 ล้านเหรียญ ก็ได้ข้อสรุปแล้ว และทีมที่ ThaiKeras ของเราเข้าร่วมด้วยได้อันดับที่ 29 ของโลก วันนี้เลยจะขออนุญาตมาแชร์วิธีการออกแบบโมเดล วิเคราะห์ปัญหา การ optimize performance ที่เราได้ใช้ในการแข่งขันครับ
ในการแข่งขันครั้งนี้ผู้เขียนโชคดีมากที่ได้ร่วมงานกับ Data Scientists ที่เก่งมากๆ ที่กระจายกันคนละทวีปนั่นคือจากเยอรมัน บราซิล และนิวซีแลนด์ ทำให้เราเป็นทีม 4 คนจาก 4 ทวีป อย่างไรก็ดีการติดต่อสื่อสารระยะไกลนี้ก็กลายเป็นมาตรฐานในยุค COVID-19 ไปแล้ว
ก่อนอื่นเลยสำหรับเพื่อนๆ ที่อาจยังไม่ทราบรายละเอียดของการแข่งขันนี้ สามารถย้อนกลับไปดูรายละเอียดได้ที่ http://bit.ly/thaikeras-deepfake20 ครับ กล่าวโดยสรุปการแข่งขันครั้งนี้ โจทย์คือการสร้างโมเดลที่สามารถแยกแยะได้อย่างมีประสิทธิภาพว่า วิดิโอไหนเป็นวิดิโอที่ปลอมด้วยเทคนิก DeepFake ซึ่งเป็นภัยคุกคามในโลกอินเตอร์เน็ตนี้ (ดั่งแสดงในรูปด้านบน)
เนื่องจากโปรเจกต์นี้เป็นโปรเจกต์ใหญ่และเพื่อให้โพสต์นี้กระชับเฉพาะไอเดียสำคัญ จึงอาจจะมีลิงก์อ้างอิงไปรายละเอียดเพิ่มเติมมากสักหน่อยนะครับ
การออกแบบโมเดล : FaceForensics
ปัญหานี้ในมุมมองวิศวกรรม ก็คือเราต้องสร้างโมเดลที่รับ input เป็น video และมี output เป็น 0/1 (จริง/ปลอม) นั่นเองครับ โดยไอเดียหลักๆ ที่เราใช้จะเรียกว่า FaceForensics (การชันสูตรใบหน้า) ซึ่งเล่าไปในโพสต์บน วิธีการ FaceForensics นี้จะแบ่งโมเดลออกเป็น 2 ส่วนโดย ส่วนแรกจะเป็นการตรวจจับใบหน้าในวิดิโอ ซึ่งจะเป็นส่วนที่เป็นเป้าหมายสำคัญของ DeepFake และสร้าง input ใหม่ที่มีเฉพาะใบหน้าเท่านั้น และส่วนที่ 2 คือการสร้างโมเดล Classification จาก input ใบหน้า (input ใหม่เหล่านี้)
โดยในส่วนแรกเราก็ได้เจ้าของ GitHub Fast-MTCNN ซึ่งเป็น Face Detector library ที่แม่นยำสูงและรวดเร็วมากๆ (สามารถตรวจใบหน้าได้ถึง 55 frames ใน 1 วินาที) ให้กับผู้เข้าแข่งขันทุกคน (นี่เป็นสเน่ห์ของ Kaggle ที่เราแชร์ความรู้กันข้ามทีมด้วย) รายละเอียดและโค้ดของภาค 1 สามารถดูได้ที่นี่ครับ :
https://www.kaggle.com/timesler/fast-mtcnn-detector-55-fps-at-full-resolution
Levels ของการออกแบบโมเดลในส่วนที่ 2
การออกแบบโมเดลนี้เราออกแบบได้ตั้งแต่ level ตื้นไปจนถึงลึก ซึ่งจะได้ประสิทธิภาพที่ต่างกันครับ
Level1 : โดยมุมมองที่ง่ายที่สุด กํ็คือการมองว่าปัญหานี้คือปัญหา “pure classification” นั่นคือพอเราได้ใบหน้าจากวิดิโอทั้งหมดแล้ว (อาจจะ extract ใบหน้าจากหลายเฟรมใน 1 วิดิโอ) เราก็นำใบหน้าทั้งหมดมารวมกันแล้วแบ่งเป็น training / validation sets แล้วก็ทำการ classification แบบปกติไป
จุดอ่อนสำคัญของการออกแบบแบบนี้คือ “Data Leakage” ซึ่งจะทำให้โมเดลใช้งานไม่ได้จริง ดังที่อธิบายในโพสต์ก่อนหน้าครับ http://bit.ly/thaikeras-on-generalization ทั้งนี้เนื่องจากว่าหลายๆ วิดิโอ Fake นั้นมีต้นกำเนิดมาจาก Video ต้นฉบับเดียวกัน ทำให้หลายๆ วิดิโอที่มาจากต้นฉบับเดียวกันกระจายไปทั้ง train และ valid set และโมเดลเราอาจจะ “จำ” เลยว่าคนไหนจริง คนไหนปลอม ดังนั้นหัวใจหลักของการออกแบบ train/test split คือจะต้องแยกนักแสดงรายคนให้ออกจากกันเด็ดขาดมากที่สุด และวิดีโอของนักแสดงคนใดคนหนึ่งต้องอยู่ใน train หรือ valid test set เท่านั้น (ห้ามกระจายไปทั้งสอง sets)
และ ซึ่งเรื่องนี้ใน context ของ DeepFake เพื่อนบราซิลหนึ่งในทีมของเราได้ถกรายละเอียดที่นี่ครับ : https://www.kaggle.com/c/deepfake-detection-challenge/discussion/126691
อีกเรื่อง leakage ที่หลายทีมผิดพลาดกันมากก็คือการ “ตัดใบหน้า” ในส่วนที่ 1 ที่ตัด background ติดมามากเกินไปนอกจากใบหน้า ทำให้บางครั้งโมเดลไป “จำฉากหลัง” ว่าฉากไหนคือวิดีโอจริง แต่พอไปเจอวิดิโอใหม่ๆ ฉากใหม่ๆ โมเดลนี้ก็จะทำงานไม่ได้เลย
Level 2 : เราสามารถสร้างความท้าทายเพิ่มเติมให้โมเดลได้ด้วยการ “การันตี” ว่าทุก input batch ที่โมเดลต้องเรียนรู้นั้น จะต้องมีทั้ง “ภาพต้นฉบับ (Real)” และ “ภาพที่ปลอมจากต้นฉบับนั้น (Fake)” อยู่ด้วยกันเสมอ (ดูรูปแนบ) ทำให้โมเดลต้องพยายามมากขึ้น ที่จะแยกแยะหน้าที่ใกล้เคียงกันแต่รูปนึงจริง และรูปนึงปลอม
เทคนิกนี้จะคล้ายไอเดียของ Siamese Networks ซึ่งใช้ในงาน Face Recognition ครับ
Level 3 : เราสามารถให้ข้อมูล model เพิ่มเติมเช่นให้ “มิติเวลา” นั่นคือส่ง input หลายเฟรมจาก 1 วิดิโอเข้าไปพร้อมกัน และใช้ LSTM มารวมข้อมูลจาก CNN อีกที ซึ่งโมเดลที่ซับซ้อนแบบนี้สามารถ implement ได้ง่ายๆ บน Keras ครับ
หรือ เราอาจท้าทายโมเดลเพิ่มเติม แทนที่จะให้โมเดลเพียงทำนายว่าเป็น “วิดิโอจริง หรือ ปลอม” เราก็อาจจะบังคับให้โมเดลต้อง “ระบุ” ส่วนที่โมเดลคิดว่า “ปลอม” ออกมาด้วย นั่นคือเราเปลี่ยนปัญหาจาก Classification เป็น Segmentation ครับ ดั่งรูปแรก
Optimize Models
เมื่อเราได้ Model Pipeline ที่พอใจแล้วก็ถึงเวลาที่จะต้องมา optimize เวลาการฝึกสอนโมเดลของเรา เนื่องจากข้อมูลในโจทย์นี้มีปริมาณมหาศาลมากหลายร้อย GB เราจำเป็นต้องหาวิธีการสอนที่เร็วทีสุดที่เป็นไปได้ ซึ่งในเพื่อนนิวซีแลนด์ในทีมของเราได้โชว์การเปลี่ยนโค้ดทั้งหมดของทีมเราให้ใช้งานได้ใน Keras TPU ซึ่งเร็วกว่า GPU ราว 20 เท่า!!! (ทำความรู้จัก GPU และ TPU เบื้องต้นใน https://bit.ly/thaikeras-deeplearning-faq )
ซึ่งจากโค้ดที่่ประสิทธิภาพสูงนี้ทำให้เราสามารถใช้โมเดลที่ดีที่สุดของงาน Computer Vision คือ EfficientNet B5 B6 และ B7 ได้ครับ (ดู EfficientNet เพิ่มเติมที่ : https://bit.ly/thaikeras-architectures)
โดยผลทำนายสุดท้ายที่ทำให้ทีมเราได้อันดับ 29 ของโลกก็คือ การทำนายเฉลี่ยจาก B5, B6 และ B7 3 โมเดลนี้ครับ
โค้ด Keras โมเดลของเราสามารถดูได้ในที่นี่ครับ : https://www.kaggle.com/c/deepfake-detection-challenge/discussion/145965
สำหรับเพื่อนๆที่อยากดูแนวคิดของ Data Scientists ระดับสุดยอดของโลกเพิ่มเติม อันดับ 3 ของโลกได้แชร์ไอเดียไว้ที่นี่ครับ : https://www.kaggle.com/c/deepfake-detection-challenge/discussion/145721