[ Thomson Reuters Intern AI Project] ทำระบบ Automated Video Tagging โดยใช้ Face Recognition

Miw Nuntida
4 min readApr 17, 2018

--

สวัสดีค่ะทุกคน วันนี้เราจะมาเล่าให้ทุกๆคนฟังเกี่ยวกับโปรเจคที่เราทำระหว่างการฝึกงาน(สหกิจศึกษา) เป็น Developer กับ Reuters Software (Thailand) Ltd. ซึ่งจากระยะเวลาการฝึกงานทั้งหมด 5–6 เดือนหรือตลอดทั้งเทอมการศึกษานั้น ตอนนี้เราได้ดำเนินมาจนถึงครึ่งทางแล้ว เลยอยากจะมาเล่าให้ฟังกันนะคะว่าได้ทำอะไรไปบ้าง

สาขาในประเทศต่างๆของ Thomson Reuters ค่ะ

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

โดยก่อนการเริ่มงาน พี่ๆจะมีการพูดคุย สอบถามความสนใจและความถนัดต่างๆ เพื่อเลือกโปรเจคที่เหมาะสมและเมื่อเราได้ให้คำตอบไปว่ากำลังสนใจเรื่อง AI และ Machine Learning จึงทำให้ได้มาซึ่งโปรเจคนี้ค่ะ(แสดงว่ามีโปรเจคให้เลือกทำหลากหลายด้านมากทีเดียว *0*) โดยโปรเจคที่เราได้ทำมีชื่อว่า Automated video tagging system using facial recognition หรือ ระบบติดแท็กวิดีโออัตโนมัติโดยอาศัยการจดจำใบหน้า

WHAT’S THE PROBLEM?

Hashtag (แฮชแท็ก)

อย่างที่กล่าวไปแล้วว่ารอยเตอร์เป็นสำนักข่าวรายใหญ่ ทำให้บริษัทมีข้อมูลข่าวสารต่างๆเข้าออกเป็นจำนวนมาก จึงต้องมีกระบวนการในการจัดการกับภาพและวีดีโอข่าวตามมา กระบวนการหนึ่งในการจัดระเบียบข้อมูลก็คือการติดแท็ก(Tagging) หรือที่หลายๆคนน่าจะรู้จักกันดีอยู่แล้วจากการเล่น Social media นั่นก็คือการใส่ #(Hashtag) ให้กับคำหรือ keyword ต่างๆ เพื่อจัดกลุ่มและรวบรวม content ที่เป็นเรื่องเดียวกันไว้

ปัจจุบันการติดแท็กให้กับวีดีโอข่าวต่างๆของบริษัทเป็นทำแบบ Manual และด้วยปริมาณข่าวจำนวนมาก ทำให้ใช้เวลาไปไม่น้อยเลย จึงเกิดเป็นความต้องการที่จะพัฒนา Software เพื่อติดแท็กวีดีโอข่าวให้กับเราได้แบบอัตโนมัติขึ้นมา โดยใน phase แรกของงานนี้ที่เราได้รับมอบหมาย จะเป็นการมุ่งเน้นไปที่การติดแท็กใบหน้าบุคคลต่างๆในข่าว ทำให้เราต้องศึกษาและนำระบบจดจำใบหน้า หรือ Face recognition เข้ามาเป็นพระเอกในการทำโปรเจคครั้งนี้นั่นเอง

Flow การทำงานอย่างง่ายๆของระบบแท็กวิดีโอ

Face Recognition คือ ระบบที่นำใบหน้าที่ตรวจจับได้ มาประมวลผลและเปรียบเทียบกับฐานข้อมูลใบหน้าที่มีอยู่แล้ว เพื่อทำการระบุตัวตน

อ่านความหมายกันเท่านี้หลายคนอาจจะยังมึนๆงงๆใช่ไหมคะ แต่ที่จริงแล้ว Face Recognition เป็นเทคโนโลยีที่ทุกคนคุ้นเคยกันดี เพราะมันถูกนำมาใช้อยู่รอบๆตัวเราโดยที่เราไม่รู้ตัว ตัวอย่างง่ายๆเลย คือ ระบบติดแท็กใบหน้าเราและเพื่อนๆบน Facebook ที่เดี๋ยวนี้พอเราลงรูปปุ๊บ เจ้าFacebook มันก็บอกได้ทันทีว่าใครเป็นใคร หรืออีกตัวอย่างหนึ่งที่เป็นที่ฮือฮากันอย่างมากในช่วงที่ผ่านมา ก็คือ feature ‘Face ID’ ของ Iphone X ที่จดจำใบหน้าของเจ้าของเครื่องไว้และใช้ในการปลดล็อคเครื่องแทนการใส่รหัส (เป็นไงคะ พอจะเห็นภาพกันแล้วใช่ไหมเอ่ย? :D )

