- ค้นหาฉากในไฟล์วิดีโอ เช่น วิดีโอจาก dashcam ด้วยภาษาธรรมชาติ และ ตัดช่วงที่ตรงกันออกมาโดยอัตโนมัติ ด้วยระบบ semantic search
- ใช้โมเดล Google Gemini Embedding 2 เพื่อ ฝังตัววิดีโอโดยตรงเป็นเวกเตอร์ และจัดเก็บไว้ใน ChromaDB เพื่อเปรียบเทียบกับ text query ได้โดยตรง
- ใช้ ffmpeg เพื่อ แบ่งวิดีโอเป็นชังก์แบบซ้อนทับกัน แล้วทำ embedding โดยคืนค่าช่วงที่คล้ายที่สุดได้ด้วยความเร็วระดับ ต่ำกว่าหนึ่งวินาที
- มีฟีเจอร์ preprocessing และ skip เฟรมนิ่ง เพื่อลดค่าใช้จ่ายในการเรียก API โดยการทำดัชนีวิดีโอ 1 ชั่วโมงมีค่าใช้จ่ายประมาณ $2.84
- ใช้ ความสามารถในการฝังตัววิดีโอโดยตรงของ Gemini Embedding 2 เพื่อให้ค้นหาเชิงความหมายในวิดีโอความยาวหลายชั่วโมงได้อย่างรวดเร็วโดยไม่ต้องสร้างคำบรรยายอัตโนมัติ
ภาพรวม
- SentrySearch เป็นเครื่องมือสำหรับทำ semantic search กับวิดีโอ dashcam โดยเมื่อผู้ใช้ป้อนคำค้นด้วยภาษาธรรมชาติ ระบบจะส่งคืน คลิปที่ถูกตัดมาแล้ว (trimmed clip) ซึ่งมีฉากนั้นอยู่
- ใช้โมเดล Google Gemini Embedding 2 เพื่อ ฝังตัววิดีโอโดยตรงเป็นเวกเตอร์ และเก็บไว้ในฐานข้อมูลแบบโลคัล ChromaDB
- จากนั้นฝัง text query ลงในเวกเตอร์สเปซเดียวกันเพื่อค้นหาชิ้นส่วนวิดีโอที่คล้ายที่สุด
- ผลการค้นหาจะถูกตัดออกจากไฟล์ต้นฉบับและบันทึกโดยอัตโนมัติ พร้อมความเร็วในการค้นหาระดับ sub-second
วิธีการทำงาน
- วิดีโอจะถูกแบ่งเป็น ช่วงซ้อนทับกัน (overlapping chunks) และแต่ละช่วงจะถูกฝังตัวโดยตรงผ่านโมเดล Gemini Embedding
- เวกเตอร์ embedding แต่ละตัวจะถูกเก็บไว้ใน ChromaDB และเมื่อค้นหา text query จะถูกแปลงไปยังเวกเตอร์สเปซเดียวกันเพื่อทำการจับคู่
- ช่วงที่มีความคล้ายสูงสุดจะถูกตัดออกจากวิดีโอต้นฉบับโดยอัตโนมัติและบันทึกเป็นคลิป
- ใช้ ffmpeg สำหรับการแบ่งและตัดวิดีโอ และหากไม่ได้ติดตั้งในระบบ จะใช้
imageio-ffmpeg โดยอัตโนมัติ
การติดตั้งและการตั้งค่าเริ่มต้น
- ติดตั้งได้บนสภาพแวดล้อม Python 3.10 ขึ้นไปด้วยคำสั่งต่อไปนี้
- หลัง
git clone ให้รัน pip install -e .
- ใช้คำสั่ง
sentrysearch init เพื่อตั้งค่า Gemini API key และบันทึกลงในไฟล์ .env
- ระบบจะทำ test embedding เพื่อตรวจสอบความถูกต้องของคีย์
- หากตั้งค่าด้วยตนเอง สามารถคัดลอก
.env.example แล้วเพิ่ม API key เองได้
คำสั่งและตัวเลือกหลัก
-
index
- สแกนไฟล์
.mp4 แบบ recursive ภายในโฟลเดอร์ที่กำหนดเพื่อทำดัชนี
- แต่ละไฟล์จะถูกแบ่งเป็นหลาย chunk แล้วนำไปทำ embedding
- ตัวเลือก
--chunk-duration : ความยาวชังก์ (หน่วยวินาที)
--overlap : ความยาวช่วงซ้อนทับระหว่างชังก์
--no-preprocess : ข้ามการลดความละเอียดและลดจำนวนเฟรม
--target-resolution : ความละเอียดเป้าหมายระหว่าง preprocessing (ค่าเริ่มต้น 480p)
--target-fps : อัตราเฟรมเป้าหมายระหว่าง preprocessing (ค่าเริ่มต้น 5fps)
--no-skip-still : ทำ embedding ทุกช่วงรวมถึงช่วงเฟรมนิ่ง
-
search
- ตัวอย่าง:
sentrysearch search "red truck running a stop sign"
- ผลลัพธ์จะแสดงพร้อมคะแนนความคล้าย และผลลัพธ์ที่ดีที่สุดจะถูกตัดและบันทึกอัตโนมัติ
- หากคะแนนความคล้ายต่ำกว่า threshold เริ่มต้น (0.35) จะมี prompt ให้ยืนยัน
- ตัวเลือก
--results N : จำนวนผลลัพธ์ที่จะแสดง
--output-dir DIR : พาธสำหรับบันทึกคลิป
--no-trim : ปิดการตัดคลิปอัตโนมัติ
--threshold : ปรับค่า threshold ของความคล้าย
-
stats
- แสดงจำนวนชังก์ที่ถูกทำดัชนีทั้งหมดและจำนวนไฟล์ต้นฉบับ
-
--verbose
- แสดงข้อมูลดีบัก เช่น มิติของ embedding, เวลาในการตอบสนองของ API, คะแนนความคล้าย เป็นต้น
พื้นหลังทางเทคนิค
- Gemini Embedding 2 สามารถ ฝังตัววิดีโอโดยตรง และเปรียบเทียบกับ text query ได้ใน เวกเตอร์สเปซขนาด 768 มิติ เดียวกัน
- ไม่จำเป็นต้องมีขั้นตอนสร้างคำบรรยายหรือ caption จากเฟรมแยกต่างหาก
- ตัวอย่างเช่น text query อย่าง “red truck at a stop sign” สามารถนำไปเปรียบเทียบกับคลิปวิดีโอความยาว 30 วินาทีได้โดยตรง
- ความสามารถนี้ทำให้ ค้นหาเชิงความหมายในวิดีโอความยาวหลายชั่วโมงได้ในระดับต่ำกว่าหนึ่งวินาที
โครงสร้างต้นทุน
- ภายใต้ค่าตั้งต้น (ชังก์ 30 วินาที, overlap 5 วินาที) ค่าใช้จ่ายในการทำดัชนีวิดีโอ 1 ชั่วโมงอยู่ที่ประมาณ $2.84
- Gemini API ประมวลผลเพียง 1 เฟรมต่อวินาทีจากวิดีโอที่อัปโหลด
- กระบวนการ preprocessing จะลดขนาดเป็น 480p, 5fps เพื่อ เพิ่มประสิทธิภาพการส่งข้อมูล และ หลีกเลี่ยง timeout
-
การเพิ่มประสิทธิภาพเพื่อลดต้นทุน
- preprocessing : ลดขนาดข้อมูลที่อัปโหลดและเวลาที่ใช้ส่งข้อมูล
- still-frame skipping : ข้ามการทำ embedding ในช่วงที่ไม่มีการเปลี่ยนแปลงทางภาพ
- มีประโยชน์กับวิดีโอที่บันทึกยาวระหว่างจอดรถ
- search query มีเพียงการทำ text embedding จึงแทบไม่มีค่าใช้จ่าย
- ตัวเลือกเพิ่มเติมสำหรับการปรับจูน
--chunk-duration, --overlap : ปรับจำนวนครั้งในการเรียก API
--no-skip-still : ทำ embedding ทุกชังก์
--target-resolution, --target-fps : ปรับคุณภาพของ preprocessing
--no-preprocess : ส่งชังก์ต้นฉบับโดยตรง
ข้อจำกัดและการปรับปรุงในอนาคต
- การตรวจจับเฟรมนิ่ง ใช้วิธี heuristic ที่อิงกับการเปรียบเทียบขนาดไฟล์ JPEG จึงอาจพลาดการเคลื่อนไหวเล็กน้อยหรือรวมช่วงนิ่งผิดพลาดได้
- คุณภาพการค้นหาขึ้นอยู่กับขอบเขตของชังก์ หากเหตุการณ์คร่อมอยู่ระหว่างสองชังก์ อาจจับได้ไม่สมบูรณ์
- ในอนาคตสามารถปรับปรุงได้ด้วยการแบ่งชังก์ตาม scene detection
- Gemini Embedding 2 ยังอยู่ในขั้น preview และพฤติกรรมของ API รวมถึงราคาอาจเปลี่ยนแปลงได้
ความเข้ากันได้และข้อกำหนด
- ทำงานกับไฟล์วิดีโอทุกชนิดที่เป็นรูปแบบ
.mp4 และ ไม่ได้จำกัดเฉพาะวิดีโอ Tesla Sentry Mode
- ค้นหาไฟล์
.mp4 ทั้งหมดแบบ recursive โดยไม่ขึ้นกับโครงสร้างโฟลเดอร์
- ข้อกำหนด
- Python 3.10 ขึ้นไป
- ต้องติดตั้ง
ffmpeg (หรือใช้ imageio-ffmpeg อัตโนมัติ)
- ต้องมี Gemini API key (ขอคีย์ฟรีได้ที่: aistudio.google.com/apikey)
1 ความคิดเห็น
ความเห็นจาก Hacker News
รู้สึกว่าวิธีการติดตั้งใช้งานแบบนี้เจ๋งมากอยู่จริง ๆ ถึงตอนนี้ embeddings ก็ยังมีส่วนที่ให้ความรู้สึกเหมือนเวทมนตร์อยู่
แต่สิ่งที่กังวลที่สุดคือเทคโนโลยีแบบนี้อาจพาไปสู่ สังคมเฝ้าระวัง ในโลกจริง
ตอนนี้มีกล้องอยู่มากมายก็จริง แต่ในทางปฏิบัติเป็นไปไม่ได้เลยที่มนุษย์จะดูภาพทั้งหมดได้ จึงยังพอมีความไม่เปิดเผยตัวตนและความเป็นส่วนตัวเหลืออยู่บ้าง
แต่ถ้า AI สามารถวิเคราะห์วิดีโอทั้งหมดแบบเรียลไทม์ และตรวจจับบุคคลหรือพฤติกรรมที่ต้องการด้วยภาษาธรรมชาติได้ การเฝ้าระวังแบบเบ็ดเสร็จ (panopticon) ก็อาจกลายเป็นความจริง
แม้จะมีการใช้งานเชิงบวกอย่างการตรวจจับอาชญากรรมหรือตรวจจับการหกล้ม แต่ถ้าไม่มีการกำกับดูแล ผลลัพธ์ก็น่าจะอันตรายมาก
เขาบอกว่ามันรวมระบบกล้องหลายแบบ, ALPR และสัญญาณเตือนไว้ด้วยกัน และยัง ค้นหาวิดีโอด้วยภาษาธรรมชาติ ได้ด้วย
ต่อไปก็มีแผนจะรวมกล้องที่ประชาชนติดตั้งเองด้วย สุดท้ายถ้าเชื่อมกับบริการอย่าง Citizen app โลกที่กล้องของเพื่อนบ้านเชื่อมตรงเข้าระบบตำรวจอาจมาถึงจริงก็ได้
เป็นทิศทางที่น่ากังวลมาก
เพราะงั้นผมคิดว่าสำคัญมากที่จะประมวลผลเรื่องพวกนี้ด้วย โมเดลโลคัล เพื่อไม่ให้วิดีโอถูกส่งออกไปภายนอก
แต่โดยรวมแล้วทิศทางของเทคโนโลยีนี้ต้องคิดกันอย่างรอบคอบ
ปัญหาจะเกิดเมื่อมีการติดตั้งใช้งานในวงกว้างแบบ Flock หรือ Ring หรือในกรณีที่บริษัทเดียวเข้าถึงวิดีโอทั้งหมดได้
ดูเหมือนว่า AI แบบมัลติโหมด จะก่อให้เกิด การแข่งขันทางอาวุธ ระหว่างการตรวจจับโฆษณากับการแทรกโฆษณา
ก่อนหน้านี้ผมเคยลองใช้โมเดลก่อน Gemini มาทดลองลบโฆษณาด้วย AI และเทคโนโลยีครั้งนี้ก็ดูทรงพลังขึ้นมาก น่าจะระบุโฆษณาแล้วปิดเสียงหรือลบออกได้แทบจะทันที
สรุปการทดลองที่เกี่ยวข้องไว้ ที่นี่
สุดท้ายแล้วโฆษณาคงไม่หายไป ผู้ให้บริการ AI อาจรับ whitelist โฆษณา หรือแย่กว่านั้น AI อาจ โปรโมตสินค้าที่เป็นโฆษณา เสียเอง
เมื่อไม่กี่เดือนก่อนผมซื้อ กล้องติดรถ Rexing มา แต่เข้าถึงวิดีโอได้ลำบากมาก เลยคิดจะสร้างระบบเอง
เป้าหมายคือให้ค้นดูและดาวน์โหลดวิดีโอได้โดยไม่ต้องถอด SD card
ตอนที่กำลังเลื่อนดูวิดีโอที่อัดไว้ก็คิดขึ้นมาว่า “ถ้าค้นหาฉากนี้ด้วย ภาษาธรรมชาติ ได้ก็คงดี” พอเห็นโปรเจกต์นี้แล้วก็อยากเอาไปใช้ทันทีเลย
ขอบคุณที่แชร์
สงสัยว่าเอาเทคโนโลยีนี้ไปใช้กับ ซอฟต์แวร์ตัดต่อวิดีโอ ได้ไหม
เช่น ในปลั๊กอินของ Premiere แค่บอกว่า “ลบทุกฉากที่มีแมวออกให้หน่อย” แล้วมันสร้าง EDL (Edit Decision List) ให้อัตโนมัติ
SentrySearch คืนค่า in/out timestamp ที่แม่นยำสำหรับคำค้นด้วยภาษาธรรมชาติได้อยู่แล้ว และยังตัดคลิปอัตโนมัติด้วย ffmpeg ด้วย
การต่อยอดไปเป็น EDL หรือปลั๊กอินของ Premiere จึงเป็นพัฒนาการที่เป็นธรรมชาติ
ผมไม่ใช่ผู้เชี่ยวชาญ Premiere แต่ถ้ามีใครลองทำ ตัวส่งออก EDL หรือปลั๊กอิน ผมยินดีช่วยรีวิวและรวม PR ให้
ถ้าเริ่มทำแล้วอยากให้แจ้งผ่าน GitHub issue
สงสัยว่าสิ่งนี้ทำงานบน โมเดลโลคัล ได้หรือเปล่า
นอกจากกล้องติดรถแล้ว ยังน่าสนใจสำหรับการใช้งานแบบ เฝ้าระวังในบ้าน ด้วย
ถ้าเลื่อนไปมาหน่อยก็หาช่วงประมาณ 30 วินาทีที่มีคนเดินเข้ามาหน้าประตูได้ไม่ยาก
ผมเคยเสียเวลาหลายชั่วโมงไล่ดูวิดีโอเพื่อเช็กว่าแมววิ่งออกไปตอนประตูเปิดหรือเปล่า สุดท้ายมันแค่ซ่อนอยู่ในบ้าน
ผมเองก็กำลังทำ โปรเจกต์ embeddings อยู่ แต่ยังเป็นแค่ต้นแบบ
ของผมไม่ได้ใช้ Gemini แต่กำลังทำ reverse connections สำหรับเกมพัซเซิลแบบเชื่อมโยง
ดูเพิ่มเติมได้ ที่นี่
ผมเห็นส่วนโค้ดที่ใช้ “ตรวจว่าชิ้นส่วนวิดีโอส่วนใหญ่เป็นเฟรมหยุดนิ่งหรือไม่” แล้วคิดว่าถ้าใช้ select และพารามิเตอร์ scene ของ ffmpeg ร่วมกันก็น่าจะจัดการอัตโนมัติได้
ผมทำงานอยู่ในสาย content/video intelligence
Gemini เป็นเครื่องมือที่เหมาะกับ use case แบบนี้มากจริง ๆ
ผมหัวเราะตอนเห็นเดโมค้นหาว่า “ตอนที่มีรถคันหนึ่งปาดหน้าผมตอนกลางคืน โดยมีที่วางจักรยานติดอยู่ด้านหลัง”
เดาว่านั่นน่าจะเป็น แรงจูงใจที่แท้จริง ของการทำโปรเจกต์นี้