Training Custom Object Detector With YOLO

1765 views Oct 30, 2024

ဒီနေ့ မှာတော့ custom object detector ကို ဘယ်လို train ရမယ်ကို ပြောပြသွားပါမယ်။ကျွန်တော်တို့ ဒီ example မှာ handgun detection လုပ်ပါမယ်။Handgun detection သည် မိတ်ဆွေက iot သမားပဲဖြစ်ဖြစ် တခြား hardware device ထုတ်တယ့်သူပဲ ဖြစ်ဖြစ် တေ်ာတေ်ာအသုံးဝင်ပါတယ်။ဥပမာ ဆိုင်တစ်ဆိုင်မှာ ဒီလို function မျိုးပါတယ့် cctv သာ တတ်ထားမယ်ဆို လူတစ်ယောက် သေနတ်နဲ့ ချိန်တာ တွေ့လိုက်တာနဲ့ ရဲကို ဖုန်းခေါ်ပေးတာမျိုးတွေ လုပ်ပေးလို့ရပါတယ်။ဒါပေမဲ့ စနောက်တာမျိုးတွေလဲ ရှိတော့ detection တမျိုးနဲ့ အဆင်မပြေပါဘူး။Activity ကိုနားလည်အောင်ပါ လုပ်ထားနိုင်မှ အဆင်ပြေမှာပါ။Activity ကို နားလည်အောင် လုပ်တာတော့ ဒီ tutorial နဲ့မဆိုင်လို့ မပြောသေးပါဘူး။နောက်ကျရင်တော့ တင်ပေးနိုင်အောင် ကြိုးစားပေးပါမယ်။

အဲ့တော့ စတော့မယ်ဆိုတော့ yolo သည် darknet ကိုသုံးထားတာမို့ darknet ကို အရင် install လုပ်ရပါမယ်။ဒီမှာ darknet repo နာမည်ကြီးတာ နှစ်ခုရှိပါတယ်။Original repo ကတော့ https://github.com/pjreddie/darknet ဖြစ်ပြီးတော့ နောက်တစ်ခုကတော့ https://github.com/AlexeyAB/darknet ဖြစ်ပါတယ်။ကျွန်တော်တို့ကတော့ ဒုတိယတစ်ခုကို သုံးပါမယ်။ဘာကြောင့်လဲဆိုတော့ Precision တို့ recall တို့ကို ပထမ repo မှာ တွက်ဖို့ function မပါလာပါဘူး။

$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
$ mkdir build-release
$ cd build-release
$ cmake ..
$ make
$ make install

ဆိုပြီး အဆင့်လိုက်လုပ်ပါ။ဒီနေရာမှာ မိမိက gpu သုံးတယ်ဆိုရင်တော့ darknet folder ထဲ ဝင်ပြီး cmake မ run ခင် Makefile မှာ GPU=1,CUDNN=1,OPENCV=1 ဆိုပြီး change ပါ။Train ဖို့ဆို GPU ရှိမှ အဆင်ပြေပါမယ်။မရှိရင် cloud သုံးမှ အဆင်ပြေပါလိမ့်မယ်။ဒီမှာတော့ Handgun ဆိုတဲ့ class 1 ခုပဲ train ပြမှာပါ။

darknet install ပြီးသွားပြီဆို darknet folder ထဲမှာပဲ ရှိနေအောင်လုပ်ပြီး ./darknet လို့ run ကြည့်ပါ။အောက်ကတိုင်း ပေါ်ရင်အဆင်ပြေပါတယ်။ကျွန်တော်ကတော့ version နှစ်မျိုးလုံးရှိလို့ darknet 2 ဆိုပြီးလုပ်ထားတာပါ။

Step 2 အဲ့တာပြီးရင်တော့ darknet ထဲမှာပဲနေပြီး pretrained model ကို download ဆွဲလိုက်ပါ။

$ cd ~/darknet
$ wget https://pjreddie.com/media/files/darknet53.conv.74 -O ~/darknet/darknet53.conv.74

Step 3 Create Training Data

ဒီမှာတော့ ကျွန်တော့် project file ကို အောက်ဆုံးမှာ download link ပေးထားပါမယ်။အဲ့မှာ train data တွေပါပါတယ်။