HOW TO DO IT?

เทคโนโลยีต่างๆที่ต้องนำมาใช้ในการทำ Face Recognition

ในการพัฒนาระบบจดจำใบหน้านี้จะต้องใช้เทคโนโลยีการประมวลผลภาพ (Image processing) ในการจัดการกับรูปภาพให้มีความเหมาะสมกับการประมวลผล, การเรียนรู้เชิงลึก (Deep learning) ที่พยายามเรียนรู้วิธีการแทนข้อมูลอย่างมีประสิทธิภาพ เพื่อแทนข้อมูลจากใบหน้า และใช้การเรียนรู้ของเครื่อง (Machine learning) ในการแยกเอกลักษณ์ใบหน้าและระบุตัวตน ซึ่งในงานนี้ของเรา จะถือเป็น Machine Learning ประเภท Supervised Learning ค่ะ (รายละเอียดด้าน Technical ถ้ามีคนสงสัยเราจะลงลึกให้ในอีกบทความนึง ในบทความนี้เราจะขอเน้นที่ตัวงานที่เราทำก่อนนะคะ)

ซึ่งแต่ละอย่างที่กล่าวมานั้นก็แยกย่อยออกไปเป็นอีกหลากหลายวิธีด้วยกัน เราจึงต้องมาทำการคัดเลือกกันค่ะ ว่า algorithm ตัวไหนเหมาะสมที่จะใช้กับข้อมูลของบริษัทมากที่สุด โดยในการคัดเลือกนี้ จะมีทั้งการใช้ Framework, Library, Tool ที่เป็น Open source และ Commercial API สำเร็จที่มาจากผู้ให้บริการต่างๆซึ่งต้องเสียค่าใช้จ่ายในการดึงมาใช้ มาดูกันว่าผู้เข้าชิงของเรามีใครกันบ้าง

อัลกอริทึมและAPI ที่จะนำมาทดสอบเพื่อคัดเลือกมาใช้

ก่อนอื่นต้องขออธิบายก่อนว่าการเลือก algorithm ต่างๆมาทดสอบ เราเลือกจากการหาข้อมูลและส่วนใหญ่แต่ละตัวจะมีเปเปอร์อ้างอิงในการนำมาใช้พัฒนาระบบจดจำใบหน้ากันอยู่แล้วนะคะ ส่วนในด้านของ Commercial API เราและทางทีมเลือกมาจากตัวที่มี Feedback ดีทั้งด้านประสิทธิภาพและการ Support ค่ะ ส่วนเรื่องราคาก็นำมาเป็นหนึ่งใน Factor ในการคัดเลือกต่อไป

START!

Collect a dataset from Media Express

ฐานข้อมูล Media Express ของ Thomson Reuters

Media Express คือฐานข้อมูลวิดีโอข่าวของบริษัททอมสันรอยเตอร์ ซึ่งเราจะนำมาใช้เป็นข้อมูลในการทดสอบ

เนื่องจากระบบแท็กวีดีโอที่เราจะทำนั้นก็ต้องใช้ข้อมูลจาก Media Express เช่นกัน ข้อมูลในการทดสอบคัดเลือกอัลกอริทึมจึงควรจะเป็นข้อมูลจากแหล่งเดียวกันด้วย แต่ในการสอนเครื่องให้เรียนรู้และจำแนกใบหน้า เราจำเป็นต้องมีรูปภาพของบุคคลนั้นๆและ Label กำกับว่าเป็นรูปของใคร ทำให้เราจะใช้วีดีโอไปสอนตรงๆไม่ได้ เราจึงต้องมาจัดเตรียมข้อมูลกันก่อนค่ะ

เราทำการเขียนโปรแกรมภาษา Python เพื่อ Capture วิดีโอจากฐานข้อมูลที่มีและทำการจัดรวมเป็น Dataset ในการทดสอบ โดยจะได้เป็นข้อมูลภาพบุคคลจำนวน 30 ชุดเพื่อนำไปสอน(Training) เครื่องให้เรียนรู้และจำแนกใบหน้า

ภาพบุคคลจำนวน 30 ชุดที่จะใช้เป็น Training set

จากนั้นได้ทำการเก็บข้อมูลวิดีโอข่าวและสัมภาษณ์จำนวน 10 วิดีโอ เพื่อเป็นข้อมูลในการ ทดสอบ(Testing) อัลกอริทึมต่างๆรวมถึง API ที่เราต้องการคัดเลือก

