又快又好,行人检测和人脸检测和人脸关键点检测(c++/android源码)(代码片段)

pan_jinquan pan_jinquan     2022-11-28     352

关键词:

又快又好,行人检测(人体检测)和人脸检测和人脸关键点检测(C++/Android)

目录

又快又好,行人检测(人体检测)和人脸检测和人脸关键点检测(C++/Android)

1.前言

2.项目说明

(1)数据集

(2)模型训练

(3)依赖库

3. JNI接口

4. 人脸人体检测效果展示

5.源码下载

6.人体关键点Demo(Android版本)


1.前言

考虑到人脸人体检测的需求,本人开发了一套轻量化的,高精度的,可实时的人脸/人体检测Android Demo,主要支持功能如下:

  1. 支持人脸检测算法模型
  2. 支持人脸检测和人脸关键点检测(5个人脸关键点)算法模型
  3. 支持人体检测(行人检测)算法模型
  4. 支持人脸和人体同时检测算法模型

所有算法模型都使用C++开发,推理框架采用TNN,Android通过JNI接口进行算法调用;所有算法模型都可在普通Android手机实时跑,在普通Android手机,CPU和GPU都可以达到实时检测的效果(CPU约25毫秒左右,GPU约15毫秒左右)

先看一些效果:

人脸关键点检测人体检测人脸+人体检测

Android Demo APP免费体检:

链接: https://download.csdn.net/download/guyuealian/25924076

Android Demo APP源码下载地址:

实时人体检测和人脸检测和人脸关键点检测(C++/Android)

尊重原创,转载请注明出处https://panjinquan.blog.csdn.net/article/details/125348189

2.项目说明

(1)数据集

人脸人体的数据都来源于网上开源的数据集,其中把WiderFace数据集作为人脸检测和人脸关键点检测的训练数据集;使用COCO的数据集person标签作为人体检测训练的数据

数据集数据说明
WiderFace

WIDER FACE数据集是人脸检测的一个benchmark数据集,包含32203图像,以及393,703个标注人脸,其中,158,989个标注人脸位于训练集,39,496个位于验证集。每一个子集都包含3个级别的检测难度:Easy,Medium,Hard。这些人脸在尺度,姿态,光照、表情、遮挡方面都有很大的变化范围

下载地址:Download - Data Decorators/WIDER FACE | 格物钛,非结构化数据平台

COCO

COCO数据集是一个可用于图像检测(image detection),语义分割(semantic segmentation)和图像标题生成(image captioning)的大规模数据集。它有超过330K张图像(其中220K张是有标注的图像),包含150万个目标,80个目标类别(object categories:行人、汽车、大象等),91种材料类别(stuff categoris:草、墙、天空等),每张图像包含五句图像的语句描述,且有250,000个带关键点标注的行人。

(2)模型训练

训练代码请参考:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB ,一个基于SSD简化的人脸检测模型,很轻量化,整个模型仅仅1.7M左右,在普通Android手机都可以实时检测。

原始代码使用WiderFace人脸数据集进行训练,仅支持了人脸检测,后经鄙人优化后,提高了人脸检测效果,并支持人脸关键点检测,人体检测。数据集是WiderFace,VOC和COCO。

(3)依赖库

# pull 3rdparty(TNN,base-utils) submodule
git submodule init
git submodule update
  • 配置OpenCV

推荐opencv-4.3.0

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make install
  • 配置OpenCL(可选)

Android系统一般都支持OpenCL,Linux系统可参考如下配置:

# 参考安装OpenCL: https://blog.csdn.net/qq_28483731/article/details/68235383,作为测试,安装`intel cpu版本的OpenCL`即可
# 安装clinfo,clinfo是一个显示OpenCL平台和设备的软件
sudo apt-get install clinfo
# 安装依赖
sudo apt install dkms xz-utils openssl libnuma1 libpciaccess0 bc curl libssl-dev lsb-core libicu-dev
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-complete
# 在intel官网上下载了intel SDK的tgz文件,并且解压
sudo sh install.sh
  • CMake配置说明

Linux OR Windows测试,CMakeLists.txt