ဒီအဆင့်မှာ သိထားရမှာက မိမိ data သည် ဥပမာ 0.jpg ဆိုတယ့် image ဆို 0.txt ဆိုပြီး သူ့ရဲ့ detection box လေးပါတယ့် 0.txt ထဲမှာ image ရဲ့ bounding box လေးပါရပါမယ်။အောက်ကတိုင်းပါ။Source code ထဲက Images folder ကို ဖွင့်ကြည့်လိုက်ရင်နားလည်သွားပါလိမ့်မယ်။ဒီ tutorial ကိုအပြည့်အဝနားလည်ချင်တယ်ဆို Face Detection ကို စမ်းထားသင့်ပါသည်။

<object-class> <x_center> <y_center> <width> <height>

အဲ့တော့ကျွန်တော်တို့မှာ Training Data တွေလဲရှိပြီဆို yolo config files တွေကို နားလည်အောင် ကြည့်ရအောင်။

yolo ကို train မယ်ဆို သူ့ရဲ့ setting တွေပါတယ့် config file ရှိမယ် ဘယ်မှာ training data တွေ testing data တွေ ထားတယ်လို့ပြောရတယ့် data file ဆိုပြီးရှိပါတယ်။အောက်ပါအတိုင်းပါ။

darknet.data

classes = 1
train  = /home/pyrobocity/Desktop/tutorials/custom_object_detection/handgun_train.txt
valid  = /home/pyrobocity/Desktop/tutorials/custom_object_detection/handgun_test.txt
names = /home/pyrobocity/Desktop/tutorials/custom_object_detection/classes.names
backup = /home/pyrobocity/Desktop/tutorials/custom_object_detection/weights

ကျွန်တော်တို့ train မှာသည် class တခုပဲဖြစ်လို့ 1 လို့ထားထားပါတယ်။ကျန်တာကတော့ variable names တွေ ဖတ်တာနဲ့သိတာမို့မပြောတော့ပါဘူး။backup ကတော့ အရေးကြီးပါတယ်။ကျွန်တော်တို့ training model တွေသိမ်းဖို့ပါ။

နောက်ထပ်ကြည့်ရမှာကတော့ Config File ပါ။

darknet-yolov3.cfg

batch=64
subdivisions=32
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
 
learning_rate=0.001
burn_in=400
max_batches=5000
policy=steps
steps=3800
scales=.1

မှာ အဓိကကတော့ batch size က ကိုယ့် memory ပေါ်မူတည်ပြီး ချိန်းကြည့်ပါ။ဒါပေမဲ့ accuracy ကိုထိခိုက်ပါတယ်။အရမ်းနည်းရင်လဲ မကောင်းပါဘူး။64,32 စသဖြင့်ချိန်းပါ။batch ကိုတော့ 64 ထားတာကောင်းပါတယ်။ဒါပေမဲ့ memory out ဖြစ်လာပြီဆို subdivisions ကို 16,32,64 စသဖြင့် တဖြေးဖြေးတိုးသွားလိုက်ပါ။

max_batches ကို 5000 လောက်ပဲထားထားပါတယ်။1 classes ပဲ train မယ်ဆို အဲ့လောက်မလိုပါဘူး။လိုရမယ်ရ များများထားထားတာပါ။နောက်တစ်ဆင့်ကတော့

[convolutional]
size=1
stride=1
pad=1
# filters = (num/3) * (5+classes)
filters=18
activation=linear
 
[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

အောက်ဆုံးက convolution layer ရဲံ filter size ကို သတိထားရပါမယ် ကျွန်တော်တို့ ၁ class ပဲမို့ ၁၈ ပါ ၂ ခုဆို (classes + 5)x3) ဆိုတယ့်တွက် 21 ပေါ့နော်။classes ကို 1 ထားထားရပါမယ်။

Ok yolo လဲပြီးပြီဆိုတော့ train ရပါတော့မယ်။

train မယ်ဆိုတော့ darknet လမ်းကြောင်းထဲကို ပြန်သွားထားပါ။

$ cd ~/darknet
$ ./darknet detector train ~/Desktop/tutorials/custom_object_detection/darknet.data ~/Desktop/tutorials/custom_object_detection/darknet-yolov3.cfg darknet53.conv.74 -map

ဆိုပြီး train လိုက်ပါ။အောက်ပါအတိုင်း itreations များလာရင် average loss ကျလာပြီး map တက်လာပါလိမ့်မယ်။Path လမ်းကြောင်းတွေကိုတော့ ကိုယ့်project ရဲ့ path ပြောင်းဖို့ မမေ့ပါနဲ့။
 

