使用卷积神经网络(CupCnn)训练人脸检测模型

结果展示

最近尝试做了下人脸检测,先上两张效果图吧:
这里写图片描述

这里写图片描述

这已经是跳出来的效果比较好的图片了,表现的确是有点差。
我用了4000(19*19)多张人脸图片和8000(19*19)多张非人脸图片训练出了这个卷积模型。这个数据量确实有点少,所以效果不太好也是可以理解的。主要还是分享做人脸检测的经历。但是,我还是相信只要给我充分的数据,我也可以训练出高质量的模型。

FaceDetector

源码我已经上传到Github了,感兴趣的欢迎下载,点赞的感谢万分!!!!
地址:FaceDetector

和代码一起上传的,还有训练使用的数据(face_detection.bin),它是一个二进制文件,制作过程和读取过程请参考前面一篇博客:
自己制作机器学习训练和测试使用的二进制数据集(C++)
当然,在FaceDetector项目中我用java重写了读取二进制文件的部分代码。

FaceDetector中使用的卷积神经网络是我之前自己写的CupCnn,请参考我之前的博客:
java写卷积神经网络—CupCnn简介

有了卷积神经网络,有了数据,接下来做的事情和训练mnist差不多了。

训练完成后,构建图像金字塔,然后扫描图像金字塔,从中寻找人脸。

FaceDetector工程图如下:
这里写图片描述

cupcnn包下是卷积神经网络的实现。
face包下是人脸检测的实现。

BinaryDatasetReader.java —-从二进制数据集中读取图片和标签
FaceInfo.java —– 记录人脸的位置,是人脸的概率
FaceNetwork.java —- 搭建人脸检测神经网络
ImageGui.java —– 显示图片
ScanImagePyramid —– 构建图像金字塔并在金字塔上搜索人脸
FaceDetectorTest —– main函数入口。

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        //if you want train nework,Uncomment the following code
        //trainFaceNetwork();

        //if you want test,Uncomment the following code
        testFaceDetector();
    }

如果想训练,就调用trainFaceNetwork()方法,如果要测试,请调用testFaceDetector();

依赖

为了方便读取图片,构建图像金字塔,项目使用opencv库。如果您对配置Opencv不熟悉,请参考下面的步骤:
下面内容引用自 OpenCV For Java环境搭建与功能演示一文
这里写图片描述

交流

如果在使用这个FaceDetector的过程中遇到问题,或者对机器学习感兴趣,欢迎加入下面的QQ群讨论交流:
机器学习 QQ交流群:704153141

猜你喜欢

转载自blog.csdn.net/u011913612/article/details/79528854