使用dlib训练,实现特定内容的检测

dlib是人脸检测领域内的大拿,非常好用,提供了python版本和c++版本,非常友好。

在从github https://github.com/davisking/dlib 上clone下来的源码中,在python_example文件夹中提供了train_object_detector.py文件。这个文件就是帮助开发者对特定内容进行训练,进而达到检测的目的,而不仅仅是针对人脸。

dlib的训练是基于HOG(Histograms of Oriented Gradients,方向梯度直方图)的检测器,可以用来对脸、行人等其他半刚性物体(此处我认为刚性物体的效果会更好)进行检测。方案的起源是2005年的论文Histograms of Oriented Gradients for Human Detection by Dalal and Triggs。

接下里是代码分析:

(dlib的安装此处就不说了,linux下直接pip install dlib就可以了)

#这个没得讲,python引入库

import os

import sys

import glob

import dlib

#首先是指定训练集的所在位置,以原有的作为样例,是examples/faces. 将这个路径作为参数输入,执行 python  train_object_detector.py ../examples/faces

if len(sys.argv) != 2:

    print( "Give the path to the examples/faces directory as the argument to this program. For example, if you are in the python_examples folder then execute this program by running:   ./train_object_detector.py ../examples/faces")

    exit()

faces_folder = sys.argv[1]

# 接下来开始准备训练,利用函数 train_simple_object_detector(),首先准备设定函数的参数(许多都是已经设定好的)

options = dlib.simple_object_detector_training_options()

# 由于人脸左右对称,所以设置检测器左右对称。

options.add_left_right_image_flips = True

# 设置检测器的C参数。这个检测器是基于HOG的SVM,所以这个C参数就是SVM中的C参数。一般来讲,C大一点会好,但过大也会导致过拟合。因此需要多尝试几次C,看不同的训练结果在测试集上的表现而确定。

options.C = 5  #需要自己调整

# 设置可用于训练的CPU核数,一般来说CPU是多少核的就填多少核,会快一点。

options.num_threads = 4

options.be_verbose = True

#指定标注文件的路径,包括训练集和测试集

training_xml_path = os.path.join(faces_folder, "training.xml")

testing_xml_path = os.path.join(faces_folder, "testing.xml")

# 接下来启动开始训练,函数是train_simple_object_detector,它会导入上面的xml文件和上面设定的option,进行训练,并将训练结果存入detector.svm文件中。xml文件的产生可以自己用labelimg标注,dlib也提供了标注工具tools/imglab进去编译就可以使用了

dlib.train_simple_object_detector(training_xml_path, "detector.svm", options)

#到达这一步,训练就完成了。

#然后第一步在训练集上进行测试,看是否过拟合,

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

#第二步,如果不过拟合,在测试机上看检测效果

print("Testing accuracy: {}".format(dlib.test_simple_object_detector(testing_xml_path, "detector.svm")))

#上面两步如果都不错,说明我们现在得到了一个检测器,可以用于一个应用或者项目了。 

# 首先载入训练好的模型文件detector.svm

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

# 看下模型文件的样子,像个人脸

win_det = dlib.image_window()

win_det.set_image(detector)

# 可以使用了

print("Showing detections on the images in the faces folder...")

win = dlib.image_window()

for f in glob.glob(os.path.join(faces_folder, "*.jpg")):

    print("Processing file: {}".format(f))

    img = dlib.load_rgb_image(f)

    dets = detector(img)

    print("Number of faces detected: {}".format(len(dets)))

    for k, d in enumerate(dets):

        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(

            k, d.left(), d.top(), d.right(), d.bottom()))

    win.clear_overlay()

    win.set_image(img)

    win.add_overlay(dets)

    dlib.hit_enter_to_continue()

#使用完毕

#高级功能

# 在实际应用中,我们会训练很多个检测器(毕竟,目标很少只有有一种),然后把这些检测器放在一起使用,代码如下:

detector1 = dlib.fhog_object_detector("detector.svm")

detector2 = dlib.fhog_object_detector("detector.svm")

detectors = [detector1, detector2]

image = dlib.load_rgb_image(faces_folder + '/2008_002506.jpg')

[boxes, confidences, detector_idxs] = dlib.fhog_object_detector.run_multiple(detectors, image, upsample_num_times=1, adjust_threshold=0.0)

for i in range(len(boxes)):

    print("detector {} found box {} with confidence {}.".format(detector_idxs[i], boxes[i], confidences[i]))

#完毕

#最后附件一点。如果你已经知道训练图像以及其对应的标注数据,可以不使用xml文件作为输入进行训练,而只需这样操作: (实例中训练集只有两张图)

images = [dlib.load_rgb_image(faces_folder + '/2008_002506.jpg'),dlib.load_rgb_image(faces_folder + '/2009_004587.jpg')]

boxes_img1 = ([dlib.rectangle(left=329, top=78, right=437, bottom=186),dlib.rectangle(left=224, top=95, right=314, bottom=185),dlib.rectangle(left=125, top=65, right=214, bottom=155)])

boxes_img2 = ([dlib.rectangle(left=154, top=46, right=228, bottom=121),dlib.rectangle(left=266, top=280, right=328, bottom=342)])

boxes = [boxes_img1, boxes_img2]

detector2 = dlib.train_simple_object_detector(images, boxes, options)

detector2.save('detector2.svm')

# 搞定

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容