上一篇文章讲解了如何使用 jdeep-learning 调用本地摄像头进行人脸识别,那么如果您想在人脸底库中添加自己的人脸数据,您需要自己采集并重新训练FaceNet网络。具体步骤如下:
1.打开cn.jiming.jdlearning.test.face.FaceDetectionByDevice.java
@Test
public void test() throws Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); //开始获取摄像头数据
CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
int i = 200;
while(true){
if(!canvas.isDisplayable()){//窗口是否关闭
grabber.stop();//停止抓取
System.exit(2);//退出
break;
}
Frame frame = grabber.grabFrame();
// 将Frame转为Mat
Mat mat = converter.convertToMat(frame);
//人脸定位
List<Mat> faces = RetinaFaceDetection.faceDetection(mat);
//保存人脸 (您自己修改路径)
for(Mat face:faces) {
// 输出图片
imwrite("E:\\faces\\" + i + ".png", face);
i++;
}
//Image转Frame
Frame convertFrame1 = Java2DFrameUtils.toFrame(mat);
canvas.showImage(convertFrame1);//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
mat.release();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2.修改好保存人脸的路径地址后直接运行即可开始采集。
结果:
到此人脸采集完成!
训练自己的FaceNet网络
1.打开cn.jiming.jdlearning.test.face.TrainFaceNetTest.java
@Test
public void train() {
String trainPath = "img/face/train";
String faceNetPath = "models/face_net.xm";
//开始训练
System.out.println("***** 开始训练 ***** ");
FaceClassificationTrain.training(null , trainPath, faceNetPath);
System.out.println("***** 训练完成 ***** ");
}
2.把前面采集好的人脸照片都copy到“img/face/train”目录下,并给自己新建一个文件夹,名称最好使用数字字母,如:
3.以上步骤准备好后,就可以开始执行@Test单元了,训练好的模型文件保存在"models/face_net.xm",这样您的项目就可以使用自己新训练出来的FaceNet了,算法将会识别到您。