软硬件环境
- ubuntu 18.04 64bit
- dlib
- opencv
- python2
准备dlib环境
首先安装dlib
模块
pip install dlib
如果是gpu
的环境,可以从编码进行编译,使之支持cuda
,步骤详见dlib使能cuda
imglab工具安装
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:")
# 最重要的一个函数,训练一个detector
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
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
来实现,你可以训练猫,也可以训练狗,等等等等,感兴趣的话,都来试试吧。