ตรวจจับความรุนแรงด้วย Video Classification

Chinavat Nachaithong
4 min readJun 21, 2022

ถึงแม้ว่าในปัจจุบันเทคโนโลยีหรือ องค์ความรู้ต่างๆจะพัฒนาไปไกลกว่าแต่ก่อนมาก แต่ถึงกระนั้นเราก็ยังพบการทำร้ายร่างกาย ใช้อารมณ์รุนแรง และ พบเหตุทะเลาะเบาะแว้งตามข่าวเป็นเรื่องปกติ. ซึ่งก็มีผู้ที่เสียชีวิตลงไม่น้อยเลยที่ถูกเป็นเหยื่อจากการใช้ความรุนแรงเหล่านี้

มันก็ดีไม่น้อยเลยใช่ไหมครับ? ถ้าสมมติว่าเราสามารถที่จะตรวจจับความรุนแรงในระหว่างเกิดเหตุหรือ หลังจากเกิดเหตุได้ไม่นาน แล้วแจ้งเหตุไปยังเจ้าหน้าที่ในบริเวณ เพื่อเข้าควบคุมพื้นที่ในบริเวณนั้นได้อย่างรวดเร็ว เพื่อที่จะลดความเสียหายที่อาจเกิดขึ้นในภายหลัง

ด้วยเหตุผลนี้เองผมจึงมีความคิดที่จะสร้าง Violence Detection ซึ่งผมเองก็จะเล่าเรื่องราว หลักการทำงานของมันผ่านบทความนี้ให้ผู้อ่านได้ศึกษา และ ผู้ที่สนใจสามารถนำไปพัฒนาต่อยอดได้นั้นเอง

เราจะตรวจจับความรุนแรงยังไง?

สิ่งที่มนุษย์สามารถอธิบายได้ว่าบริเวณด้านหน้านั้นมีคนกำลังชกต่อยกันอยู่รึป่าว? สิ่งนั้นก็คือ “ภาพ” มนุษย์เห็นภาพแล้วจึงตัดสินว่าตรงด้านหน้าเขาถัดไป 15 เมตรกำลังมีวัยรุ่น 3 คนชกต่อยกันอยู่

หลักการคล่าวๆ คือเราจะส่งภาพไปให้ Deep learning เรียนรู้ว่าภาพตรงหน้านั้นมีความรุนแรงหรือไม่

ซึ่งวิธีที่ดีในการจัดการกับรูปภาพนั้นก็คือ CNN (Convolutional Neural Network) แต่ปัญหาคือ ลองจินตนาการว่าเราส่งภาพคนที่กำลังตีลังกากลับหลังให้โมเดลเรียนรู้ เราส่งภาพ 1ms แรกตั้งแต่คนๆ นั้นกำลังกระโดดตีลังกากลับหลังจน 1ms สุดท้าย โมเดลเราจะเรียนรู้ว่าการที่คนกำลังย่อ (เตรียมกระโดด) ในช่วงแรกของการตีลังกา มันคือท่าตีลังกา ฟังดูเหมือนไม่ใช่ปัญหาใช่ไหมครับ

แต่เมื่อเราลองส่งภาพคนกำลังทำท่าลุกนั่ง โมเดลเราก็จะคิดว่าคนนั้นกำลังตีลังกาน่ะสิครับ 😆 มันกลับกลายเป็นปัญหา Action Recognition แทน

LSTM (Long-Short Term Memory)

LSTM (Long-Short Term Memory)

LSTM เข้ามามีบทบาทอย่างมากในการแก้ปัญหา Action Recognition เพราะโมเดลไม่อาจเรียนรู้เพียงภาพแค่เฟรมเดียวได้ (Single frame) แต่โมเดลนั้นต้องการที่จะเรียนรู้ลำดับ (Sequence) ของมัน ซึ่ง LSTM ค่อนข้างตอบโจทย์ในส่วนของตรงนี้

หลักการทำงานของมันคือ

  1. เราจะอ่านค่าของภาพ (Features Extraction) โดยใช้ VGG16
  2. Loop ทั้งวิดีโอแล้วเก็บค่าที่ได้ไว้
  3. เมื่อครบ 20 เฟรม ให้โมเดล LSTM ทำนายว่าภายในระยะเวลา 20 เฟรมนั้นมีความรุนแรงเกิดขึ้นหรือไม่
Author pch.vector

