最近刚入门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相关推荐

  1. python之 ffmpeg+opencv绿幕抠图,蒙版绿幕抠图,透明化处理,PIL检测图片是否包含透明通道

    目录 OpenCV-Python实现绿幕图像抠图 python利用蒙版批量抠图并实现透明化 jpeg格式图片进行批量背景透明化处理 PIL检测图片是否包含透明通道 OpenCV-Python实现绿幕图 ...

  2. caffe检测图片是否包含人脸_人脸识别(基于Caffe)

    人脸识别(基于Caffe, 来自tyd) 人脸识别(判断是否为人脸) LMDB(数据库, 为Caffe支持的分类数据源) mkdir face_detect cd face_detect mkdir ...

  3. php如何检测图片背景是白色,javascript – 用PHP检测白色图像背景?

    是否可以使用 PHP(或JS或类似的东西)来检测图像是否具有大部分白色背景? 这是因为在我显示图像的地方有一个白色的背景.并且一些图像具有深色或彩色背景,但有些图像是白色或大多数是白色.我有一个名为i ...

  4. C#人脸识别入门篇(Step by step 人脸识别)

    C#人脸识别入门篇-Step ByStep人脸识别 引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不 ...

  5. C# 虹软arcface人脸识别入门篇

    引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不上潮流了.人脸识别是一个算法密集型的项目,如果自行开 ...

  6. C#人脸识别入门篇-STEP BY STEP人脸识别--入门篇

    引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果应用中不能集成人脸识别,那就太跟不上潮流了.人脸识别是一个算法密集型的项目,如果自行开 ...

  7. 学习笔记:YOLO(Python版)检测图片标注目标位置

    前记: 作用说明:学习笔记,主要用于自我记录. (PS:本人菜鸟,文章仅供参考:如有错误,欢迎各位大神批评指正!) 最近刚刚接触yolo,由于yolo官网和网上各种资料几乎都是基于C语言的,本人觉得p ...

  8. opencv快速入门人脸检测与人脸识别

    让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...

  9. TensorFlow入门 | 人脸检测与识别

    人脸识别概述 人脸识别,特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术.属于生物特征识别技术的一种. 广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集.人脸定位.人脸 ...

最新文章

  1. mysql 主从报错
  2. mysql中自增auto_increment功能的相关设置及问题
  3. 正则表达式匹配Python解法
  4. python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发
  5. Java中的Unsafe在安全领域的一些应用总结和复现
  6. 【LeetCode笔记】剑指 Offer 45. 把数组排成最小的数(Java、字符串、Lambda)
  7. java怎么中断流_JAVA代码运行中断
  8. 软件测试系统并发数,“并发用户数”、“系统用户数”和“同时在线用户数”之间的差别...
  9. Block作为参数时的使用
  10. Python的基本数据类型(1)
  11. Linux 网络配置
  12. Lambda表达式的练习1
  13. 论如何进行培养独立解决问题的能力
  14. 疯狂架构师最强分享:分布式架构与性能优化,你学会了吗?
  15. 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了
  16. 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?
  17. 前端学习笔记DAY1
  18. 关于印发《深圳市福田区稳企惠民纾困“十条”政策》的通知
  19. Angular使用HTTP POST下载流文件
  20. Elasticsearch宕机问题

热门文章

  1. head first Design Pattern State
  2. html js 如何判断页面是第一次访问还是重复刷新访问,使用JS判断页面是首次被加载还是刷新...
  3. Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入
  4. Java黑皮书课后题第4章:*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音。对于非字母的输入,提示非法输入
  5. java怎么判断类相同_java中如何判定两个对象属于同一类 两个对象是不是类的相同实例,即用“===”是什么意思...
  6. 1小时钟回顾MySQL语法(中)
  7. kubernetes1.5即将发布
  8. python -- 字符串的方法及注释
  9. 【solr基础教程之二】索引
  10. http请求在asp.net中的应用