วิดีโอจำนวน 10 วิดีโอที่จะใช้เป็น Testing set

Commercial API Testing

เมื่อได้ Dataset ที่แน่นอนแล้ว เราจึงเริ่มที่การดึง API มาทดสอบกันก่อนเลยค่ะ เราเขียนโปรแกรมภาษา Python ในการ capture วิดีโอเช่นเดียวกับตอนเก็บข้อมูล แต่คราวนี้ capture วิดีโอที่ใช้ทดสอบแทน และส่งภาพแต่ละ frame ของวีดีโอไปโดย POST method จะได้ Response กลับมาในรูปแบบของ JSON ค่ะ ซึ่งแน่นอนว่า Response ของแต่ละ API ก็จะแตกต่างกันไป ต้องนำมาจัดการกันอีกที เพื่อดึงเอาเฉพาะข้อมูลที่เราต้องการออกมาแสดง

Output ที่ได้จากการดึงข้อมูลมาแสดงร่วมใน frame วิดีโอ

สุดท้ายเราจะนำข้อมูลที่ได้ออกมาแสดงร่วมกับ frame วิดีโอที่เรา capture ออกมาได้เป็นลักษณะนี้ค่ะ คือแสดงกรอบรอบใบหน้าที่ API detect ได้และใส่ชื่อและค่าความมั่นใจ(Confidence) ในการทำนายใบหน้าเพื่อให้ง่ายต่อการตรวจสอบ

แต่แค่นั้นยังไม่เพียงพอ เพราะในการทดสอบนี้เราจะใช้จำนวนเป็นตัววัดผล เราจึงทำการ crop ใบหน้าที่มีค่าความมั่นใจ (Confidence) มากกว่าค่า Threshold ที่ตั้งไว้และเก็บแยกไว้ใน folder ของแต่ละบุคคล

Folder คัดแยกใบหน้าที่มีค่า Confidence มากกว่าค่า Threshold

เท่านี้ก็จะง่ายต่อการนับจำนวนและตรวจสอบความถูกต้องในการทำนายบุคคลของแต่ละ API แล้วค่ะ

Using Dlib and SVM

Dlib คือ C++ library ซึ่งมี Machine learning algorithms และ เครื่องมือต่างๆในการสร้างโปรแกรมที่ซับซ้อน อย่างระบบการจดจำใบหน้าก็มี moduleไว้ให้ใช้เช่นเดียวกัน

ในการพัฒนา Face recognition system ด้วยวิธีนี้ หลักๆเราศึกษามาจากบทความ Machine Learning is Fun! Part 4: Modern Face Recognition with Deep Learning (ใครสนใจ ตามไปศึกษาและลองทำกันได้เลยนะคะ เขียนอธิบายไว้ละเอียดและเข้าใจง่ายมากๆ) ซึ่งเราก็ศึกษาและนำมาปรับใช้ให้เข้ากับข้อมูลที่เรามีอีกทีนึง มาเริ่มกันเลยดีกว่า

Pipeline คร่าวๆในการสร้าง Classifier Model

เรามาเริ่มที่ขั้นตอนแรกคือ การตรวจจับใบหน้า (Face Detection) ขั้นตอนนี้จะใช้อัลกอริทึม Histogram of Oriented Gradients (HOG) ซึ่งเป็นอัลกอริทึมการคัดแยกลักษณะเฉพาะของวัตถุที่สนใจออกจากพื้นหลัง โดยอาศัยการเปรียบเทียบ Histogram ของ Vector ที่ได้จาก Gradients point ในแต่ละบล็อคของรูป ซึ่งการตรวจจับใบหน้าด้วยวิธีดังกล่าวสามารถเรียกใช้ฟังก์ชันจาก library Dlib ได้เลยค่ะ

การแทนรูปภาพด้วย Vector ของ HOG และผลการตรวจจับใบหน้า

เมื่อได้รูปใบหน้ากันแล้วต่อมาเราจะต้อง จัดวางใบหน้า (Face alignment) เพื่อให้ใบหน้าเหมาะสมแก่การนำไปวิเคราะห์ต่อ เนื่องจากใบหน้าที่ได้มาจากการตรวจจับจะไม่ใช่ใบหน้าตรงเสมอไป ดังนั้นจึงต้องมีการจัดวางใบหน้า เช่น การหมุนหรือปรับขนาด ให้ใบหน้าที่ได้ใกล้เคียงหน้าตรงมากที่สุด ซึ่งเราใช้โมเดลในการตรวจจับ 68 จุดสำคัญบนใบหน้า และนำมาจัดวางโดยใช้ function จาก Dlib เช่นเดียวกันค่ะ

