caffe检测图片是否包含人脸_caffe入门-人脸检测1
最近刚入门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 indirs:for root, dirs, files in os.walk(caffe_root + 'train/' + str(dir)): #遍历每一个文件夹中的文件
for file infiles:
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 indirs:for root, dirs, files in os.walk(caffe_root + 'val/' + str(dir)): #遍历每一个文件夹中的文件
for file infiles:
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=trueif$RESIZE; then
RESIZE_HEIGHT=227RESIZE_WIDTH=227
elseRESIZE_HEIGHT=0
RESIZE_WIDTH=0
fiif [ ! -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."exit1fiif [ ! -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."exit1fi
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:16backend: 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:16backend: LMDB
}
}
layer {
name:"fc8"type:"InnerProduct"bottom:"fc7"top:"fc8"param {
lr_mult:1decay_mult:1}
param {
lr_mult:2decay_mult: 0
}
inner_product_param {
num_output:2weight_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:20test_interval:1000base_lr:0.001lr_policy:"step"gamma:0.1stepsize:2000display:20max_iter:450000momentum:0.9weight_decay:0.0005snapshot:1000snapshot_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检测图片是否包含人脸_caffe入门-人脸检测1相关推荐
- python之 ffmpeg+opencv绿幕抠图,蒙版绿幕抠图,透明化处理,PIL检测图片是否包含透明通道
目录 OpenCV-Python实现绿幕图像抠图 python利用蒙版批量抠图并实现透明化 jpeg格式图片进行批量背景透明化处理 PIL检测图片是否包含透明通道 OpenCV-Python实现绿幕图 ...
- caffe检测图片是否包含人脸_人脸识别(基于Caffe)
人脸识别(基于Caffe, 来自tyd) 人脸识别(判断是否为人脸) LMDB(数据库, 为Caffe支持的分类数据源) mkdir face_detect cd face_detect mkdir ...
- php如何检测图片背景是白色,javascript – 用PHP检测白色图像背景?
是否可以使用 PHP(或JS或类似的东西)来检测图像是否具有大部分白色背景? 这是因为在我显示图像的地方有一个白色的背景.并且一些图像具有深色或彩色背景,但有些图像是白色或大多数是白色.我有一个名为i ...
- C#人脸识别入门篇(Step by step 人脸识别)
C#人脸识别入门篇-Step ByStep人脸识别 引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不 ...
- C# 虹软arcface人脸识别入门篇
引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不上潮流了.人脸识别是一个算法密集型的项目,如果自行开 ...
- C#人脸识别入门篇-STEP BY STEP人脸识别--入门篇
引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不上潮流了.人脸识别是一个算法密集型的项目,如果自行开 ...
- 学习笔记:YOLO(Python版)检测图片标注目标位置
前记: 作用说明:学习笔记,主要用于自我记录. (PS:本人菜鸟,文章仅供参考:如有错误,欢迎各位大神批评指正!) 最近刚刚接触yolo,由于yolo官网和网上各种资料几乎都是基于C语言的,本人觉得p ...
- opencv快速入门人脸检测与人脸识别
让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...
- TensorFlow入门 | 人脸检测与识别
人脸识别概述 人脸识别,特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术.属于生物特征识别技术的一种. 广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集.人脸定位.人脸 ...
最新文章
- mysql 主从报错
- mysql中自增auto_increment功能的相关设置及问题
- 正则表达式匹配Python解法
- python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发
- Java中的Unsafe在安全领域的一些应用总结和复现
- 【LeetCode笔记】剑指 Offer 45. 把数组排成最小的数(Java、字符串、Lambda)
- java怎么中断流_JAVA代码运行中断
- 软件测试系统并发数,“并发用户数”、“系统用户数”和“同时在线用户数”之间的差别...
- Block作为参数时的使用
- Python的基本数据类型(1)
- Linux 网络配置
- Lambda表达式的练习1
- 论如何进行培养独立解决问题的能力
- 疯狂架构师最强分享:分布式架构与性能优化,你学会了吗?
- 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了
- 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?
- 前端学习笔记DAY1
- 关于印发《深圳市福田区稳企惠民纾困“十条”政策》的通知
- Angular使用HTTP POST下载流文件
- Elasticsearch宕机问题
热门文章
- head first Design Pattern State
- html js 如何判断页面是第一次访问还是重复刷新访问,使用JS判断页面是首次被加载还是刷新...
- Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入
- Java黑皮书课后题第4章:*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音。对于非字母的输入,提示非法输入
- java怎么判断类相同_java中如何判定两个对象属于同一类 两个对象是不是类的相同实例,即用“===”是什么意思...
- 1小时钟回顾MySQL语法(中)
- kubernetes1.5即将发布
- python -- 字符串的方法及注释
- 【solr基础教程之二】索引
- http请求在asp.net中的应用