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张验证图片,验证结果不太可靠,需要更多的训练集和验证集,才能说明问题。
- QT+Opencv实现人脸检测与性别识别(2)
- QT+Opencv实现人脸检测与性别识别(1)
- 基于opencv的人脸性别识别
- QT之opencv人脸识别,瞳孔检测
- 关于QT+OPENCV 实现人脸检测
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
- 基于QT和OpenCV的人脸检测识别系统(2)
- OpenCV人脸检测+识别
- C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数
- 人脸识别之性别实现
- OpenCV人脸检测与人脸识别
- qml+opencv(三)人脸检测与识别
- qml+opencv(三)人脸检测与识别
- 人脸实时情绪与性别识别
- 人脸和性别识别(基于OpenCV)
- Qt+Caffe+OpenCV——【一个基于VGG网络的人脸识别考勤系统】(一)人脸检测与识别模块
- 年少成名的我并没有放弃自己,谁敢说她\他文章比我写的好?!,不服来战!
- Altium Designer中如何进行覆铜和网状覆铜?
- 简化java开发
- smail的语法
- 8月18日总结
- QT+Opencv实现人脸检测与性别识别(2)
- MapReduce数据倾斜解决方案1--1、重新设计key---二次作业
- Android判断是否有网络跳转
- 基于POJ2991Crane问题对线段树的理解
- 【算法】3、堆排序
- POJ3090-Visible Lattice Points-数论
- 块元素/行内元素的转变
- 面试笔试--TCP/IP知识点
- 奇奇怪怪的东西们