Tag Archives: object detection

Object detection using OpenCV

หลังจากที่ห่างหายไปนานมากเป็นปีเลยทีเดียว วันนี้ก็ได้กลับมาเขียนอีกครั้ง ก็ไม่มีอะไรจะแก้ตัวครับขี้เกียจเป็นหลัก ในวันนี้จะนำเสนอเรื่อง Object detection โดยใช้ HOG และ SVM ผ่านไลบรารี่ OpenCV ซึ่งจริงๆ ใน GitHub ของ OpenCV มีโค้ดส่วนนี้อยู่แล้ว อยู่ใน samples/cpp/train_HOG.cpp ในบทความนี้แค่มาใช้ให้ดูเท่านั้นครับ สำหรับผมใช้ Ubuntu 14.04 และ OpenCV เวอร์ชัน 3 ในการพัฒนาโปรเจคนี้ครับ

ภาพรวมของโปรเจคนี้มีสองขั้นตอนครับ คือเตรียมข้อมูลและ Train model ซึ่งเป็นหน้าที่ของโค้ด train_HOG ของ OpenCV การทำงานของ train_HOG.cpp คือการนำข้อมูลนำเข้าทั้ง Positive และ Negative ไป train โมเดล linear SVM ซึ่งมีการปรับแก้ไขโค้ดเล็กน้อยเพื่อให้เข้ากับโปรเจคที่เราจะทำ นั่นคือการทำ iPhone detection สามารถเข้าไปดูได้ที่ link นี้

ขั้นตอนแรก การเตรียมข้อมูล ข้อมูลประกอบด้วยข้อมูลสองชนิด (Positive, Negative) เริ่มต้นจาก Negative มันคือภาพที่ไม่ใช่วัตถุที่เราจะตรวจจับ ซึ่งเอามาจาก link นี้ ส่วนภาพวัตถุที่จะตรวจจับเราสามารถสร้างเองก็ได้แต่ในที่นี้จะใช้วิธี populate ขึ้นมาจากตัวอย่างที่มีอยู่หนึ่งภาพโดยใช้ opencv_creasamples หลักการคือโปรแกรมจะเอาภาพตัวอย่างไปหมุนและแปะลงบนภาพ Negative เช่นตัวอย่างด้านล่าง

Generated Data

โดยใช้คำสั่งตามข้างล่างนี้

# opencv_createsamples -img images/iphone.jpg -bg negatives/negatives.txt -info positives/positives.txt -num 3000 -bgcolor 255 -bgthresh 8 -w 40 -h 80 -maxxangle 0.5 -maxyangle 0.5

ซึ่งการจะใช้โปรแกรม opencv_createsamples จำเป็นต้องมีไฟล์ negatives.txt ซึ่งคือไฟล์ที่มีรายชื่อของภาพที่จะใช้ ซึ่งเราสามารถสร้างได้โดยใช้คำสั่งข้างล่างนี้

# ls -1 negatives/ > negatives/negatives.txt

และขั้นตอนต่อไปคือการ Train model โดยใช้ train_HOG.cpp ซึ่งสิ่งที่ต้องมีเพื่อใช้กับโปรแกรม train_HOG คือภาพ negative 1 โฟลเดอร์ และภาพ positive 1 โฟลเดอร์ พร้อมด้วยไฟล์ .txt ที่มีรายชื่อของไฟล์ภาพทั้งหมด เพียงเท่านี้เราก็สามารถ train HOG SVM ได้แล้ว แต่สำหรับโค้ดผมจะมีการโหลดภาพทดสอบ เพื่อทดสอบโมเดลที่เรา train มาด้วย โดยคำสั่งที่ใช้ train ตามนี้ครับ

# ./train_HOG --pd=positives/ -p=positives.txt -nd=negatives/ -n=negatives.txt

ภาพผลลัพธ์ทางนี้เลยยังไม่สมบูรณ์มากแต่ก็พอเป็นแนวทางในการริเริ่มทำ object detection ของวัตถุอื่นๆ ได้ครับ ขอบอกว่า ณ ตอนนี้ OpenCV รองรับเพียง linear model ถ้าว่างๆ ผมจะลองพัฒนาโค้ดให้สามารถรับ rbf model ได้ละกัน แล้วก็ใครรู็สึกว่า model ไม่ค่อยดีเท่าไหร่ ลองดู reference ข้างล่างมีวิธีการ train แบบ Haar Cascade อยู่ ซึ่งหลายคนบอกว่าให้ผลดีกว่า HOG SVM แต่ใช้เวลาในการ train นานมาก กอไก่หลายตัว ก็ลองทำตามกันดูครับ ถ้าใครมีผลลัพธ์อย่างไรเอามาแนะนำและแบ่งปันกันก็ได้ครับ (ขอขอบคุณภาพจาก http://kooc.market/)

Advertisements