# TNN set
    set(TNN_OPENCL_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_CPU_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_X86_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_QUANTIZATION_ENABLE OFF CACHE BOOL "" FORCE)
    set(TNN_OPENMP_ENABLE ON CACHE BOOL "" FORCE)  # Multi-Thread
    add_definitions(-DTNN_OPENCL_ENABLE)           # for OpenCL GPU
    add_definitions(-DDEBUG_ON)                    # for WIN/Linux Log
    add_definitions(-DDEBUG_LOG_ON)                # for WIN/Linux Log
    add_definitions(-DDEBUG_IMSHOW_OFF)            # for OpenCV show
    add_definitions(-DPLATFORM_LINUX)
    # add_definitions(-DPLATFORM_WINDOWS)

3. C++/Java接口

所有算法模型都使用C++开发,推理框架采用TNN,Android通过JNI接口进行算法调用

 Java接口:

package com.cv.tnn.model;

import android.graphics.Bitmap;

public class Detector 

    static 
        System.loadLibrary("tnn_wrapper");
    


    /***
     * 初始化关键点检测模型
     * @param proto: TNN *.tnnproto文件文件名(含后缀名)
     * @param model: TNN *.tnnmodel文件文件名(含后缀名)
     * @param root:模型文件的根目录,放在assets文件夹下
     * @param model_type:模型类型
     * @param num_thread:开启线程数
     * @param useGPU:关键点的置信度,小于值的坐标会置-1
     */
    public static native void init(String proto, String model, String root, int model_type, int num_thread, boolean useGPU);

    /***
     * 检测关键点
     * @param bitmap 图像(bitmap),ARGB_8888格式
     * @param score_thresh:置信度阈值
     * @param iou_thresh:  IOU阈值
     * @return
     */
    public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh);

 C++ JNI接口

#include <jni.h>
#include <string>
#include <fstream>
#include "src/object_detection.h"
#include "src/Types.h"
#include "debug.h"
#include "android_utils.h"
#include "opencv2/opencv.hpp"

using namespace vision;

static ObjectDetection *detector = nullptr;


JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) 
    return JNI_VERSION_1_6;


JNIEXPORT void JNI_OnUnload(JavaVM *vm, void *reserved) 




extern "C"
JNIEXPORT void JNICALL
Java_com_cv_tnn_model_Detector_init(JNIEnv *env,
                                    jclass clazz,
                                    jstring proto,
                                    jstring model,
                                    jstring root,
                                    jint model_type,
                                    jint num_thread,
                                    jboolean use_gpu) 
    if (detector != nullptr) 
        delete detector;
        detector = nullptr;
    
    std::string parent = env->GetStringUTFChars(root, 0);
    std::string proto_file = parent + env->GetStringUTFChars(proto, 0);
    std::string model_file = parent + env->GetStringUTFChars(model, 0);
    DeviceType device = use_gpu ? GPU : CPU;
    LOGW("parent     : %s", parent.c_str());
    LOGW("useGPU     : %d", use_gpu);
    LOGW("device_type: %d", device);
    LOGW("model_type : %d", model_type);
    LOGW("num_thread : %d", num_thread);
    ObjectDetectiobParam model_param = MODEL_TYPE[model_type];//模型参数
    detector = new ObjectDetection(model_file,
                                   proto_file,
                                   model_param,
                                   num_thread,
                                   device);