ဒီမှာ ပုံကိုကြည့်မယ်ဆို iteartion 900 မှာ ကျွန်တော်တို့ loss ကတော်တေ်ာနည်းနေပြီး map တော်တော်ကောင်းတယ့် အခြေနေကိုရနေပြီမို့ ကျွန်တော် ဆက်မ train ပဲ ရပ်လိုက်တာ တွေ့ရမှာပါ။

Yolo က ကျွန်တော့်ကို model နှစ်ခုပေးပါတယ်။weights folder ထဲမှာ best ရယ် last ရယ် ဆိုပြိး အဲ့တော့ ကျွန်တော်တို့ ဒီမှာ ဘယ် model ကိုသုံးရမယ်ဆိုတာကို ကြည့်ရအောင်။

$ ./darknet detector map ~/Desktop/tutorials/custom_object_detection/darknet.data ~/Desktop/tutorials/custom_object_detection/darknet-yolov3.cfg ~/Desktop/tutorials/custom_object_detection/weights/darknet-yolov3_last.weights

အပေါ်က command ကို run လိုက်မယ်ဆို ကျွန်တော့်ရဲ့ last model ရဲ့ precision recall map စတာတွေကိုအောက်ပါအတိုင်း တွေ့ရမှာပါ။

calculation mAP (mean average precision)...
56
 detections_count = 168, unique_truth_count = 60  
class_id = 0, name = handgun, ap = 86.56%   	 (TP = 51, FP = 15) 
 
 for conf_thresh = 0.25, precision = 0.77, recall = 0.85, F1-score = 0.81 
 for conf_thresh = 0.25, TP = 51, FP = 15, FN = 9, average IoU = 55.57 % 
 
 IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
 mean average precision (mAP@0.50) = 0.865637, or 86.56 % 
Total Detection Time: 1.000000 Seconds
 
Set -points flag:
 `-points 101` for MS COCO 
 `-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data) 
 `-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset

Last model က 86.56% ထိ ရှိပါတယ်။Best model ကိုကြည့်ရအောင်

calculation mAP (mean average precision)...
56
 detections_count = 175, unique_truth_count = 60  
class_id = 0, name = handgun, ap = 88.91%   	 (TP = 53, FP = 15) 
 
 for conf_thresh = 0.25, precision = 0.78, recall = 0.88, F1-score = 0.83 
 for conf_thresh = 0.25, TP = 53, FP = 15, FN = 7, average IoU = 61.08 % 
 
 IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
 mean average precision (mAP@0.50) = 0.889065, or 88.91 % 
Total Detection Time: 1.000000 Seconds
 
Set -points flag:
 `-points 101` for MS COCO 
 `-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data) 
 `-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset

88.91 တောင် ဆိုတော့ ဘယ်ဟာသုံးမလဲဆိုတာ အသိသာကြီးပါ။အဲ့တော့ ကျွန်တော့်ရဲ့ project file မှာ object detect script ထည့်ပေးပြီးသားမို့ အောက်ပါအတိုင်း run ကြည့်လိုက်ပါ။

$ python object_detection_yolo.py --image=5858_NaGarr.jpg

ဆိုပြီး တွေ့ရမှာပါ။အားလုံးကျေးဇူးတင်ပါတယ်။ကျွန်တော်လဲ အမြဲမအားတာမို့ မိတ်ဆွေတို့က page မှာ review လေးတွေပေး share ပေးမယ်ဆို ရေးရတာပိုကောင်းတာပေါ့။ဒီ ပို့စ်သည် လေ့လာနေတဲ့သူတွေအတွက် အဆင်ပြေသွားတယ်ဆို ကျေနပ်ပါတယ်။နောက်ကျမှတွေ့မယ်။

Project Download Link

Click here to download

ဒီ Project ထဲမှာတော့ train ထားတယ့် model တွေ ပါမှာ မဟုတ်ပါဘူး လိုချင်တယ်ဆို page မှာလာမေးပေးပါ။ကိုယ့်ဘာ့သာ train လဲရတာမို့ မထည့်ပေးတော့ပါဘူး။ကျွန်တော်လဲ file size ကြီးတော့ တင်ရအဆင်မပြေလို့ပါ။

တင်ပေးလိုက်တယ့် Objectdetect.py မှာ model weight ကို last သုံးထားပါတယ်။ကိုယ့်ဘာ့သာ ပြောင်းသုံးကြည့်ပါ။