Advertisement

人脸检测和行人检测3:Android实现人脸检测和行人检测检测(含源码,可实时检测)

阅读量:

本摘要介绍了一种在Android平台上实现实时人脸和行人检测的方法。基于YOLOv5轻量化模型yolov5s05,在416×416和320×320输入下进行部署。通过ONNX转换为TNN模型,并利用多线程CPU和GPU加速推理,在普通手机上实现约30ms(CPU)至25ms(GPU)的检测速度。解决了TNN推理时的错误(如Permute param size mismatch)以及dlopen失败等问题。实验结果表明该方法满足性能需求,并支持摄像头实时检测功能。

人脸与行人检测(第三部分):基于Android平台的人脸与行人检测开发及其实时监控(附带源代码)

目录

人脸检测与行人识别第三版:基于移动平台的开发实现(附源代码)并支持实时检测功能

1. 前言

2. 人脸检测和行人检测数据集说明

3. 基于YOLOv5的人脸检测和行人检测模型训练

4.人脸检测和行人检测模型Android部署

(1) 将Pytorch模型转换ONNX模型

(2) 将ONNX模型转换为TNN模型

(3) Android端上部署模型

(4) 一些异常错误解决方法

5. 人脸检测和行人检测效果

6.项目源码下载


1. 前言

这是项目《人脸识别与人行 detection》系列之一;其中,《基于 Android 的人脸与人行 detection 及其实现(含源码)》一文旨在介绍如何将 Python 训练后的 YOLOv5 检测模型成功移植至 Android 平台并优化性能。我们计划开发一个直观且高效的 Android 平台上的 faces and pedestrians detection 界面,并提供相应的源代码支持。

目前基于YOLOv5s的人脸与人体检测系统实现了较高的精度水平,在mAP_0.5指标上达到98.484%,而在mAP_0.5:0.95的比例下则达到了82.777%的性能表现。为满足手机Android平台的实际应用需求,在保证检测精度的前提下对原始的YOLOv5s模型进行了优化设计并开发出了相应的轻量化版本yolov5s05_416与yolov5s05_320两个系列模型;经过测试该轻量化版本在普通Android设备上能够实现实时的人脸与人体检测功能其中基于单个CPU核心(4线程)的推理速度约为30毫秒而使用GPU加速后的速度则进一步提升至约25毫秒这样的性能表现足以支撑业务运营的相关需求下表详细列出了轻量化模型的各项计算性能参数及其对应的检测精度数据

先展示一下Android Demo人脸和行人(人体)检测的效果

该Android应用用于面部识别和人像(人体)演示版体验,并可访问下载链接:<>

尊重原创,转载请注明出处

秉持版权意识,请在引用时注明来源

秉持版权意识,请在引用时注明来源


更多项目《人脸和行人(人体)》系列文章请参考:

以下是对原文的改写版本

如需完成图像去背景任务并达成快速实现图像去背景功能的目标,请参考本文推荐的开源项目:《基于C++与Android平台的人脸分割与智能图像抠图技术研究》

|

|

|

|
|---|---|---|


2. 人脸检测和行人检测 数据集说明

目前收集VOC、COCO以及MPII等数据集进行研究与开发工作。这些数据集共计约10万条左右的样本数量,并可应用于人体(即行人)检测模型的算法研发。经分析发现,在当前的数据集中已标记了人体检测框的位置信息(即已标注person类别),但未标注人脸框位置(即face类别)。因此,在后续的数据处理阶段中对这三个数据集分别添加了person与face两个类别标签,并用于深度学习目标检测模型的训练工作

涉及 facial recognition 和 body detection 数据集的使用指南及下载信息,请参阅《** facial recognition 和 body detection (行人检测)1: facial recognition 和 body detection 数据集(附带下载链接)** 》:<>


3. 基于YOLOv5的人脸检测和行人检测 模型训练

官方YOLOv5给出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考虑到手机端CPU/GPU性能比较弱鸡,直接部署yolov5s运行速度十分慢。所以本人在yolov5s基础上进行模型轻量化处理,即将yolov5s的模型的channels通道数全部都减少一半,并且模型输入由原来的640×640降低到416×416或者320×320,该轻量化的模型我称之为yolov5s05。轻量化后的模型yolov5s05比yolov5s计算量减少了16倍,参数量减少了7倍。

下面是yolov5s05和yolov5s的参数量和计算量对比:

模型 input-size params(M) GFLOPs
yolov5s 640×640 7.2 16.5
yolov5s05 416×416 1.7 1.8
yolov5s05 320×320 1.7 1.1

yolov5s05与yolov5s的训练流程基本一致,在本质上仅存在配置参数的不同之处;鉴于篇幅限制,本文未能详尽阐述具体细节,请您参考: [人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测(含数据集和训练代码)]( "人脸检测和行人检测2:YOLOv5实现人脸检测和行人检测含数据集和训练代码")


4.人脸检测和行人检测 模型Android部署

(1) 将Pytorch模型转换ONNX模型

