一、数据集准备 点击此处返回总目录 二、数据处理 三、数据集划分 四、制作标签 五、生成LMDB文件 六、编写网络结构文件 七、编写超参数文件 八、训练模型 九、测试模型 十、把分类器CNN转换成全卷积网络CFN 十一、
目的:输入一张图片,希望能够把这些人的脸框出来。 参考:https://blog.youkuaiyun.com/sinat_14916279/article/details/71273892 注:我不是做人脸检测的,纯粹就是练手玩一下~~
一、数据集准备 从网上下载人脸检测的数据集。数据来源很多,比如benchmark啊,论文里的啊什么的,自己找吧。我下载后的数据的格式是: 路径/xxx.jpg 60,80,280,320
其中四个值分别表示人脸框的左上角坐标和右下角坐标。其实关于标注,也不一定是给出左上角右下角的坐标这种方法。也可能是给出左上角坐标+图像高度+图像宽度等方法。
二、数据处理 我们想让模型知道什么样是人脸,什么样不是人脸。模型做的是分类的任务。 训练数据应当是二分类的数据,第一类是人脸,第二类是非人脸。
1. 根据原始数据制作正样本(人脸)数据。 什么是人脸呢?就是图中框框的部分。下载的数据集的图像不是光包括人脸的,而是既有人脸又有身体什么的图片。我们要做一个裁剪的操作得到人脸的图片。可以根据标注的坐标把人脸裁剪出来。这样就得到了正样本。可以使用OpenCV来做,很简单。裁剪完之后检查检查把不太好的删掉。
得到人脸数据:
2. 根据原始数据制作负样本(非人脸)数据。 什么是非人脸呢?除了人脸,其他都是非人脸。负样本稍微麻烦一点。
第一种情况就是,图中红色框框中的就是非人脸。 第二种情况就是,重合了一小部分的我们也可以认为是非人脸。比如: 这时我们需要定义一个指标:交并比(Intersection-over-Union,IoU),是指是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。
因此,对于非人脸制作。我们随机选很多框。框的个数可以是几十上百,框的大小也可以随机变化。 找出框来之后,计算与人脸框的IoU。如果重叠的比例小于0.3,我们就认为是非人脸数据。如果IoU>0.7,也可以认为是人脸数据,放到人脸数据集中(这样的话不仅仅可以增加人脸数据的大小,而且考虑了人脸的遮挡、照不全等情况)。如果0.3<IoU<0.7,就去掉。 当然生成之后检查检查把不太好的删掉。
如果担心得到非人脸数据里面掺了人脸的图片,又不想费力气去检查一下,还有一种方法就是从其他的数据集中裁剪,比如物体检测的数据集里面就没有人脸,无论怎么切都切不出来人脸来。
最后得到非人脸数据:
三、数据集划分 正样本和负样本已经有了之后,还需要对样本进行划分。划分成训练集、验证集和测试集。 划分结果如下:
|----data | |---- face_train | | |----0 //训练集正样本。15738张图片。人脸。 | | |----1 //训练集负样本。15663张图片。非人脸。 | | | | | |---- face_val | | |----0 //验证集正样本。3156张图片。人脸。 | | |----1 //验证集负样本。3146张图片。非人脸。 | | | | | |----face_test | |----0 //测试集正样本。2079张图片。人脸。 | |----1 //测试集负样本。2066张图片。非人脸。 | | |---labels //存放标签 | | |---bat //存放脚本 | | |---lmdb //存放转换后的lmdb数据 | | |---model //训练后结果保存到这里 | | |---draw //可视化的图保存在这里
四、制作标签
编写生成标签的程序,在labels文件夹下生成了face_train.txt和face_val.txt文件:
五、生成LMDB文件 AlexNet和VGGNet一般resize到227*227。
//create_train_lmdb.bat
//create_test_lmdb.bat
运行,可以看到在lmdb文件夹下生成了face_train_lmdb目录和face_val_lmdb目录,里面有lmdb文件。
六、编写网络结构文件 //train_val.prototxt
|
项目一:人脸检测(基于Caffe)
最新推荐文章于 2021-11-27 21:31:22 发布