ToB企服应用市场:ToB评测及商务社交产业平台

标题: JavaCV人脸识别三部曲之二:训练 [打印本页]

作者: 宁睿    时间: 2023-6-29 08:06
标题: JavaCV人脸识别三部曲之二:训练
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览

编码

  1. package com.bolingcavalry.grabpush.extend;
  2. import com.bolingcavalry.grabpush.Constants;
  3. import org.bytedeco.opencv.global.opencv_imgcodecs;
  4. import org.bytedeco.opencv.opencv_core.Mat;
  5. import org.bytedeco.opencv.opencv_core.MatVector;
  6. import org.bytedeco.opencv.opencv_core.Size;
  7. import org.bytedeco.opencv.opencv_face.FaceRecognizer;
  8. import org.bytedeco.opencv.opencv_face.FisherFaceRecognizer;
  9. import java.io.File;
  10. import java.io.IOException;
  11. import java.nio.IntBuffer;
  12. import java.util.LinkedList;
  13. import java.util.List;
  14. import static org.bytedeco.opencv.global.opencv_core.CV_32SC1;
  15. import static org.bytedeco.opencv.global.opencv_imgcodecs.IMREAD_GRAYSCALE;
  16. import static org.bytedeco.opencv.global.opencv_imgproc.resize;
  17. /**
  18. * @author willzhao
  19. * @version 1.0
  20. * @description 训练
  21. * @date 2021/12/12 18:26
  22. */
  23. public class TrainFromDirectory {
  24.     /**
  25.      * 从指定目录下
  26.      * @param dirs
  27.      * @param outputPath
  28.      * @throws IOException
  29.      */
  30.     private void train(String[] dirs, String outputPath) throws IOException {
  31.         int totalImageNums = 0;
  32.         // 统计每个路径下的照片数,加在一起就是照片总数
  33.         for(String dir : dirs) {
  34.             List<String> files = getAllFilePath(dir);
  35.             totalImageNums += files.size();
  36.         }
  37.         System.out.println("total : " + totalImageNums);
  38.         // 这里用来保存每一张照片的序号,和照片的Mat对象
  39.         MatVector imageIndexMatMap = new MatVector(totalImageNums);
  40.         Mat lables = new Mat(totalImageNums, 1, CV_32SC1);
  41.         // 这里用来保存每一张照片的序号,和照片的类别
  42.         IntBuffer lablesBuf = lables.createBuffer();
  43.         // 类别序号,从1开始,dirs中的每个目录就是一个类别
  44.         int kindIndex = 1;
  45.         // 照片序号,从0开始
  46.         int imageIndex = 0;
  47.         // 每个目录下的照片都遍历
  48.         for(String dir : dirs) {
  49.             // 得到当前目录下所有照片的绝对路径
  50.             List<String> files = getAllFilePath(dir);
  51.             // 处理一个目录下的每张照片,它们的序号不同,类别相同
  52.             for(String file : files) {
  53.                 // imageIndexMatMap放的是照片的序号和Mat对象
  54.                 imageIndexMatMap.put(imageIndex, read(file));
  55.                 // bablesBuf放的是照片序号和类别
  56.                 lablesBuf.put(imageIndex, kindIndex);
  57.                 // 照片序号加一
  58.                 imageIndex++;
  59.             }
  60.             // 每当遍历完一个目录,才会将类别加一
  61.             kindIndex++;
  62.         }
  63.         // 实例化人脸识别类
  64.         FaceRecognizer faceRecognizer = FisherFaceRecognizer.create();
  65.         // 训练,入参就是图片集合和分类集合
  66.         faceRecognizer.train(imageIndexMatMap, lables);
  67.         // 训练完成后,模型保存在指定位置
  68.         faceRecognizer.save(outputPath);
  69.         //释放资源
  70.         faceRecognizer.close();
  71.     }
  72.     /**
  73.      * 读取指定图片的灰度图,调整为指定大小
  74.      * @param path
  75.      * @return
  76.      */
  77.     private static Mat read(String path) {
  78.         Mat faceMat = opencv_imgcodecs.imread(path,IMREAD_GRAYSCALE);
  79.         resize(faceMat, faceMat, new Size(Constants.RESIZE_WIDTH, Constants.RESIZE_HEIGHT));
  80.         return faceMat;
  81.     }
  82.     /**
  83.      * 把指定路径下所有文件的绝对路径放入list集合中返回
  84.      * @param path
  85.      * @return
  86.      */
  87.     public static List<String> getAllFilePath(String path) {
  88.         List<String> paths = new LinkedList<>();
  89.         File file = new File(path);
  90.         if (file.exists()) {
  91.             // 列出该目录下的所有文件
  92.             File[] files = file.listFiles();
  93.             for (File f : files) {
  94.                 if (!f.isDirectory()) {
  95.                     // 把每个文件的绝对路径都放在list中
  96.                     paths.add(f.getAbsolutePath());
  97.                 }
  98.             }
  99.         }
  100.         return paths;
  101.     }
  102.     public static void main(String[] args) throws IOException {
  103.         String base = "E:\\temp\\202112\\18\\001\";
  104.         // 存储图片的两个目录
  105.         // man目录下保存了群众演员A的所有人脸照片,
  106.         // woman目录下保存了群众演员B的所有人脸照片
  107.         String[] dirs = {base + "man", base + "woman"};
  108.         // 开始训练,并指定模型输出位置
  109.         new TrainFromDirectory().train(dirs, base + "faceRecognizer.xml");
  110.     }
  111. }
复制代码
执行

源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4