人脸识别(dlib)——用imglab制作样本与测试

2018-11-04  本文已影响0人  神昀

终于又见面!经过一波休养和修炼,我获得了制作样本的技能,分享给大家吧。不过这次我们不识别真人,我们来识别一下二次元的人。

在dlib的源码包中有一个工具叫做imglab,第一次用之前需要Cmake编译生成一下,然后准备一个有图片的文件夹,图片都是自己找的,而我用了51张进击的巨人的图片。

训练用图片

命令行输入 imglab -c mydataset.xml images,生成mydataset.xml文件(每张图片的标记都记录在这个文件里,images是装有图片的文件夹)

然后输入imglab mydataset.xml,开始进行标记,这个过程是重复且无聊的。一开始可以先画框框住脸,这样也可以作为样本拿去训练。熟悉后,可以标记眼、口、鼻、面部轮廓等等。

标记团长的脸 标记艾伦、三笠、康尼的脸

根据源码包的例子train_object_detector.py。取出用来训练图片的代码

# -*- coding: utf-8 -*-
import os
import sys
import glob
import dlib
import cv2

# options用于设置训练的参数和模式
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_xml_path = current_path + '/mydataset.xml'

# 训练
dlib.train_simple_object_detector(train_xml_path, 'detector.svm', options)

最后会生成detector.svm文件,这个就是我们训练出来的模型。然后我们用这个模型去测试一组新的图片。

测试用图片

同样在官方例子train_object_detector.py中可以找到测试用的代码,拿出来并修改一下

import os
import sys
import glob
import dlib

detector = dlib.simple_object_detector("detector.svm")
win_det = dlib.image_window()
win_det.set_image(detector)
win = dlib.image_window()
for f in glob.glob(os.path.join("./testImages", "*.png")):
    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()
识别结果1 识别结果2 识别结果3 识别结果4

可以看到,能识别挺多张脸了,很可惜没有识别出幽怨的三笠和充满颜艺的让。显然是样本数量太少,结果是可以接受的。

吐槽环节

标记人脸真的不是一件容易的事,单纯的画框都会因为眼疾或者手残而要画好几次,更不用说后面还要标记器官。看到结果挺有成就感的,跨越了层层障碍实现了跨越次元的人脸识别,很有意思,很好玩。

那么本期到此结束吧,谢谢观看。

上一篇下一篇

猜你喜欢

热点阅读