ก่อนที่จะดึง Features จากเฟรมต่างๆ เราจะต้องแตกเฟรมออกมาจากวิดีโอซะก่อน ซึ่งในการแตกเฟรมออกจากวิดีโอนั้นค่อนข้างมีหลากหลายหนทาง เช่น

  1. เราจะดึง n เฟรมแรกของจากวิดีโอ — วิธีนี้นั้นเป็นวิธีที่ค่อนข้าง Simple แต่ไม่ครอบคุมทั้งวิดีโอ
  2. เราจะดึง n เฟรมจากวิดีโอ โดยที่จะข้ามเฟรมทุกๆ k เฟรม — เป็นวิธีที่ดีเพราะจะครอบคุมทั้งวิดีโอ แต่ปัญหาก็คือ บางวิดีโอมีเวลานานเกินไปทำให้ข้ามเฟรมไปหลายเฟรมเกิน จึงทำให้โมเดลเรียนรู้ Sequence ผิดพลาดไป
  3. เราจะแบ่งวิดีโอเป็นช่วงๆ s ช่วง โดยมากสุด m ช่วง แล้วในแต่ละช่วงเราจะดึง features ออกมาโดย และเราจะข้ามเฟรมทุกๆ k เฟรมในช่วงที่ s นั้น — วิธีนี้นอกจากจะแก้ปัญหาของวิธีที่ 2 แล้วเราจะได้จำนวนข้อมูลเพิ่มขึ้นมาด้วย
  4. คล้ายคลึงกับวิธีที่ 3 แต่เราจะแบ่งวิดีโอเป็น s ช่วงโดย แต่เราจะเริ่มดึงจากเฟรมที่ k ที่แล้วด้วย เช่น (0, 20) (15, 35) (30, 50) (45, 65) (60, 80)… — วิธีนี้จะทำให้เราได้ข้อมูลเพิ่มขึ้นมาอีก แต่กลับน่าเสียดายที่ผลการทดสอบกับวิธีนี้ได้ผลไม่ดีเท่าวิธีที่ 3

แต่แล้วทำไมวิธีที่ 3 ถึงดีกว่าวิธีที่ 4 ทั้งที่ได้ข้อมูลมามากกว่า?

ในส่วนตัวผมคิดว่า เป็นเพราะ การดึงเฟรมของบางช่วงในวิธีที่ 4 ไม่สอดคล้องกันกับการออกท่าทางในวิดีโอ เพราะในบทความนี้เราไม่ได้มานั่ง Annotate เองว่าเกิด Violence หรือ Non-Violence ช่วงไหนบ้าง 😅🤣

ซึ่งในบทความนี้เราเลือกใช้วิธีที่ 3 ซึ่งถึงแม้ว่าอาจจะไม่ใช่วิธีที่ดีที่สุด แต่ก็เป็นอีกหนึ่งวิธีในการแก้ปัญหา และส่วนตัวผมคิดว่าเป็นวิธีที่เข้าใจง่ายในการทำนั้นเอง

ซึ่ง Dataset ที่เราจะเอามาใช้วันนี้จะเป็น UCF101 ซึ่งเป็น Dataset ที่นิยมนำมาใช้ในงาน Action recognition เป็นอย่างมาก ซึ่งเป็นวิดีโอที่มีทั้งหมด 101 Class แหนะ เยอะมากเลยทีเดียว

UCF101 Dataset
ตัวอย่างของ UCF101 Dataset (Archery, Baby crawling, Baseball Pitch)

แต่เราทำเรื่อง Violence Detection ซึ่ง UCF101 มีหมวดที่พอใช้ความรุนแรงอยู่บ้าง เช่น Boxing และ Sumo ซึ่งแน่นอนว่าไม่เพียงพอในการทำ Violence Detection

เราก็เลยใช้ร่วมกับ Real life violence situations dataset ใน Dataset นี้ประกอบไปด้วย Violence และ NonViolence อย่างละ 1,000 วิดีโอ

Real life violence situations Dataset
ตัวอย่างจาก Real life violence situation dataset (Non violence, Violence)

และใช้ Dataset อื่นๆ

แต่ด้วยความที่ทั้ง UCF101 และ Real life violence situation มีบางวิดีโอที่ค่อนข้างคลายคลึงกัน จึงเลยต้อง Split Validation Data ออกมาเองแบบ Manual