ภาพก่อนและหลังการจัดวางใบหน้า

ต่อมาเพื่อให้ได้ตัวชี้วัดของใบหน้าแต่ละใบหน้าออกมาใช้ในการเปรียบเทียบและจำแนก เราจะต้องทำการดึงข้อมูลใบหน้า (Face Extraction)โดยใช้ model ที่ train โดย Deep Convolution Neural Network ด้วย 27 Convolution layers และใบหน้าในการ train จำนวนกว่า 3ล้านใบหน้า โดยโมเดลนี้จะให้ตัวชี้วัดของใบหน้าแต่ละใบหน้าออกมาเป็นชุดตัวเลข 128 ตัว

ขั้นตอนการดึงและจัดเก็บข้อมูลใบหน้า

เมื่อได้ตัวชี้วัดใบหน้า (Face Descriptor) จากฐานข้อมูลใบหน้า 30 คนที่เก็บมาแล้ว ทำการ Train model โดยใช้ Linear SVM classifier โดย Input เป็น ข้อมูลตัวชี้วัดใบหน้า (Face Descriptor) พร้อมกับ ชื่อ (Label) ของคนนั้นๆเก็บเป็นไฟล์ CSV และได้ Output ออกมาเป็น model ไฟล์ Python pickle (.pkl)

Flow ของ Machine learning (รูปจาก A Practical Introduction to Deep Learning with Caffe and Python)

จากภาพ flow การทำ Machine learning จะเห็นว่าเราผ่าน Training phase เรียบร้อยแล้ว ได้ model ที่เป็นตัว classifier ออกมา จากนั้นเรามาทำ Prediction phase กันค่ะ โดยใช้ model ที่ได้จำแนกใบหน้าจากวิดีโอทดสอบที่เตรียมไว้ทั้ง 10 วิดีโอ การทดสอบก็เขียนโปรแกรมในลักษณะเดียวกันกับที่เราใช้ทดสอบ API ซึ่งจะทำการ capture วิดีโอและส่งเป็น frame ไปหาใบหน้าที่ปรากฏในแต่ละ frame นั้น

ตัวอย่าง Output ที่ได้จาก Prediction phase ซึ่งจะเห็นว่ายังมีการ Detect ใบหน้าผิดที่และค่า Confidence ในการทำนายใบหน้ายังไม่สูงมากนัก

จากนั้นทำการเก็บภาพใบหน้าที่มีค่าความมั่นใจ (Confidence) ในการระบุตัวบุคคลมากกว่าค่า Threshold ที่ตั้งไว้แยกเป็น Folder เพื่อให้ง่ายต่อการวัดผลเช่นเดียวกับตอนทดสอบ API

CONCLUSION

และทั้งหมดนี้ก็คืองานทั้งหมดที่เราได้ทำมาจนถึงตอนนี้ค่ะ ต่อไปเราก็จะพัฒนา Face recognition system อีก 2 ตัวด้วยวิธีที่ต่างกันไปและทำการวัดผล คัดเลือกตัวที่จะนำมาใช้ในระบบแท็กวิดีโอกับพี่ๆในทีมต่อไป (เรียกได้ว่าสนใจอะไรก็ได้ทำกันแบบ Full course ไปเลย 55555) แล้วเดี๋ยวเราจะมาอัพเดตให้ฟังกันต่อนะคะ ว่าตัวอื่นๆนั้นมีขั้นตอนการพัฒนาอย่างไรและสุดท้ายแล้วผลของแต่ละตัวเป็นยังไงกันบ้าง

หวังว่าบทความนี้จะเป็นประโยชน์กับคนที่กำลังสนใจเทคโนโลยีทางด้าน Data science อยู่หรือน้องๆเพื่อนๆที่กำลังมองหาที่ฝึกงานกันอยู่คงจะได้เห็นภาพงานที่ได้ทำกับ Thomson Reuters กันมากขึ้น (ถ้ามีคนสนใจเดี๋ยวเราจะมาเขียนรีวิวเรื่องบรรยากาศและเรื่องอื่นๆทั่วๆไปในการฝึกงานให้อีกทีนะคะ ^^)

ถ้าทุกคนมีข้อสงสัย สอบถามกันเข้ามาได้เลยนะคะ บทความนี้คงต้องลากันไปเท่านี้ก่อน (นี่เป็นบทความแรกของเราเลย หากมีส่วนไหนผิดพลาดไปต้องขออภัยด้วยนะคะ) แล้วรอติดตามกันต่อกับบทความหน้าด้วยน้าาา สวัสดีค่า~

--

--

Miw Nuntida

Software Developer | ComEn KKU51 | Machine Learning and AI enthusiast | DREAMER