extern "C"
JNIEXPORT jobjectArray JNICALL
Java_com_cv_tnn_model_Detector_detect(JNIEnv *env, jclass clazz, jobject bitmap,
                                      jfloat score_thresh, jfloat iou_thresh) 
    cv::Mat bgr;
    BitmapToMatrix(env, bitmap, bgr);
    int src_h = bgr.rows;
    int src_w = bgr.cols;
    // 检测区域为整张图片的大小
    FrameInfo resultInfo;
    // 开始检测
    if (detector!= nullptr)
        detector->detect(bgr, &resultInfo, score_thresh, iou_thresh);
    
    else
        ObjectInfo objectInfo;
        objectInfo.x1=0;
        objectInfo.y1=0;
        objectInfo.x2=84;
        objectInfo.y2=84;
        objectInfo.label=0;
        resultInfo.info.push_back(objectInfo);
    

    int nums = resultInfo.info.size();
    LOGW("object nums: %d\\n", nums);

    auto BoxInfo = env->FindClass("com/cv/tnn/model/FrameInfo");
    auto init_id = env->GetMethodID(BoxInfo, "<init>", "()V");
    auto box_id = env->GetMethodID(BoxInfo, "addBox", "(FFFFIF)V");
    auto ky_id = env->GetMethodID(BoxInfo, "addKeyPoint", "(FFF)V");
    jobjectArray ret = env->NewObjectArray(resultInfo.info.size(), BoxInfo, nullptr);
    for (int i = 0; i < nums; ++i) 
        auto info = resultInfo.info[i];
        env->PushLocalFrame(1);
        //jobject obj = env->AllocObject(BoxInfo);
        jobject obj = env->NewObject(BoxInfo, init_id);
        // set bbox
        //LOGW("rect:[%f,%f,%f,%f] label:%d,score:%f \\n", info.rect.x,info.rect.y, info.rect.w, info.rect.h, 0, 1.0f);
        env->CallVoidMethod(obj, box_id, info.x1, info.y1, info.x2 - info.x1, info.y2 - info.y1,
                            info.label, info.score);
        // set keypoint
        for (const auto &kps : info.landmarks) 
            //LOGW("point:[%f,%f] score:%f \\n", lm.point.x, lm.point.y, lm.score);
            env->CallVoidMethod(obj, ky_id, (float) kps.x, (float) kps.y, 1.0f);
        
        obj = env->PopLocalFrame(obj);
        env->SetObjectArrayElement(ret, i, obj);
    
    return ret;



4. 人脸人体检测效果展示

在普通Android手机上,CPU和GPU都可以达到实时检测(CPU约25毫秒左右,GPU约15毫秒左右), 下面是APP的检测效果,你可下载Android Demo APP真实体检一下哦~

APP模型选择人脸检测
人脸关键点检测人体检测人脸+人体检测

5.Demo源码下载

Android Demo APP免费体检:

链接: https://download.csdn.net/download/guyuealian/25924076

Android Demo APP源码下载地址:

实时人体检测和人脸检测和人脸关键点检测(C++/Android)

6.人体关键点Demo(Android版本)

本项目Demo支持人脸关键点检测(5个人脸关键点),如果你需要人体关键点检测,请查看鄙人另一篇博客:2D Pose人体关键点实时检测(Python/Android /C++ Demo)_pan_jinquan的博客-CSDN博客

人脸检测+人体检测c++android实现(代码片段)

...droid实现本博客将实现C++版本的人脸检测,人脸关键点检测,人体检测,人脸+人体检测,推理框架采用TNN,在普通Android手机,CPU和GPU都可以达到实时检测的效果人脸检测+人脸关键点检测+人... 查看详情

人脸检测+人体检测c++android实现(代码片段)

...droid实现本博客将实现C++版本的人脸检测,人脸关键点检测,人体检测,人脸+人体检测,推理框架采用TNN,在普通Android手机,CPU和GPU都可以达到实时检测的效果人脸检测+人脸关键点检测+人... 查看详情

夜间(低光照)目标检测数据集整理:人脸检测,行人检测

1.夜间(低光照)人脸检测的数据集DARKFACE:FaceDetectioninLowLightCondition提供了6000幅真实世界的低光图像,在夜间捕获,在教学楼、街道、桥梁、立交桥、公园等,所有标记的边界框的人脸,作为主要的训练和/... 查看详情

csp:objectaspoint同会议论文,相似思想用于人脸和行人检测|cvpr2019

CSP将目标定义为中心点和尺寸,通过网络直接预测目标的中心和寸尺,相对于传统的RCNN类型检测算法轻量化了不少。整体思想与ObjectasPoints撞车了,真是英雄所见略同 来源:晓飞的算法工程笔记公众号论文:CenterandScalePrediction:A... 查看详情

学习opencv——行人检测&人脸检测(总算运行出来了)

...征的adaboost算法人脸检测一直出错,加上今天的HOG&SVM行人检测程序,一直报错。今天总算发现自己犯了多么白痴的错误——是因为外部依赖项lib文件没有添加完整,想一头囊死啊做程序一定要心如止水!!!仔细查找!!!&n... 查看详情

人脸识别中的活体检测是啥?

...、点头、睁眼、闭眼、张嘴、摇头这些,然后再使用人脸关键点定位和追踪技术,验证是否是本人在操作。比如云脉的人脸识别门禁考勤系统,就是通过活体检测等技术来辨别用户真假与否的。参考技术A屏管家人脸识别的活体... 查看详情

