Giter VIP home page Giter VIP logo

mnnkit's Introduction

MNNKit

简介

MNNKit是基于端上推理引擎MNN提供的系列应用层解决方案,它是由MNN团队在阿里系应用大规模业务实践后的成熟方案,MNNKit主要面向Android/iOS移动应用开发者,使其能快速、方便地将通用场景的AI能力直接部署到移动应用中,从而基于它开发各种各样的业务能力和玩法。

  • SDK开箱即用,接入方便,无需关心算法或模型
  • 阿里系业务沉淀的稳定模型和算法,历经双十一等重大项目,端侧由MNN提供可靠的运行环境
  • 高性能实时推理,不依赖于后端,更适合移动端应用场景

Demo快速体验

1. 扫码安装

Android

安卓扫码安装

2. 源码安装

git clone https://github.com/alibaba/MNNKit.git

Android

  1. 打开Android Studio,点击File->Open...,选择MNNKitDemo/Android目录
  2. Gradle sync成功后,点击Run安装运行到真机上(Demo中视频检测依赖摄像头输入)

iOS

cd MNNKitDemo/iOS
pod update
open MNNKitDemo.xcworkspace

然后安装运行到真机上(Demo中视频检测依赖摄像头输入)

SDK安装

Kit依赖关系

MNNKit SDK组织结构如下图:

SDK栈

从底向上分为三层:

  1. MNN引擎层,是MNN开源库在Android/iOS上编译好的二进制包的Relase版本,提供端侧AI运行的环境。
  2. Core基础层,这一层主要抽象和封装与MNN c++接口调用粒度基本一致的上层API,iOS以OC接口提供,Android以Java接口提供(TODO)。同时也为上层SDK提供一些公共服务类或结构定义。
  3. 业务Kit层,人脸检测、手势识别等都属于具体的一种算法能力在上层的封装,这一层的SDK称为业务Kit SDK,其中封装了若干模型和对应的算法处理。往后业务Kit层会不断扩展更多实用的Kit SDK。

安装

业务Kit层SDK相互独立,向下关联依赖无需显式指定,只需根据自身需求选择集成的SDK和版本即可。

Kit SDK Android iOS License
FaceDetection 0.0.5 0.0.4 《MNN Kit Terms of Service》
HandGestureDetection 0.0.6 0.0.4 《MNN Kit Terms of Service》
PortraitSegmentation 0.0.6 0.0.4 《MNN Kit Terms of Service》

Android

  • 系统最低API Level16(4.1版本)
  • MNNKit官方库托管在Maven Central上

工程build.gradle配置maven仓库:

allprojects {
    repositories {
        google()
        jcenter()
        // 国内访问推荐使用阿里云镜像加速
        maven { url "https://maven.aliyun.com/nexus/content/groups/public" }
      	// Maven Central
//        mavenCentral()
//        mavenLocal()
    }
}

app的build.gradle添加依赖:

dependencies {
    implementation 'com.alibaba.android.mnnkit:facedetection:0.0.5'
    implementation 'com.alibaba.android.mnnkit:handgesturedetection:0.0.6'
    implementation 'com.alibaba.android.mnnkit:portraitsegmentation:0.0.6'
}
Proguard
-dontwarn com.alibaba.android.mnnkit.**
-keep class com.alibaba.android.mnnkit.**{*;}

iOS

  • 系统最低版本ios 8.0
  • 从0.0.4版本开始,MNNKit系列SDK均为静态库
source 'https://github.com/CocoaPods/Specs.git'
platform :ios

target 'MNNKitDemo' do
    platform :ios, '8.0'
    
    # 人脸检测
    pod 'MNNFaceDetection', '~> 0.0.4'
    # 手势识别
    pod 'MNNHandGestureDetection', '~> 0.0.4'
    # 人像分割
    pod 'MNNPortraitSegmentation', '~> 0.0.4'
    
end
Bitcode

目前MNNKit SDK均不支持bitcode,应用集成时候需关闭bitcode选项。

API

