终于又见面!经过一波休养和修炼,我获得了制作样本的技能,分享给大家吧。不过这次我们不识别真人,我们来识别一下二次元的人。
在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()
可以看到,能识别挺多张脸了,很可惜没有识别出幽怨的三笠和充满颜艺的让。显然是样本数量太少,结果是可以接受的。
吐槽环节
标记人脸真的不是一件容易的事,单纯的画框都会因为眼疾或者手残而要画好几次,更不用说后面还要标记器官。看到结果挺有成就感的,跨越了层层障碍实现了跨越次元的人脸识别,很有意思,很好玩。
那么本期到此结束吧,谢谢观看。