Camera combat trece de JavaCV: detección de edad

¡Acostúmbrate a escribir juntos! Este es el octavo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Bienvenido a mi GitHub

Todos los trabajos originales de Xinchen (incluido el código fuente de soporte) se clasifican y resumen aquí: github.com/zq2599/blog…

Resumen de este artículo

  • Este artículo es el decimotercer artículo de la serie "Cámara de combate real de JavaCV". En el artículo anterior "Cámara de combate real de JavaCV No. 12: Detección de género" , se desarrolló la aplicación de reconocimiento de género con la ayuda del modelo de red neuronal convolucional entrenado. Hoy en el artículo anterior Sobre la base, realice algunos cambios para realizar la función de reconocimiento de edad. El efecto es el siguiente:

inserte la descripción de la imagen aquí

  • Las principales funciones de la aplicación se muestran en la siguiente figura:

inserte la descripción de la imagen aquí

  • Si ha leído otros artículos en la serie "JavaCV Camera Actual Combat", encontrará que solo la parte azul en la figura anterior es contenido nuevo, y el resto de los pasos son rutinas fijas. Cada aplicación en la "JavaCV Camera Actual Combat" La serie "Combate" puede jugar Todos son la misma rutina: independientemente de la cantidad de pasos, en realidad es el mismo proceso

Acerca de la detección de sexo y edad

  • Más detalles técnicos sobre la inferencia de género y edad mediante redes neuronales convolucionales se explican con más detalle aquí:

talhassner.github.io/home/public…

  • Este artículo utilizará un modelo Caffe entrenado, los datos para entrenar el modelo provienen de álbumes de Flickr, ensamblados mediante carga automática desde dispositivos de teléfonos inteligentes iPhone5 (o posteriores) y publicados por su autor bajo una licencia Creative Commons (CC). un total de 26580 fotos, involucrando a 2284 personas, las edades de estas personas fueron identificadas en ocho grupos: (0-2, 4-6, 8-13, 15-20, 25-32, 38-43, 48-53, 60 -)
  • Para obtener más detalles sobre la fuente de datos, consulte: talhassner.github.io/home/projec…
  • Dirección en papel: talhassner.github.io/home/projec…