Kit的基本API只有三个,创建实例、推理、释放实例。使用流程也是按照这个顺序,如下图所示,其中推理时可输入视频、图片或其他格式的数据。

api

人脸检测API

手势识别API

人像分割API

隐私说明

默认情况下,MNNKit会收集SDK运行时的性能、稳定性等数据,帮助我们统计和分析问题,以在后续迭代中针对性地进行优化和改进。SDK不会收集其他任何无关的用户信息,相关协议请参考license。用户可以显式的调用API关闭该功能(不推荐):

Android

MNNMonitor.java
/**
 * enable/disable collection of statistical information. Enable by default.
 * @param monitorEnable true or false
 */
public static void setMonitorEnable(boolean monitorEnable)

iOS

MNNMonitor.h
/// enable/disable collection of statistical information. Enable by default.
/// @param enable 
+ (void)setMonitorEnable:(BOOL)enable;

接入指南

MNNKit API中包含了inAngle和outAngle两个参数值,他们是用来做什么的?理解这个问题之前,我们不妨先了解下SDK处理的一般过程。

处理过程

如下是iOS和Android设备后置摄像头正向拍摄的场景,端上整个处理过程:

process

1. 设备预览和输出

这部分是从Camera获取数据,作为SDK的输入;同时在设备前端,要正确的预览给用户。

2. SDK检测

MNNKit SDK内部实现封装了算法的深度学习模型,运行在MNN引擎上,因此人脸检测也并非传统的图像处理,它有着机器学习所有的特性。算法在模型训练阶段使用的是正向的人脸数据集,因而这个模型只认识"正向"的人脸,如果输入是一张方向不对的人脸,可能就不会有检测结果,我们称之为"内容方向敏感"。MNNKit中人脸检测、手势识别、人像分割都属于"内容方向敏感"的类型。

  1. 在MNN引擎执行推理之前,需要对原始的输入做预处理,保证输入数据中的人脸为正向
  2. 推理完成后,产生了基于输入图像(预处理之后的)坐标系的关键点结果
  3. 为了上层渲染方便,SDK会把关键点坐标变换到和屏幕渲染坐标系相同的方向

SDK参数中的inAngle参数就是用来控制将原始输入旋转到"内容正向"的角度,outAngle就是用来变换关键点坐标到屏幕渲染坐标系方向的角度!

从上图中可以看出,iOS在后置正向的情况下的输入角度为0,输出角度为0;而安卓输入角度为90,输出角度为0。

3. 结果渲染

SDK检测的结果是图像的特征描述,最简单的描述就是关键点的坐标,这些坐标都是在图像坐标系下产生的,也就是在最终输入到引擎的图片左上角为原点的坐标系下。比如输入的图像是1280*720,那么检测结果也是在这个坐标系下产生。

工程应用中,最后的结果关键点要显示在用户屏幕上,前端会使用一个用来渲染的"画布",它可以是一个UI上用来显示的视图或其他组件,画布的尺寸由应用根据视觉设计自己定义。画布的坐标系我们统称为渲染坐标系,这一步要做的就是将关键点坐标从头像坐标系转换到渲染坐标系。

在SDK检测的最后一步,我们已经将关键点变换到和渲染坐标系相同的方向,因为两个坐标系的大小不一样,接下来只需要等比例映射坐标就行了。映射完后直接渲染到画布上,就完成了整个过程。

工程实践参考

上述我们以iOS和Android设备后置摄像头正向拍摄为例阐述,比较简单,实际的工程接入中,摄像头的正向角度会产生输出图像的角度,设备旋转会造成输出图片非内容正向,自动旋转开启会引起渲染坐标系的变化,等等,这些都是SDK之外工程上需要解决的问题。

MNNKit Demo中涵盖了工程实践中所有问题的综合解法,如输入角度、摄像头预览、结果渲染、自动旋转等等,是工程接入的最佳实践参考。如果不熟悉该如何处理,请阅读Demo中的代码示例,相信所有的问题都可以迎刃而解。