ซึ่งสามารถดาวน์โหลด Dataset ที่ใช้ในบทความได้ที่ลิงค์นี้ Download Dataset

โมเดล

VGG16 Very Deep Convolutional Networks for Large-Scale Image Recognition

จากนั้นเราก็จะดึง Features ออกจากเฟรมโดยการ Loop ทั้งวิดีโอ

เราจะใช้ LSTM model ในการ Classification ในวิดีโอว่าเกิด Violence หรือ Non-Violence

Accuracy and Loss

ในส่วนของการเทรนโมเดลสามารถอ่านเพิ่มเติมได้ที่ Notebook

หลังจากที่ได้เทรน Model เสร็จเรียบร้อยแล้วก็สามารถนำมาทำเป็น Application ได้ตามขั้นตอนนี้เลย 😉

1. อ่านค่าของภาพ (Features Extraction) โดยใช้ VGG16

เริ่มจากการเตรียมโมเดล VGG16 ซึ่งเราจะใช้โมเดลนี้ในการ Extract frame ออกมาอย่างเดียว

Setting up vgg16 model for features extraction

ในขั้นตอนนี้เราจะเป็นการเตรียมโมเดลไว้ใช้ในขั้นตอนถัดไป

2. ดึง Features ออกจากเฟรมแล้วเก็บค่าเอาไว้เรียงกันเป็น Sequence

ในขั้นตอนนี้เราจะ Loop ทั้งวิดีโอ แล้วดึง Features ในแต่ละเฟรมเก็บไว้ก่อน เมื่อครบตามจำนวน Sequence ที่เราตั้งเอาไว้แล้วให้ทำการ Predicted action ว่าเป็น Violence หรือ Non-violence ในขั้นตอนถัดไป

หมายเหตุ :ในขั้นตอนใช้เราจะใช้ OpenCV ในการเล่นวิดีโอ สามารถอ่านคู่มือการใช้งานเบื้องต้นได้ที่ OpenCV-Python

3. Predict ด้วย LSTM model

เมื่อเก็บ Feature จนได้จำนวน Sequence ตามที่กำหนดไว้ ในขั้นตอนนี้เราก็จะนำ Features เหล่านั้นมาทำนายโดย model LSTM ที่ได้เทรนไว้ (สามารถดูขั้นการเทรนได้ใน Notebook ข้างบน)

ซึ่ง เมื่อนำ Code มารวมกันก็จะได้คล่าวๆ ประมาณนี้

ตัวอย่าง Output ที่ได้จาก predict.py

python predict.py --dir ["dir"] --write-vid [output path].avi --write-csv [output path].csv

สามารถลองเล่นได้ที่ monshinawatra/ViolenceDetection (github.com)

ก็จบไปแล้วสำหรับการทำ Video Classification มาทำนายการเกิด Violent, Non-Violence และอย่างที่กล่าวไป วิธีที่มานำเสนอในบทความนี้อาจจะยังไม่ใช่วิธีที่ดีที่สุด แต่ก็อีกหนึ่งวิธีที่ทุกคนสามารถทำความเข้าใจง่าย และทำตามได้

🙏 ทั้งนี้ก็ขอบคุณผู้อ่านทุกคนที่เข้ามาอ่าน และให้ความสนใจกับบทความนี้ 🙂

สิ่งที่ต้องแก้ไขเพิ่มเติม

  • ควรมีซับคลาสเพื่อแบ่งคลาสย่อยอีกที เช่น (ปั่นจักรยาน กอด เต้นรำ) นับเป็น Non-Violence | (ต่อย เตะ) นับเป็น Violence
  • Annotate ในทุกๆวิดีโอว่าเกิด Violence | Non Violence ช่วงไหนบ้าง
  • ต้องมี Data มากกว่านี้

Related Notebook

References

Mohamed Elesawy (2019). Real Life Violence Situations Dataset, Version 1. Retrieved June 25 from https://www.kaggle.com/datasets/mohamedmustafa/real-life-violence-situations-dataset

Khurram Soomro, Amir Roshan Zamir and Mubarak Shah, UCF101: A Dataset of 101 Human Action Classes From Videos in The Wild., CRCV-TR-12–01, November, 2012

Special thanks

for Dataset

Sponser

  • AWS — Amazon web service
  • VISTEC
  • VISAI
  • CENTRAL GROUP
  • Nimble
  • AIA
  • DELL

--

--