建议按照以下步骤操作:首先经过专业训练完成目标检测任务后,请您按照以下步骤操作:第一步是将训练好的目标检测模型导出为ONNX格式;随后,在命令行界面运行onnx-simplifier工具以对网络结构进行优化简化。

复制代码
 # 转换yolov5s05模型

    
 python export.py --weights "runs/yolov5s05_320/weights/best.pt" --img-size 320 320
    
  
    
 # 转换yolov5s模型
    
 python export.py --weights "runs/yolov5s_640/weights/best.pt" --img-size 640 640

在线代码存储库:https://github.com/daquexian/onnx-simplifier
安装:使用pip3安装onnx-simplifier

(2) 将ONNX模型转换为TNN模型

现有CNN模型具备多种部署方案。其中支持使用TNN、MNN、NCNN等技术框架,并结合TensorRT等加速工具实现性能优化。本研究团队基于TNN技术框架开展移动设备端应用开发工作。

TNN转换工具:

​​

(3) Android端上部署模型

该项目开发了基于Android平台的人脸检测与行人识别Demo系统,并采用了TNN作为部署框架,在多核处理器环境下实现了高效的多线程并行推理能力,在主流智能手机上即可实现实时性能。系统源码中的YOLOv5核心算法采用C++实现以提高计算效率,并通过JNI接口调用相应的上层功能模块

复制代码
 package com.cv.tnn.model;

    
  
    
 import android.graphics.Bitmap;
    
  
    
 public class Detector {
    
  
    
     static {
    
     System.loadLibrary("tnn_wrapper");
    
     }
    
  
    
  
    
     /*** * 初始化模型
    
      * @param model: TNN *.tnnmodel文件文件名(含后缀名)
    
      * @param root:模型文件的根目录,放在assets文件夹下
    
      * @param model_type:模型类型
    
      * @param num_thread:开启线程数
    
      * @param useGPU:关键点的置信度,小于值的坐标会置-1
    
      */
    
     public static native void init(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);
    
 }

如果想在Android Demo中部署你自己训练的YOLOv5模型,请按照以下步骤操作:首先将训练好的Pytorch权重文件转换为ONNX格式;随后将该ONNX文件转译成TNN模型;最后将得到的TNN替代你的原始目标检测模型即可完成部署。

(4) 一些异常错误解决方法

TNN推理时出现:Permute param got wrong size

官方YOLOv5: 访问GitHub上的地址

若要直接使用官方YOLOv5代码进行TNN部署,则在部署过程中会遇到错误"Permute param got wrong size"。该错误归因于YOLOv5设计时采用了多维计算,而当前模型仅支持最多四个维度的计算。为了解决这个问题,请对model/yolo.py进行调整。

​​

export.py文件设置model.model[-1].export = True:

复制代码
 .....

    
     # Exports
    
     if 'torchscript' in include:
    
     export_torchscript(model, img, file, optimize)
    
     if 'onnx' in include:
    
     model.model[-1].export = True  # TNN不支持5个维度,修改输出格式
    
     export_onnx(model, img, file, opset, train, dynamic, simplify=simplify)
    
     if 'coreml' in include:
    
     export_coreml(model, img, file)
    
  
    
     # Finish
    
     print(f'\nExport complete ({time.time() - t:.2f}s)'
    
       f"\nResults saved to {colorstr('bold', file.parent.resolve())}"
    
       f'\nVisualize with https://netron.app')
    
  
    
 .....
  • TNN推理时效果很差,检测框一团麻

​​

这个研究问题的主要原因是模型参数配置错误。具体来说,在使用YOLOv5Param模型时会遇到性能瓶颈问题。建议根据实际需求重新进行编译配置以优化推理速度。

复制代码
  
    
 struct YOLOv5Param {
    
     ModelType model_type;                  // 模型类型,MODEL_TYPE_TNN,MODEL_TYPE_NCNN等
    
     int input_width;                       // 模型输入宽度,单位:像素
    
     int input_height;                      // 模型输入高度,单位:像素
    
     bool use_rgb;                          // 是否使用RGB作为模型输入(PS:接口固定输入BGR,use_rgb=ture时,预处理将BGR转换为RGB)
    
     bool padding;
    
     int num_landmarks;                     // 关键点个数
    
     NetNodes InputNodes;                   // 输入节点名称
    
     NetNodes OutputNodes;                  // 输出节点名称
    
     vector<YOLOAnchor> anchors;
    
     vector<string> class_names;            // 类别集合
    
 };

该段改写后内容:
Input dimension (width) 和 height dimension (height) 是该模型所接受的输入尺寸;在使用vector类型的数据时,请确保其与相应的YOLAnchors一一对应;特别指出的是,在Python环境下使用yolov5s模型时,默认情况下其原始anchor设置为...

复制代码
 anchors:

    
   - [ 10,13, 16,30, 33,23 ]  # P3/8
    
   - [ 30,61, 62,45, 59,119 ]  # P4/16
    
   - [ 116,90, 156,198, 373,326 ]  # P5/32

