软硬件环境

  • ubuntu 18.04 64bit
  • dlib
  • opencv
  • python2

准备dlib环境

pip install dlib

imglab工具安装

git clone https://github.com/davisking/dlib
cd dlib/tools/imglab
mkdir build
cd build
cmake ..
cmake --build . --config Release
sudo make install

素材准备

把所有要训练的汽车图片保存到car_train文件夹,要测试的图片放到car_test文件夹,2个文件夹里的图片不要一样,以免影响测试效果

cd car_train
imglab -c car.xml .
imglab car.xml

打标签的方法很简单,在imglab窗口下,先按住shift键,然后在车身的左上方按下鼠标左键,拖动到车身右下方再放开鼠标,这样就在车身位置上画出了一个矩形框,如下图所示

针对每一张图片进行上述操作,结束后保存。如果数据集够大的话,确实是个体力活。

训练代码

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

import os
import dlib

# 训练的参数,可以根据实际情况进行修改
options = dlib.simple_object_detector_training_options()

options.add_left_right_image_flips = True
options.C = 5
options.num_threads = 4
options.be_verbose = True


current_path = os.getcwd()
train_folder = current_path + '/car_train/'
train_xml_path = train_folder + 'car.xml'

print("start training:")

# 最重要的一个函数
dlib.train_simple_object_detector(train_xml_path, 'detector.svm', options)

print("Training accuracy: {}".format(
    dlib.test_simple_object_detector(train_xml_path, "detector.svm")))

检测代码

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

import os
import sys
import dlib
import cv2
import glob

detector = dlib.simple_object_detector("detector.svm")

current_path = os.getcwd()
test_folder = current_path + '/car_test/'

for f in glob.glob(test_folder+'*.jpg'):
    print("Processing file: {}".format(f))
    img = cv2.imread(f, cv2.IMREAD_COLOR)
    b, g, r = cv2.split(img)
    img2 = cv2.merge([r, g, b])
    dets = detector(img2)
    print("Number of cars detected: {}".format(len(dets)))
    for index, car in enumerate(dets):
        print('car {}; left {}; top {}; right {}; bottom {}'.format(index, car.left(), car.top(), car.right(), car.bottom()))

        left = car.left()
        top = car.top()
        right = car.right()
        bottom = car.bottom()
        cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
        cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)
        cv2.imshow(f, img)

k = cv2.waitKey(0)
cv2.destroyAllWindows()

小结

根据上述方法,对于一般的物体检测都可以用dlib来实现,你可以训练猫,也可以训练狗,等等等等,感兴趣的话,都来试试吧。

参考资料



Comments

comments powered by Disqus