最近刚入门caffe,跟着视频做了一个简单人脸检测。包括人脸二分类模型+方框框出人脸。

人脸二分类模型

1. 收集数据

我用的是lfw数据集,总共有13233张人脸图片。非人脸数据有两种选择。1. 用完全不是人脸的图片;2. 用与人脸重叠比例较小的图片。我用的是动物的图片作为负样本。负样本数据集

2. 制作LMDB数据源(caffe非常支持的常用于分类的数据源)

首先需要写两个txt文档。train.txt 和 val.txt

主要保存的是图片的路径、名称、label。

形如:train.txt

0/xxx.jpg 0

1/xxx.jpg 1

val.txt

0/xxx.jpg 0

1/xxx.jpg 1

其中0文件夹表示正样本(人脸)、1文件夹表示负样本(非人脸)

如果是多分类,文件夹名称也是从0开始

生成txt文本的python代码(linux和Windows下的代码有点不同):

linux版。jupyter notebook作为编译器

import os 
#定义Caffe根目录
caffe_root = '/home/z/work/face_detect/' # 制作训练标签数据
i = 0 # 标签
with open(caffe_root + 'train.txt', 'w') as train_txt:
for root, dirs, files in os.walk(caffe_root + 'train/'): # 遍历文件夹
for dir in dirs:
for root, dirs, files in os.walk(caffe_root + 'train/' + str(dir)): # 遍历每一个文件夹中的文件
for file in files:
image_file = str(dir) + '/' + str(file)
label = image_file + ' ' + str(i) + '\n' # 文件路径+空格+标签编号+换行
train_txt.writelines(label) # 写入标签文件中
i += 1 # 编号加1 # 制作测试标签数据
i = 0 # 标签
with open(caffe_root + 'val.txt', 'w') as val_txt:
for root, dirs, files in os.walk(caffe_root + 'val/'): # 遍历文件夹
for dir in dirs:
for root, dirs, files in os.walk(caffe_root + 'val/' + str(dir)): # 遍历每一个文件夹中的文件
for file in files:
image_file = str(dir) + '/' + str(file)
label = image_file + ' ' + str(i) + '\n' # 文件路径+空格+标签编号+换行
val_txt.writelines(label) # 写入标签文件中
i += 1 # 编号加1
print('成功生成文件列表')

两个txt文件创建后,使用caffe提供create_imagenet.sh。当然需要修改。前几行改成自己的安装目录。还要进行一个resize操作,比如ALEXNET或者VGG通常都是给它resize 227*227. 我的文件是face_lmdb.sh

EXAMPLE=/home/z/work/face_detect
DATA=/home/z/work/face_detect
TOOLS=/home/z/caffe/build/tools TRAIN_DATA_ROOT=/home/z/work/face_detect/train/
VAL_DATA_ROOT=/home/z/work/face_detect/val/ # Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=227
RESIZE_WIDTH=227
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi echo "Creating train lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/face_train_lmdb echo "Creating val lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/face_val_lmdb echo "Done."

命令行输入:sh LMDB脚本文件。

3. 训练模型

使用的是AlEXNET,当然用其他的网络也可以,比如VGG。主要是电脑配置比较差,使用cpu跑的,人脸数据集也没有全部使用。

只是为了跑通上述流程。我的训练集使用了1000张人脸,1000张非人脸。测试集使用600张人脸,600张非人脸。生成的LMDB数据源。

1. 网络模型文件train_val.prototxt.

要改的地方不多。数据来源、batch_size、最后全连接层的num_output该为2(2分类)

name: "AlexNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
#mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
data_param {
source: "/home/z/work/face_detect/face_train_lmdb"
batch_size: 16
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
#mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
data_param {
source: "/home/z/work/face_detect/face_val_lmdb"
batch_size: 16
backend: LMDB
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}

2. 参数配置文件solver.prototxt

net: "/home/z/work/face_detect/train_val.prototxt"
test_iter: 20
test_interval: 1000
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 2000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 1000
snapshot_prefix: "/home/z/work/face_detect/model"
solver_mode: CPU

3. 训练脚本train.sh

#!/usr/bin/env sh
/home/z/caffe/build/tools/caffe train --solver=/home/z/work/face_detect/solver.prototxt

caffe入门-人脸检测1的更多相关文章

  1. 用caffe一步一步实现人脸检测

    学习深度学习已有一段时间了,总想着拿它做点什么,今天终于完成了一个基于caffe的人脸检测,这篇博文将告诉你怎样通过caffe一步步实现人脸检测.本文主要参考唐宇迪老师的教程,在这里感谢老师的辛勤付出 ...

  2. OpenCV入门指南----人脸检测

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...

  3. 人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门

    人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练 ...

  4. 人脸检测数据源制作与基于caffe构架的ALEXNET神经网络训练

    本篇文章主要记录的是人脸检测数据源制作与ALEXNET网络训练实现检测到人脸(基于caffe). 1.数据获取 数据获取: ① benchmark是一个行业的基准(数据库.论文.源码.结果),例如WI ...

  5. caffe_实战之两个简单的例子(物体分类和人脸检测)

    一.物体分类: 这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~ 首先导入一些必要的库: import caffe import numpy as np import matplot ...

  6. MTCNN人脸检测 附完整C++代码

    人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...

  7. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...

  8. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  9. 人脸检测及识别python实现系列(1)——配置、获取实时视频流

    人脸检测及识别python实现系列(1)——配置.获取实时视频流 1. 前言 今天用多半天的时间把QQ空间里的几篇年前的旧文搬到了这里,算是完成了博客搬家.QQ空间里还剩下一些记录自己数学学习路线的学 ...

随机推荐

  1. WebBrowser控件的NavigateToString()方法 参数 为中文时乱码问题的解决。

    public static string ConvertExtendedASCII(string HTML) { StringBuilder str = new StringBuilder(); ch ...

  2. [转] 指定进程运行的CPU

    转自:https://www.cnblogs.com/liuhao/archive/2012/06/21/2558069.html coolshell最新的文章<性能调优攻略>在“多核CP ...

  3. CF1102F Elongated Matrix

    题目地址:CF1102F Elongated Matrix 没想到Div.3里还有这么好的题 其实就是求Hamilton路径 预处理 \(d\) 数组: \(d1_{i,j}\) 表示第 \(i,j\ ...

  4. 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

      相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...

  5. mysql数据库 详解 之 自学成才1

    一.学习目录 1.认识数据库和mysql 2.mysql连接 3.入门语句 4.详解列类型 5.增删改查 INSERT INTO  表名(列1,……  列n)  VALUES(值 1,……  值 n) ...

  6. linux下添加删除,修改,查看用户和用户组

    一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...

  7. openwrt页面显示问题修改

    页面显示错误如下: 在不应该的位置显示了这个,查看配置文件: config igmpproxy        option quickleave '1' config phyint         o ...

  8. mongodb内建角色

    MongoDB内建角色 数据库用户角色:read.readWrite; 数据库管理角色:dbAdmin.dbOwner.userAdmin: 集群管理角色:clusterAdmin.clusterMa ...

  9. windows server 2008开启共享文件设置

    之前设置过共享文件,将共享文件映射成磁盘,重新去设置另外服务器的时候,又到网络上找,特此记录 设置网络共享需要开启的服务如下: 以下服务都相关,需要全部开启后才能保证共享正常:1,UPnP Devic ...

  10. 转载:UML学习(三)-----序列图(silent)

    原文:http://www.cnblogs.com/silent2012/archive/2011/09/14/2172219.html UML的模型中可分为两种,动态模型和静态模型.用例图.类图和对 ...