而yolov5s05由于input size由原来640变成320,anchor也需要做对应调整:

复制代码
 anchors:

    
   - [ 5, 6, 8, 15, 16, 12 ]  # P3/8
    
   - [ 15, 30, 31, 22, 30, 60 ]  # P4/16
    
   - [ 58, 45, 78, 99, 186, 163 ]  # P5/32

因此C++版本的yolov5s和yolov5s05的模型参数YOLOv5Param如下设置

复制代码
 //YOLOv5s模型参数

    
 static YOLOv5Param YOLOv5s_640 = {MODEL_TYPE_TNN,
    
                               640,
    
                               640,
    
                               true,
    
                               true,
    
                               0,
    
                               {{{"images", nullptr}}}, //InputNodes
    
                               {{{"boxes", nullptr},   //OutputNodes
    
                                 {"scores", nullptr}}},
    
                               {
    
                                       {"434", 32, {{116, 90}, {156, 198}, {373, 326}}},
    
                                       {"415", 16, {{30, 61}, {62, 45}, {59, 119}}},
    
                                       {"output", 8, {{10, 13}, {16, 30}, {33, 23}}},
    
                               },
    
                               CLASS_NAME
    
 };
    
  
    
 //YOLOv5s05模型参数
    
 static YOLOv5Param YOLOv5s05_ANCHOR_416 = {MODEL_TYPE_TNN,
    
                                        416,
    
                                        416,
    
                                        true,
    
                                        true,
    
                                        0,
    
                                        {{{"images", nullptr}}}, //InputNodes
    
                                        {{{"boxes", nullptr},   //OutputNodes
    
                                          {"scores", nullptr}}},
    
                                        {
    
                                                {"434", 32,{{75, 58}, {101, 129}, {242, 212}}},
    
                                                {"415", 16, {{20, 40}, {40, 29}, {38, 77}}},
    
                                                {"output", 8, {{6, 8}, {10, 20}, {21, 15}}}, //
    
                                        },
    
                                        CLASS_NAME
    
 };
    
 //YOLOv5s05模型参数
    
 static YOLOv5Param YOLOv5s05_ANCHOR_320 = {MODEL_TYPE_TNN,
    
                                        320,
    
                                        320,
    
                                        true,
    
                                        true,
    
                                        0,
    
                                        {{{"images", nullptr}}}, //InputNodes
    
                                        {{{"boxes", nullptr},   //OutputNodes
    
                                          {"scores", nullptr}}},
    
                                        {
    
                                                {"434", 32, {{58, 45}, {78, 99}, {186, 163}}},
    
                                                {"415", 16, {{15, 30}, {31, 22}, {30, 60}}},
    
                                                {"output", 8, {{5, 6}, {8, 15}, {16, 12}}}, //
    
                                        },
    
                                        CLASS_NAME
    
 };
  • 运行APP闪退:dlopen failed: library "libomp.so" not found

遇到dlopen函数调用失败时(即遇到dlopen函数调用失败的情况),软件库文件无法被正确加载(无法正常加载)。通常情况下(一般情况下),当系统尝试加载共享库文件时(在程序运行过程中),如果遇到dlopen函数调用失败的情况(出现类似"libomp.so"不存在的问题),可能导致程序运行异常(导致应用程序崩溃)。为了解决这个问题(解决这一问题),建议采取以下措施(具体解决方案):首先检查并确认所需的软件库文件是否存在(确认相关软件库是否存在);如果存在但仍然无法加载(即使存在也无法正确加载),则需要重新安装相应的软件包或重装操作系统系统;如果不存在则需按照官方文档指导进行安装配置系统参数以满足需求;此外还需要确保系统环境变量中包含必要的兼容性设置项以支持多线程运算环境下的运行需求


5. 人脸检测和行人检测 效果

【Android APP体验】<>

该APP能够在普通Android设备上实现实时的人脸与人流量检测效果。其中CPU核心数为4颗,并运行时间平均约30ms;而GPU处理时长约为25ms。整体性能指标能够基本满足业务系统的技术性能要求。


6.项目源码下载

【Android APP体验】<>

如需下载项目源码,请WX关注【AI吃大瓜】,回复【人脸人体检测】即可下载

Android项目源码内容包含:

  1. 包含轻量级优化版的人脸检测与行人识别模型:yolov5s05_416和yolov5s05_320,在普通手机上实现实时的人脸检测与行人识别功能。其中CPU(4线程)运行时间约为30ms,GPU版本则约为25ms。
  2. 提供高性能版本的人脸检测与行人识别模型yolov5s,在保证准确性的同时显著提升了处理速度:CPU(4线程)耗时250ms左右,GPU版本则为100ms左右。
  3. Android Demo功能支持读取图片文件、视频流以及摄像头实时数据进行检测。
  4. 所有依赖库已正确配置完成,在直接编译运行时应可正常工作。如出现"dlopen failed: library “libomp.so“ not found"错误,请参考[官方解决方案]( "dlopen failed: library “libomp.so“ not found")进行处理。

全部评论 (0)

还没有任何评论哟~