จากทความก่อนหน้า บทความนี้จะเป็นวิธีการการทำ label image ด้วย dasar_haartrain


Python
Date 08 11, 2023

ตัวอย่างนี้จะเป็นการ เทรน ด้วย haar cascade เพื่อใช้ในงาน ตรวจจับ object บนรุปภาพและวิดีโอ ซึ่งเป็นวิธีที่ง่าย วึ่งปัจจุบันได้มีการต่อยอดไป ทำ งาน machine leaning และ deep leaning ซึ่งสามารถเพิ่มประสิทธิภาพในการตรวจจับได้ดีกว่าในงานที่มีความยุ่งยาก ซับซ้อนมากขึ้น

1.นำไฟล์รุปที่เราจะใช้ เทรนไปไว้ที่ folder : dasar_haartrain\positive\rawdata เปลี่ยนไฟล์เป็นนามสกุล bitmap (*.bmp)

Nature

รูปภาพ แสดงตำแหน่งภาพ ที่จะวางในfolder

2.ไปโฟลเดอร์ negative ข้างในจะมีรูปที่ไม่เกี่ยวกับที่เราจะตรวจจับ ส่วนมากจะใช้รูปวิว หรือ แบ็คกราวน์ สีขาวดำ ถ้ามีพื้นเป็น background ด้านหลังยิ่งดี กด run ไฟล์ create_list.bat ทำการ label ชื่อรูปเข้าไปใน bg.txt เมื่อกดเปิดไฟล์ bg.txt ชื่อ list รุปไฟล์อยู่

Nature

รูปภาพ แสดงตำแหน่งfolder negative

3.ไปที่โฟลเดอร์ positive กด run ไฟล์ objectmaker.exe ตัดครอบด้วยการใช้ เม้ากด แล้ะลากกรอบ ในตำแหน่งที่ต้องการ ส่วนที่สนใจจะตรวจจับ กด space bar เพิ่ม add ข้อมูลเข้าไปใน info.txt โดยสามารถ ตีกรอบได้มากกว่า 1 รูป และกด enter เพื่อ save และไปยังรูปถัดไป ทำจนครบทั้งหมด

Nature

รูปภาพ แสดงตำแหน่งobjectmaker.exe

Nature

รูปภาพ แสดงการตีกรอบรูป และ แสดงค่าใน info.txt

4.กด run ไฟล์ 01 samples_creation.bat

Nature

รูปภาพ แสดงตำแหน่งfolder ไฟล์ samples_creation.bat

5.ทำการ edit ไฟล์ 02 haarTraining.bat แนะนำใช้ nodpad++ โดยแก้ไข ตัวเลขหลัง -npos [จำนวนรูปในโฟลเดอร์ rawdata] และ -nneg [จำนวนรูปในโฟลเดอร์ negative] กด save แล้ว run ไฟล์ (ก่อน run เข้าไปลบโฟลเดอร์ที่ได้จากการ train ครั้งที่แล้วทั้งหมดใน โฟลเดอร์ cascade ก่อน) ซึ่ง ค่า -mem 512 เป็นค่าแรม สามารถเปลี่ยนได้เป็น 1024 และขนาดของรูป -w and -h สามารถเเปลี่ยนตามขนาดของรุปเราได้

Nature

รูปภาพ แสดงตำแหน่งfolder ไฟล์ haarTraining.bat และการแกไฟล์ ในตัว haarTraining.bat

6.กด run ไฟล์ 03 convert.bat เท่านี้เราก็จะได้ไฟล์ชื่อ myhaar.xml ไว้ใช้ตรวจจับวัตถุกันแล้ว เอาล่ะทีนี้มาเขียนโปรแกรมตรวจจับวัตถุกัน

Nature

รูปภาพ แสดงตำแหน่งfolder ไฟล์ haarTraining.bat และการแกไฟล์ ในตัว haarTraining.bat

ใช้โค้ด Python ลอง run ดุผลลัพธ์ ซึ่ง ตามการที่ ทำด้วยข้อมูลที่น้อย และ ทำให้ บ้างรูปก็จับไม่ได้ เช่นรูปนี้จับได้เพียง ตา ของแมว ถ้าข้อมูลในการ label เยอะกว่านี้ ข้อมูลน่าจะดีขึ้นครับ

Nature

รูปภาพ แสดงผลลัพธ์ที่ได้

Python code

            
import cv2 
import os

path = "C:/Users/rawdata/output/test.jpg" # path folder

image = cv2.imread(path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
detector = cv2.CascadeClassifier('myhaar.xml') # file myhaar.xml
rects = detector.detectMultiScale(gray, scaleFactor=1.2,minNeighbors=1, minSize=(40,40))


for (i, (x, y, w, h)) in enumerate(rects):
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv2.putText(image, "cat ", (x, y - 10),
    cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)
#else :  cv2.putText(image, "??", (100, 100),
#        cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)


cv2.imshow("Cat detector", image)
cv2.waitKey(0)
cv2.destroyAllWindows()