mirror of https://github.com/davisking/dlib.git
102 lines
4.7 KiB
Python
102 lines
4.7 KiB
Python
|
#!/usr/bin/python
|
||
|
# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
|
||
|
#
|
||
|
# This example program shows how you can use dlib to make an object detector
|
||
|
# for things like faces, pedestrians, and any other semi-rigid object. In
|
||
|
# particular, we go though the steps to train the kind of sliding window
|
||
|
# object detector first published by Dalal and Triggs in 2005 in the paper
|
||
|
# Histograms of Oriented Gradients for Human Detection.
|
||
|
#
|
||
|
#
|
||
|
# COMPILING THE DLIB PYTHON INTERFACE
|
||
|
# Dlib comes with a compiled python interface for python 2.7 on MS Windows. If
|
||
|
# you are using another python version or operating system then you need to
|
||
|
# compile the dlib python interface before you can use this file. To do this,
|
||
|
# run compile_dlib_python_module.bat. This should work on any operating system
|
||
|
# so long as you have CMake and boost-python installed. On Ubuntu, this can be
|
||
|
# done easily by running the command: sudo apt-get install libboost-python-dev cmake
|
||
|
|
||
|
import dlib, sys, glob
|
||
|
from skimage import io
|
||
|
|
||
|
# In this example we are going to train a face detector based on the small
|
||
|
# faces dataset in the examples/faces directory. This means you need to supply
|
||
|
# the path to this faces folder as a command line argument so we will know
|
||
|
# where it is.
|
||
|
if (len(sys.argv) != 2):
|
||
|
print "Give the path to the examples/faces directory as the argument to this"
|
||
|
print "program. For example, if you are in the python_examples folder then "
|
||
|
print "execute this program by running:"
|
||
|
print " ./train_object_detector.py ../examples/faces"
|
||
|
exit(1)
|
||
|
faces_folder = sys.argv[1]
|
||
|
|
||
|
|
||
|
# Now lets do the training. The train_simple_object_detector() function has a
|
||
|
# bunch of options, all of which come with reasonable default values. The next
|
||
|
# few lines goes over some of these options.
|
||
|
options = dlib.simple_object_detector_training_options()
|
||
|
# Since faces are left/right symmetric we can tell the trainer to train a
|
||
|
# symmetric detector. This helps it get the most value out of the training
|
||
|
# data.
|
||
|
options.add_left_right_image_flips = True
|
||
|
# The trainer is a kind of support vector machine and therefore has the usual
|
||
|
# SVM C parameter. In general, a bigger C encourages it to fit the training
|
||
|
# data better but might lead to overfitting. You must find the best C value
|
||
|
# empirically by checking how well the trained detector works on a test set of
|
||
|
# images you haven't trained on. Don't just leave the value set at 1. Try a
|
||
|
# few different C values and see what works best for your data.
|
||
|
options.C = 1
|
||
|
# Tell the code how many CPU cores your computer has for the fastest training.
|
||
|
options.num_threads = 4
|
||
|
options.be_verbose = True
|
||
|
|
||
|
# This function does the actual training. It will save the final detector to
|
||
|
# detector.svm. The input is an XML file that lists the images in the training
|
||
|
# dataset and also contains the positions of the face boxes. To create your
|
||
|
# own XML files you can use the imglab tool which can be found in the
|
||
|
# tools/imglab folder. It is a simple graphical tool for labeling objects in
|
||
|
# images with boxes. To see how to use it read the tools/imglab/README.txt
|
||
|
# file. But for this example, we just use the training.xml file included with
|
||
|
# dlib.
|
||
|
dlib.train_simple_object_detector(faces_folder+"/training.xml","detector.svm", options)
|
||
|
|
||
|
|
||
|
|
||
|
# Now that we have a face detector we can test it. The first statement tests
|
||
|
# it on the training data. It will print the precision, recall, and then
|
||
|
# average precision.
|
||
|
print "\ntraining accuracy:", dlib.test_simple_object_detector(faces_folder+"/training.xml", "detector.svm")
|
||
|
# However, to get an idea if it really worked without overfitting we need to
|
||
|
# run it on images it wasn't trained on. The next line does this. Happily, we
|
||
|
# see that the object detector works perfectly on the testing images.
|
||
|
print "testing accuracy: ", dlib.test_simple_object_detector(faces_folder+"/testing.xml", "detector.svm")
|
||
|
|
||
|
|
||
|
|
||
|
# Now let's use the detector as you would in a normal application. First we
|
||
|
# will load it from disk.
|
||
|
detector = dlib.simple_object_detector("detector.svm")
|
||
|
|
||
|
# We can look at the HOG filter we learned. It should look like a face. Neat!
|
||
|
win_det = dlib.image_window()
|
||
|
win_det.set_image(detector)
|
||
|
|
||
|
# Now lets run the detector over the images in the faces folder and display the
|
||
|
# results.
|
||
|
print "\nShowing detections on the images in the faces folder..."
|
||
|
win = dlib.image_window()
|
||
|
for f in glob.glob(faces_folder+"/*.jpg"):
|
||
|
print "processing file:", f
|
||
|
img = io.imread(f)
|
||
|
dets = detector(img)
|
||
|
print "number of faces detected:", len(dets)
|
||
|
for d in dets:
|
||
|
print " detection position left,top,right,bottom:", d.left(), d.top(), d.right(), d.bottom()
|
||
|
|
||
|
win.clear_overlay()
|
||
|
win.set_image(img)
|
||
|
win.add_overlay(dets)
|
||
|
raw_input("Hit enter to continue")
|
||
|
|