# TengineKit **Repository Path**: yippeesoft/TengineKit ## Basic Information - **Project Name**: TengineKit - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-06 - **Last Updated**: 2021-10-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![TengineKit](https://openailab.oss-cn-shenzhen.aliyuncs.com/logo/TengineKit.png?raw=true "TengineKit logo") ======================================================================= # TengineKit - 永久免费移动端实时人脸212关键点SDK [![Apache 2.0](https://img.shields.io/crates/l/r)](LICENSE)

TengineKit, developed by OPEN AI LAB.
TengineKit是一个易于集成的人脸检测和人脸关键点SDK。目前,它可以在各种手机上以非常低的延迟运行。 # 效果 ## DEMO
真实效果
## Gif
跳舞主持
## 视频( YouTube | BiliBili ) [
](https://www.bilibili.com/video/BV1AK4y147xx/) # 试用 - [Apk](apk/TengineKitDemo-v1.2.2.apk) 可直接下载安装在手机上看到效果。 或者 - android扫码直接下载 ![Apk](https://www.pgyer.com/app/qrcode/A0uD?sign=&auSign=&code=) # 目标 - 移动端最佳的性能的人脸SDK - 移动端最简单易用的API - 移动端最小的包体 # 功能 - 人脸检测 - 人脸关键点 - 人脸属性像性别,年龄,是否戴眼镜,是否微笑,颜值 # 性能指标 | CPU | 耗时 | 帧率 | | :---: | :---: | :---: | | 麒麟980 | 14ms | 71fps | | 骁龙855 | 15ms | 67fps | | 麒麟970 | 17ms | 59fps | | 骁龙835 | 18ms | 56fps | | 麒麟710F| 19ms | 53fps | | 骁龙439 | 26ms | 38fps | | 联发科 Helio P60 | 27ms | 37fps | | 骁龙450B | 28ms | 36fps | # 库 最新的库的版本放在 Maven Central. ```implementation implementation 'com.tengine.android:tenginekit:1.0.2' ``` # 使用 ```java ... import com.tenginekit.FaceManager; public class CameraActivity extends AppCompatActivity implements Camera.PreviewCallback{ private static final String TAG = "CameraActicity"; // camera preview width protected int previewWidth; // camera preview height protected int previewHeight; // content display screen width public static float ScreenWidth; // content display screen height public static float ScreenHeight; // nv21 data from camera protected byte[] mNV21Bytes; ... public void Init() { mNV21Bytes = new byte[previewHeight * previewWidth]; /** * init * */ FaceManager.GetInstance().init(this,previewWidth, previewHeight, ScreenWidth, ScreenHeight,FaceManager.ImageFormat.YUV_NV21); } /** * Callback for android.hardware.Camera API */ @Override public void onPreviewFrame(final byte[] bytes, final Camera camera) { if (isProcessingFrame) { return; } isProcessingFrame = true; try { if (mNV21Bytes == null) { ... Camera.Size previewSize = camera.getParameters().getPreviewSize(); previewHeight = previewSize.height; previewWidth = previewSize.width; Init(); ... } } catch (final Exception e) { MyLogger.logError(TAG, "onPreviewFrame: " + e); return; } processImage(); } @Override public void onDestroy() { super.onDestroy(); /** * release * */ FaceManager.GetInstance().release(); } protected void processImage() { ... FaceInfo[] faceInfos = FaceManager.GetInstance().getFaceInfo(mNV21Bytes); if (faceInfos != null && faceInfos.length > 0) { Rect[] face_rect = new Rect[faceInfos.length]; List> face_landmarks = new ArrayList<>(); for (int i = 0; i < faceInfos.length; i++) { face_rect[i] = faceInfos[i].faceRect; face_landmarks.add(faceInfos[i].landmarks); } // do something with face_rect, face_landmarks } ... } } ``` # 系统 Android - 系统最低要求API 19 # API 方法位于```com.tenginekit.FaceManager```下。 ## 初始化 #### 参数 - context:activity的context - preview_w:摄像头预览宽 - preview_h:摄像头预览高 - screen_w:屏幕宽 - screen_h:屏幕高 - format:数据格式(YUV, RGB) ``` java FaceManager.getInstance().init(Context context, int preview_w, int preview_h, float screen_w, float screen_h, ImageFormat format); ``` ``` java enum ImageFormat { YUV_NV21, RGB, RGBA, GRAY } ``` ## 得到人脸信息 #### 参数 - imageData:输入数据 ``` java FaceInfo[] info = FaceManager.getInstance().getFaceInfo(byte[] imageData); ``` ## 设置旋转角 #### 参数 - ori:旋转角度(以竖直为0°) - is_screen_rotate:是否展示区域跟随旋转 - screen_w:屏幕宽 - screen_h:屏幕高 ``` java FaceManager.getInstance().setRotation(int ori, boolean is_screen_rotate, float screen_w, float screen_h); ``` ## 切换摄像头 #### 参数 - back:是否是后置摄像头。 ``` java FaceManager.getInstance().switchCamera(boolean back); ``` ## 开启额外功能 #### 参数: - FuncName:额外的功能类型 - state:是否开启 ``` java FaceManager.getInstance().changeFuncState(ExtraFunc FuncName, boolean state); ``` ``` java enum ExtraFunc { Attribution, // 人脸属性功能 } ``` ## 释放 ``` java FaceManager.getInstance().release(); ``` # 数据结构 - FaceInfo | 参数名 | 参数类型 | 注释 | | :---: | :---: | :---: | | faceRect | Rect | 人脸矩形框 | | landmarks | List | 人脸关键点信息 212个点 | | xAngle | float | 人脸x方向转角 | | yAngle | float | 人脸y方向转角 | | zAngle | float | 人脸z方向转角 | | leftEyeClose | float | 左眼闭合置信度 0~1 | | rightEyeClose | float | 右眼闭合置信度 0~1 | | mouseClose | float | 嘴巴闭合置信度 0~1 | | mouseOpenBig | float | 嘴巴张大置信度 0~1 | - FaceInfo --属性功能 | 参数名 | 参数类型 | 注释 | | :---: | :---: | :---: | | age | int | 年龄 | | isMan | boolean | 是否是男性 | | smile | int | 微笑程度0~100 | | glasses | boolean | 是否佩戴眼镜 | | beatyOfManLook | int | 男性角度看的颜值 | | beautyOfWomanLook | int | 女性角度看的颜值 | - LandmarkInfo | 参数名 | 参数类型 | 注释 | | :---: | :---: | :---: | | x | float | 点的x位置信息 | | y | float | 点的y位置信息 | # 人脸关键点顺序 [人脸关键点顺序](POINTORDER_CN.md) # 权限 ``` permission ``` # 示例 “sample/Android”文件夹下的Android代码。 # 接入指南 在TengineKit Api的setRotation 里有两个有两个参数ori和is_screen_rotate,分别为旋转角度和是否跟随屏幕旋转。这个是否跟随屏幕在Manifest里面的android:screenOrientation参数可以设置。不设置这个参数就是跟随屏幕旋转。 # 处理过程 ## 1.设备预览 这部分是从Camera获取数据,作为SDK的输入。 ## 2.角度 我们以竖直屏幕下为0度角,由于Android摄像头采集的数据实际总是偏差90,所以在设置ori参数的时候都需要 + (-90),安卓的实际旋转角是需要通过传感器加上函数计算去获得。具体可以看Demo项目中的示例。 ![process](https://openailab.oss-cn-shenzhen.aliyuncs.com/images/process_graph.png) ## 3.渲染 在渲染的时候是以0°角去渲染,是人在正常情况下看到正常输出。Android部分有Canvas和Opengl渲染,选用Opengl渲染可以让你的apk效果更好。 # 联系 关于TengineKit的使用以及人脸相关的技术交流可以加入下群(加群答案:TengineKit): - TengineKit QQ交流群 630836519 - 扫码加群