License

当您在软件中使用MNNKit相关SDK时,默认您已经阅读并同意协议《MNN Kit Terms of Service》

mnnkit's People

Contributors

alibaba-oss avatar hush-alibaba avatar jiangjinglyu avatar ofshare avatar suancaiyu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mnnkit's Issues

人脸检测pitch/yaw两个角度?

我看demo两个角度跟senseTime的结果差不多,想请教一下这两个角度数据怎么标注的啊?是模型直接预测出来的还是根据关键点计算的? 请阿里大佬们赐教下,感谢

按文档配置好混淆规则,开启混淆后,调用人脸识别就出现 fast json 栈溢出。请问能帮忙查一查原因吗?

一、问题:如标所述,问题栈如下。
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:932)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:932)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:932)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:932)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:932)
at com.alibaba.fastjson.JSON.toJSON(JSON.java:852)
at com.alibaba.android.mnnkit.monitor.MNNMonitor.a(SourceFile:324)
at com.alibaba.android.mnnkit.monitor.MNNMonitor.loadCommit(SourceFile:258)
at com.alibaba.android.mnnkit.actor.FaceDetector$1.run(SourceFile:132)
at java.lang.Thread.run(Thread.java:919)
二、环境
编译工具:
Android studio 4.0 / Android Gradle 3.5.0 / Gralde 5.4.1

三、混淆规则已按官方文档配置如下:

mnnkit

-dontwarn com.alibaba.android.mnnkit.**
-keep class com.alibaba.android.mnnkit.**{*;}

-ignorewarnings
-keep class * {
public private *;
}

什么情况下,函数inferenceWithPixelBuffer...返回nil?

  • (NSArray<MNNFaceDetectionReport *> *)inferenceWithPixelBuffer:(CVPixelBufferRef)pixelBuffer config:(MNNFaceDetectConfig)detectConfig
    angle:(float)inAngle outAngle:(float)outAngle flipType:(MNNFlipType)flipType
    error:(NSError *__autoreleasing *)error;
    这个函数,1)没有buffer,结果为nil;2)若buffer不空,且是没有人脸的正常视频,那也是有可能返回nil的,那么这种buffer不空情况下,推理结果为nil,是什么情况?还是哪里设置不对?3)有无第三种情况,返回结果为nil?

'MNN' uses the unencrypted 'http' protocol to transfer the Pod.

Update all pods
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing FMDB (2.7.5)
Installing MNN (0.2.2.2)

[!] Error installing MNN
[!] /usr/bin/curl -f -L -o /var/folders/t4/zsm4n0kd5rs25cfpkfjw60lm0000gn/T/d20200331-38860-1dqjspc/file.zip http://mnnkit.oss-cn-hangzhou.aliyuncs.com/pods-repo/MNN/0.2.2.2/MNN.framework.zip --create-dirs --netrc-optional --retry 2

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to 127.0.0.1 port 1080: Connection refused

[!] 'MNN' uses the unencrypted 'http' protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts. Otherwise, please reach out to the library author to notify them of this security issue.

MNNKit流程问题

这个流程是隔几帧才检测一次的把? 有更好的跟踪方案么

dsymutil warning

while linking with MNNFaceDetection.framework 0.0.4, xcode dysmutil spit out these warnings:

warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/3KUL5D6HFMZKL/Darwin-MI6WZSG1PNOM.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/3KUL5D6HFMZKL/Darwin-MI6WZSG1PNOM.pcm
note: Linking a static library that was built with -gmodules, but the module cache was not found.  Redistributable static libraries should never be built with module debugging enabled.  The debug experience will be degraded due to incomplete debug information.
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/3KUL5D6HFMZKL/_Builtin_intrinsics-1NVMHOZAVFWA2.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/3KUL5D6HFMZKL/_Builtin_intrinsics-1NVMHOZAVFWA2.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Foundation-A3SOD99KJ0S9.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Foundation-A3SOD99KJ0S9.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CommonCrypto-2BKBWM9L7D2GS.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CommonCrypto-2BKBWM9L7D2GS.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Darwin-MI6WZSG1PNOM.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Darwin-MI6WZSG1PNOM.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/MachO-CA7UA9IK83JK.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/MachO-CA7UA9IK83JK.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/ObjectiveC-1KD62J152BYGO.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/ObjectiveC-1KD62J152BYGO.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Dispatch-12O7S7HHQXK9N.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/Dispatch-12O7S7HHQXK9N.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/zlib-MI6WZSG1PNOM.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/zlib-MI6WZSG1PNOM.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreMotion-RZ4DJFEI29KM.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreMotion-RZ4DJFEI29KM.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/LocalAuthentication-1HUI0898YUD5H.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/LocalAuthentication-1HUI0898YUD5H.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreLocation-DJ7O04274VT4.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreLocation-DJ7O04274VT4.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreTelephony-SKNXW9OJAIWC.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreTelephony-SKNXW9OJAIWC.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/UIKit-2LM3EQU7VVY4O.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/UIKit-2LM3EQU7VVY4O.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/AdSupport-2ZX7501G6C1T6.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/AdSupport-2ZX7501G6C1T6.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreGraphics-1TH4RJJRQVFOC.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreGraphics-1TH4RJJRQVFOC.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreFoundation-10I2D2XL7L7X9.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/CoreFoundation-10I2D2XL7L7X9.pcm
warning: /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/SystemConfiguration-2O070L5BFB5B1.pcm: No such file or directory
note: while processing /Users/tsia/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/2MSIKR0H4Y5WQ/SystemConfiguration-2O070L5BFB5B1.pcm

As the warning suggested:

Redistributable static libraries should never be built with module debugging enabled. The debug experience will be degraded due to incomplete debug information.

I believe tsia in the warning message might be your developer machine, simply grep, I got:

grep -r 'tsia' ./Pods/
Binary file ./Pods//MNNKitCore/MNNKitCore.framework/MNNKitCore matches
Binary file ./Pods//MNNFaceDetection/MNNFaceDetection.framework/MNNFaceDetection matches

So if possible, please disable debugging of the MNNKitCore and MNNFaceDetection library module, check if -gmodules was disabled.

use format type rgba no result return

         ByteBuffer byteBuffer = getResizeByteBuffer(1); //glReadbuffer get buffer  GL_RGBA 格式
        long detectConfig = FaceDetectConfig.ACTIONTYPE_EYE_BLINK| FaceDetectConfig.ACTIONTYPE_MOUTH_AH|FaceDetectConfig.ACTIONTYPE_HEAD_YAW|FaceDetectConfig.ACTIONTYPE_HEAD_PITCH|FaceDetectConfig.ACTIONTYPE_BROW_JUMP;
        FaceDetectionReport[] results = mFaceDetector.inference(byteBuffer.array(), (int)(config.cameraOutWidth), (int)(config.cameraOutHeight), MNNCVImageFormat.RGBA, detectConfig, 0, 0, MNNFlipType.FLIP_NONE);
        LogUtils.e(TAG,"startdetect" + results);

【严重Bug】实锤mPortraitSegmentor.inference方法内存泄漏

使用官网提供的MNNKit Demo for Android,进入到人像分割界面放着不动,几分钟后会因内存溢出导致App崩溃。

使用
Samsung A9 Star(Android 10) 约6分钟
Mi 8(Android10) 约7分半
Smartisan R1(Android 8.1) 约2分半钟
Google pixel4(Android 11) 约5分半钟
四台设备均会出现该问题,只是时间长短不同。

MNNKit版本为 com.alibaba.android.mnnkit:portraitsegmentation:0.0.6

IOS issue

Hi,after I open MNNKitDemo.xcworkspace, an error occurred:

Showing All Messages No account for team "2QB4NHW4W2". Add a new account in the Accounts preference pane or verify that your accounts have valid credentials.

安卓编译失败

