QT+Opencv实现人脸检测与性别识别(2)

来源:互联网 发布:ubuntu 升级软件包 编辑:程序博客网 时间:2024/05/21 17:13

seetaface开源人脸检测框架实现人脸检测,OpenCV+dnn模块实现性别分类,qt做显示界面,完成一个课程设计。

依赖库:opencv3.1+ 包含dnn模块,QT5

1.性别分类网络训练

1.3.网络结构定义

网络结构参考Age and Gender Classification using Convolutional Neural Networks论文,是CVPR2015年的文章,用卷积神经网络对年龄和性别做识别,我们只用其网络模型对性别做分类。网络结构如下图

这里写图片描述

其实是一个比较常规的网络框架,论文中的性别识别准确率在86%左右,感觉性别识别这个任务还是比较难的,当然,作者的数据集也属于实际场景,有很多模糊,畸变,遮挡等干扰,导致准确率不高。这篇论文应该是比较早的將CNN用于年龄的性别识别任务,并且取得了优于以前方法的效果。传统方法是使用人工特征,lbp,gabor等等,再用svm分类器。

caffe网络定义文件
train_val.prototxt,这个可以在网络上找到作者开源的文件,或者自己根据网络写也行。3卷积层,relu作为激活函数,再加上dropout,softmax损失函数。

caffe sovler.prototxt
这个是caffe训练的配置文件,下面进行分析

net: “examples/amyfile/gender/train_val.prototxt”
test_iter: 10
test_interval: 100
base_lr: 0.001
lr_policy: “step”
gamma: 0.1
stepsize: 1000
display: 20
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
solver_mode: GPU

net:网络结构定义文件位置
test_iter:测试一次epoch需要迭代的次数,结合batch_size*test_iter=测试集大小。
疑问:如果batch_size*test_iter < or >测试集大小呢?
test_interval:每迭代test_interval次就测试一次
base_lr lr_policy gamma stepsize:控制每stepsize次学习率乘以gamma
momentum:动量?
其他的不再表述

1.4.caffe训练自己的数据

用caffe训练分类网络,可以用官方已经编译好的程序训练,下面分成abcd四个步骤

a.建立训练集文件路径txt与验证集文件txt
写一个python脚本就行了,注意的是,我们的label要从0开始,之前我以为label只要代表不同类别就行,不过,实验发现label不从0开始,貌似会影响训练,stackoverflow有类似问题。

#encoding:utf-8import os'''获取male样本和female样本中的图片的绝对路径,并保存在txt文件中,male样本路径后加上标签1,female样本路径后加上标签2,如male0.jpg 0male1.jpg 0female0.jpg 1female1.jpg 1'''male_path = 'valmale' #male相对路径file_list = os.listdir(male_path)#female路径下的图片相对路径 male0.jpg#print file_listf = open('val.txt','w')abs_path_list=[]#图片绝对路径print 'male......'for file in file_list:    file_name = male_path+'/'+file    #print file_name    abs_path_list.append(file_name+' 0\n')female_path = 'valfemale'file_list = os.listdir(female_path)print 'female......'for file in file_list:    file_name = female_path+'/'+file    abs_path_list.append(file_name+' 1\n')f.writelines(abs_path_list)

b.创建LDBM数据格式

写个脚本create_lmdb.sh调用caffe编译好的程序,创建caffe需要的格式,下面分析

#!/usr/bin/env shMY=examples/amyfile/gender#自己的主目录echo "Create train lmdb.."rm -rf $MY/img_train_lmdbbuild/tools/convert_imageset \ #要在caffe目录下运行的程序--shuffle \--resize_height=227 \ #图片resize--resize_width=227 \/home/xiong/caffe/examples/amyfile/gender/ \$MY/label.txt \ #训练文件路径txt$MY/img_train_lmdb#下同上echo "Create test lmdb.."rm -rf $MY/img_test_lmdbbuild/tools/convert_imageset \--shuffle \--resize_width=227 \--resize_height=227 \/home/xiong/caffe/examples/amyfile/gender/ \$MY/val.txt \$MY/img_test_lmdbecho "All Done.."

c.生成meanfile

执行

build/tools/compute_image_mean examples/amyfile/gender/img_train_lmdb examples/amyfile/gender/mean.binaryproto

实际上,就是再caffe目录下,运行compute_image_mean,將lmdb计算均值文件,并保存设置的目录下

d.训练模型

还是创建一个train.sh脚本吧

#!/usr/bin/env shCAFFE_ROOT=/home/caffeSLOVER_ROOT=/home/caffe/examples/amyfile/gender$CAFFE_ROOT/build/tools/caffe train --solver=$SLOVER_ROOT/slover.prototxt --gpu=0

至此,会在caffe目录下保存训练的模型,个人感觉caffe用这种方法训练还是挺麻烦的。

小结:训练的过程主要是定义好网络结构文件,训练方法文件,再用caffe编译好的程序,计算均值,转换数据格式,训练等,大多数通过.sh脚本实现。训练过程中发现准确率上升的比较快,不过到达89%左右就难以再提高了。比较原文,我们的准确率基本接近论文的准确率,稍微高点的原因是我们的数据是lfw数据库,相对而言可能简单一点,并且我们只有600张验证图片,验证结果不太可靠,需要更多的训练集和验证集,才能说明问题。

原创粉丝点击