ค้นหาภาพในคลิปด้วย
CLIP Model (AI)

หมายเหตุ: บทความนี้แนะนำวิธีการสำหรับเขียนโปรแกรมสำหรับใช้ค้นหารูปภาพหรือฉากที่ต้องการในคลิปวิดีโอ มีจุดประสงค์หลักเพื่อการเรียนรู้และนำไปต่อยอดให้เกิดประโยชน์ เหมาะสำหรับผู้มีพื้นฐานด้านการเขียนโปรแกรม หรือที่มีความสนใจและอยากจะทดลองใช้งาน
การค้นหารูปภาพนั้นมองเผิน ๆ อาจเป็นงานที่ง่าย เพราะเพียงแค่เรามองดูก็จะรู้ได้ว่ารูปไหนคือรูปที่เราต้องการ แต่ในกรณีที่เราต้องการค้นหารูปภาพในคลังรูปขนาดใหญ่ หรือในสมุดภาพที่มีภาพอยู่เป็นจำนวนมากนั้นงานนี้จะกลายเป็นงานที่ยากขึ้นมาทันที โดยเฉพาะกับระบบคอมพิวเตอร์ที่ไม่เข้าใจรูปภาพในแบบที่มนุษย์เห็นและเข้าใจ หากไม่มี Metadata หรือการจัดหมวดหมู่ให้กับรูปภาพเอาไว้ก่อนการที่จะหารูปภาพที่ต้องการจากรูปจำนวนหลายหมื่นรูปนั้นก็แทบจะเป็นไปไม่ได้เลย
เช่นเดียวกันกับการค้นหาฉากที่ต้องการในคลิปวิดีโอ การที่จะเลื่อนหาฉากที่ต้องการดูนั้นเป็นเรื่องยากและยิ่งถ้าคลิปมีความยาวหลายสิบนาทีหรือเป็นชั่วโมงนั้นการเลื่อนหาอาจใช้เวลาเยอะมากกว่าจะเจอหรืออาจจะไม่เจอเลยด้วยซ้ำ ทว่าปัญหานี้สามารถแก้ได้โดยการนำ AI ที่ชื่อว่า CLIP (Contrastive Language–Image Pre-training) เข้ามาช่วย ซึ่งมีวิธีการติดตั้งและใช้งานดังนี้
Installation

ติดตั้งโมเดล CLIP จาก GitHub ของ OpenAI และลง Pytorch เวอร์ชั่น 1.7.1 พร้อม torchvision แบบที่รองรับ GPU และติดตั้ง Plotly สำหรับพล็อต Heatmap
Download CLIP Model

โหลด Weights ของ CLIP และตัว Preprocess สำหรับเตรียมข้อมูลก่อนนำเข้าสู่โมเดล และส่ง Model กับ Preprocess ไปไว้บน GPU
เตรียมข้อมูลสำหรับ Input ให้กับ CLIP

ขั้นตอนนี้จะเป็นการบันทึกแต่ละเฟรมในวิดีโอไว้เป็นรูปภาพ (แปลงจากวิดีโอเป็นชุดรูปภาพจำนวนหลาย ๆ รูปเรียงต่อกัน) เพื่อให้สามารถประมวลผลในลักษณะรูปภาพได้ จากในตัวอย่างจะเป็นคลิปการเล่นบาสของ Professor Live ที่แต่งตัวเป็นซานต้าคลอส ความยาว 3 นาทีกว่า ๆ โดยมีจำนวน Frames (รูป) จำนวน 1346 ภาพที่เราสกัดออกมา

นำรูปภาพทั้งหมดที่มีมาผ่านตัว Preprocess และนำเข้าสู่ส่วน Encoder ของ CLIP เพื่อแปลงเป็นฟีเจอร์ที่โมเดลสามารถรับและนำไปประมวลผลได้ (ในขั้นตอนนี้จะใช้เวลาค่อนข้างนานยิ่งมีจำนวนรูปมากก็ยิ่งนานมากขึ้น)
สร้างฟังก์ชันสำหรับค้นหารูปภาพ

หน้าที่หลักของฟังก์ชันนี้คือรับค่าคำค้นหาที่เป็นข้อความเข้ามาและแปลงเป็นฟีเจอร์จากนั้นจึงส่งเข้า CLIP โมเดล และคำนวณหา Similarity และแสดงผลเป็นฉากที่ตรงกับคำค้นหา พร้อมกราฟ Heatmap (แต่ถ้าไม่ใช่ก็เซต display_heatmap=False ไว้ได้)
ทดลองค้นหาฉากในวิดีโอจากข้อความ



จากรูปแรก (ซ้ายมือ) ค้นหาว่า Santa Claus playing basketball ผลลัพธ์ของ CLIP จะค้นหาให้เป็นรูปซานต้ากำลังเล่นบาสพร้อมบอกว่าอยู่ที่นาทีที่เท่าไหร่ในวิดีโอ โดยสามารถเลือกได้ว่าจะให้โมเดลแสดงผลลัพธ์กี่อันดับแรกออกมา (ในที่นี้เลือกมาแค่ 3 อันดับแรก)
รูปที่สอง (กลาง) ลองระบุว่า Santa Claus walking ก็จะพบรูปซานต้าคลอสกำลังเดินเฉย ๆ แต่ไม่ได้เล่นบาส
รูปที่สาม (ขวามือ) ระบุคำค้นหาที่มีเงื่อนไขมากขึ้นเป็น A man dribble a ball ก็จะค้นเจอรูปภาพเด็กชายกำลังเลี้ยงลูกบาสเกตบอล



ทดสอบค้นหากับวิดีโอที่เป็นเชิง Conceptual เฉพาะอย่าง Dragonball ก็จะเห็นว่า CLIP AI เองก็ยังรู้จักซูเปอร์ไซย่า, โกคูไซย่าบลู, หรือแม้กระทั่งโบรลี่ แสดงให้เห็นว่าโมเดลมีประสิทธิภาพเพียงพอที่จะค้นหาชื่อเฉพาะบางอย่างได้เช่นกัน