dlib库包的介绍与使用,opencv+dlib检测人脸框opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类dlib视频目标跟踪(代码片段)

...测源码2.2opencv+dlib人脸检测2.3dlib人脸检测总结3dlib人脸关键点检测:并绘制检测框、关键点、不同区域关键点连线3.1dlib人脸关键点检测源码3.2opencv+dlib进行人脸关键点检测4dlib人脸识别4.1dlib进行人脸识别逻辑4.2opencv+d... 查看详情

mtcnn人脸识别(代码片段)

...类改为2分类,且为小目标检测。而且人脸检测还加上了关键点检测,可以依靠关键点增加召回率。主要思想还是依靠的通用目标检测,除了yolo和R-CNN系列,还多出的一个算法系列为级联网络结构,MTCNN为其中一个代表。以前讲过 查看详情

人脸关键点的应用场景及重难点解析丨devfordev专栏

...;作者为声网视频组AI算法工程师周世付。人脸检测、人脸关键点检测,是计算机视觉的基础算法。许多酷炫应用背后,例如美颜、贴纸、人脸驱动avatar,是依赖着人脸检测、人脸关键点检测的算法。人脸检测的常规做... 查看详情

人脸检测进阶:使用dlibopencv和python检测面部标记(代码片段)

...象的ROI),形状预测器尝试沿形状定位感兴趣的关键点。在人脸标记的背景下,我们的目标是使用形状预 查看详情

pytorch深度学习实战|基于resnet的人脸关键点检测

人脸关键点检测指的是用于标定人脸五官和轮廓位置的一系列特征点的检测,是对于人脸形状的稀疏表示。关键点的精确定位可以为后续应用提供十分丰富的信息。因此,人脸关键点检测是人脸分析领域的基础技术之一... 查看详情

如何通过活体检测

...测能通过眨眼、张嘴、摇头、点头等组合动作,使用人脸关键点定位和人脸追踪等技术,验证用户是否为真实活体本人操作。可有效抵御照片、换脸、面具、遮挡以及屏幕翻拍等常见的攻击手段,从而帮助用户甄别欺诈行为,保... 查看详情

opencv&mediapipe人脸检测+摄像头实时(代码片段)

文章目录单张人脸关键点检测单张图像人脸检测摄像头实时关键点检测单张人脸关键点检测定义可视化图像函数导入三维人脸关键点检测模型导入可视化函数和可视化样式读取图像将图像模型输入,获取预测结果BGR转RGB将RGB... 查看详情

基于tensorflow2.x从零训练15点人脸关键点检测模型(代码片段)

一、人脸关键点检测数据集在计算机视觉人脸计算领域,人脸关键点检测是一个十分重要的区域,可以实现例如一些人脸矫正、表情分析、姿态分析、人脸识别、人脸美颜等方向。人脸关键点数据集通常有5点、15点、68点... 查看详情

dlib+opencv库实现疲劳检测(代码片段)

文章目录1.关键点检测2.算法实现的核心点3.算法实现(1)人脸的关键点集合(2)加载人脸检测库和人脸关键点检测库(3)绘制人脸检测的框(4)对检测之后的人脸关键点坐标进行转换(5)... 查看详情

人脸检测—retinanetface

...验框不但要获得人脸位置,还需要获得每一个人脸的五个关键点位置接下来我们对Retinaface执行过程其实就是在图片上预先设定好先验框,网络的预测结果会判断先验框内部是否包含人脸并且对先验框进行调整获得预测框和五个... 查看详情

adaboost人脸检测介绍:矩形特征和积分图

...本系列文章总共有七篇,目录索引如下:  AdaBoost人脸检测介绍(1):AdaBoost身世之谜  AdaBoost人脸检测介绍(2):矩形特征和积分图  AdaBoost人脸检测介绍(3):AdaBoost算法流程  AdaBoost人脸检测介绍(4):AdaBoost算法举例  AdaBoost人... 查看详情

dlib人脸关键点检测的模型分析与压缩

...m博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模型分析与压缩.htmlgithub项目:https://github.com/miaoerduo/dlib-face-landmark-compression 人脸关键点检测的技术在很多领域上都 查看详情