A problem occurred configuring project ':app'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:79)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:73)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:54)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:110)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
	at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
	at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:61)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NullPointerException
	at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:877)
	at com.android.build.gradle.internal.ndk.NdkHandler.getPlatformVersion(NdkHandler.java:167)
	at com.android.build.gradle.internal.ndk.NdkHandler.supports64Bits(NdkHandler.java:340)
	at com.android.build.gradle.internal.ndk.NdkHandler.getSupportedAbis(NdkHandler.java:412)
	at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.create(ExternalNativeJsonGenerator.java:626)
	at com.android.build.gradle.internal.TaskManager.createExternalNativeBuildJsonGenerators(TaskManager.java:1552)
	at com.android.build.gradle.internal.ApplicationTaskManager.createTasksForVariantScope(ApplicationTaskManager.java:166)
	at com.android.build.gradle.internal.VariantManager.createTasksForVariantData(VariantManager.java:491)
	at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:365)
	at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:767)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.BasePlugin.lambda$createTasks$4(BasePlugin.java:651)
	at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt:37)
	at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1$1.run(DefaultListenerBuildOperationDecorator.java:155)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:152)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:149)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy40.afterEvaluate(Unknown Source)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:187)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:184)
	at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1418)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:193)
	... 92 more

请问ndk的版本是什么呢?是否与这个有关?

ios 编译报错

很多方法是不是都变了,看方法的大小写不一样
屏幕快照 2020-02-08 17 45 13
屏幕快照 2020-02-08 17 45 25

How can I use the android version of facedetection in android native c++ code?

Is it possible to directly invoke the android facedetection api from native c++ code without calling back java api?

I mean, is the c++ header file of the libmnnfacedetection.so public available?

since I could get the camera stream in android native c++, I'd like to invoke the c++ facedetection api from android native code for higher performance interactive exprience. What can I do to achieve that? Help..please.

想请教下其中手势检测的思路?

请教下,手势demo的思路是不是手势检测+手势追踪+手势识别,检测到手势的位置后对手进行追踪,然后将手势区域单独截取下来送进网络进行识别?是这样吗?

Swift Setup

Hello,
I was seeing good results with this library in ObjectiveC, but I was required to integrate it into a Swift app. Below are my findings.

First the podfile

platform :ios, '13.0'
source 'https://github.com/CocoaPods/Specs.git'

target 'MyProject' do
  # Pods for MyProject
  pod 'MNNFaceDetection'
  pod 'MNNHandGestureDetection'
  pod 'MNNPortraitSegmentation'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
    end
  end
end

Then in your target application you need to mark ENABLE_BITCODE to No

Enjoy

部分华为手机找不到so文件

java.lang.UnsatisfiedLinkError
No implementation found for long com.alibaba.android.mnnkit.actor.FaceDetector.nativeCreateFrom(int, java.lang.String, java.lang.String) (tried Java_com_alibaba_android_mnnkit_actor_FaceDetector_nativeCreateFrom and Java_com_alibaba_android_mnnkit_actor_FaceDetector_nativeCreateFrom__ILjava_lang_String_2Ljava_lang_String_2)
com.alibaba.android.mnnkit.actor.FaceDetector.nativeCreateFrom(Native Method)

image

image

手机型号和apk内的so文件如图所示

姿态角

作者你好,能告诉下那三个姿态角的值是怎么换算的吗,想用你的模型回归角度做旋转,谢谢

稠密特征点

首先感谢作者的付出~

请教一下,目前开发版本中,是106个特征点,是否有稠密点(例如1K+)的计划呢?

请教关于人脸关键点遮挡分类的训练思路

你好,我知道模型和相关代码是不开源的
但是关于人脸关键点是否遮挡的这个分类,一直有疑问,很想请教一下

因为遮挡物可能是任意形状任意物体,很难通过在训练集中添加遮挡物并标注来训练成一个泛化性很好的模型,是否有其他更好的思路呢

新入门菜鸟一名,还望各位大牛指点,万分感谢!

👍

分割的人像的头发处理能否进行边缘羽化

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.