Descarga del código fuente

  • 《JavaCV人脸识别三部曲》的完整源码可在GitHub下载到,地址和链接信息如下表所示(github.com/zq2599/blog…
名称 链接 备注
项目主页 github.com/zq2599/blog… 该项目在GitHub上的主页
git仓库地址(https) github.com/zq2599/blog… 该项目源码的仓库地址,https协议
git仓库地址(ssh) [email protected]:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本篇的源码在javacv-tutorials文件夹下,如下图红框所示:

inserte la descripción de la imagen aquí

  • javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在simple-grab-push工程下:

inserte la descripción de la imagen aquí

准备:文件下载

  • 本次实战需要三个文件:
  1. 人脸检测的模型文件:raw.github.com/opencv/open…
  2. 年龄识别的配置文件:raw.githubusercontent.com/GilLevi/Age…
  3. 年龄识别的模型文件:raw.githubusercontent.com/GilLevi/Age…

准备:代码接口简介

  • 编码前,先把涉及到的所有java文件说明一下:
  1. AbstractCameraApplication.java:主程序的抽象类,这里面定义了打开摄像头、抓取每一帧、处理每一帧的基本框架,避免每个应用都把这些事情重复做一遍
  2. PreviewCameraWithGenderAge.java:主程序,是AbstractCameraApplication的实现类,本次实战的核心功能人脸检测和年龄检测,都委托给它的成员变量detectService去完成
  3. DetectService.java:检测服务的接口,里面定义了几个重要的api,例如初始化、处理每一帧、释放资源等
  4. AgeDetectService.java:前文GenderDetectService的子类,仅仅是处理推理结果的逻辑与前文的性别识别略有不同,其余功能完全继承自性别识别
  • 以上代码,咱们已经在前文写过一次了,今天当然不需要重复再做一次,今天是在上述代码基础上做两处小幅度修改,接下来就开始吧

改动一:主程序(PreviewCameraWithGenderAge.java)

  • 卷积神经网络所需的配置和模型文件,是在主程序的main方法内设置的,上一章是性别检测,这里替换为年龄检测的文件,如下所示,请您将路径换为自己电脑上的文件路径:
    public static void main(String[] args) {
        String base = "E:\\temp\\202112\\25\\opencv\\";
        
        DetectService detectService = new AgeDetectService(
                base + "haarcascade_frontalface_alt.xml",
                base + "age\\deploy.prototxt",
                base + "age\\age_net.caffemodel");

        new PreviewCameraWithGenderAge(detectService).action(1000);
    }
复制代码

改动二:检测服务实现(GenderDetectService的子类)

  • 前文《性别检测》的核心功能都集中在GenderDetectService.java中,今天要做的年龄检测,除了推理结果的处理逻辑略有不同,其余功能与《性别检测》完全一致
  • 所以,实现年龄检测的最简单方法就是写一个子类继承GenderDetectService,这个子类中只有神经网络推理结果的处理逻辑,完整代码如下,注释中已经有了详细说明,就不多赘述了:
@Slf4j
public class AgeDetectService extends GenderDetectService {

    /**
     * 设置训练模型时划分的年龄段,所以推理结果也是这样的年龄段
     */
    private static final String[] AGES = new String[]{"0-2", "4-6", "8-13", "15-20", "25-32", "38-43", "48-53", "60-"};

    public AgeDetectService(String classifierModelFilePath, String cnnProtoFilePath, String cnnModelFilePath) {
        super(classifierModelFilePath, cnnProtoFilePath, cnnModelFilePath);
    }

    @Override
    protected String getDescriptionFromPredictResult(Mat prob) {
        DoublePointer pointer = new DoublePointer(new double[1]);
        Point max = new Point();
        
        // 把prob理解为一个数组,
        // 第一个元素是"0-2"的置信度
        // 第二个元素是"4-6"的置信度
        // minMaxLoc方法帮忙我们找出了置信度最高的元素,max是元素位置,pointer是这个元素的置信度
        minMaxLoc(prob, null, pointer, null, max, null);

        // 如果置信度太低,那就是"难以置信",就返回空字符串
        if (pointer.get()<0.6d) {
            return "";
        } else {
            // 如果置信度可信,就返回该元素对应的年龄范围
            return AGES[max.x()];
        }
    }
}
复制代码
  • 至此,编码完成,按套路出牌让咱们省下不少时间,接下来开始验证

验证

  • 确保摄像头工作正常,运行PreviewCameraWithGenderAge类的main方法(再次提醒,main方法中文件的位置,注意是年龄检测的模型文件,不是性别检测的)
  • 天气很冷,为了领到免费盒饭,群众演员早就等得不耐烦了,让他站在摄像头前,如下图,年龄识别成功,且实时展示:

在这里插入图片描述

  • En este punto, la función de integración de detección de rostros y detección de edad en la vista previa de la ventana local se ha completado. Gracias al poder de JavaCV, todo el proceso es tan fácil y agradable. A continuación, continúe prestando atención a Xinchen Original, el La serie "JavaCV Camera Actual Combat" también presentará aplicaciones más ricas;

Acerca del reconocimiento de género + edad

  • Si ha prestado atención a los artículos técnicos relacionados con el reconocimiento de género y edad en Internet, encontrará que estos artículos generalmente integran los dos reconocimientos juntos, y el efecto del código también hereda los dos reconocimientos, como se muestra en la siguiente figura. :

在这里插入图片描述

  • También puede tener preguntas: ¿por qué Xinchen no pone las dos identificaciones en un artículo y una demostración, para que el contenido sea más completo y la demostración sea más poderosa?
  • La razón por la que los dos artículos están divididos es porque las rutinas de reconocimiento de edad y género son relativamente cercanas.Si terminas de hablar en un artículo, no es más que escribir unas líneas más de código y escribir unas líneas más de palabras, lo que no mejorará la tecnología. Cada artículo solo se enfoca en una función y explica claramente los puntos técnicos como la inicialización, el uso y la liberación de recursos. En cuanto a si se usa solo o en combinación, se deja a los lectores inteligentes libremente combinar de acuerdo a sus propias necesidades.

Bienvenido a los Nuggets: Programador Xin Chen

En el camino del aprendizaje, no estás solo, Xinchen Original te acompañará en todo el camino...

Supongo que te gusta

Origin juejin.im/post/7084029249048444941
Recomendado
Clasificación