python dlib学习(六):训练模型

摘要:
调用cnn人脸检测pythondlib学习(4)://下载。csdn net/download/hongbin_Xu/10103900(建议在官方网站下载)默认下载了此文件。sudomakeinstall1安装完成后,可以使用imglab命令在控制台中直接调用它。接下来,使用imglab标记数据集。我直接在数据集文件夹中创建了它。

前言
前面的博客都是使用dlib官方提供的训练好的模型,进行目标识别。
- python dlib学习(一):人脸检测
- python dlib学习(二):人脸特征点标定
- python dlib学习(三):调用cnn人脸检测
- python dlib学习(四):单目标跟踪
- python dlib学习(五):比对人脸
直接进入主题吧,这次我们要自己训练一个模型。使用dlib训练一个基于HOG的物体识别器。

准备数据集
首当其冲地就是数据集,这里提供一个很方便的工具imglab。
dlib官方源码中提供了这个工具,想要的可以去下载。
1. 在从github上下载的源码中,文件路径为:dlib/tools/imglab。
2. 这里我再提供一个下载链接,提取出了这个工具包供下载。http://download.csdn.net/download/hongbin_xu/10103900
(推荐到官网自行下载)
默认已经下载好了这个文件。
进入目录,输入以下指令:

mkdir build
cd build
cmake ..
cmake --build . --config Release
1
2
3
4

编译好了再:

sudo make install
1
安装完成之后可以直接在console里使用imglab指令调用。

接下来使用imglab给数据集打标签。
我自己在网上收集了一些猫的照片,用于训练。打标签在猫的脸上,所以这里相当于对猫脸进行识别(笑)。数据集需要自己事先收集好,这里我用的数据集会在文章的最后附上,需要的请自行下载。

使用imglab先创建我们要用来记录标签的xml文件。
进入到当前目录下:

imglab -c mydata.xml ./
1
mydata.xml:这个是xml文件的名字,随便取一个就是了
./:这个是你的数据集的目录,我是直接在数据集文件夹中创建的,所以直接指定当前文件夹

之后文件夹中会生成两个文件:一个xml文件,一个xsl文件。如下图所示:

接下来,打开这个xml文件:

imglab mydata.xml
1

随后会启动工具软件。

接下来一张一张图片打标签吧。
操作很简单,按下shift键后,鼠标左键拖动就会画出框;先松开左键,就会记录这个框,若先松开shift键,则不记录操作。

最后,打开你的xml文件,里面已经标注好了标签的信息:


程序和结果
训练模型
# -*- coding: utf-8 -*-
import os
import sys
import glob
import dlib
import cv2

# 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
# 支持向量机的C参数,通常默认取为5.自己适当更改参数以达到最好的效果
options.C = 5
# 线程数,你电脑有4核的话就填4
options.num_threads = 4
options.be_verbose = True

# 获取路径
current_path = os.getcwd()
train_folder = current_path + '/cats_train/'
test_folder = current_path + '/cats_test/'
train_xml_path = train_folder + 'cat.xml'
test_xml_path = test_folder + 'cats.xml'

print("training file path:" + train_xml_path)
# print(train_xml_path)
print("testing file path:" + test_xml_path)
# print(test_xml_path)

# 开始训练
print("start training:")
dlib.train_simple_object_detector(train_xml_path, 'detector.svm', options)

print("") # Print blank line to create gap from previous output
print("Training accuracy: {}".format(
dlib.test_simple_object_detector(train_xml_path, "detector.svm")))

print("Testing accuracy: {}".format(
dlib.test_simple_object_detector(test_xml_path, "detector.svm")))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
运行程序:
开始训练

接下来等待一小会儿,我用的数据集并不大,在我的笔记本上跑了没多久就好了。

可以看到准确率差不多7成。模型保存到了detector.svm中。

测试模型
# -*- coding: utf-8 -*-

import os
import sys
import dlib
import cv2
import glob

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

current_path = os.getcwd()
test_folder = current_path + '/cats_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 faces detected: {}".format(len(dets)))
for index, face in enumerate(dets):
print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))

left = face.left()
top = face.top()
right = face.right()
bottom = face.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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
代码很简单,不做赘述。

识别的结果:

由于光照、角度等等的因素,训练结果还是需要改进的。我放的数据集很小,加大数据集可以一定程度上改进这个问题。

吐槽:
话说这个不应该叫做“猫”脸识别吗?
( ̄_ ̄ )

我用到的数据集下载链接:
http://download.csdn.net/download/hongbin_xu/10103946

原文链接:https://blog.csdn.net/hongbin_xu/article/details/78443289

免责声明:文章转载自《python dlib学习(六):训练模型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CIOCPServer的数据结构定义及内存池方案janusgraph-创建索引出现GraphIndexStatusReport[success=false, indexName='mixedvlabel', targetStatus=[REGISTERED], notConverged={vlabel=INSTALLED}, converged={}, elapsed=PT1M0.07S]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue vue-resource 请求数据

<template> <!-- 所有的内容要被根节点包含起来 --> <div id="home"> 首页组件 <button @click="getData()">请求数据</button> <hr&g...

Mysql 数据库数值类型详解

MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER、SMALLINT、DECIMAL 和NUMERIC),以及近似数值数据类型(FLOAT、REAL 和DOUBLE PRECISION),并在此基础上做了扩展。扩展后增加了TINYINT、MEDIUMINT 和BIGINT 这3 种长度不同的整型,并增加了BIT 类型,用来存...

WinInet:HTTPS 请求出现无效的证书颁发机构的处理

     首先,微软提供的WinInet库封装了对网页访问的方法。      最近工作需要从https服务器获取数据,都知道https和http网页的访问方式不同,多了一道证书认证程序,这样就使得https在请求起来比http要复杂的多;好在,WinInet库中提供了对https网页请求的处理,这样就不需要在使用openssl中的一些方法来复杂化程序了。...

8086CPU的结构与功能

CPU结构与功能 不管什么型号的CPU,其内部均有这四大部件 ALU:算术逻辑单元 工作寄存器:分为数据寄存器和地址寄存器 工作寄存器的目的是为了提高运算速度,希望参与运算的数据不从外部存储器去取数据,而是在CPU内部取,所以要有能暂存少量数据的寄存器。 数据寄存器是专门存放数据的,地址寄存器是专门存放地址,进行间接寻址方式,但当地址寄存器不提供地址时...

python使用关键字爬取url

python网路爬虫 --------- 使用百度输入的关键字搜索内容然后爬取搜索内容的url 开发环境:windows7+python3.6.3 开发语言:Python 开发工具:pycharm 第三方软件包:需安装lxml4.0,如果只安装lxml会出错,要需要lxml中的etree 废话不多说,贴上代码: 爬取数据保存以TXT格式保存,等会尝试使用E...

ADO.net数据访问方法

ADO.NET是一组用于和数据源进行交互的面向对象的类库。 核心组件有两个:   DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 Dat...