main 83ecdf198aeb cached
69 files
324.5 KB
104.5k tokens
127 symbols
1 requests
Download .txt
Showing preview only (348K chars total). Download the full file or copy to clipboard to get everything.
Repository: FeiGeChuanShu/ncnn_Android_face
Branch: main
Commit: 83ecdf198aeb
Files: 69
Total size: 324.5 KB

Directory structure:
gitextract_pop_0yey/

├── README.md
├── facemesh.onnx
├── ncnn-android-scrfd-master/
│   ├── README.md
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   ├── facemesh-op.param
│   │           │   ├── facemesh-op2.param
│   │           │   ├── faceseg-op.param
│   │           │   ├── scrfd_1g-opt2.param
│   │           │   └── scrfd_500m-opt2.param
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── scrfdncnn/
│   │           │               ├── MainActivity.java
│   │           │               └── SCRFDNcnn.java
│   │           ├── jni/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── ndkcamera.cpp
│   │           │   ├── ndkcamera.h
│   │           │   ├── scrfd.cpp
│   │           │   ├── scrfd.h
│   │           │   └── scrfdncnn.cpp
│   │           └── res/
│   │               ├── layout/
│   │               │   └── main.xml
│   │               └── values/
│   │                   └── strings.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── local.properties
│   └── settings.gradle
├── ncnn-android-yolov5_face/
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   ├── yolov5n-0.5.param
│   │           │   └── yolov5n.param
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── ncnnyoloface/
│   │           │               ├── MainActivity.java
│   │           │               └── NcnnYoloFace.java
│   │           ├── jni/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── ndkcamera.cpp
│   │           │   ├── ndkcamera.h
│   │           │   ├── yoloface.cpp
│   │           │   ├── yoloface.h
│   │           │   └── yolofacencnn.cpp
│   │           └── res/
│   │               ├── layout/
│   │               │   └── main.xml
│   │               └── values/
│   │                   └── strings.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── local.properties
│   └── settings.gradle
└── ncnn-android-yolov7_face/
    ├── app/
    │   ├── build.gradle
    │   └── src/
    │       └── main/
    │           ├── AndroidManifest.xml
    │           ├── assets/
    │           │   ├── yolov7-lite-e.param
    │           │   └── yolov7-tiny.param
    │           ├── java/
    │           │   └── com/
    │           │       └── tencent/
    │           │           └── ncnnyoloface/
    │           │               ├── MainActivity.java
    │           │               └── NcnnYoloFace.java
    │           ├── jni/
    │           │   ├── CMakeLists.txt
    │           │   ├── ndkcamera.cpp
    │           │   ├── ndkcamera.h
    │           │   ├── yoloface.cpp
    │           │   ├── yoloface.h
    │           │   └── yolofacencnn.cpp
    │           └── res/
    │               ├── layout/
    │               │   └── main.xml
    │               └── values/
    │                   └── strings.xml
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── local.properties
    └── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# ncnn_Android_face
Face detect and segmentation, facemesh by ncnn  

## model support:  
1.scrfd  
2.yolov5-face  
3.yolov7-face  

## A new mediapipe-blazeface demo in this place [new demo](https://github.com/FeiGeChuanShu/ncnn_Android_blazeface)  
![image](https://github.com/FeiGeChuanShu/ncnn_Android_face/blob/main/yolov7-tiny-face.png)![image](https://github.com/FeiGeChuanShu/ncnn_Android_face/blob/main/result.gif)![image](https://github.com/FeiGeChuanShu/ncnn_Android_face/blob/main/facemesh.gif)![image](https://github.com/FeiGeChuanShu/ncnn_Android_face/blob/main/yolov5-face.gif)  

## Reference:  
https://github.com/nihui/ncnn-android-scrfd  
https://github.com/deepcam-cn/yolov5-face  
https://github.com/Tencent/ncnn  
https://github.com/thepowerfuldeez/facemesh.pytorch  
https://github.com/derronqi/yolov7-face  


================================================
FILE: ncnn-android-scrfd-master/README.md
================================================
# ncnn-android-scrfd

The SCRFD face detection

This is a sample ncnn android project, it depends on ncnn library and opencv

https://github.com/Tencent/ncnn

https://github.com/nihui/opencv-mobile

## android apk file download
https://github.com/nihui/ncnn-android-scrfd/releases/download/v1/com.tencent.scrfdncnn-release.apk

## how to build and run
### step1
https://github.com/Tencent/ncnn/releases

* Download ncnn-YYYYMMDD-android-vulkan.zip or build ncnn for android yourself
* Extract ncnn-YYYYMMDD-android-vulkan.zip into **app/src/main/jni** and change the **ncnn_DIR** path to yours in **app/src/main/jni/CMakeLists.txt**

### step2
https://github.com/nihui/opencv-mobile

* Download opencv-mobile-XYZ-android.zip
* Extract opencv-mobile-XYZ-android.zip into **app/src/main/jni** and change the **OpenCV_DIR** path to yours in **app/src/main/jni/CMakeLists.txt**

### step3
* Open this project with Android Studio, build it and enjoy!

## some notes
* Android ndk camera is used for best efficiency
* Crash may happen on very old devices for lacking HAL3 camera interface
* All models are manually modified to accept dynamic input shape
* Most small models run slower on GPU than on CPU, this is common
* FPS may be lower in dark environment because of longer camera exposure time

## screenshot
![](screenshot.jpg)



================================================
FILE: ncnn-android-scrfd-master/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.tencent.scrfdncnn"
        archivesBaseName = "$applicationId"

        minSdkVersion 24
    }

    externalNativeBuild {
        cmake {
            version "3.10.2"
            path file('src/main/jni/CMakeLists.txt')
        }
    }

    dependencies {
        implementation 'com.android.support:support-v4:24.0.0'
    }
}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.tencent.scrfdncnn"
      android:versionCode="1"
      android:versionName="1.1">
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2.full" />

    <application android:label="@string/app_name">
        <activity android:name="MainActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 


================================================
FILE: ncnn-android-scrfd-master/app/src/main/assets/facemesh-op.param
================================================
7767517
123 144
Input            input.1                  0 1 input.1
MemoryData       200                      0 1 200 0=1
MemoryData       264                      0 1 264 0=1
MemoryData       328                      0 1 328 0=1
Padding          Pad_13                   1 1 input.1 136 0=1 1=0 2=1 3=0 4=2 5=0.000000e+00 7=0 8=0
Convolution      Conv_17                  1 1 136 140 0=16 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=0 16=0 5=1 6=432
PReLU            PRelu_18                 1 1 140 142 0=16
Split            splitncnn_0              1 2 142 142_splitncnn_0 142_splitncnn_1
ConvolutionDepthWise Conv_19                  1 1 142_splitncnn_1 143 0=16 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=144 7=16
Convolution      Conv_20                  1 1 143 144 0=16 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=256
BinaryOp         Add_21                   2 1 144 142_splitncnn_0 145 0=0
PReLU            PRelu_22                 1 1 145 147 0=16
Split            splitncnn_1              1 2 147 147_splitncnn_0 147_splitncnn_1
ConvolutionDepthWise Conv_23                  1 1 147_splitncnn_1 148 0=16 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=144 7=16
Convolution      Conv_24                  1 1 148 149 0=16 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=256
BinaryOp         Add_25                   2 1 149 147_splitncnn_0 150 0=0
PReLU            PRelu_26                 1 1 150 152 0=16
Split            splitncnn_2              1 2 152 152_splitncnn_0 152_splitncnn_1
Pooling          MaxPool_42               1 1 152_splitncnn_1 177 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
Padding          Pad_57                   2 1 177 200 201 0=0 1=0 2=0 3=0 4=0 5=0.000000e+00 7=0 8=16
ConvolutionDepthWise Conv_58                  1 1 152_splitncnn_0 202 0=16 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=144 7=16
Convolution      Conv_59                  1 1 202 203 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=512
BinaryOp         Add_60                   2 1 203 201 204 0=0
PReLU            PRelu_61                 1 1 204 206 0=32
Split            splitncnn_3              1 2 206 206_splitncnn_0 206_splitncnn_1
ConvolutionDepthWise Conv_62                  1 1 206_splitncnn_1 207 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=288 7=32
Convolution      Conv_63                  1 1 207 208 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
BinaryOp         Add_64                   2 1 208 206_splitncnn_0 209 0=0
PReLU            PRelu_65                 1 1 209 211 0=32
Split            splitncnn_4              1 2 211 211_splitncnn_0 211_splitncnn_1
ConvolutionDepthWise Conv_66                  1 1 211_splitncnn_1 212 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=288 7=32
Convolution      Conv_67                  1 1 212 213 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
BinaryOp         Add_68                   2 1 213 211_splitncnn_0 214 0=0
PReLU            PRelu_69                 1 1 214 216 0=32
Split            splitncnn_5              1 2 216 216_splitncnn_0 216_splitncnn_1
Pooling          MaxPool_85               1 1 216_splitncnn_1 241 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
Padding          Pad_100                  2 1 241 264 265 0=0 1=0 2=0 3=0 4=0 5=0.000000e+00 7=0 8=32
ConvolutionDepthWise Conv_101                 1 1 216_splitncnn_0 266 0=32 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=288 7=32
Convolution      Conv_102                 1 1 266 267 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2048
BinaryOp         Add_103                  2 1 267 265 268 0=0
PReLU            PRelu_104                1 1 268 270 0=64
Split            splitncnn_6              1 2 270 270_splitncnn_0 270_splitncnn_1
ConvolutionDepthWise Conv_105                 1 1 270_splitncnn_1 271 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=576 7=64
Convolution      Conv_106                 1 1 271 272 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
BinaryOp         Add_107                  2 1 272 270_splitncnn_0 273 0=0
PReLU            PRelu_108                1 1 273 275 0=64
Split            splitncnn_7              1 2 275 275_splitncnn_0 275_splitncnn_1
ConvolutionDepthWise Conv_109                 1 1 275_splitncnn_1 276 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=576 7=64
Convolution      Conv_110                 1 1 276 277 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
BinaryOp         Add_111                  2 1 277 275_splitncnn_0 278 0=0
PReLU            PRelu_112                1 1 278 280 0=64
Split            splitncnn_8              1 2 280 280_splitncnn_0 280_splitncnn_1
Pooling          MaxPool_128              1 1 280_splitncnn_1 305 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
Padding          Pad_143                  2 1 305 328 329 0=0 1=0 2=0 3=0 4=0 5=0.000000e+00 7=0 8=64
ConvolutionDepthWise Conv_144                 1 1 280_splitncnn_0 330 0=64 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=576 7=64
Convolution      Conv_145                 1 1 330 331 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8192
BinaryOp         Add_146                  2 1 331 329 332 0=0
PReLU            PRelu_147                1 1 332 334 0=128
Split            splitncnn_9              1 2 334 334_splitncnn_0 334_splitncnn_1
ConvolutionDepthWise Conv_148                 1 1 334_splitncnn_1 335 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_149                 1 1 335 336 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_150                  2 1 336 334_splitncnn_0 337 0=0
PReLU            PRelu_151                1 1 337 339 0=128
Split            splitncnn_10             1 2 339 339_splitncnn_0 339_splitncnn_1
ConvolutionDepthWise Conv_152                 1 1 339_splitncnn_1 340 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_153                 1 1 340 341 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_154                  2 1 341 339_splitncnn_0 342 0=0
PReLU            PRelu_155                1 1 342 344 0=128
Split            splitncnn_11             1 2 344 344_splitncnn_0 344_splitncnn_1
Pooling          MaxPool_171              1 1 344_splitncnn_1 369 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
ConvolutionDepthWise Conv_172                 1 1 344_splitncnn_0 370 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=1152 7=128
Convolution      Conv_173                 1 1 370 371 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_174                  2 1 371 369 372 0=0
PReLU            PRelu_175                1 1 372 374 0=128
Split            splitncnn_12             1 2 374 374_splitncnn_0 374_splitncnn_1
ConvolutionDepthWise Conv_176                 1 1 374_splitncnn_1 375 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_177                 1 1 375 376 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_178                  2 1 376 374_splitncnn_0 377 0=0
PReLU            PRelu_179                1 1 377 379 0=128
Split            splitncnn_13             1 2 379 379_splitncnn_0 379_splitncnn_1
ConvolutionDepthWise Conv_180                 1 1 379_splitncnn_1 380 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_181                 1 1 380 381 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_182                  2 1 381 379_splitncnn_0 382 0=0
PReLU            PRelu_183                1 1 382 384 0=128
Split            splitncnn_14             1 4 384 384_splitncnn_0 384_splitncnn_1 384_splitncnn_2 384_splitncnn_3
Pooling          MaxPool_199              1 1 384_splitncnn_3 409 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
ConvolutionDepthWise Conv_200                 1 1 384_splitncnn_2 410 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=1152 7=128
Convolution      Conv_201                 1 1 410 411 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_202                  2 1 411 409 412 0=0
PReLU            PRelu_203                1 1 412 414 0=128
Convolution      Conv_204                 1 1 414 415 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
PReLU            PRelu_205                1 1 415 417 0=32
Split            splitncnn_15             1 2 417 417_splitncnn_0 417_splitncnn_1
ConvolutionDepthWise Conv_206                 1 1 417_splitncnn_1 418 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=288 7=32
Convolution      Conv_207                 1 1 418 419 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
BinaryOp         Add_208                  2 1 419 417_splitncnn_0 420 0=0
PReLU            PRelu_209                1 1 420 422 0=32
Convolution      Conv_210                 1 1 422 423 0=1 1=3 11=3 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=288
Reshape          Reshape_213              1 1 423 428 0=-1
Pooling          MaxPool_229              1 1 384_splitncnn_1 453 0=0 1=2 11=2 2=2 12=2 3=0 13=0 14=0 15=0 5=1
ConvolutionDepthWise Conv_230                 1 1 384_splitncnn_0 454 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=0 14=0 15=2 16=2 5=1 6=1152 7=128
Convolution      Conv_231                 1 1 454 455 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_232                  2 1 455 453 456 0=0
PReLU            PRelu_233                1 1 456 458 0=128
Split            splitncnn_16             1 2 458 458_splitncnn_0 458_splitncnn_1
ConvolutionDepthWise Conv_234                 1 1 458_splitncnn_1 459 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_235                 1 1 459 460 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_236                  2 1 460 458_splitncnn_0 461 0=0
PReLU            PRelu_237                1 1 461 463 0=128
Split            splitncnn_17             1 2 463 463_splitncnn_0 463_splitncnn_1
ConvolutionDepthWise Conv_238                 1 1 463_splitncnn_1 464 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1152 7=128
Convolution      Conv_239                 1 1 464 465 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
BinaryOp         Add_240                  2 1 465 463_splitncnn_0 466 0=0
PReLU            PRelu_241                1 1 466 468 0=128
Convolution      Conv_242                 1 1 468 469 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
PReLU            PRelu_243                1 1 469 471 0=32
Split            splitncnn_18             1 2 471 471_splitncnn_0 471_splitncnn_1
ConvolutionDepthWise Conv_244                 1 1 471_splitncnn_1 472 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=288 7=32
Convolution      Conv_245                 1 1 472 473 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
BinaryOp         Add_246                  2 1 473 471_splitncnn_0 474 0=0
PReLU            PRelu_247                1 1 474 476 0=32
Convolution      Conv_248                 1 1 476 477 0=1404 1=3 11=3 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=404352
Reshape          Reshape_251              1 1 477 482 0=-1


================================================
FILE: ncnn-android-scrfd-master/app/src/main/assets/facemesh-op2.param
================================================
7767517
166 206
Input                    input                    0 1 input
Convolution              550                      1 1 input 552 0=16 1=3 3=2 4=1 5=1 6=432 9=1
Split                    splitncnn_0              1 2 552 552_splitncnn_0 552_splitncnn_1
Convolution              553                      1 1 552_splitncnn_1 555 0=8 1=1 5=1 6=128 9=1
Split                    splitncnn_1              1 2 555 555_splitncnn_0 555_splitncnn_1
ConvolutionDepthWise     556                      1 1 555_splitncnn_1 558 0=8 1=3 4=1 5=1 6=72 7=8 9=1
Concat                   559                      2 1 555_splitncnn_0 558 559
Convolution              560                      1 1 559 561 0=8 1=1 5=1 6=128
Split                    splitncnn_2              1 2 561 561_splitncnn_0 561_splitncnn_1
ConvolutionDepthWise     562                      1 1 561_splitncnn_1 563 0=8 1=3 4=1 5=1 6=72 7=8
Concat                   564                      2 1 561_splitncnn_0 563 564
BinaryOp                 565                      2 1 564 552_splitncnn_0 565
Split                    splitncnn_3              1 2 565 565_splitncnn_0 565_splitncnn_1
Convolution              566                      1 1 565_splitncnn_1 568 0=24 1=1 5=1 6=384 9=1
Split                    splitncnn_4              1 2 568 568_splitncnn_0 568_splitncnn_1
ConvolutionDepthWise     569                      1 1 568_splitncnn_1 571 0=24 1=3 4=1 5=1 6=216 7=24 9=1
Concat                   572                      2 1 568_splitncnn_0 571 572
ConvolutionDepthWise     573                      1 1 572 574 0=48 1=3 3=2 4=1 5=1 6=432 7=48
Convolution              575                      1 1 574 576 0=12 1=1 5=1 6=576
Split                    splitncnn_5              1 2 576 576_splitncnn_0 576_splitncnn_1
ConvolutionDepthWise     577                      1 1 576_splitncnn_1 578 0=12 1=3 4=1 5=1 6=108 7=12
Concat                   579                      2 1 576_splitncnn_0 578 579
ConvolutionDepthWise     580                      1 1 565_splitncnn_0 581 0=16 1=3 3=2 4=1 5=1 6=144 7=16
Convolution              582                      1 1 581 583 0=24 1=1 5=1 6=384
BinaryOp                 584                      2 1 579 583 584
Split                    splitncnn_6              1 2 584 584_splitncnn_0 584_splitncnn_1
Convolution              585                      1 1 584_splitncnn_1 587 0=36 1=1 5=1 6=864 9=1
Split                    splitncnn_7              1 2 587 587_splitncnn_0 587_splitncnn_1
ConvolutionDepthWise     588                      1 1 587_splitncnn_1 590 0=36 1=3 4=1 5=1 6=324 7=36 9=1
Concat                   591                      2 1 587_splitncnn_0 590 591
Convolution              592                      1 1 591 593 0=12 1=1 5=1 6=864
Split                    splitncnn_8              1 2 593 593_splitncnn_0 593_splitncnn_1
ConvolutionDepthWise     594                      1 1 593_splitncnn_1 595 0=12 1=3 4=1 5=1 6=108 7=12
Concat                   596                      2 1 593_splitncnn_0 595 596
BinaryOp                 597                      2 1 596 584_splitncnn_0 597
Split                    splitncnn_9              1 2 597 597_splitncnn_0 597_splitncnn_1
Convolution              598                      1 1 597_splitncnn_1 600 0=36 1=1 5=1 6=864 9=1
Split                    splitncnn_10             1 2 600 600_splitncnn_0 600_splitncnn_1
ConvolutionDepthWise     601                      1 1 600_splitncnn_1 603 0=36 1=3 4=1 5=1 6=324 7=36 9=1
Concat                   604                      2 1 600_splitncnn_0 603 604
ConvolutionDepthWise     605                      1 1 604 606 0=72 1=5 3=2 4=2 5=1 6=1800 7=72
Split                    splitncnn_11             1 2 606 606_splitncnn_0 606_splitncnn_1
Pooling                  607                      1 1 606_splitncnn_1 607 0=1 4=1
InnerProduct             608                      1 1 607 609 0=20 1=1 2=1440 9=1
InnerProduct             610                      1 1 609 610 0=72 1=1 2=1440
HardSigmoid              615                      1 1 610 615 0=1.666667e-01
BinaryOp                 616                      2 1 606_splitncnn_0 615 616 0=2
Convolution              617                      1 1 616 618 0=20 1=1 5=1 6=1440
Split                    splitncnn_12             1 2 618 618_splitncnn_0 618_splitncnn_1
ConvolutionDepthWise     619                      1 1 618_splitncnn_1 620 0=20 1=3 4=1 5=1 6=180 7=20
Concat                   621                      2 1 618_splitncnn_0 620 621
ConvolutionDepthWise     622                      1 1 597_splitncnn_0 623 0=24 1=5 3=2 4=2 5=1 6=600 7=24
Convolution              624                      1 1 623 625 0=40 1=1 5=1 6=960
BinaryOp                 626                      2 1 621 625 626
Split                    splitncnn_13             1 2 626 626_splitncnn_0 626_splitncnn_1
Convolution              627                      1 1 626_splitncnn_1 629 0=60 1=1 5=1 6=2400 9=1
Split                    splitncnn_14             1 2 629 629_splitncnn_0 629_splitncnn_1
ConvolutionDepthWise     630                      1 1 629_splitncnn_1 632 0=60 1=3 4=1 5=1 6=540 7=60 9=1
Concat                   633                      2 1 629_splitncnn_0 632 633
Split                    splitncnn_15             1 2 633 633_splitncnn_0 633_splitncnn_1
Pooling                  634                      1 1 633_splitncnn_1 634 0=1 4=1
InnerProduct             635                      1 1 634 636 0=32 1=1 2=3840 9=1
InnerProduct             637                      1 1 636 637 0=120 1=1 2=3840
HardSigmoid              642                      1 1 637 642 0=1.666667e-01
BinaryOp                 643                      2 1 633_splitncnn_0 642 643 0=2
Convolution              644                      1 1 643 645 0=20 1=1 5=1 6=2400
Split                    splitncnn_16             1 2 645 645_splitncnn_0 645_splitncnn_1
ConvolutionDepthWise     646                      1 1 645_splitncnn_1 647 0=20 1=3 4=1 5=1 6=180 7=20
Concat                   648                      2 1 645_splitncnn_0 647 648
BinaryOp                 649                      2 1 648 626_splitncnn_0 649
Split                    splitncnn_17             1 2 649 649_splitncnn_0 649_splitncnn_1
Convolution              650                      1 1 649_splitncnn_1 652 0=120 1=1 5=1 6=4800 9=1
Split                    splitncnn_18             1 2 652 652_splitncnn_0 652_splitncnn_1
ConvolutionDepthWise     653                      1 1 652_splitncnn_1 655 0=120 1=3 4=1 5=1 6=1080 7=120 9=1
Concat                   656                      2 1 652_splitncnn_0 655 656
ConvolutionDepthWise     657                      1 1 656 658 0=240 1=3 3=2 4=1 5=1 6=2160 7=240
Convolution              659                      1 1 658 660 0=40 1=1 5=1 6=9600
Split                    splitncnn_19             1 2 660 660_splitncnn_0 660_splitncnn_1
ConvolutionDepthWise     661                      1 1 660_splitncnn_1 662 0=40 1=3 4=1 5=1 6=360 7=40
Concat                   663                      2 1 660_splitncnn_0 662 663
ConvolutionDepthWise     664                      1 1 649_splitncnn_0 665 0=40 1=3 3=2 4=1 5=1 6=360 7=40
Convolution              666                      1 1 665 667 0=80 1=1 5=1 6=3200
BinaryOp                 668                      2 1 663 667 668
Split                    splitncnn_20             1 2 668 668_splitncnn_0 668_splitncnn_1
Convolution              669                      1 1 668_splitncnn_1 671 0=100 1=1 5=1 6=8000 9=1
Split                    splitncnn_21             1 2 671 671_splitncnn_0 671_splitncnn_1
ConvolutionDepthWise     672                      1 1 671_splitncnn_1 674 0=100 1=3 4=1 5=1 6=900 7=100 9=1
Concat                   675                      2 1 671_splitncnn_0 674 675
Convolution              676                      1 1 675 677 0=40 1=1 5=1 6=8000
Split                    splitncnn_22             1 2 677 677_splitncnn_0 677_splitncnn_1
ConvolutionDepthWise     678                      1 1 677_splitncnn_1 679 0=40 1=3 4=1 5=1 6=360 7=40
Concat                   680                      2 1 677_splitncnn_0 679 680
BinaryOp                 681                      2 1 680 668_splitncnn_0 681
Split                    splitncnn_23             1 2 681 681_splitncnn_0 681_splitncnn_1
Convolution              682                      1 1 681_splitncnn_1 684 0=92 1=1 5=1 6=7360 9=1
Split                    splitncnn_24             1 2 684 684_splitncnn_0 684_splitncnn_1
ConvolutionDepthWise     685                      1 1 684_splitncnn_1 687 0=92 1=3 4=1 5=1 6=828 7=92 9=1
Concat                   688                      2 1 684_splitncnn_0 687 688
Convolution              689                      1 1 688 690 0=40 1=1 5=1 6=7360
Split                    splitncnn_25             1 2 690 690_splitncnn_0 690_splitncnn_1
ConvolutionDepthWise     691                      1 1 690_splitncnn_1 692 0=40 1=3 4=1 5=1 6=360 7=40
Concat                   693                      2 1 690_splitncnn_0 692 693
BinaryOp                 694                      2 1 693 681_splitncnn_0 694
Split                    splitncnn_26             1 2 694 694_splitncnn_0 694_splitncnn_1
Convolution              695                      1 1 694_splitncnn_1 697 0=92 1=1 5=1 6=7360 9=1
Split                    splitncnn_27             1 2 697 697_splitncnn_0 697_splitncnn_1
ConvolutionDepthWise     698                      1 1 697_splitncnn_1 700 0=92 1=3 4=1 5=1 6=828 7=92 9=1
Concat                   701                      2 1 697_splitncnn_0 700 701
Convolution              702                      1 1 701 703 0=40 1=1 5=1 6=7360
Split                    splitncnn_28             1 2 703 703_splitncnn_0 703_splitncnn_1
ConvolutionDepthWise     704                      1 1 703_splitncnn_1 705 0=40 1=3 4=1 5=1 6=360 7=40
Concat                   706                      2 1 703_splitncnn_0 705 706
BinaryOp                 707                      2 1 706 694_splitncnn_0 707
Split                    splitncnn_29             1 2 707 707_splitncnn_0 707_splitncnn_1
Convolution              708                      1 1 707_splitncnn_1 710 0=240 1=1 5=1 6=19200 9=1
Split                    splitncnn_30             1 2 710 710_splitncnn_0 710_splitncnn_1
ConvolutionDepthWise     711                      1 1 710_splitncnn_1 713 0=240 1=3 4=1 5=1 6=2160 7=240 9=1
Concat                   714                      2 1 710_splitncnn_0 713 714
Split                    splitncnn_31             1 2 714 714_splitncnn_0 714_splitncnn_1
Pooling                  715                      1 1 714_splitncnn_1 715 0=1 4=1
InnerProduct             716                      1 1 715 717 0=120 1=1 2=57600 9=1
InnerProduct             718                      1 1 717 718 0=480 1=1 2=57600
HardSigmoid              723                      1 1 718 723 0=1.666667e-01
BinaryOp                 724                      2 1 714_splitncnn_0 723 724 0=2
Convolution              725                      1 1 724 726 0=56 1=1 5=1 6=26880
Split                    splitncnn_32             1 2 726 726_splitncnn_0 726_splitncnn_1
ConvolutionDepthWise     727                      1 1 726_splitncnn_1 728 0=56 1=3 4=1 5=1 6=504 7=56
Concat                   729                      2 1 726_splitncnn_0 728 729
ConvolutionDepthWise     730                      1 1 707_splitncnn_0 731 0=80 1=3 4=1 5=1 6=720 7=80
Convolution              732                      1 1 731 733 0=112 1=1 5=1 6=8960
BinaryOp                 734                      2 1 729 733 734
Split                    splitncnn_33             1 2 734 734_splitncnn_0 734_splitncnn_1
Convolution              735                      1 1 734_splitncnn_1 737 0=336 1=1 5=1 6=37632 9=1
Split                    splitncnn_34             1 2 737 737_splitncnn_0 737_splitncnn_1
ConvolutionDepthWise     738                      1 1 737_splitncnn_1 740 0=336 1=3 4=1 5=1 6=3024 7=336 9=1
Concat                   741                      2 1 737_splitncnn_0 740 741
Split                    splitncnn_35             1 2 741 741_splitncnn_0 741_splitncnn_1
Pooling                  742                      1 1 741_splitncnn_1 742 0=1 4=1
InnerProduct             743                      1 1 742 744 0=168 1=1 2=112896 9=1
InnerProduct             745                      1 1 744 745 0=672 1=1 2=112896
HardSigmoid              750                      1 1 745 750 0=1.666667e-01
BinaryOp                 751                      2 1 741_splitncnn_0 750 751 0=2
Convolution              752                      1 1 751 753 0=56 1=1 5=1 6=37632
Split                    splitncnn_36             1 2 753 753_splitncnn_0 753_splitncnn_1
ConvolutionDepthWise     754                      1 1 753_splitncnn_1 755 0=56 1=3 4=1 5=1 6=504 7=56
Concat                   756                      2 1 753_splitncnn_0 755 756
BinaryOp                 757                      2 1 756 734_splitncnn_0 757
Split                    splitncnn_37             1 2 757 757_splitncnn_0 757_splitncnn_1
Pooling                  758                      1 1 757_splitncnn_1 758 0=1 4=1
InnerProduct             759                      1 1 758 761 0=28 1=1 2=3136 9=1
InnerProduct             762                      1 1 761 764 0=112 1=1 2=3136 9=4
BinaryOp                 765                      2 1 757_splitncnn_0 764 765 0=2
Convolution              766                      1 1 765 768 0=224 1=1 5=1 6=25088 9=1
ConvolutionDepthWise     769                      1 1 768 771 0=224 1=3 4=1 5=1 6=2016 7=224 9=1
Convolution              772                      1 1 771 773 0=32 1=1 5=1 6=7168
Split                    splitncnn_38             1 2 773 773_splitncnn_0 773_splitncnn_1
Pooling                  775                      1 1 773_splitncnn_1 775 0=1 1=14 2=14 5=1
Reshape                  783                      1 1 775 783 0=-1
Convolution              784                      1 1 773_splitncnn_0 786 0=64 1=3 3=2 4=1 5=1 6=18432 9=1
Split                    splitncnn_39             1 2 786 786_splitncnn_0 786_splitncnn_1
Pooling                  788                      1 1 786_splitncnn_1 788 0=1 1=7 2=7 5=1
Reshape                  796                      1 1 788 796 0=-1
Convolution              797                      1 1 786_splitncnn_0 798 0=256 1=7 5=1 6=802816 9=1
Reshape                  806                      1 1 798 806 0=-1
Concat                   807                      3 1 783 796 806 807
InnerProduct             output                   1 1 807 output 0=936 1=1 2=329472


================================================
FILE: ncnn-android-scrfd-master/app/src/main/assets/faceseg-op.param
================================================
7767517
161 189
Input                    input.1                  0 1 input
Convolution              Conv_14                  1 1 input 363 0=32 1=3 3=2 4=1 5=1 6=864 9=1
Convolution              Conv_17                  1 1 363 366 0=32 1=3 3=2 4=1 5=1 6=9216 9=1
Split                    splitncnn_0              1 2 366 366_splitncnn_0 366_splitncnn_1
Convolution              Conv_20                  1 1 366_splitncnn_1 369 0=32 1=3 4=1 5=1 6=9216 9=1
Convolution              Conv_23                  1 1 369 371 0=32 1=3 4=1 5=1 6=9216
BinaryOp                 Add_25                   2 1 371 366_splitncnn_0 372
ReLU                     Relu_26                  1 1 372 373
Split                    splitncnn_1              1 2 373 373_splitncnn_0 373_splitncnn_1
Convolution              Conv_27                  1 1 373_splitncnn_1 376 0=32 1=3 4=1 5=1 6=9216 9=1
Convolution              Conv_30                  1 1 376 378 0=32 1=3 4=1 5=1 6=9216
BinaryOp                 Add_32                   2 1 378 373_splitncnn_0 379
ReLU                     Relu_33                  1 1 379 380
Split                    splitncnn_2              1 2 380 380_splitncnn_0 380_splitncnn_1
Convolution              Conv_34                  1 1 380_splitncnn_1 383 0=64 1=3 3=2 4=1 5=1 6=18432 9=1
Convolution              Conv_37                  1 1 383 385 0=64 1=3 4=1 5=1 6=36864
Convolution              Conv_39                  1 1 380_splitncnn_0 387 0=64 1=1 3=2 5=1 6=2048
BinaryOp                 Add_41                   2 1 385 387 388
ReLU                     Relu_42                  1 1 388 389
Split                    splitncnn_3              1 2 389 389_splitncnn_0 389_splitncnn_1
Convolution              Conv_43                  1 1 389_splitncnn_1 392 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_46                  1 1 392 394 0=64 1=3 4=1 5=1 6=36864
BinaryOp                 Add_48                   2 1 394 389_splitncnn_0 395
Split                    splitncnn_4              1 2 395 395_splitncnn_0 395_splitncnn_1
ReLU                     Relu_49                  1 1 395_splitncnn_1 396
Split                    splitncnn_5              1 2 396 396_splitncnn_0 396_splitncnn_1
Convolution              Conv_50                  1 1 396_splitncnn_1 399 0=128 1=3 3=2 4=1 5=1 6=73728 9=1
Convolution              Conv_53                  1 1 399 401 0=128 1=3 4=1 5=1 6=147456
Convolution              Conv_55                  1 1 396_splitncnn_0 403 0=128 1=1 3=2 5=1 6=8192
BinaryOp                 Add_57                   2 1 401 403 404
ReLU                     Relu_58                  1 1 404 405
Split                    splitncnn_6              1 2 405 405_splitncnn_0 405_splitncnn_1
Convolution              Conv_59                  1 1 405_splitncnn_1 408 0=128 1=3 4=1 5=1 6=147456 9=1
Convolution              Conv_62                  1 1 408 410 0=128 1=3 4=1 5=1 6=147456
BinaryOp                 Add_64                   2 1 410 405_splitncnn_0 411
Split                    splitncnn_7              1 2 411 411_splitncnn_0 411_splitncnn_1
ReLU                     Relu_65                  1 1 395_splitncnn_0 412
Split                    splitncnn_8              1 2 412 412_splitncnn_0 412_splitncnn_1
Convolution              Conv_66                  1 1 412_splitncnn_1 415 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_69                  1 1 415 417 0=64 1=3 4=1 5=1 6=36864
BinaryOp                 Add_71                   2 1 417 412_splitncnn_0 418
ReLU                     Relu_72                  1 1 418 419
Split                    splitncnn_9              1 2 419 419_splitncnn_0 419_splitncnn_1
Convolution              Conv_73                  1 1 419_splitncnn_1 422 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_76                  1 1 422 424 0=64 1=3 4=1 5=1 6=36864
BinaryOp                 Add_78                   2 1 424 419_splitncnn_0 425
Split                    splitncnn_10             1 2 425 425_splitncnn_0 425_splitncnn_1
ReLU                     Relu_79                  1 1 425_splitncnn_1 426
Convolution              Conv_80                  1 1 426 428 0=128 1=3 3=2 4=1 5=1 6=73728
BinaryOp                 Add_82                   2 1 411_splitncnn_1 428 429
ReLU                     Relu_83                  1 1 411_splitncnn_0 430
Convolution              Conv_84                  1 1 430 432 0=64 1=1 5=1 6=8192
Interp                   Resize_98                1 1 432 445 0=2 3=32 4=32
BinaryOp                 Add_99                   2 1 425_splitncnn_0 445 446
ReLU                     Relu_100                 1 1 429 447
Split                    splitncnn_11             1 2 447 447_splitncnn_0 447_splitncnn_1
Convolution              Conv_101                 1 1 447_splitncnn_1 450 0=256 1=3 3=2 4=1 5=1 6=294912 9=1
Convolution              Conv_104                 1 1 450 452 0=256 1=3 4=1 5=1 6=589824
Convolution              Conv_106                 1 1 447_splitncnn_0 454 0=256 1=1 3=2 5=1 6=32768
BinaryOp                 Add_108                  2 1 452 454 455
ReLU                     Relu_109                 1 1 455 456
Split                    splitncnn_12             1 2 456 456_splitncnn_0 456_splitncnn_1
Convolution              Conv_110                 1 1 456_splitncnn_1 459 0=256 1=3 4=1 5=1 6=589824 9=1
Convolution              Conv_113                 1 1 459 461 0=256 1=3 4=1 5=1 6=589824
BinaryOp                 Add_115                  2 1 461 456_splitncnn_0 462
Split                    splitncnn_13             1 2 462 462_splitncnn_0 462_splitncnn_1
ReLU                     Relu_116                 1 1 446 463
Split                    splitncnn_14             1 2 463 463_splitncnn_0 463_splitncnn_1
Convolution              Conv_117                 1 1 463_splitncnn_1 466 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_120                 1 1 466 468 0=64 1=3 4=1 5=1 6=36864
BinaryOp                 Add_122                  2 1 468 463_splitncnn_0 469
ReLU                     Relu_123                 1 1 469 470
Split                    splitncnn_15             1 2 470 470_splitncnn_0 470_splitncnn_1
Convolution              Conv_124                 1 1 470_splitncnn_1 473 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_127                 1 1 473 475 0=64 1=3 4=1 5=1 6=36864
BinaryOp                 Add_129                  2 1 475 470_splitncnn_0 476
Split                    splitncnn_16             1 2 476 476_splitncnn_0 476_splitncnn_1
ReLU                     Relu_130                 1 1 476_splitncnn_1 477
Convolution              Conv_131                 1 1 477 480 0=128 1=3 3=2 4=1 5=1 6=73728 9=1
Convolution              Conv_134                 1 1 480 482 0=256 1=3 3=2 4=1 5=1 6=294912
BinaryOp                 Add_136                  2 1 462_splitncnn_1 482 483
ReLU                     Relu_137                 1 1 462_splitncnn_0 484
Convolution              Conv_138                 1 1 484 486 0=64 1=1 5=1 6=16384
Interp                   Resize_152               1 1 486 499 0=2 3=32 4=32
BinaryOp                 Add_153                  2 1 476_splitncnn_0 499 500
ReLU                     Relu_154                 1 1 500 501
Split                    splitncnn_17             1 2 501 501_splitncnn_0 501_splitncnn_1
Convolution              Conv_155                 1 1 501_splitncnn_1 504 0=64 1=1 5=1 6=4096 9=1
Convolution              Conv_158                 1 1 504 507 0=64 1=3 4=1 5=1 6=36864 9=1
Convolution              Conv_161                 1 1 507 509 0=128 1=1 5=1 6=8192
Convolution              Conv_163                 1 1 501_splitncnn_0 511 0=128 1=1 5=1 6=8192
BinaryOp                 Add_165                  2 1 509 511 512
ReLU                     Relu_166                 1 1 483 513
Split                    splitncnn_18             1 2 513 513_splitncnn_0 513_splitncnn_1
Convolution              Conv_167                 1 1 513_splitncnn_1 516 0=256 1=1 5=1 6=65536 9=1
Convolution              Conv_170                 1 1 516 519 0=256 1=3 3=2 4=1 5=1 6=589824 9=1
Convolution              Conv_173                 1 1 519 521 0=512 1=1 5=1 6=131072
Convolution              Conv_175                 1 1 513_splitncnn_0 523 0=512 1=1 3=2 5=1 6=131072
BinaryOp                 Add_177                  2 1 521 523 524
Split                    splitncnn_19             1 6 524 524_splitncnn_0 524_splitncnn_1 524_splitncnn_2 524_splitncnn_3 524_splitncnn_4 524_splitncnn_5
BatchNorm                BatchNormalization_184   1 1 524_splitncnn_5 531 0=512
ReLU                     Relu_185                 1 1 531 532
Convolution              Conv_186                 1 1 532 533 0=128 1=1 6=65536
Split                    splitncnn_20             1 2 533 533_splitncnn_0 533_splitncnn_1
Padding                  Pad_188                  1 1 524_splitncnn_4 535 0=1 1=1 2=1 3=1
Pooling                  AveragePool_189          1 1 535 536 0=1 1=3 2=2 5=1
BatchNorm                BatchNormalization_190   1 1 536 537 0=512
ReLU                     Relu_191                 1 1 537 538
Convolution              Conv_192                 1 1 538 539 0=128 1=1 6=65536
Interp                   Resize_205               1 1 539 552 0=2 3=4 4=4
BinaryOp                 Add_206                  2 1 552 533_splitncnn_1 553
BatchNorm                BatchNormalization_207   1 1 553 554 0=128
ReLU                     Relu_208                 1 1 554 555
Convolution              Conv_209                 1 1 555 556 0=128 1=3 4=1 6=147456
Split                    splitncnn_21             1 2 556 556_splitncnn_0 556_splitncnn_1
Padding                  Pad_211                  1 1 524_splitncnn_3 558 0=2 1=2 2=2 3=2
Pooling                  AveragePool_212          1 1 558 559 0=1 1=5 2=4 5=1
BatchNorm                BatchNormalization_213   1 1 559 560 0=512
ReLU                     Relu_214                 1 1 560 561
Convolution              Conv_215                 1 1 561 562 0=128 1=1 6=65536
Interp                   Resize_228               1 1 562 575 0=2 3=4 4=4
BinaryOp                 Add_229                  2 1 575 556_splitncnn_1 576
BatchNorm                BatchNormalization_230   1 1 576 577 0=128
ReLU                     Relu_231                 1 1 577 578
Convolution              Conv_232                 1 1 578 579 0=128 1=3 4=1 6=147456
Split                    splitncnn_22             1 2 579 579_splitncnn_0 579_splitncnn_1
Padding                  Pad_234                  1 1 524_splitncnn_2 581 0=4 1=4 2=4 3=4
Pooling                  AveragePool_235          1 1 581 582 0=1 1=9 2=8 5=1
BatchNorm                BatchNormalization_236   1 1 582 583 0=512
ReLU                     Relu_237                 1 1 583 584
Convolution              Conv_238                 1 1 584 585 0=128 1=1 6=65536
Interp                   Resize_251               1 1 585 598 0=2 3=4 4=4
BinaryOp                 Add_252                  2 1 598 579_splitncnn_1 599
BatchNorm                BatchNormalization_253   1 1 599 600 0=128
ReLU                     Relu_254                 1 1 600 601
Convolution              Conv_255                 1 1 601 602 0=128 1=3 4=1 6=147456
Split                    splitncnn_23             1 2 602 602_splitncnn_0 602_splitncnn_1
Pooling                  GlobalAveragePool_256    1 1 524_splitncnn_1 603 0=1 4=1
BatchNorm                BatchNormalization_257   1 1 603 604 0=512
ReLU                     Relu_258                 1 1 604 605
Convolution              Conv_259                 1 1 605 606 0=128 1=1 6=65536
Interp                   Resize_272               1 1 606 619 0=2 3=4 4=4
BinaryOp                 Add_273                  2 1 619 602_splitncnn_1 620
BatchNorm                BatchNormalization_274   1 1 620 621 0=128
ReLU                     Relu_275                 1 1 621 622
Convolution              Conv_276                 1 1 622 623 0=128 1=3 4=1 6=147456
Concat                   Concat_277               5 1 533_splitncnn_0 556_splitncnn_0 579_splitncnn_0 602_splitncnn_0 623 624
BatchNorm                BatchNormalization_278   1 1 624 625 0=640
ReLU                     Relu_279                 1 1 625 626
Convolution              Conv_280                 1 1 626 627 0=128 1=1 6=81920
BatchNorm                BatchNormalization_281   1 1 524_splitncnn_0 628 0=512
ReLU                     Relu_282                 1 1 628 629
Convolution              Conv_283                 1 1 629 630 0=128 1=1 6=65536
BinaryOp                 Add_284                  2 1 627 630 631
Interp                   Resize_297               1 1 631 644 0=2 3=32 4=32
BinaryOp                 Add_298                  2 1 644 512 645
BatchNorm                BatchNormalization_299   1 1 645 646 0=128
ReLU                     Relu_300                 1 1 646 647
Convolution              Conv_301                 1 1 647 650 0=64 1=3 4=1 5=1 6=73728 9=1
Convolution              Conv_304                 1 1 650 651 0=8 1=1 5=1 6=512
Interp                   Resize_313               1 1 651 output 0=2 3=256 4=256


================================================
FILE: ncnn-android-scrfd-master/app/src/main/assets/scrfd_1g-opt2.param
================================================
7767517
99 108
Input                    input.1                  0 1 input.1
Convolution              Conv_0                   1 1 input.1 193 0=32 1=3 3=2 4=1 5=1 6=864 9=1
ConvolutionDepthWise     Conv_2                   1 1 193 196 0=32 1=3 4=1 5=1 6=288 7=32 9=1
Convolution              Conv_4                   1 1 196 199 0=48 1=1 5=1 6=1536 9=1
ConvolutionDepthWise     Conv_6                   1 1 199 202 0=48 1=3 3=2 4=1 5=1 6=432 7=48 9=1
Convolution              Conv_8                   1 1 202 205 0=48 1=1 5=1 6=2304 9=1
ConvolutionDepthWise     Conv_10                  1 1 205 208 0=48 1=3 4=1 5=1 6=432 7=48 9=1
Convolution              Conv_12                  1 1 208 211 0=48 1=1 5=1 6=2304 9=1
ConvolutionDepthWise     Conv_14                  1 1 211 214 0=48 1=3 4=1 5=1 6=432 7=48 9=1
Convolution              Conv_16                  1 1 214 217 0=48 1=1 5=1 6=2304 9=1
ConvolutionDepthWise     Conv_18                  1 1 217 220 0=48 1=3 3=2 4=1 5=1 6=432 7=48 9=1
Convolution              Conv_20                  1 1 220 223 0=160 1=1 5=1 6=7680 9=1
ConvolutionDepthWise     Conv_22                  1 1 223 226 0=160 1=3 4=1 5=1 6=1440 7=160 9=1
Convolution              Conv_24                  1 1 226 229 0=160 1=1 5=1 6=25600 9=1
Split                    splitncnn_0              1 2 229 229_splitncnn_0 229_splitncnn_1
ConvolutionDepthWise     Conv_26                  1 1 229_splitncnn_1 232 0=160 1=3 3=2 4=1 5=1 6=1440 7=160 9=1
Convolution              Conv_28                  1 1 232 235 0=216 1=1 5=1 6=34560 9=1
Split                    splitncnn_1              1 2 235 235_splitncnn_0 235_splitncnn_1
ConvolutionDepthWise     Conv_30                  1 1 235_splitncnn_1 238 0=216 1=3 3=2 4=1 5=1 6=1944 7=216 9=1
Convolution              Conv_32                  1 1 238 241 0=312 1=1 5=1 6=67392 9=1
ConvolutionDepthWise     Conv_34                  1 1 241 244 0=312 1=3 4=1 5=1 6=2808 7=312 9=1
Convolution              Conv_36                  1 1 244 247 0=312 1=1 5=1 6=97344 9=1
ConvolutionDepthWise     Conv_38                  1 1 247 250 0=312 1=3 4=1 5=1 6=2808 7=312 9=1
Convolution              Conv_40                  1 1 250 253 0=312 1=1 5=1 6=97344 9=1
ConvolutionDepthWise     Conv_42                  1 1 253 256 0=312 1=3 4=1 5=1 6=2808 7=312 9=1
Convolution              Conv_44                  1 1 256 259 0=312 1=1 5=1 6=97344 9=1
ConvolutionDepthWise     Conv_46                  1 1 259 262 0=312 1=3 4=1 5=1 6=2808 7=312 9=1
Convolution              Conv_48                  1 1 262 265 0=312 1=1 5=1 6=97344 9=1
Convolution              Conv_50                  1 1 229_splitncnn_0 266 0=24 1=1 5=1 6=3840
Convolution              Conv_51                  1 1 235_splitncnn_0 267 0=24 1=1 5=1 6=5184
Convolution              Conv_52                  1 1 265 268 0=24 1=1 5=1 6=7488
Split                    splitncnn_2              1 2 268 268_splitncnn_0 268_splitncnn_1
Interp                   Resize_71                1 1 268_splitncnn_1 287 0=1 1=2.000000e+00 2=2.000000e+00
BinaryOp                 Add_72                   2 1 267 287 288
Split                    splitncnn_3              1 2 288 288_splitncnn_0 288_splitncnn_1
Interp                   Resize_91                1 1 288_splitncnn_1 307 0=1 1=2.000000e+00 2=2.000000e+00
BinaryOp                 Add_92                   2 1 266 307 308
Convolution              Conv_93                  1 1 308 309 0=24 1=3 4=1 5=1 6=5184
Split                    splitncnn_4              1 2 309 309_splitncnn_0 309_splitncnn_1
Convolution              Conv_94                  1 1 288_splitncnn_0 310 0=24 1=3 4=1 5=1 6=5184
Convolution              Conv_95                  1 1 268_splitncnn_0 311 0=24 1=3 4=1 5=1 6=5184
Convolution              Conv_96                  1 1 309_splitncnn_1 312 0=24 1=3 3=2 4=1 5=1 6=5184
BinaryOp                 Add_97                   2 1 310 312 313
Split                    splitncnn_5              1 2 313 313_splitncnn_0 313_splitncnn_1
Convolution              Conv_98                  1 1 313_splitncnn_1 314 0=24 1=3 3=2 4=1 5=1 6=5184
BinaryOp                 Add_99                   2 1 311 314 315
Convolution              Conv_100                 1 1 313_splitncnn_0 316 0=24 1=3 4=1 5=1 6=5184
Convolution              Conv_101                 1 1 315 317 0=24 1=3 4=1 5=1 6=5184
ConvolutionDepthWise     Conv_102                 1 1 309_splitncnn_0 318 0=24 1=3 4=1 6=216 7=24
GroupNorm                Add_111                  1 1 318 329 0=8 1=24 2=1.000000e-05
ReLU                     Relu_112                 1 1 329 330
Convolution              Conv_113                 1 1 330 331 0=96 1=1 6=2304
GroupNorm                Add_122                  1 1 331 342 0=8 1=96 2=1.000000e-05
ReLU                     Relu_123                 1 1 342 343
ConvolutionDepthWise     Conv_124                 1 1 343 344 0=96 1=3 4=1 6=864 7=96
GroupNorm                Add_133                  1 1 344 355 0=8 1=96 2=1.000000e-05
ReLU                     Relu_134                 1 1 355 356
Convolution              Conv_135                 1 1 356 357 0=96 1=1 6=9216
GroupNorm                Add_144                  1 1 357 368 0=8 1=96 2=1.000000e-05
ReLU                     Relu_145                 1 1 368 369
Split                    splitncnn_6              1 2 369 369_splitncnn_0 369_splitncnn_1
Convolution              Conv_146                 1 1 369_splitncnn_1 375 0=2 1=3 4=1 5=1 6=1728
Convolution              Conv_147                 1 1 369_splitncnn_0 371 0=8 1=3 4=1 5=1 6=6912
BinaryOp                 Mul_148                  1 1 371 bbox_8 0=2 1=1 2=8.200800e-01
Sigmoid                  Sigmoid_152              1 1 375 score_8
ConvolutionDepthWise     Conv_156                 1 1 316 380 0=24 1=3 4=1 6=216 7=24
GroupNorm                Add_165                  1 1 380 391 0=8 1=24 2=1.000000e-05
ReLU                     Relu_166                 1 1 391 392
Convolution              Conv_167                 1 1 392 393 0=96 1=1 6=2304
GroupNorm                Add_176                  1 1 393 404 0=8 1=96 2=1.000000e-05
ReLU                     Relu_177                 1 1 404 405
ConvolutionDepthWise     Conv_178                 1 1 405 406 0=96 1=3 4=1 6=864 7=96
GroupNorm                Add_187                  1 1 406 417 0=8 1=96 2=1.000000e-05
ReLU                     Relu_188                 1 1 417 418
Convolution              Conv_189                 1 1 418 419 0=96 1=1 6=9216
GroupNorm                Add_198                  1 1 419 430 0=8 1=96 2=1.000000e-05
ReLU                     Relu_199                 1 1 430 431
Split                    splitncnn_7              1 2 431 431_splitncnn_0 431_splitncnn_1
Convolution              Conv_200                 1 1 431_splitncnn_1 437 0=2 1=3 4=1 5=1 6=1728
Convolution              Conv_201                 1 1 431_splitncnn_0 433 0=8 1=3 4=1 5=1 6=6912
BinaryOp                 Mul_202                  1 1 433 bbox_16 0=2 1=1 2=1.225648e+00
Sigmoid                  Sigmoid_206              1 1 437 score_16
ConvolutionDepthWise     Conv_210                 1 1 317 442 0=24 1=3 4=1 6=216 7=24
GroupNorm                Add_219                  1 1 442 453 0=8 1=24 2=1.000000e-05
ReLU                     Relu_220                 1 1 453 454
Convolution              Conv_221                 1 1 454 455 0=96 1=1 6=2304
GroupNorm                Add_230                  1 1 455 466 0=8 1=96 2=1.000000e-05
ReLU                     Relu_231                 1 1 466 467
ConvolutionDepthWise     Conv_232                 1 1 467 468 0=96 1=3 4=1 6=864 7=96
GroupNorm                Add_241                  1 1 468 479 0=8 1=96 2=1.000000e-05
ReLU                     Relu_242                 1 1 479 480
Convolution              Conv_243                 1 1 480 481 0=96 1=1 6=9216
GroupNorm                Add_252                  1 1 481 492 0=8 1=96 2=1.000000e-05
ReLU                     Relu_253                 1 1 492 493
Split                    splitncnn_8              1 2 493 493_splitncnn_0 493_splitncnn_1
Convolution              Conv_254                 1 1 493_splitncnn_1 499 0=2 1=3 4=1 5=1 6=1728
Convolution              Conv_255                 1 1 493_splitncnn_0 495 0=8 1=3 4=1 5=1 6=6912
BinaryOp                 Mul_256                  1 1 495 bbox_32 0=2 1=1 2=1.842380e+00
Sigmoid                  Sigmoid_260              1 1 499 score_32


================================================
FILE: ncnn-android-scrfd-master/app/src/main/assets/scrfd_500m-opt2.param
================================================
7767517
103 112
Input                    input.1                  0 1 input.1
Convolution              Conv_0                   1 1 input.1 217 0=16 1=3 3=2 4=1 5=1 6=432 9=1
ConvolutionDepthWise     Conv_2                   1 1 217 220 0=16 1=3 4=1 5=1 6=144 7=16 9=1
Convolution              Conv_4                   1 1 220 223 0=16 1=1 5=1 6=256 9=1
ConvolutionDepthWise     Conv_6                   1 1 223 226 0=16 1=3 3=2 4=1 5=1 6=144 7=16 9=1
Convolution              Conv_8                   1 1 226 229 0=40 1=1 5=1 6=640 9=1
ConvolutionDepthWise     Conv_10                  1 1 229 232 0=40 1=3 4=1 5=1 6=360 7=40 9=1
Convolution              Conv_12                  1 1 232 235 0=40 1=1 5=1 6=1600 9=1
ConvolutionDepthWise     Conv_14                  1 1 235 238 0=40 1=3 3=2 4=1 5=1 6=360 7=40 9=1
Convolution              Conv_16                  1 1 238 241 0=72 1=1 5=1 6=2880 9=1
ConvolutionDepthWise     Conv_18                  1 1 241 244 0=72 1=3 4=1 5=1 6=648 7=72 9=1
Convolution              Conv_20                  1 1 244 247 0=72 1=1 5=1 6=5184 9=1
ConvolutionDepthWise     Conv_22                  1 1 247 250 0=72 1=3 4=1 5=1 6=648 7=72 9=1
Convolution              Conv_24                  1 1 250 253 0=72 1=1 5=1 6=5184 9=1
Split                    splitncnn_0              1 2 253 253_splitncnn_0 253_splitncnn_1
ConvolutionDepthWise     Conv_26                  1 1 253_splitncnn_1 256 0=72 1=3 3=2 4=1 5=1 6=648 7=72 9=1
Convolution              Conv_28                  1 1 256 259 0=152 1=1 5=1 6=10944 9=1
ConvolutionDepthWise     Conv_30                  1 1 259 262 0=152 1=3 4=1 5=1 6=1368 7=152 9=1
Convolution              Conv_32                  1 1 262 265 0=152 1=1 5=1 6=23104 9=1
Split                    splitncnn_1              1 2 265 265_splitncnn_0 265_splitncnn_1
ConvolutionDepthWise     Conv_34                  1 1 265_splitncnn_1 268 0=152 1=3 3=2 4=1 5=1 6=1368 7=152 9=1
Convolution              Conv_36                  1 1 268 271 0=288 1=1 5=1 6=43776 9=1
ConvolutionDepthWise     Conv_38                  1 1 271 274 0=288 1=3 4=1 5=1 6=2592 7=288 9=1
Convolution              Conv_40                  1 1 274 277 0=288 1=1 5=1 6=82944 9=1
ConvolutionDepthWise     Conv_42                  1 1 277 280 0=288 1=3 4=1 5=1 6=2592 7=288 9=1
Convolution              Conv_44                  1 1 280 283 0=288 1=1 5=1 6=82944 9=1
ConvolutionDepthWise     Conv_46                  1 1 283 286 0=288 1=3 4=1 5=1 6=2592 7=288 9=1
Convolution              Conv_48                  1 1 286 289 0=288 1=1 5=1 6=82944 9=1
ConvolutionDepthWise     Conv_50                  1 1 289 292 0=288 1=3 4=1 5=1 6=2592 7=288 9=1
Convolution              Conv_52                  1 1 292 295 0=288 1=1 5=1 6=82944 9=1
ConvolutionDepthWise     Conv_54                  1 1 295 298 0=288 1=3 4=1 5=1 6=2592 7=288 9=1
Convolution              Conv_56                  1 1 298 301 0=288 1=1 5=1 6=82944 9=1
Convolution              Conv_58                  1 1 253_splitncnn_0 302 0=16 1=1 5=1 6=1152
Convolution              Conv_59                  1 1 265_splitncnn_0 303 0=16 1=1 5=1 6=2432
Convolution              Conv_60                  1 1 301 304 0=16 1=1 5=1 6=4608
Split                    splitncnn_2              1 2 304 304_splitncnn_0 304_splitncnn_1
Interp                   Resize_79                1 1 304_splitncnn_1 323 0=1 1=2.000000e+00 2=2.000000e+00
BinaryOp                 Add_80                   2 1 303 323 324
Split                    splitncnn_3              1 2 324 324_splitncnn_0 324_splitncnn_1
Interp                   Resize_99                1 1 324_splitncnn_1 343 0=1 1=2.000000e+00 2=2.000000e+00
BinaryOp                 Add_100                  2 1 302 343 344
Convolution              Conv_101                 1 1 344 345 0=16 1=3 4=1 5=1 6=2304
Split                    splitncnn_4              1 2 345 345_splitncnn_0 345_splitncnn_1
Convolution              Conv_102                 1 1 324_splitncnn_0 346 0=16 1=3 4=1 5=1 6=2304
Convolution              Conv_103                 1 1 304_splitncnn_0 347 0=16 1=3 4=1 5=1 6=2304
Convolution              Conv_104                 1 1 345_splitncnn_1 348 0=16 1=3 3=2 4=1 5=1 6=2304
BinaryOp                 Add_105                  2 1 346 348 349
Split                    splitncnn_5              1 2 349 349_splitncnn_0 349_splitncnn_1
Convolution              Conv_106                 1 1 349_splitncnn_1 350 0=16 1=3 3=2 4=1 5=1 6=2304
BinaryOp                 Add_107                  2 1 347 350 351
Convolution              Conv_108                 1 1 349_splitncnn_0 352 0=16 1=3 4=1 5=1 6=2304
Convolution              Conv_109                 1 1 351 353 0=16 1=3 4=1 5=1 6=2304
ConvolutionDepthWise     Conv_110                 1 1 345_splitncnn_0 354 0=16 1=3 4=1 6=144 7=16
GroupNorm                Add_119                  1 1 354 365 0=16 1=16 2=1.000000e-05
ReLU                     Relu_120                 1 1 365 366
Convolution              Conv_121                 1 1 366 367 0=64 1=1 6=1024
GroupNorm                Add_130                  1 1 367 378 0=16 1=64 2=1.000000e-05
ReLU                     Relu_131                 1 1 378 379
ConvolutionDepthWise     Conv_132                 1 1 379 380 0=64 1=3 4=1 6=576 7=64
GroupNorm                Add_141                  1 1 380 391 0=16 1=64 2=1.000000e-05
ReLU                     Relu_142                 1 1 391 392
Convolution              Conv_143                 1 1 392 393 0=64 1=1 6=4096
GroupNorm                Add_152                  1 1 393 404 0=16 1=64 2=1.000000e-05
ReLU                     Relu_153                 1 1 404 405
Split                    splitncnn_6              1 2 405 405_splitncnn_0 405_splitncnn_1
Convolution              Conv_154                 1 1 405_splitncnn_1 411 0=2 1=3 4=1 5=1 6=1152
Convolution              Conv_155                 1 1 405_splitncnn_0 407 0=8 1=3 4=1 5=1 6=4608
BinaryOp                 Mul_156                  1 1 407 bbox_8 0=2 1=1 2=7.957783e-01
Sigmoid                  Sigmoid_160              1 1 411 score_8
ConvolutionDepthWise     Conv_164                 1 1 352 416 0=16 1=3 4=1 6=144 7=16
GroupNorm                Add_173                  1 1 416 427 0=16 1=16 2=1.000000e-05
ReLU                     Relu_174                 1 1 427 428
Convolution              Conv_175                 1 1 428 429 0=64 1=1 6=1024
GroupNorm                Add_184                  1 1 429 440 0=16 1=64 2=1.000000e-05
ReLU                     Relu_185                 1 1 440 441
ConvolutionDepthWise     Conv_186                 1 1 441 442 0=64 1=3 4=1 6=576 7=64
GroupNorm                Add_195                  1 1 442 453 0=16 1=64 2=1.000000e-05
ReLU                     Relu_196                 1 1 453 454
Convolution              Conv_197                 1 1 454 455 0=64 1=1 6=4096
GroupNorm                Add_206                  1 1 455 466 0=16 1=64 2=1.000000e-05
ReLU                     Relu_207                 1 1 466 467
Split                    splitncnn_7              1 2 467 467_splitncnn_0 467_splitncnn_1
Convolution              Conv_208                 1 1 467_splitncnn_1 473 0=2 1=3 4=1 5=1 6=1152
Convolution              Conv_209                 1 1 467_splitncnn_0 469 0=8 1=3 4=1 5=1 6=4608
BinaryOp                 Mul_210                  1 1 469 bbox_16 0=2 1=1 2=1.201926e+00
Sigmoid                  Sigmoid_214              1 1 473 score_16
ConvolutionDepthWise     Conv_218                 1 1 353 478 0=16 1=3 4=1 6=144 7=16
GroupNorm                Add_227                  1 1 478 489 0=16 1=16 2=1.000000e-05
ReLU                     Relu_228                 1 1 489 490
Convolution              Conv_229                 1 1 490 491 0=64 1=1 6=1024
GroupNorm                Add_238                  1 1 491 502 0=16 1=64 2=1.000000e-05
ReLU                     Relu_239                 1 1 502 503
ConvolutionDepthWise     Conv_240                 1 1 503 504 0=64 1=3 4=1 6=576 7=64
GroupNorm                Add_249                  1 1 504 515 0=16 1=64 2=1.000000e-05
ReLU                     Relu_250                 1 1 515 516
Convolution              Conv_251                 1 1 516 517 0=64 1=1 6=4096
GroupNorm                Add_260                  1 1 517 528 0=16 1=64 2=1.000000e-05
ReLU                     Relu_261                 1 1 528 529
Split                    splitncnn_8              1 2 529 529_splitncnn_0 529_splitncnn_1
Convolution              Conv_262                 1 1 529_splitncnn_1 535 0=2 1=3 4=1 5=1 6=1152
Convolution              Conv_263                 1 1 529_splitncnn_0 531 0=8 1=3 4=1 5=1 6=4608
BinaryOp                 Mul_264                  1 1 531 bbox_32 0=2 1=1 2=1.992024e+00
Sigmoid                  Sigmoid_268              1 1 535 score_32


================================================
FILE: ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/MainActivity.java
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

package com.tencent.scrfdncnn;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.Spinner;

import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

public class MainActivity extends Activity implements SurfaceHolder.Callback
{
    public static final int REQUEST_CAMERA = 100;

    private SCRFDNcnn scrfdncnn = new SCRFDNcnn();
    private int facing = 0;

    private Spinner spinnerModel;
    private Spinner spinnerCPUGPU;
    private int current_model = 0;
    private int current_cpugpu = 0;

    private SurfaceView cameraView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        cameraView = (SurfaceView) findViewById(R.id.cameraview);

        cameraView.getHolder().setFormat(PixelFormat.RGBA_8888);
        cameraView.getHolder().addCallback(this);

        Button buttonSwitchCamera = (Button) findViewById(R.id.buttonSwitchCamera);
        buttonSwitchCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                int new_facing = 1 - facing;

                scrfdncnn.closeCamera();

                scrfdncnn.openCamera(new_facing);

                facing = new_facing;
            }
        });

        spinnerModel = (Spinner) findViewById(R.id.spinnerModel);
        spinnerModel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id)
            {
                if (position != current_model)
                {
                    current_model = position;
                    reload();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
            }
        });

        spinnerCPUGPU = (Spinner) findViewById(R.id.spinnerCPUGPU);
        spinnerCPUGPU.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id)
            {
                if (position != current_cpugpu)
                {
                    current_cpugpu = position;
                    reload();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
            }
        });

        reload();
    }

    private void reload()
    {
        boolean ret_init = scrfdncnn.loadModel(getAssets(), current_model, current_cpugpu);
        if (!ret_init)
        {
            Log.e("MainActivity", "scrfdncnn loadModel failed");
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {
        scrfdncnn.setOutputWindow(holder.getSurface());
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
    }

    @Override
    public void onResume()
    {
        super.onResume();

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED)
        {
            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA}, REQUEST_CAMERA);
        }

        scrfdncnn.openCamera(facing);
    }

    @Override
    public void onPause()
    {
        super.onPause();

        scrfdncnn.closeCamera();
    }
}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/SCRFDNcnn.java
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

package com.tencent.scrfdncnn;

import android.content.res.AssetManager;
import android.view.Surface;

public class SCRFDNcnn
{
    public native boolean loadModel(AssetManager mgr, int modelid, int cpugpu);
    public native boolean openCamera(int facing);
    public native boolean closeCamera();
    public native boolean setOutputWindow(Surface surface);

    static {
        System.loadLibrary("scrfdncnn");
    }
}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/CMakeLists.txt
================================================
project(scrfdncnn)

cmake_minimum_required(VERSION 3.10)

set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-android/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc)

set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20210322-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)

add_library(scrfdncnn SHARED scrfdncnn.cpp scrfd.cpp ndkcamera.cpp)

target_link_libraries(scrfdncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk)


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.cpp
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include "ndkcamera.h"

#include <string>

#include <android/log.h>

#include <opencv2/core/core.hpp>

#include "mat.h"

static void onDisconnected(void* context, ACameraDevice* device)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onDisconnected %p", device);
}

static void onError(void* context, ACameraDevice* device, int error)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onError %p %d", device, error);
}

static void onImageAvailable(void* context, AImageReader* reader)
{
//     __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onImageAvailable %p", reader);

    AImage* image = 0;
    media_status_t status = AImageReader_acquireLatestImage(reader, &image);

    if (status != AMEDIA_OK)
    {
        // error
        return;
    }

    int32_t format;
    AImage_getFormat(image, &format);

    // assert format == AIMAGE_FORMAT_YUV_420_888

    int32_t width = 0;
    int32_t height = 0;
    AImage_getWidth(image, &width);
    AImage_getHeight(image, &height);

    int32_t y_pixelStride = 0;
    int32_t u_pixelStride = 0;
    int32_t v_pixelStride = 0;
    AImage_getPlanePixelStride(image, 0, &y_pixelStride);
    AImage_getPlanePixelStride(image, 1, &u_pixelStride);
    AImage_getPlanePixelStride(image, 2, &v_pixelStride);

    int32_t y_rowStride = 0;
    int32_t u_rowStride = 0;
    int32_t v_rowStride = 0;
    AImage_getPlaneRowStride(image, 0, &y_rowStride);
    AImage_getPlaneRowStride(image, 1, &u_rowStride);
    AImage_getPlaneRowStride(image, 2, &v_rowStride);

    uint8_t* y_data = 0;
    uint8_t* u_data = 0;
    uint8_t* v_data = 0;
    int y_len = 0;
    int u_len = 0;
    int v_len = 0;
    AImage_getPlaneData(image, 0, &y_data, &y_len);
    AImage_getPlaneData(image, 1, &u_data, &u_len);
    AImage_getPlaneData(image, 2, &v_data, &v_len);

    if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width)
    {
        // already nv21  :)
        ((NdkCamera*)context)->on_image((unsigned char*)y_data, (int)width, (int)height);
    }
    else
    {
        // construct nv21
        unsigned char* nv21 = new unsigned char[width * height + width * height / 2];
        {
            // Y
            unsigned char* yptr = nv21;
            for (int y=0; y<height; y++)
            {
                const unsigned char* y_data_ptr = y_data + y_rowStride * y;
                for (int x=0; x<width; x++)
                {
                    yptr[0] = y_data_ptr[0];
                    yptr++;
                    y_data_ptr += y_pixelStride;
                }
            }

            // UV
            unsigned char* uvptr = nv21 + width * height;
            for (int y=0; y<height/2; y++)
            {
                const unsigned char* v_data_ptr = v_data + v_rowStride * y;
                const unsigned char* u_data_ptr = u_data + u_rowStride * y;
                for (int x=0; x<width/2; x++)
                {
                    uvptr[0] = v_data_ptr[0];
                    uvptr[1] = u_data_ptr[0];
                    uvptr += 2;
                    v_data_ptr += v_pixelStride;
                    u_data_ptr += u_pixelStride;
                }
            }
        }

        ((NdkCamera*)context)->on_image((unsigned char*)nv21, (int)width, (int)height);

        delete[] nv21;
    }

    AImage_delete(image);
}

static void onSessionActive(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionActive %p", session);
}

static void onSessionReady(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionReady %p", session);
}

static void onSessionClosed(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionClosed %p", session);
}

void onCaptureFailed(void* context, ACameraCaptureSession* session, ACaptureRequest* request, ACameraCaptureFailure* failure)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureFailed %p %p %p", session, request, failure);
}

void onCaptureSequenceCompleted(void* context, ACameraCaptureSession* session, int sequenceId, int64_t frameNumber)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureSequenceCompleted %p %d %ld", session, sequenceId, frameNumber);
}

void onCaptureSequenceAborted(void* context, ACameraCaptureSession* session, int sequenceId)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureSequenceAborted %p %d", session, sequenceId);
}

void onCaptureCompleted(void* context, ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result)
{
//     __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureCompleted %p %p %p", session, request, result);
}

NdkCamera::NdkCamera()
{
    camera_facing = 0;
    camera_orientation = 0;

    camera_manager = 0;
    camera_device = 0;
    image_reader = 0;
    image_reader_surface = 0;
    image_reader_target = 0;
    capture_request = 0;
    capture_session_output_container = 0;
    capture_session_output = 0;
    capture_session = 0;


    // setup imagereader and its surface
    {
        AImageReader_new(640, 480, AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);

        AImageReader_ImageListener listener;
        listener.context = this;
        listener.onImageAvailable = onImageAvailable;

        AImageReader_setImageListener(image_reader, &listener);

        AImageReader_getWindow(image_reader, &image_reader_surface);

        ANativeWindow_acquire(image_reader_surface);
    }
}

NdkCamera::~NdkCamera()
{
    close();

    if (image_reader)
    {
        AImageReader_delete(image_reader);
        image_reader = 0;
    }

    if (image_reader_surface)
    {
        ANativeWindow_release(image_reader_surface);
        image_reader_surface = 0;
    }
}

int NdkCamera::open(int _camera_facing)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "open");

    camera_facing = _camera_facing;

    camera_manager = ACameraManager_create();

    // find front camera
    std::string camera_id;
    {
        ACameraIdList* camera_id_list = 0;
        ACameraManager_getCameraIdList(camera_manager, &camera_id_list);

        for (int i = 0; i < camera_id_list->numCameras; ++i)
        {
            const char* id = camera_id_list->cameraIds[i];
            ACameraMetadata* camera_metadata = 0;
            ACameraManager_getCameraCharacteristics(camera_manager, id, &camera_metadata);

            // query faceing
            acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT;
            {
                ACameraMetadata_const_entry e = { 0 };
                ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_LENS_FACING, &e);
                facing = (acamera_metadata_enum_android_lens_facing_t)e.data.u8[0];
            }

            if (camera_facing == 0 && facing != ACAMERA_LENS_FACING_FRONT)
            {
                ACameraMetadata_free(camera_metadata);
                continue;
            }

            if (camera_facing == 1 && facing != ACAMERA_LENS_FACING_BACK)
            {
                ACameraMetadata_free(camera_metadata);
                continue;
            }

            camera_id = id;

            // query orientation
            int orientation = 0;
            {
                ACameraMetadata_const_entry e = { 0 };
                ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_SENSOR_ORIENTATION, &e);

                orientation = (int)e.data.i32[0];
            }

            camera_orientation = orientation;

            ACameraMetadata_free(camera_metadata);

            break;
        }

        ACameraManager_deleteCameraIdList(camera_id_list);
    }

    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "open %s %d", camera_id.c_str(), camera_orientation);

    // open camera
    {
        ACameraDevice_StateCallbacks camera_device_state_callbacks;
        camera_device_state_callbacks.context = this;
        camera_device_state_callbacks.onDisconnected = onDisconnected;
        camera_device_state_callbacks.onError = onError;

        ACameraManager_openCamera(camera_manager, camera_id.c_str(), &camera_device_state_callbacks, &camera_device);
    }

    // capture request
    {
        ACameraDevice_createCaptureRequest(camera_device, TEMPLATE_PREVIEW, &capture_request);

        ACameraOutputTarget_create(image_reader_surface, &image_reader_target);
        ACaptureRequest_addTarget(capture_request, image_reader_target);
    }

    // capture session
    {
        ACameraCaptureSession_stateCallbacks camera_capture_session_state_callbacks;
        camera_capture_session_state_callbacks.context = this;
        camera_capture_session_state_callbacks.onActive = onSessionActive;
        camera_capture_session_state_callbacks.onReady = onSessionReady;
        camera_capture_session_state_callbacks.onClosed = onSessionClosed;

        ACaptureSessionOutputContainer_create(&capture_session_output_container);

        ACaptureSessionOutput_create(image_reader_surface, &capture_session_output);

        ACaptureSessionOutputContainer_add(capture_session_output_container, capture_session_output);

        ACameraDevice_createCaptureSession(camera_device, capture_session_output_container, &camera_capture_session_state_callbacks, &capture_session);

        ACameraCaptureSession_captureCallbacks camera_capture_session_capture_callbacks;
        camera_capture_session_capture_callbacks.context = this;
        camera_capture_session_capture_callbacks.onCaptureStarted = 0;
        camera_capture_session_capture_callbacks.onCaptureProgressed = 0;
        camera_capture_session_capture_callbacks.onCaptureCompleted = onCaptureCompleted;
        camera_capture_session_capture_callbacks.onCaptureFailed = onCaptureFailed;
        camera_capture_session_capture_callbacks.onCaptureSequenceCompleted = onCaptureSequenceCompleted;
        camera_capture_session_capture_callbacks.onCaptureSequenceAborted = onCaptureSequenceAborted;
        camera_capture_session_capture_callbacks.onCaptureBufferLost = 0;

        ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, nullptr);
    }

    return 0;
}

void NdkCamera::close()
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "close");

    if (capture_session)
    {
        ACameraCaptureSession_stopRepeating(capture_session);
        ACameraCaptureSession_close(capture_session);
        capture_session = 0;
    }

    if (camera_device)
    {
        ACameraDevice_close(camera_device);
        camera_device = 0;
    }

    if (capture_session_output_container)
    {
        ACaptureSessionOutputContainer_free(capture_session_output_container);
        capture_session_output_container = 0;
    }

    if (capture_session_output)
    {
        ACaptureSessionOutput_free(capture_session_output);
        capture_session_output = 0;
    }

    if (capture_request)
    {
        ACaptureRequest_free(capture_request);
        capture_request = 0;
    }

    if (image_reader_target)
    {
        ACameraOutputTarget_free(image_reader_target);
        image_reader_target = 0;
    }

    if (camera_manager)
    {
        ACameraManager_delete(camera_manager);
        camera_manager = 0;
    }
}

void NdkCamera::on_image(const cv::Mat& rgb) const
{
}

void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const
{
    // rotate nv21
    int w = 0;
    int h = 0;
    int rotate_type = 0;
    {
        if (camera_orientation == 0)
        {
            w = nv21_width;
            h = nv21_height;
            rotate_type = camera_facing == 0 ? 2 : 1;
        }
        if (camera_orientation == 90)
        {
            w = nv21_height;
            h = nv21_width;
            rotate_type = camera_facing == 0 ? 5 : 6;
        }
        if (camera_orientation == 180)
        {
            w = nv21_width;
            h = nv21_height;
            rotate_type = camera_facing == 0 ? 4 : 3;
        }
        if (camera_orientation == 270)
        {
            w = nv21_height;
            h = nv21_width;
            rotate_type = camera_facing == 0 ? 7 : 8;
        }
    }

    cv::Mat nv21_rotated(h + h / 2, w, CV_8UC1);
    ncnn::kanna_rotate_yuv420sp(nv21, nv21_width, nv21_height, nv21_rotated.data, w, h, rotate_type);

    // nv21_rotated to rgb
    cv::Mat rgb(h, w, CV_8UC3);
    ncnn::yuv420sp2rgb(nv21_rotated.data, w, h, rgb.data);

    on_image(rgb);
}

static const int NDKCAMERAWINDOW_ID = 233;

NdkCameraWindow::NdkCameraWindow() : NdkCamera()
{
    sensor_manager = 0;
    sensor_event_queue = 0;
    accelerometer_sensor = 0;
    win = 0;

    accelerometer_orientation = 0;

    // sensor
    sensor_manager = ASensorManager_getInstance();

    accelerometer_sensor = ASensorManager_getDefaultSensor(sensor_manager, ASENSOR_TYPE_ACCELEROMETER);
}

NdkCameraWindow::~NdkCameraWindow()
{
    if (accelerometer_sensor)
    {
        ASensorEventQueue_disableSensor(sensor_event_queue, accelerometer_sensor);
        accelerometer_sensor = 0;
    }

    if (sensor_event_queue)
    {
        ASensorManager_destroyEventQueue(sensor_manager, sensor_event_queue);
        sensor_event_queue = 0;
    }

    if (win)
    {
        ANativeWindow_release(win);
    }
}

void NdkCameraWindow::set_window(ANativeWindow* _win)
{
    if (win)
    {
        ANativeWindow_release(win);
    }

    win = _win;
    ANativeWindow_acquire(win);
}

void NdkCameraWindow::on_image_render(cv::Mat& rgb) const
{
}

void NdkCameraWindow::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const
{
    // resolve orientation from camera_orientation and accelerometer_sensor
    {
        if (!sensor_event_queue)
        {
            sensor_event_queue = ASensorManager_createEventQueue(sensor_manager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), NDKCAMERAWINDOW_ID, 0, 0);

            ASensorEventQueue_enableSensor(sensor_event_queue, accelerometer_sensor);
        }

        int id = ALooper_pollAll(0, 0, 0, 0);
        if (id == NDKCAMERAWINDOW_ID)
        {
            ASensorEvent e[8];
            ssize_t num_event = 0;
            while (ASensorEventQueue_hasEvents(sensor_event_queue) == 1)
            {
                num_event = ASensorEventQueue_getEvents(sensor_event_queue, e, 8);
                if (num_event < 0)
                    break;
            }

            if (num_event > 0)
            {
                float acceleration_x = e[num_event - 1].acceleration.x;
                float acceleration_y = e[num_event - 1].acceleration.y;
                float acceleration_z = e[num_event - 1].acceleration.z;
//                 __android_log_print(ANDROID_LOG_WARN, "NdkCameraWindow", "x = %f, y = %f, z = %f", x, y, z);

                if (acceleration_y > 7)
                {
                    accelerometer_orientation = 0;
                }
                if (acceleration_x < -7)
                {
                    accelerometer_orientation = 90;
                }
                if (acceleration_y < -7)
                {
                    accelerometer_orientation = 180;
                }
                if (acceleration_x > 7)
                {
                    accelerometer_orientation = 270;
                }
            }
        }
    }

    // roi crop and rotate nv21
    int nv21_roi_x = 0;
    int nv21_roi_y = 0;
    int nv21_roi_w = 0;
    int nv21_roi_h = 0;
    int roi_x = 0;
    int roi_y = 0;
    int roi_w = 0;
    int roi_h = 0;
    int rotate_type = 0;
    int render_w = 0;
    int render_h = 0;
    int render_rotate_type = 0;
    {
        int win_w = ANativeWindow_getWidth(win);
        int win_h = ANativeWindow_getHeight(win);

        if (accelerometer_orientation == 90 || accelerometer_orientation == 270)
        {
            std::swap(win_w, win_h);
        }

        const int final_orientation = (camera_orientation + accelerometer_orientation) % 360;

        if (final_orientation == 0 || final_orientation == 180)
        {
            if (win_w * nv21_height > win_h * nv21_width)
            {
                roi_w = nv21_width;
                roi_h = (nv21_width * win_h / win_w) / 2 * 2;
                roi_x = 0;
                roi_y = ((nv21_height - roi_h) / 2) / 2 * 2;
            }
            else
            {
                roi_h = nv21_height;
                roi_w = (nv21_height * win_w / win_h) / 2 * 2;
                roi_x = ((nv21_width - roi_w) / 2) / 2 * 2;
                roi_y = 0;
            }

            nv21_roi_x = roi_x;
            nv21_roi_y = roi_y;
            nv21_roi_w = roi_w;
            nv21_roi_h = roi_h;
        }
        if (final_orientation == 90 || final_orientation == 270)
        {
            if (win_w * nv21_width > win_h * nv21_height)
            {
                roi_w = nv21_height;
                roi_h = (nv21_height * win_h / win_w) / 2 * 2;
                roi_x = 0;
                roi_y = ((nv21_width - roi_h) / 2) / 2 * 2;
            }
            else
            {
                roi_h = nv21_width;
                roi_w = (nv21_width * win_w / win_h) / 2 * 2;
                roi_x = ((nv21_height - roi_w) / 2) / 2 * 2;
                roi_y = 0;
            }

            nv21_roi_x = roi_y;
            nv21_roi_y = roi_x;
            nv21_roi_w = roi_h;
            nv21_roi_h = roi_w;
        }

        if (camera_facing == 0)
        {
            if (camera_orientation == 0 && accelerometer_orientation == 0)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 90)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 180)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 270)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 0)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 90)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 180)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 270)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 0)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 90)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 180)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 270)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 0)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 90)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 180)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 270)
            {
                rotate_type = 2;
            }
        }
        else
        {
            if (final_orientation == 0)
            {
                rotate_type = 1;
            }
            if (final_orientation == 90)
            {
                rotate_type = 6;
            }
            if (final_orientation == 180)
            {
                rotate_type = 3;
            }
            if (final_orientation == 270)
            {
                rotate_type = 8;
            }
        }

        if (accelerometer_orientation == 0)
        {
            render_w = roi_w;
            render_h = roi_h;
            render_rotate_type = 1;
        }
        if (accelerometer_orientation == 90)
        {
            render_w = roi_h;
            render_h = roi_w;
            render_rotate_type = 8;
        }
        if (accelerometer_orientation == 180)
        {
            render_w = roi_w;
            render_h = roi_h;
            render_rotate_type = 3;
        }
        if (accelerometer_orientation == 270)
        {
            render_w = roi_h;
            render_h = roi_w;
            render_rotate_type = 6;
        }
    }

    // crop and rotate nv21
    cv::Mat nv21_croprotated(roi_h + roi_h / 2, roi_w, CV_8UC1);
    {
        const unsigned char* srcY = nv21 + nv21_roi_y * nv21_width + nv21_roi_x;
        unsigned char* dstY = nv21_croprotated.data;
        ncnn::kanna_rotate_c1(srcY, nv21_roi_w, nv21_roi_h, nv21_width, dstY, roi_w, roi_h, roi_w, rotate_type);

        const unsigned char* srcUV = nv21 + nv21_width * nv21_height + nv21_roi_y * nv21_width / 2 + nv21_roi_x;
        unsigned char* dstUV = nv21_croprotated.data + roi_w * roi_h;
        ncnn::kanna_rotate_c2(srcUV, nv21_roi_w / 2, nv21_roi_h / 2, nv21_width, dstUV, roi_w / 2, roi_h / 2, roi_w, rotate_type);
    }

    // nv21_croprotated to rgb
    cv::Mat rgb(roi_h, roi_w, CV_8UC3);
    ncnn::yuv420sp2rgb(nv21_croprotated.data, roi_w, roi_h, rgb.data);

    on_image_render(rgb);

    // rotate to native window orientation
    cv::Mat rgb_render(render_h, render_w, CV_8UC3);
    ncnn::kanna_rotate_c3(rgb.data, roi_w, roi_h, rgb_render.data, render_w, render_h, render_rotate_type);

    ANativeWindow_setBuffersGeometry(win, render_w, render_h, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM);

    ANativeWindow_Buffer buf;
    ANativeWindow_lock(win, &buf, NULL);

    // scale to target size
    if (buf.format == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM || buf.format == AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM)
    {
        for (int y = 0; y < render_h; y++)
        {
            const unsigned char* ptr = rgb_render.ptr<const unsigned char>(y);
            unsigned char* outptr = (unsigned char*)buf.bits + buf.stride * 4 * y;

            int x = 0;
#if __ARM_NEON
            for (; x + 7 < render_w; x += 8)
            {
                uint8x8x3_t _rgb = vld3_u8(ptr);
                uint8x8x4_t _rgba;
                _rgba.val[0] = _rgb.val[0];
                _rgba.val[1] = _rgb.val[1];
                _rgba.val[2] = _rgb.val[2];
                _rgba.val[3] = vdup_n_u8(255);
                vst4_u8(outptr, _rgba);

                ptr += 24;
                outptr += 32;
            }
#endif // __ARM_NEON
            for (; x < render_w; x++)
            {
                outptr[0] = ptr[0];
                outptr[1] = ptr[1];
                outptr[2] = ptr[2];
                outptr[3] = 255;

                ptr += 3;
                outptr += 4;
            }
        }
    }

    ANativeWindow_unlockAndPost(win);
}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.h
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#ifndef NDKCAMERA_H
#define NDKCAMERA_H

#include <android/looper.h>
#include <android/native_window.h>
#include <android/sensor.h>
#include <camera/NdkCameraDevice.h>
#include <camera/NdkCameraManager.h>
#include <camera/NdkCameraMetadata.h>
#include <media/NdkImageReader.h>

#include <opencv2/core/core.hpp>

class NdkCamera
{
public:
    NdkCamera();
    virtual ~NdkCamera();

    // facing 0=front 1=back
    int open(int camera_facing = 0);
    void close();

    virtual void on_image(const cv::Mat& rgb) const;

    virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const;

public:
    int camera_facing;
    int camera_orientation;

private:
    ACameraManager* camera_manager;
    ACameraDevice* camera_device;
    AImageReader* image_reader;
    ANativeWindow* image_reader_surface;
    ACameraOutputTarget* image_reader_target;
    ACaptureRequest* capture_request;
    ACaptureSessionOutputContainer* capture_session_output_container;
    ACaptureSessionOutput* capture_session_output;
    ACameraCaptureSession* capture_session;
};

class NdkCameraWindow : public NdkCamera
{
public:
    NdkCameraWindow();
    virtual ~NdkCameraWindow();

    void set_window(ANativeWindow* win);

    virtual void on_image_render(cv::Mat& rgb) const;

    virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const;

public:
    mutable int accelerometer_orientation;

private:
    ASensorManager* sensor_manager;
    mutable ASensorEventQueue* sensor_event_queue;
    const ASensor* accelerometer_sensor;
    ANativeWindow* win;
};

#endif // NDKCAMERA_H


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfd.cpp
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include "scrfd.h"

#include <string.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include "cpu.h"

static inline float intersection_area(const FaceObject& a, const FaceObject& b)
{
    cv::Rect_<float> inter = a.rect & b.rect;
    return inter.area();
}

static void qsort_descent_inplace(std::vector<FaceObject>& faceobjects, int left, int right)
{
    int i = left;
    int j = right;
    float p = faceobjects[(left + right) / 2].prob;

    while (i <= j)
    {
        while (faceobjects[i].prob > p)
            i++;

        while (faceobjects[j].prob < p)
            j--;

        if (i <= j)
        {
            // swap
            std::swap(faceobjects[i], faceobjects[j]);

            i++;
            j--;
        }
    }

//     #pragma omp parallel sections
    {
//         #pragma omp section
        {
            if (left < j) qsort_descent_inplace(faceobjects, left, j);
        }
//         #pragma omp section
        {
            if (i < right) qsort_descent_inplace(faceobjects, i, right);
        }
    }
}

static void qsort_descent_inplace(std::vector<FaceObject>& faceobjects)
{
    if (faceobjects.empty())
        return;

    qsort_descent_inplace(faceobjects, 0, faceobjects.size() - 1);
}

static void nms_sorted_bboxes(const std::vector<FaceObject>& faceobjects, std::vector<int>& picked, float nms_threshold)
{
    picked.clear();

    const int n = faceobjects.size();

    std::vector<float> areas(n);
    for (int i = 0; i < n; i++)
    {
        areas[i] = faceobjects[i].rect.area();
    }

    for (int i = 0; i < n; i++)
    {
        const FaceObject& a = faceobjects[i];

        int keep = 1;
        for (int j = 0; j < (int)picked.size(); j++)
        {
            const FaceObject& b = faceobjects[picked[j]];

            // intersection over union
            float inter_area = intersection_area(a, b);
            float union_area = areas[i] + areas[picked[j]] - inter_area;
            //             float IoU = inter_area / union_area
            if (inter_area / union_area > nms_threshold)
                keep = 0;
        }

        if (keep)
            picked.push_back(i);
    }
}

// insightface/detection/scrfd/mmdet/core/anchor/anchor_generator.py gen_single_level_base_anchors()
static ncnn::Mat generate_anchors(int base_size, const ncnn::Mat& ratios, const ncnn::Mat& scales)
{
    int num_ratio = ratios.w;
    int num_scale = scales.w;

    ncnn::Mat anchors;
    anchors.create(4, num_ratio * num_scale);

    const float cx = 0;
    const float cy = 0;

    for (int i = 0; i < num_ratio; i++)
    {
        float ar = ratios[i];

        int r_w = round(base_size / sqrt(ar));
        int r_h = round(r_w * ar); //round(base_size * sqrt(ar));

        for (int j = 0; j < num_scale; j++)
        {
            float scale = scales[j];

            float rs_w = r_w * scale;
            float rs_h = r_h * scale;

            float* anchor = anchors.row(i * num_scale + j);

            anchor[0] = cx - rs_w * 0.5f;
            anchor[1] = cy - rs_h * 0.5f;
            anchor[2] = cx + rs_w * 0.5f;
            anchor[3] = cy + rs_h * 0.5f;
        }
    }

    return anchors;
}

static void generate_proposals(const ncnn::Mat& anchors, int feat_stride, const ncnn::Mat& score_blob, const ncnn::Mat& bbox_blob, const ncnn::Mat& kps_blob, float prob_threshold, std::vector<FaceObject>& faceobjects)
{
    int w = score_blob.w;
    int h = score_blob.h;

    // generate face proposal from bbox deltas and shifted anchors
    const int num_anchors = anchors.h;

    for (int q = 0; q < num_anchors; q++)
    {
        const float* anchor = anchors.row(q);

        const ncnn::Mat score = score_blob.channel(q);
        const ncnn::Mat bbox = bbox_blob.channel_range(q * 4, 4);

        // shifted anchor
        float anchor_y = anchor[1];

        float anchor_w = anchor[2] - anchor[0];
        float anchor_h = anchor[3] - anchor[1];

        for (int i = 0; i < h; i++)
        {
            float anchor_x = anchor[0];

            for (int j = 0; j < w; j++)
            {
                int index = i * w + j;

                float prob = score[index];

                if (prob >= prob_threshold)
                {
                    // insightface/detection/scrfd/mmdet/models/dense_heads/scrfd_head.py _get_bboxes_single()
                    float dx = bbox.channel(0)[index] * feat_stride;
                    float dy = bbox.channel(1)[index] * feat_stride;
                    float dw = bbox.channel(2)[index] * feat_stride;
                    float dh = bbox.channel(3)[index] * feat_stride;

                    // insightface/detection/scrfd/mmdet/core/bbox/transforms.py distance2bbox()
                    float cx = anchor_x + anchor_w * 0.5f;
                    float cy = anchor_y + anchor_h * 0.5f;

                    float x0 = cx - dx;
                    float y0 = cy - dy;
                    float x1 = cx + dw;
                    float y1 = cy + dh;

                    FaceObject obj;
                    obj.rect.x = x0;
                    obj.rect.y = y0;
                    obj.rect.width = x1 - x0 + 1;
                    obj.rect.height = y1 - y0 + 1;
                    obj.prob = prob;

                    if (!kps_blob.empty())
                    {
                        const ncnn::Mat kps = kps_blob.channel_range(q * 10, 10);

                        obj.landmark[0].x = cx + kps.channel(0)[index] * feat_stride;
                        obj.landmark[0].y = cy + kps.channel(1)[index] * feat_stride;
                        obj.landmark[1].x = cx + kps.channel(2)[index] * feat_stride;
                        obj.landmark[1].y = cy + kps.channel(3)[index] * feat_stride;
                        obj.landmark[2].x = cx + kps.channel(4)[index] * feat_stride;
                        obj.landmark[2].y = cy + kps.channel(5)[index] * feat_stride;
                        obj.landmark[3].x = cx + kps.channel(6)[index] * feat_stride;
                        obj.landmark[3].y = cy + kps.channel(7)[index] * feat_stride;
                        obj.landmark[4].x = cx + kps.channel(8)[index] * feat_stride;
                        obj.landmark[4].y = cy + kps.channel(9)[index] * feat_stride;
                    }

                    faceobjects.push_back(obj);
                }

                anchor_x += feat_stride;
            }

            anchor_y += feat_stride;
        }
    }
}

int SCRFD::load(const char* modeltype, bool use_gpu)
{
    scrfd.clear();

    ncnn::set_cpu_powersave(2);
    ncnn::set_omp_num_threads(ncnn::get_big_cpu_count());

    scrfd.opt = ncnn::Option();

#if NCNN_VULKAN
    scrfd.opt.use_vulkan_compute = use_gpu;
#endif

    scrfd.opt.num_threads = ncnn::get_big_cpu_count();

    char parampath[256];
    char modelpath[256];
    sprintf(parampath, "scrfd_%s-opt2.param", modeltype);
    sprintf(modelpath, "scrfd_%s-opt2.bin", modeltype);

    scrfd.load_param(parampath);
    scrfd.load_model(modelpath);

    has_kps = strstr(modeltype, "_kps") != NULL;

    return 0;
}

int SCRFD::load(AAssetManager* mgr, const char* modeltype, bool use_gpu)
{
    scrfd.clear();

    ncnn::set_cpu_powersave(2);
    ncnn::set_omp_num_threads(ncnn::get_big_cpu_count());

    scrfd.opt = ncnn::Option();
    faceseg.opt = ncnn::Option();
    facept.opt = ncnn::Option();
#if NCNN_VULKAN
    scrfd.opt.use_vulkan_compute = use_gpu;
    faceseg.opt.num_threads = ncnn::get_big_cpu_count();
#endif

    scrfd.opt.num_threads = ncnn::get_big_cpu_count();
    faceseg.opt.num_threads = ncnn::get_big_cpu_count();
    facept.opt.num_threads = ncnn::get_big_cpu_count();

    char parampath[256];
    char modelpath[256];
    sprintf(parampath, "scrfd_%s-opt2.param", modeltype);
    sprintf(modelpath, "scrfd_%s-opt2.bin", modeltype);

    scrfd.load_param(mgr, parampath);
    scrfd.load_model(mgr, modelpath);
    faceseg.load_param(mgr,"faceseg-op.param");
    faceseg.load_model(mgr,"faceseg-op.bin");
    facept.load_param(mgr,"facemesh-op.param");
    facept.load_model(mgr,"facemesh-op.bin");
    has_kps = strstr(modeltype, "_kps") != NULL;

    return 0;
}

int SCRFD::detect(const cv::Mat& rgb, std::vector<FaceObject>& faceobjects, float prob_threshold, float nms_threshold)
{
    int width = rgb.cols;
    int height = rgb.rows;

    // insightface/detection/scrfd/configs/scrfd/scrfd_500m.py
    const int target_size = 640;

    // pad to multiple of 32
    int w = width;
    int h = height;
    float scale = 1.f;
    if (w > h)
    {
        scale = (float)target_size / w;
        w = target_size;
        h = h * scale;
    }
    else
    {
        scale = (float)target_size / h;
        h = target_size;
        w = w * scale;
    }

    ncnn::Mat in = ncnn::Mat::from_pixels_resize(rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h);

    // pad to target_size rectangle
    int wpad = (w + 31) / 32 * 32 - w;
    int hpad = (h + 31) / 32 * 32 - h;
    ncnn::Mat in_pad;
    ncnn::copy_make_border(in, in_pad, hpad / 2, hpad - hpad / 2, wpad / 2, wpad - wpad / 2, ncnn::BORDER_CONSTANT, 0.f);

    const float mean_vals[3] = {127.5f, 127.5f, 127.5f};
    const float norm_vals[3] = {1/128.f, 1/128.f, 1/128.f};
    in_pad.substract_mean_normalize(mean_vals, norm_vals);

    ncnn::Extractor ex = scrfd.create_extractor();

    ex.input("input.1", in_pad);

    std::vector<FaceObject> faceproposals;

    // stride 8
    {
        ncnn::Mat score_blob, bbox_blob, kps_blob;
        ex.extract("score_8", score_blob);
        ex.extract("bbox_8", bbox_blob);
        if (has_kps)
            ex.extract("kps_8", kps_blob);

        const int base_size = 16;
        const int feat_stride = 8;
        ncnn::Mat ratios(1);
        ratios[0] = 1.f;
        ncnn::Mat scales(2);
        scales[0] = 1.f;
        scales[1] = 2.f;
        ncnn::Mat anchors = generate_anchors(base_size, ratios, scales);

        std::vector<FaceObject> faceobjects32;
        generate_proposals(anchors, feat_stride, score_blob, bbox_blob, kps_blob, prob_threshold, faceobjects32);

        faceproposals.insert(faceproposals.end(), faceobjects32.begin(), faceobjects32.end());
    }

    // stride 16
    {
        ncnn::Mat score_blob, bbox_blob, kps_blob;
        ex.extract("score_16", score_blob);
        ex.extract("bbox_16", bbox_blob);
        if (has_kps)
            ex.extract("kps_16", kps_blob);

        const int base_size = 64;
        const int feat_stride = 16;
        ncnn::Mat ratios(1);
        ratios[0] = 1.f;
        ncnn::Mat scales(2);
        scales[0] = 1.f;
        scales[1] = 2.f;
        ncnn::Mat anchors = generate_anchors(base_size, ratios, scales);

        std::vector<FaceObject> faceobjects16;
        generate_proposals(anchors, feat_stride, score_blob, bbox_blob, kps_blob, prob_threshold, faceobjects16);

        faceproposals.insert(faceproposals.end(), faceobjects16.begin(), faceobjects16.end());
    }

    // stride 32
    {
        ncnn::Mat score_blob, bbox_blob, kps_blob;
        ex.extract("score_32", score_blob);
        ex.extract("bbox_32", bbox_blob);
        if (has_kps)
            ex.extract("kps_32", kps_blob);

        const int base_size = 256;
        const int feat_stride = 32;
        ncnn::Mat ratios(1);
        ratios[0] = 1.f;
        ncnn::Mat scales(2);
        scales[0] = 1.f;
        scales[1] = 2.f;
        ncnn::Mat anchors = generate_anchors(base_size, ratios, scales);

        std::vector<FaceObject> faceobjects8;
        generate_proposals(anchors, feat_stride, score_blob, bbox_blob, kps_blob, prob_threshold, faceobjects8);

        faceproposals.insert(faceproposals.end(), faceobjects8.begin(), faceobjects8.end());
    }

    // sort all proposals by score from highest to lowest
    qsort_descent_inplace(faceproposals);

    // apply nms with nms_threshold
    std::vector<int> picked;
    nms_sorted_bboxes(faceproposals, picked, nms_threshold);

    int face_count = picked.size();

    faceobjects.resize(face_count);
    for (int i = 0; i < face_count; i++)
    {
        faceobjects[i] = faceproposals[picked[i]];

        // adjust offset to original unpadded
        float x0 = (faceobjects[i].rect.x - (wpad / 2)) / scale;
        float y0 = (faceobjects[i].rect.y - (hpad / 2)) / scale;
        float x1 = (faceobjects[i].rect.x + faceobjects[i].rect.width - (wpad / 2)) / scale;
        float y1 = (faceobjects[i].rect.y + faceobjects[i].rect.height - (hpad / 2)) / scale;

        x0 = std::max(std::min(x0, (float)width - 1), 0.f);
        y0 = std::max(std::min(y0, (float)height - 1), 0.f);
        x1 = std::max(std::min(x1, (float)width - 1), 0.f);
        y1 = std::max(std::min(y1, (float)height - 1), 0.f);

        faceobjects[i].rect.x = x0;
        faceobjects[i].rect.y = y0;
        faceobjects[i].rect.width = x1 - x0;
        faceobjects[i].rect.height = y1 - y0;

        if (has_kps)
        {
            float x0 = (faceobjects[i].landmark[0].x - (wpad / 2)) / scale;
            float y0 = (faceobjects[i].landmark[0].y - (hpad / 2)) / scale;
            float x1 = (faceobjects[i].landmark[1].x - (wpad / 2)) / scale;
            float y1 = (faceobjects[i].landmark[1].y - (hpad / 2)) / scale;
            float x2 = (faceobjects[i].landmark[2].x - (wpad / 2)) / scale;
            float y2 = (faceobjects[i].landmark[2].y - (hpad / 2)) / scale;
            float x3 = (faceobjects[i].landmark[3].x - (wpad / 2)) / scale;
            float y3 = (faceobjects[i].landmark[3].y - (hpad / 2)) / scale;
            float x4 = (faceobjects[i].landmark[4].x - (wpad / 2)) / scale;
            float y4 = (faceobjects[i].landmark[4].y - (hpad / 2)) / scale;

            faceobjects[i].landmark[0].x = std::max(std::min(x0, (float)width - 1), 0.f);
            faceobjects[i].landmark[0].y = std::max(std::min(y0, (float)height - 1), 0.f);
            faceobjects[i].landmark[1].x = std::max(std::min(x1, (float)width - 1), 0.f);
            faceobjects[i].landmark[1].y = std::max(std::min(y1, (float)height - 1), 0.f);
            faceobjects[i].landmark[2].x = std::max(std::min(x2, (float)width - 1), 0.f);
            faceobjects[i].landmark[2].y = std::max(std::min(y2, (float)height - 1), 0.f);
            faceobjects[i].landmark[3].x = std::max(std::min(x3, (float)width - 1), 0.f);
            faceobjects[i].landmark[3].y = std::max(std::min(y3, (float)height - 1), 0.f);
            faceobjects[i].landmark[4].x = std::max(std::min(x4, (float)width - 1), 0.f);
            faceobjects[i].landmark[4].y = std::max(std::min(y4, (float)height - 1), 0.f);
        }
    }

    return 0;
}
void SCRFD::seg(cv::Mat &rgb, const FaceObject &obj,cv::Mat &mask,cv::Rect &box)
{
    int pad = obj.rect.height;
    box.x = (obj.rect.x+obj.rect.width/2)-pad/2-20;
    box.y = obj.rect.y-80;
    box.width = obj.rect.height+40;
    box.height = obj.rect.height+80;

    box.x = std::max(0.f,(float)box.x);
    box.y = std::max(0.f,(float)box.y);
    box.width = box.x+box.width<rgb.cols?box.width:rgb.cols-box.x-1;
    box.height = box.y+box.height<rgb.rows?box.height:rgb.rows-box.y-1;

    cv::Mat faceRoiImage = rgb(box).clone();
    ncnn::Extractor ex_face = faceseg.create_extractor();
    ncnn::Mat ncnn_in = ncnn::Mat::from_pixels_resize(faceRoiImage.data,ncnn::Mat::PIXEL_RGB, faceRoiImage.cols, faceRoiImage.rows,256,256);

    ncnn_in.substract_mean_normalize(meanVals, normVals);
    ex_face.input("input",ncnn_in);
    ncnn::Mat ncnn_out;
    ex_face.extract("output",ncnn_out);
    float *scoredata = (float*)ncnn_out.data;

    unsigned char * maskIndex = mask.data;
    int h = mask.rows;
    int w = mask.cols;
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            int maxk = 0;
            float tmp = scoredata[0 * w * h + i * w + j];
            for (int k = 0; k < 8; k++)
            {
                if (tmp < scoredata[k * w * h + i * w + j])
                {
                    tmp = scoredata[k * w * h + i * w + j];
                    maxk = k;
                }
            }
            maskIndex[i * w + j] = maxk;
        }
    }
    //cv::resize(mask,mask,faceRoiImage.size(),0,0,cv::INTER_NEAREST);

}

void SCRFD::landmark(cv::Mat &rgb, const FaceObject &obj, std::vector<cv::Point2f> &landmarks)
{
    int pad = obj.rect.height;
    cv::Rect box;

    box.x = (obj.rect.x+obj.rect.width/2)-pad/2;
    box.y = obj.rect.y;
    box.width = obj.rect.height;
    box.height = obj.rect.height;

    box.x = std::max(0.f,(float)box.x);
    box.y = std::max(0.f,(float)box.y);
    box.width = box.x+box.width<rgb.cols?box.width:rgb.cols-box.x-1;
    box.height = box.y+box.height<rgb.rows?box.height:rgb.rows-box.y-1;

    cv::Mat faceRoiImage = rgb(box).clone();
    ncnn::Extractor ex_face = facept.create_extractor();
    ncnn::Mat ncnn_in = ncnn::Mat::from_pixels_resize(faceRoiImage.data,ncnn::Mat::PIXEL_RGB, faceRoiImage.cols, faceRoiImage.rows,192,192);
    const float means[3] = { 127.5f, 127.5f,  127.5f };
    const float norms[3] = { 1/127.5f, 1 / 127.5f, 1 / 127.5f };
    ncnn_in.substract_mean_normalize(means, norms);
    ex_face.input("input.1",ncnn_in);
    ncnn::Mat ncnn_out;
    ex_face.extract("482",ncnn_out);
    float *scoredata = (float*)ncnn_out.data;
    for(int i = 0; i < 468; i++)
    {
        cv::Point2f pt;
        pt.x = scoredata[i*3]*box.width/192+box.x;
        pt.y = scoredata[i*3+1]*box.width/192+box.y;
        landmarks.push_back(pt);
    }

}
int SCRFD::draw(cv::Mat& rgb, const std::vector<FaceObject>& faceobjects)
{
    static const unsigned  char face_part_colors[8][3] = {{0, 0, 255}, {255, 85, 0}, {255, 170, 0},
                                                     {255, 0, 85}, {255, 0, 170},
                                                     {0, 255, 0}, {170, 255, 255}, {255, 255, 255}};
    for (size_t i = 0; i < faceobjects.size(); i++)
    {
        const FaceObject& obj = faceobjects[i];
        //face segmentation
        /*
        cv::Mat mask = cv::Mat::zeros(256, 256, CV_8UC1);
        cv::Rect  box;
        seg(rgb,obj,mask,box);
        cv::Mat maskResize;
        cv::resize(mask,maskResize,cv::Size(box.width,box.height),0,0,cv::INTER_NEAREST);

        for(size_t h = 0; h < maskResize.rows; h++)
        {
            cv::Vec3b* pRgb = rgb(box).ptr<cv::Vec3b >(h);
            for(size_t w = 0; w < maskResize.cols; w++)
            {
                int index = maskResize.at<uchar>(h,w);
                if(index == 0)
                    continue;
                pRgb[w] = cv::Vec3b(face_part_colors[index][2]*0.3+pRgb[w][2]*0.7,
                                    face_part_colors[index][1]*0.3+pRgb[w][1]*0.7,
                                    face_part_colors[index][0]*0.3+pRgb[w][0]*0.7);
            }
        }
         */

        //mediapipe face mesh
        std::vector<cv::Point2f> pts;
        landmark(rgb,obj,pts);
        for(int i = 0; i < pts.size(); i++)
            cv::circle(rgb,pts[i],2,cv::Scalar(255,255,0),-1);

        cv::rectangle(rgb, obj.rect, cv::Scalar(0, 255, 0));

        if (has_kps)
        {
            cv::circle(rgb, obj.landmark[0], 2, cv::Scalar(255, 255, 0), -1);
            cv::circle(rgb, obj.landmark[1], 2, cv::Scalar(255, 255, 0), -1);
            cv::circle(rgb, obj.landmark[2], 2, cv::Scalar(255, 255, 0), -1);
            cv::circle(rgb, obj.landmark[3], 2, cv::Scalar(255, 255, 0), -1);
            cv::circle(rgb, obj.landmark[4], 2, cv::Scalar(255, 255, 0), -1);
        }

        char text[256];
        sprintf(text, "%.1f%%", obj.prob * 100);

        int baseLine = 0;
        cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);

        int x = obj.rect.x;
        int y = obj.rect.y - label_size.height - baseLine;
        if (y < 0)
            y = 0;
        if (x + label_size.width > rgb.cols)
            x = rgb.cols - label_size.width;

        cv::rectangle(rgb, cv::Rect(cv::Point(x, y), cv::Size(label_size.width, label_size.height + baseLine)), cv::Scalar(255, 255, 255), -1);

        cv::putText(rgb, text, cv::Point(x, y + label_size.height), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0), 1);
    }

    return 0;
}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfd.h
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#ifndef SCRFD_H
#define SCRFD_H

#include <opencv2/core/core.hpp>

#include <net.h>

struct FaceObject
{
    cv::Rect_<float> rect;
    cv::Point2f landmark[5];
    float prob;
};

class SCRFD
{
public:
    int load(const char* modeltype, bool use_gpu = false);

    int load(AAssetManager* mgr, const char* modeltype, bool use_gpu = false);

    int detect(const cv::Mat& rgb, std::vector<FaceObject>& faceobjects, float prob_threshold = 0.5f, float nms_threshold = 0.45f);

    int draw(cv::Mat& rgb, const std::vector<FaceObject>& faceobjects);
    void seg(cv::Mat &rgb,const FaceObject &obj,cv::Mat &mask,cv::Rect &box);
    void landmark(cv::Mat &rgb, const FaceObject &obj, std::vector<cv::Point2f> &landmarks);
private:
    const float meanVals[3] = { 123.675f, 116.28f,  103.53f };
    const float normVals[3] = { 0.01712475f, 0.0175f, 0.01742919f };
    ncnn::Net facept;
    ncnn::Net faceseg;
    ncnn::Net scrfd;
    bool has_kps;
};

#endif // SCRFD_H


================================================
FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfdncnn.cpp
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include <android/asset_manager_jni.h>
#include <android/native_window_jni.h>
#include <android/native_window.h>

#include <android/log.h>

#include <jni.h>

#include <string>
#include <vector>

#include <platform.h>
#include <benchmark.h>

#include "scrfd.h"

#include "ndkcamera.h"

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#if __ARM_NEON
#include <arm_neon.h>
#endif // __ARM_NEON

static int draw_unsupported(cv::Mat& rgb)
{
    const char text[] = "unsupported";

    int baseLine = 0;
    cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 1.0, 1, &baseLine);

    int y = (rgb.rows - label_size.height) / 2;
    int x = (rgb.cols - label_size.width) / 2;

    cv::rectangle(rgb, cv::Rect(cv::Point(x, y), cv::Size(label_size.width, label_size.height + baseLine)),
                    cv::Scalar(255, 255, 255), -1);

    cv::putText(rgb, text, cv::Point(x, y + label_size.height),
                cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(0, 0, 0));

    return 0;
}

static int draw_fps(cv::Mat& rgb)
{
    // resolve moving average
    float avg_fps = 0.f;
    {
        static double t0 = 0.f;
        static float fps_history[10] = {0.f};

        double t1 = ncnn::get_current_time();
        if (t0 == 0.f)
        {
            t0 = t1;
            return 0;
        }

        float fps = 1000.f / (t1 - t0);
        t0 = t1;

        for (int i = 9; i >= 1; i--)
        {
            fps_history[i] = fps_history[i - 1];
        }
        fps_history[0] = fps;

        if (fps_history[9] == 0.f)
        {
            return 0;
        }

        for (int i = 0; i < 10; i++)
        {
            avg_fps += fps_history[i];
        }
        avg_fps /= 10.f;
    }

    char text[32];
    sprintf(text, "FPS=%.2f", avg_fps);

    int baseLine = 0;
    cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);

    int y = 0;
    int x = rgb.cols - label_size.width;

    cv::rectangle(rgb, cv::Rect(cv::Point(x, y), cv::Size(label_size.width, label_size.height + baseLine)),
                    cv::Scalar(255, 255, 255), -1);

    cv::putText(rgb, text, cv::Point(x, y + label_size.height),
                cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));

    return 0;
}

static SCRFD* g_scrfd = 0;
static ncnn::Mutex lock;

class MyNdkCamera : public NdkCameraWindow
{
public:
    virtual void on_image_render(cv::Mat& rgb) const;
};

void MyNdkCamera::on_image_render(cv::Mat& rgb) const
{
    // scrfd
    {
        ncnn::MutexLockGuard g(lock);

        if (g_scrfd)
        {
            std::vector<FaceObject> faceobjects;
            g_scrfd->detect(rgb, faceobjects);

            g_scrfd->draw(rgb, faceobjects);
        }
        else
        {
            draw_unsupported(rgb);
        }
    }

    draw_fps(rgb);
}

static MyNdkCamera* g_camera = 0;

extern "C" {

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "JNI_OnLoad");

    g_camera = new MyNdkCamera;

    return JNI_VERSION_1_4;
}

JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved)
{
    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "JNI_OnUnload");

    {
        ncnn::MutexLockGuard g(lock);

        delete g_scrfd;
        g_scrfd = 0;
    }

    delete g_camera;
    g_camera = 0;
}

// public native boolean loadModel(AssetManager mgr, int modelid, int cpugpu);
JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_loadModel(JNIEnv* env, jobject thiz, jobject assetManager, jint modelid, jint cpugpu)
{
    if (modelid < 0 || modelid > 6 || cpugpu < 0 || cpugpu > 1)
    {
        return JNI_FALSE;
    }

    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);

    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "loadModel %p", mgr);

    const char* modeltypes[] =
    {
        "500m",
        "1g",
    };

    const char* modeltype = modeltypes[(int)modelid];
    bool use_gpu = (int)cpugpu == 1;

    // reload
    {
        ncnn::MutexLockGuard g(lock);

        if (use_gpu && ncnn::get_gpu_count() == 0)
        {
            // no gpu
            delete g_scrfd;
            g_scrfd = 0;
        }
        else
        {
            if (!g_scrfd)
                g_scrfd = new SCRFD;
            g_scrfd->load(mgr, modeltype, use_gpu);
        }
    }

    return JNI_TRUE;
}

// public native boolean openCamera(int facing);
JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_openCamera(JNIEnv* env, jobject thiz, jint facing)
{
    if (facing < 0 || facing > 1)
        return JNI_FALSE;

    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "openCamera %d", facing);

    g_camera->open((int)facing);

    return JNI_TRUE;
}

// public native boolean closeCamera();
JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_closeCamera(JNIEnv* env, jobject thiz)
{
    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "closeCamera");

    g_camera->close();

    return JNI_TRUE;
}

// public native boolean setOutputWindow(Surface surface);
JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_setOutputWindow(JNIEnv* env, jobject thiz, jobject surface)
{
    ANativeWindow* win = ANativeWindow_fromSurface(env, surface);

    __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "setOutputWindow %p", win);

    g_camera->set_window(win);

    return JNI_TRUE;
}

}


================================================
FILE: ncnn-android-scrfd-master/app/src/main/res/layout/main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

    <Button
        android:id="@+id/buttonSwitchCamera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="切换摄像头" />

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

    <Spinner
        android:id="@+id/spinnerModel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="true"
        android:entries="@array/model_array" />

    <Spinner
        android:id="@+id/spinnerCPUGPU"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="true"
        android:entries="@array/cpugpu_array" />

    </LinearLayout>

    <SurfaceView
        android:id="@+id/cameraview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>


================================================
FILE: ncnn-android-scrfd-master/app/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">scrfdncnn</string>
    <string-array name="model_array">
        <item>500m</item>
        <item>1g</item>
    </string-array>
    <string-array name="cpugpu_array">
        <item>CPU</item>
        <item>GPU</item>
    </string-array>
</resources>


================================================
FILE: ncnn-android-scrfd-master/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}


================================================
FILE: ncnn-android-scrfd-master/gradle/wrapper/gradle-wrapper.properties
================================================
#Sun Sep 08 23:09:42 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip


================================================
FILE: ncnn-android-scrfd-master/gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: ncnn-android-scrfd-master/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: ncnn-android-scrfd-master/local.properties
================================================
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon May 17 14:14:17 CST 2021
sdk.dir=D\:\\Android


================================================
FILE: ncnn-android-scrfd-master/settings.gradle
================================================
include ':app'


================================================
FILE: ncnn-android-yolov5_face/app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.tencent.ncnnyoloface"
        archivesBaseName = "$applicationId"

        minSdkVersion 24
    }

    externalNativeBuild {
        cmake {
            version "3.10.2"
            path file('src/main/jni/CMakeLists.txt')
        }
    }

    dependencies {
        implementation 'com.android.support:support-v4:24.0.0'
    }
}


================================================
FILE: ncnn-android-yolov5_face/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.tencent.ncnnyoloface"
      android:versionCode="1"
      android:versionName="1.1">
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2.full" />

    <application android:label="@string/app_name">
        <activity android:name="MainActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 


================================================
FILE: ncnn-android-yolov5_face/app/src/main/assets/yolov5n-0.5.param
================================================
7767517
224 251
Input                    data                     0 1 data
Convolution              Conv_0                   1 1 data 389 0=16 1=3 3=2 4=1 5=1 6=432
Swish                    Mul_2                    1 1 389 391
Split                    splitncnn_0              1 2 391 391_splitncnn_0 391_splitncnn_1
Convolution              Conv_3                   1 1 391_splitncnn_1 392 0=8 1=1 5=1 6=128
Swish                    Mul_5                    1 1 392 394
Convolution              Conv_6                   1 1 394 395 0=16 1=3 3=2 4=1 5=1 6=1152
Swish                    Mul_8                    1 1 395 397
Pooling                  MaxPool_9                1 1 391_splitncnn_0 398 1=2 2=2
Concat                   Concat_10                2 1 397 398 399
Convolution              Conv_11                  1 1 399 400 0=16 1=1 5=1 6=512
Swish                    Mul_13                   1 1 400 402
Split                    splitncnn_1              1 2 402 402_splitncnn_0 402_splitncnn_1
ConvolutionDepthWise     Conv_14                  1 1 402_splitncnn_1 796 0=16 1=3 3=2 4=1 5=1 6=144 7=16
Convolution              Conv_15                  1 1 796 799 0=32 1=1 5=1 6=512
Swish                    Mul_17                   1 1 799 408
Convolution              Conv_18                  1 1 402_splitncnn_0 802 0=32 1=1 5=1 6=512
Swish                    Mul_20                   1 1 802 412
ConvolutionDepthWise     Conv_21                  1 1 412 805 0=32 1=3 3=2 4=1 5=1 6=288 7=32
Convolution              Conv_22                  1 1 805 808 0=32 1=1 5=1 6=1024
Swish                    Mul_24                   1 1 808 418
Concat                   Concat_25                2 1 408 418 419
ShuffleChannel           Reshape_30               1 1 419 424 0=2
Slice                    Split_31                 1 2 424 425 426 -23300=2,32,-233
Convolution              Conv_32                  1 1 426 811 0=32 1=1 5=1 6=1024
Swish                    Mul_34                   1 1 811 430
ConvolutionDepthWise     Conv_35                  1 1 430 814 0=32 1=3 4=1 5=1 6=288 7=32
Convolution              Conv_36                  1 1 814 817 0=32 1=1 5=1 6=1024
Swish                    Mul_38                   1 1 817 436
Concat                   Concat_39                2 1 425 436 437
ShuffleChannel           Reshape_44               1 1 437 442 0=2
Slice                    Split_45                 1 2 442 443 444 -23300=2,32,-233
Convolution              Conv_46                  1 1 444 820 0=32 1=1 5=1 6=1024
Swish                    Mul_48                   1 1 820 448
ConvolutionDepthWise     Conv_49                  1 1 448 823 0=32 1=3 4=1 5=1 6=288 7=32
Convolution              Conv_50                  1 1 823 826 0=32 1=1 5=1 6=1024
Swish                    Mul_52                   1 1 826 454
Concat                   Concat_53                2 1 443 454 455
ShuffleChannel           Reshape_58               1 1 455 460 0=2
Slice                    Split_59                 1 2 460 461 462 -23300=2,32,-233
Convolution              Conv_60                  1 1 462 829 0=32 1=1 5=1 6=1024
Swish                    Mul_62                   1 1 829 466
ConvolutionDepthWise     Conv_63                  1 1 466 832 0=32 1=3 4=1 5=1 6=288 7=32
Convolution              Conv_64                  1 1 832 835 0=32 1=1 5=1 6=1024
Swish                    Mul_66                   1 1 835 472
Concat                   Concat_67                2 1 461 472 473
ShuffleChannel           Reshape_72               1 1 473 478 0=2
Split                    splitncnn_2              1 3 478 478_splitncnn_0 478_splitncnn_1 478_splitncnn_2
ConvolutionDepthWise     Conv_73                  1 1 478_splitncnn_2 838 0=64 1=3 3=2 4=1 5=1 6=576 7=64
Convolution              Conv_74                  1 1 838 841 0=64 1=1 5=1 6=4096
Swish                    Mul_76                   1 1 841 484
Convolution              Conv_77                  1 1 478_splitncnn_1 844 0=64 1=1 5=1 6=4096
Swish                    Mul_79                   1 1 844 488
ConvolutionDepthWise     Conv_80                  1 1 488 847 0=64 1=3 3=2 4=1 5=1 6=576 7=64
Convolution              Conv_81                  1 1 847 850 0=64 1=1 5=1 6=4096
Swish                    Mul_83                   1 1 850 494
Concat                   Concat_84                2 1 484 494 495
ShuffleChannel           Reshape_89               1 1 495 500 0=2
Slice                    Split_90                 1 2 500 501 502 -23300=2,64,-233
Convolution              Conv_91                  1 1 502 853 0=64 1=1 5=1 6=4096
Swish                    Mul_93                   1 1 853 506
ConvolutionDepthWise     Conv_94                  1 1 506 856 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_95                  1 1 856 859 0=64 1=1 5=1 6=4096
Swish                    Mul_97                   1 1 859 512
Concat                   Concat_98                2 1 501 512 513
ShuffleChannel           Reshape_103              1 1 513 518 0=2
Slice                    Split_104                1 2 518 519 520 -23300=2,64,-233
Convolution              Conv_105                 1 1 520 862 0=64 1=1 5=1 6=4096
Swish                    Mul_107                  1 1 862 524
ConvolutionDepthWise     Conv_108                 1 1 524 865 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_109                 1 1 865 868 0=64 1=1 5=1 6=4096
Swish                    Mul_111                  1 1 868 530
Concat                   Concat_112               2 1 519 530 531
ShuffleChannel           Reshape_117              1 1 531 536 0=2
Slice                    Split_118                1 2 536 537 538 -23300=2,64,-233
Convolution              Conv_119                 1 1 538 871 0=64 1=1 5=1 6=4096
Swish                    Mul_121                  1 1 871 542
ConvolutionDepthWise     Conv_122                 1 1 542 874 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_123                 1 1 874 877 0=64 1=1 5=1 6=4096
Swish                    Mul_125                  1 1 877 548
Concat                   Concat_126               2 1 537 548 549
ShuffleChannel           Reshape_131              1 1 549 554 0=2
Slice                    Split_132                1 2 554 555 556 -23300=2,64,-233
Convolution              Conv_133                 1 1 556 880 0=64 1=1 5=1 6=4096
Swish                    Mul_135                  1 1 880 560
ConvolutionDepthWise     Conv_136                 1 1 560 883 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_137                 1 1 883 886 0=64 1=1 5=1 6=4096
Swish                    Mul_139                  1 1 886 566
Concat                   Concat_140               2 1 555 566 567
ShuffleChannel           Reshape_145              1 1 567 572 0=2
Slice                    Split_146                1 2 572 573 574 -23300=2,64,-233
Convolution              Conv_147                 1 1 574 889 0=64 1=1 5=1 6=4096
Swish                    Mul_149                  1 1 889 578
ConvolutionDepthWise     Conv_150                 1 1 578 892 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_151                 1 1 892 895 0=64 1=1 5=1 6=4096
Swish                    Mul_153                  1 1 895 584
Concat                   Concat_154               2 1 573 584 585
ShuffleChannel           Reshape_159              1 1 585 590 0=2
Slice                    Split_160                1 2 590 591 592 -23300=2,64,-233
Convolution              Conv_161                 1 1 592 898 0=64 1=1 5=1 6=4096
Swish                    Mul_163                  1 1 898 596
ConvolutionDepthWise     Conv_164                 1 1 596 901 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_165                 1 1 901 904 0=64 1=1 5=1 6=4096
Swish                    Mul_167                  1 1 904 602
Concat                   Concat_168               2 1 591 602 603
ShuffleChannel           Reshape_173              1 1 603 608 0=2
Slice                    Split_174                1 2 608 609 610 -23300=2,64,-233
Convolution              Conv_175                 1 1 610 907 0=64 1=1 5=1 6=4096
Swish                    Mul_177                  1 1 907 614
ConvolutionDepthWise     Conv_178                 1 1 614 910 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_179                 1 1 910 913 0=64 1=1 5=1 6=4096
Swish                    Mul_181                  1 1 913 620
Concat                   Concat_182               2 1 609 620 621
ShuffleChannel           Reshape_187              1 1 621 626 0=2
Split                    splitncnn_3              1 3 626 626_splitncnn_0 626_splitncnn_1 626_splitncnn_2
ConvolutionDepthWise     Conv_188                 1 1 626_splitncnn_2 916 0=128 1=3 3=2 4=1 5=1 6=1152 7=128
Convolution              Conv_189                 1 1 916 919 0=128 1=1 5=1 6=16384
Swish                    Mul_191                  1 1 919 632
Convolution              Conv_192                 1 1 626_splitncnn_1 922 0=128 1=1 5=1 6=16384
Swish                    Mul_194                  1 1 922 636
ConvolutionDepthWise     Conv_195                 1 1 636 925 0=128 1=3 3=2 4=1 5=1 6=1152 7=128
Convolution              Conv_196                 1 1 925 928 0=128 1=1 5=1 6=16384
Swish                    Mul_198                  1 1 928 642
Concat                   Concat_199               2 1 632 642 643
ShuffleChannel           Reshape_204              1 1 643 648 0=2
Slice                    Split_205                1 2 648 649 650 -23300=2,128,-233
Convolution              Conv_206                 1 1 650 931 0=128 1=1 5=1 6=16384
Swish                    Mul_208                  1 1 931 654
ConvolutionDepthWise     Conv_209                 1 1 654 934 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_210                 1 1 934 937 0=128 1=1 5=1 6=16384
Swish                    Mul_212                  1 1 937 660
Concat                   Concat_213               2 1 649 660 661
ShuffleChannel           Reshape_218              1 1 661 666 0=2
Slice                    Split_219                1 2 666 667 668 -23300=2,128,-233
Convolution              Conv_220                 1 1 668 940 0=128 1=1 5=1 6=16384
Swish                    Mul_222                  1 1 940 672
ConvolutionDepthWise     Conv_223                 1 1 672 943 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_224                 1 1 943 946 0=128 1=1 5=1 6=16384
Swish                    Mul_226                  1 1 946 678
Concat                   Concat_227               2 1 667 678 679
ShuffleChannel           Reshape_232              1 1 679 684 0=2
Slice                    Split_233                1 2 684 685 686 -23300=2,128,-233
Convolution              Conv_234                 1 1 686 949 0=128 1=1 5=1 6=16384
Swish                    Mul_236                  1 1 949 690
ConvolutionDepthWise     Conv_237                 1 1 690 952 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_238                 1 1 952 955 0=128 1=1 5=1 6=16384
Swish                    Mul_240                  1 1 955 696
Concat                   Concat_241               2 1 685 696 697
ShuffleChannel           Reshape_246              1 1 697 702 0=2
Convolution              Conv_247                 1 1 702 703 0=64 1=1 5=1 6=16384
Swish                    Mul_249                  1 1 703 705
Split                    splitncnn_4              1 2 705 705_splitncnn_0 705_splitncnn_1
Interp                   Resize_251               1 1 705_splitncnn_1 710 0=1 1=2.000000e+00 2=2.000000e+00
Concat                   Concat_252               2 1 710 626_splitncnn_0 711
Split                    splitncnn_5              1 2 711 711_splitncnn_0 711_splitncnn_1
Convolution              Conv_253                 1 1 711_splitncnn_1 712 0=32 1=1 5=1 6=6144
Swish                    Mul_255                  1 1 712 714
Convolution              Conv_256                 1 1 714 715 0=32 1=1 5=1 6=1024
Swish                    Mul_258                  1 1 715 717
Convolution              Conv_259                 1 1 717 718 0=32 1=3 4=1 5=1 6=9216
Swish                    Mul_261                  1 1 718 720
Convolution              Conv_262                 1 1 711_splitncnn_0 721 0=32 1=1 5=1 6=6144
Swish                    Mul_264                  1 1 721 723
Concat                   Concat_265               2 1 720 723 724
Convolution              Conv_266                 1 1 724 725 0=64 1=1 5=1 6=4096
Swish                    Mul_268                  1 1 725 727
Convolution              Conv_269                 1 1 727 728 0=64 1=1 5=1 6=4096
Swish                    Mul_271                  1 1 728 730
Split                    splitncnn_6              1 2 730 730_splitncnn_0 730_splitncnn_1
Interp                   Resize_273               1 1 730_splitncnn_1 735 0=1 1=2.000000e+00 2=2.000000e+00
Concat                   Concat_274               2 1 735 478_splitncnn_0 736
Split                    splitncnn_7              1 2 736 736_splitncnn_0 736_splitncnn_1
Convolution              Conv_275                 1 1 736_splitncnn_1 737 0=32 1=1 5=1 6=4096
Swish                    Mul_277                  1 1 737 739
Convolution              Conv_278                 1 1 739 740 0=32 1=1 5=1 6=1024
Swish                    Mul_280                  1 1 740 742
Convolution              Conv_281                 1 1 742 743 0=32 1=3 4=1 5=1 6=9216
Swish                    Mul_283                  1 1 743 745
Convolution              Conv_284                 1 1 736_splitncnn_0 746 0=32 1=1 5=1 6=4096
Swish                    Mul_286                  1 1 746 748
Concat                   Concat_287               2 1 745 748 749
Convolution              Conv_288                 1 1 749 750 0=64 1=1 5=1 6=4096
Swish                    Mul_290                  1 1 750 752
Split                    splitncnn_8              1 2 752 752_splitncnn_0 752_splitncnn_1
Convolution              Conv_291                 1 1 752_splitncnn_1 753 0=64 1=3 3=2 4=1 5=1 6=36864
Swish                    Mul_293                  1 1 753 755
Concat                   Concat_294               2 1 755 730_splitncnn_0 756
Split                    splitncnn_9              1 2 756 756_splitncnn_0 756_splitncnn_1
Convolution              Conv_295                 1 1 756_splitncnn_1 757 0=32 1=1 5=1 6=4096
Swish                    Mul_297                  1 1 757 759
Convolution              Conv_298                 1 1 759 760 0=32 1=1 5=1 6=1024
Swish                    Mul_300                  1 1 760 762
Convolution              Conv_301                 1 1 762 763 0=32 1=3 4=1 5=1 6=9216
Swish                    Mul_303                  1 1 763 765
Convolution              Conv_304                 1 1 756_splitncnn_0 766 0=32 1=1 5=1 6=4096
Swish                    Mul_306                  1 1 766 768
Concat                   Concat_307               2 1 765 768 769
Convolution              Conv_308                 1 1 769 770 0=64 1=1 5=1 6=4096
Swish                    Mul_310                  1 1 770 772
Split                    splitncnn_10             1 2 772 772_splitncnn_0 772_splitncnn_1
Convolution              Conv_311                 1 1 772_splitncnn_1 773 0=64 1=3 3=2 4=1 5=1 6=36864
Swish                    Mul_313                  1 1 773 775
Concat                   Concat_314               2 1 775 705_splitncnn_0 776
Split                    splitncnn_11             1 2 776 776_splitncnn_0 776_splitncnn_1
Convolution              Conv_315                 1 1 776_splitncnn_1 777 0=32 1=1 5=1 6=4096
Swish                    Mul_317                  1 1 777 779
Convolution              Conv_318                 1 1 779 780 0=32 1=1 5=1 6=1024
Swish                    Mul_320                  1 1 780 782
Convolution              Conv_321                 1 1 782 783 0=32 1=3 4=1 5=1 6=9216
Swish                    Mul_323                  1 1 783 785
Convolution              Conv_324                 1 1 776_splitncnn_0 786 0=32 1=1 5=1 6=4096
Swish                    Mul_326                  1 1 786 788
Concat                   Concat_327               2 1 785 788 789
Convolution              Conv_328                 1 1 789 790 0=64 1=1 5=1 6=4096
Swish                    Mul_330                  1 1 790 792
Convolution              Conv_331                 1 1 752_splitncnn_0 stride_8 0=48 1=1 5=1 6=3072
Convolution              Conv_332                 1 1 772_splitncnn_0 stride_16 0=48 1=1 5=1 6=3072
Convolution              Conv_333                 1 1 792 stride_32 0=48 1=1 5=1 6=3072
Reshape                  Reshape_573              1 1 stride_8 980 0=-1 1=16 2=3
Permute                  Transpose_574            1 1 980 981 0=1
Reshape                  Reshape_589              1 1 stride_16 982 0=-1 1=16 2=3
Permute                  Transpose_590            1 1 982 983 0=1
Reshape                  Reshape_605              1 1 stride_32 984 0=-1 1=16 2=3
Permute                  Transpose_606            1 1 984 985 0=1

================================================
FILE: ncnn-android-yolov5_face/app/src/main/assets/yolov5n.param
================================================
7767517
224 251
Input                    data                     0 1 data
Convolution              Conv_0                   1 1 data 389 0=32 1=3 3=2 4=1 5=1 6=864
Swish                    Mul_2                    1 1 389 391
Split                    splitncnn_0              1 2 391 391_splitncnn_0 391_splitncnn_1
Convolution              Conv_3                   1 1 391_splitncnn_1 392 0=16 1=1 5=1 6=512
Swish                    Mul_5                    1 1 392 394
Convolution              Conv_6                   1 1 394 395 0=32 1=3 3=2 4=1 5=1 6=4608
Swish                    Mul_8                    1 1 395 397
Pooling                  MaxPool_9                1 1 391_splitncnn_0 398 1=2 2=2
Concat                   Concat_10                2 1 397 398 399
Convolution              Conv_11                  1 1 399 400 0=32 1=1 5=1 6=2048
Swish                    Mul_13                   1 1 400 402
Split                    splitncnn_1              1 2 402 402_splitncnn_0 402_splitncnn_1
ConvolutionDepthWise     Conv_14                  1 1 402_splitncnn_1 796 0=32 1=3 3=2 4=1 5=1 6=288 7=32
Convolution              Conv_15                  1 1 796 799 0=64 1=1 5=1 6=2048
Swish                    Mul_17                   1 1 799 408
Convolution              Conv_18                  1 1 402_splitncnn_0 802 0=64 1=1 5=1 6=2048
Swish                    Mul_20                   1 1 802 412
ConvolutionDepthWise     Conv_21                  1 1 412 805 0=64 1=3 3=2 4=1 5=1 6=576 7=64
Convolution              Conv_22                  1 1 805 808 0=64 1=1 5=1 6=4096
Swish                    Mul_24                   1 1 808 418
Concat                   Concat_25                2 1 408 418 419
ShuffleChannel           Reshape_30               1 1 419 424 0=2
Slice                    Split_31                 1 2 424 425 426 -23300=2,64,-233
Convolution              Conv_32                  1 1 426 811 0=64 1=1 5=1 6=4096
Swish                    Mul_34                   1 1 811 430
ConvolutionDepthWise     Conv_35                  1 1 430 814 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_36                  1 1 814 817 0=64 1=1 5=1 6=4096
Swish                    Mul_38                   1 1 817 436
Concat                   Concat_39                2 1 425 436 437
ShuffleChannel           Reshape_44               1 1 437 442 0=2
Slice                    Split_45                 1 2 442 443 444 -23300=2,64,-233
Convolution              Conv_46                  1 1 444 820 0=64 1=1 5=1 6=4096
Swish                    Mul_48                   1 1 820 448
ConvolutionDepthWise     Conv_49                  1 1 448 823 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_50                  1 1 823 826 0=64 1=1 5=1 6=4096
Swish                    Mul_52                   1 1 826 454
Concat                   Concat_53                2 1 443 454 455
ShuffleChannel           Reshape_58               1 1 455 460 0=2
Slice                    Split_59                 1 2 460 461 462 -23300=2,64,-233
Convolution              Conv_60                  1 1 462 829 0=64 1=1 5=1 6=4096
Swish                    Mul_62                   1 1 829 466
ConvolutionDepthWise     Conv_63                  1 1 466 832 0=64 1=3 4=1 5=1 6=576 7=64
Convolution              Conv_64                  1 1 832 835 0=64 1=1 5=1 6=4096
Swish                    Mul_66                   1 1 835 472
Concat                   Concat_67                2 1 461 472 473
ShuffleChannel           Reshape_72               1 1 473 478 0=2
Split                    splitncnn_2              1 3 478 478_splitncnn_0 478_splitncnn_1 478_splitncnn_2
ConvolutionDepthWise     Conv_73                  1 1 478_splitncnn_2 838 0=128 1=3 3=2 4=1 5=1 6=1152 7=128
Convolution              Conv_74                  1 1 838 841 0=128 1=1 5=1 6=16384
Swish                    Mul_76                   1 1 841 484
Convolution              Conv_77                  1 1 478_splitncnn_1 844 0=128 1=1 5=1 6=16384
Swish                    Mul_79                   1 1 844 488
ConvolutionDepthWise     Conv_80                  1 1 488 847 0=128 1=3 3=2 4=1 5=1 6=1152 7=128
Convolution              Conv_81                  1 1 847 850 0=128 1=1 5=1 6=16384
Swish                    Mul_83                   1 1 850 494
Concat                   Concat_84                2 1 484 494 495
ShuffleChannel           Reshape_89               1 1 495 500 0=2
Slice                    Split_90                 1 2 500 501 502 -23300=2,128,-233
Convolution              Conv_91                  1 1 502 853 0=128 1=1 5=1 6=16384
Swish                    Mul_93                   1 1 853 506
ConvolutionDepthWise     Conv_94                  1 1 506 856 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_95                  1 1 856 859 0=128 1=1 5=1 6=16384
Swish                    Mul_97                   1 1 859 512
Concat                   Concat_98                2 1 501 512 513
ShuffleChannel           Reshape_103              1 1 513 518 0=2
Slice                    Split_104                1 2 518 519 520 -23300=2,128,-233
Convolution              Conv_105                 1 1 520 862 0=128 1=1 5=1 6=16384
Swish                    Mul_107                  1 1 862 524
ConvolutionDepthWise     Conv_108                 1 1 524 865 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_109                 1 1 865 868 0=128 1=1 5=1 6=16384
Swish                    Mul_111                  1 1 868 530
Concat                   Concat_112               2 1 519 530 531
ShuffleChannel           Reshape_117              1 1 531 536 0=2
Slice                    Split_118                1 2 536 537 538 -23300=2,128,-233
Convolution              Conv_119                 1 1 538 871 0=128 1=1 5=1 6=16384
Swish                    Mul_121                  1 1 871 542
ConvolutionDepthWise     Conv_122                 1 1 542 874 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_123                 1 1 874 877 0=128 1=1 5=1 6=16384
Swish                    Mul_125                  1 1 877 548
Concat                   Concat_126               2 1 537 548 549
ShuffleChannel           Reshape_131              1 1 549 554 0=2
Slice                    Split_132                1 2 554 555 556 -23300=2,128,-233
Convolution              Conv_133                 1 1 556 880 0=128 1=1 5=1 6=16384
Swish                    Mul_135                  1 1 880 560
ConvolutionDepthWise     Conv_136                 1 1 560 883 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_137                 1 1 883 886 0=128 1=1 5=1 6=16384
Swish                    Mul_139                  1 1 886 566
Concat                   Concat_140               2 1 555 566 567
ShuffleChannel           Reshape_145              1 1 567 572 0=2
Slice                    Split_146                1 2 572 573 574 -23300=2,128,-233
Convolution              Conv_147                 1 1 574 889 0=128 1=1 5=1 6=16384
Swish                    Mul_149                  1 1 889 578
ConvolutionDepthWise     Conv_150                 1 1 578 892 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_151                 1 1 892 895 0=128 1=1 5=1 6=16384
Swish                    Mul_153                  1 1 895 584
Concat                   Concat_154               2 1 573 584 585
ShuffleChannel           Reshape_159              1 1 585 590 0=2
Slice                    Split_160                1 2 590 591 592 -23300=2,128,-233
Convolution              Conv_161                 1 1 592 898 0=128 1=1 5=1 6=16384
Swish                    Mul_163                  1 1 898 596
ConvolutionDepthWise     Conv_164                 1 1 596 901 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_165                 1 1 901 904 0=128 1=1 5=1 6=16384
Swish                    Mul_167                  1 1 904 602
Concat                   Concat_168               2 1 591 602 603
ShuffleChannel           Reshape_173              1 1 603 608 0=2
Slice                    Split_174                1 2 608 609 610 -23300=2,128,-233
Convolution              Conv_175                 1 1 610 907 0=128 1=1 5=1 6=16384
Swish                    Mul_177                  1 1 907 614
ConvolutionDepthWise     Conv_178                 1 1 614 910 0=128 1=3 4=1 5=1 6=1152 7=128
Convolution              Conv_179                 1 1 910 913 0=128 1=1 5=1 6=16384
Swish                    Mul_181                  1 1 913 620
Concat                   Concat_182               2 1 609 620 621
ShuffleChannel           Reshape_187              1 1 621 626 0=2
Split                    splitncnn_3              1 3 626 626_splitncnn_0 626_splitncnn_1 626_splitncnn_2
ConvolutionDepthWise     Conv_188                 1 1 626_splitncnn_2 916 0=256 1=3 3=2 4=1 5=1 6=2304 7=256
Convolution              Conv_189                 1 1 916 919 0=256 1=1 5=1 6=65536
Swish                    Mul_191                  1 1 919 632
Convolution              Conv_192                 1 1 626_splitncnn_1 922 0=256 1=1 5=1 6=65536
Swish                    Mul_194                  1 1 922 636
ConvolutionDepthWise     Conv_195                 1 1 636 925 0=256 1=3 3=2 4=1 5=1 6=2304 7=256
Convolution              Conv_196                 1 1 925 928 0=256 1=1 5=1 6=65536
Swish                    Mul_198                  1 1 928 642
Concat                   Concat_199               2 1 632 642 643
ShuffleChannel           Reshape_204              1 1 643 648 0=2
Slice                    Split_205                1 2 648 649 650 -23300=2,256,-233
Convolution              Conv_206                 1 1 650 931 0=256 1=1 5=1 6=65536
Swish                    Mul_208                  1 1 931 654
ConvolutionDepthWise     Conv_209                 1 1 654 934 0=256 1=3 4=1 5=1 6=2304 7=256
Convolution              Conv_210                 1 1 934 937 0=256 1=1 5=1 6=65536
Swish                    Mul_212                  1 1 937 660
Concat                   Concat_213               2 1 649 660 661
ShuffleChannel           Reshape_218              1 1 661 666 0=2
Slice                    Split_219                1 2 666 667 668 -23300=2,256,-233
Convolution              Conv_220                 1 1 668 940 0=256 1=1 5=1 6=65536
Swish                    Mul_222                  1 1 940 672
ConvolutionDepthWise     Conv_223                 1 1 672 943 0=256 1=3 4=1 5=1 6=2304 7=256
Convolution              Conv_224                 1 1 943 946 0=256 1=1 5=1 6=65536
Swish                    Mul_226                  1 1 946 678
Concat                   Concat_227               2 1 667 678 679
ShuffleChannel           Reshape_232              1 1 679 684 0=2
Slice                    Split_233                1 2 684 685 686 -23300=2,256,-233
Convolution              Conv_234                 1 1 686 949 0=256 1=1 5=1 6=65536
Swish                    Mul_236                  1 1 949 690
ConvolutionDepthWise     Conv_237                 1 1 690 952 0=256 1=3 4=1 5=1 6=2304 7=256
Convolution              Conv_238                 1 1 952 955 0=256 1=1 5=1 6=65536
Swish                    Mul_240                  1 1 955 696
Concat                   Concat_241               2 1 685 696 697
ShuffleChannel           Reshape_246              1 1 697 702 0=2
Convolution              Conv_247                 1 1 702 703 0=128 1=1 5=1 6=65536
Swish                    Mul_249                  1 1 703 705
Split                    splitncnn_4              1 2 705 705_splitncnn_0 705_splitncnn_1
Interp                   Resize_251               1 1 705_splitncnn_1 710 0=1 1=2.000000e+00 2=2.000000e+00
Concat                   Concat_252               2 1 710 626_splitncnn_0 711
Split                    splitncnn_5              1 2 711 711_splitncnn_0 711_splitncnn_1
Convolution              Conv_253                 1 1 711_splitncnn_1 712 0=64 1=1 5=1 6=24576
Swish                    Mul_255                  1 1 712 714
Convolution              Conv_256                 1 1 714 715 0=64 1=1 5=1 6=4096
Swish                    Mul_258                  1 1 715 717
Convolution              Conv_259                 1 1 717 718 0=64 1=3 4=1 5=1 6=36864
Swish                    Mul_261                  1 1 718 720
Convolution              Conv_262                 1 1 711_splitncnn_0 721 0=64 1=1 5=1 6=24576
Swish                    Mul_264                  1 1 721 723
Concat                   Concat_265               2 1 720 723 724
Convolution              Conv_266                 1 1 724 725 0=128 1=1 5=1 6=16384
Swish                    Mul_268                  1 1 725 727
Convolution              Conv_269                 1 1 727 728 0=128 1=1 5=1 6=16384
Swish                    Mul_271                  1 1 728 730
Split                    splitncnn_6              1 2 730 730_splitncnn_0 730_splitncnn_1
Interp                   Resize_273               1 1 730_splitncnn_1 735 0=1 1=2.000000e+00 2=2.000000e+00
Concat                   Concat_274               2 1 735 478_splitncnn_0 736
Split                    splitncnn_7              1 2 736 736_splitncnn_0 736_splitncnn_1
Convolution              Conv_275                 1 1 736_splitncnn_1 737 0=64 1=1 5=1 6=16384
Swish                    Mul_277                  1 1 737 739
Convolution              Conv_278                 1 1 739 740 0=64 1=1 5=1 6=4096
Swish                    Mul_280                  1 1 740 742
Convolution              Conv_281                 1 1 742 743 0=64 1=3 4=1 5=1 6=36864
Swish                    Mul_283                  1 1 743 745
Convolution              Conv_284                 1 1 736_splitncnn_0 746 0=64 1=1 5=1 6=16384
Swish                    Mul_286                  1 1 746 748
Concat                   Concat_287               2 1 745 748 749
Convolution              Conv_288                 1 1 749 750 0=128 1=1 5=1 6=16384
Swish                    Mul_290                  1 1 750 752
Split                    splitncnn_8              1 2 752 752_splitncnn_0 752_splitncnn_1
Convolution              Conv_291                 1 1 752_splitncnn_1 753 0=128 1=3 3=2 4=1 5=1 6=147456
Swish                    Mul_293                  1 1 753 755
Concat                   Concat_294               2 1 755 730_splitncnn_0 756
Split                    splitncnn_9              1 2 756 756_splitncnn_0 756_splitncnn_1
Convolution              Conv_295                 1 1 756_splitncnn_1 757 0=64 1=1 5=1 6=16384
Swish                    Mul_297                  1 1 757 759
Convolution              Conv_298                 1 1 759 760 0=64 1=1 5=1 6=4096
Swish                    Mul_300                  1 1 760 762
Convolution              Conv_301                 1 1 762 763 0=64 1=3 4=1 5=1 6=36864
Swish                    Mul_303                  1 1 763 765
Convolution              Conv_304                 1 1 756_splitncnn_0 766 0=64 1=1 5=1 6=16384
Swish                    Mul_306                  1 1 766 768
Concat                   Concat_307               2 1 765 768 769
Convolution              Conv_308                 1 1 769 770 0=128 1=1 5=1 6=16384
Swish                    Mul_310                  1 1 770 772
Split                    splitncnn_10             1 2 772 772_splitncnn_0 772_splitncnn_1
Convolution              Conv_311                 1 1 772_splitncnn_1 773 0=128 1=3 3=2 4=1 5=1 6=147456
Swish                    Mul_313                  1 1 773 775
Concat                   Concat_314               2 1 775 705_splitncnn_0 776
Split                    splitncnn_11             1 2 776 776_splitncnn_0 776_splitncnn_1
Convolution              Conv_315                 1 1 776_splitncnn_1 777 0=64 1=1 5=1 6=16384
Swish                    Mul_317                  1 1 777 779
Convolution              Conv_318                 1 1 779 780 0=64 1=1 5=1 6=4096
Swish                    Mul_320                  1 1 780 782
Convolution              Conv_321                 1 1 782 783 0=64 1=3 4=1 5=1 6=36864
Swish                    Mul_323                  1 1 783 785
Convolution              Conv_324                 1 1 776_splitncnn_0 786 0=64 1=1 5=1 6=16384
Swish                    Mul_326                  1 1 786 788
Concat                   Concat_327               2 1 785 788 789
Convolution              Conv_328                 1 1 789 790 0=128 1=1 5=1 6=16384
Swish                    Mul_330                  1 1 790 792
Convolution              Conv_331                 1 1 752_splitncnn_0 stride_8 0=48 1=1 5=1 6=6144
Convolution              Conv_332                 1 1 772_splitncnn_0 stride_16 0=48 1=1 5=1 6=6144
Convolution              Conv_333                 1 1 792 stride_32 0=48 1=1 5=1 6=6144
Reshape                  Reshape_573              1 1 stride_8 980 0=-1 1=16 2=3
Permute                  Transpose_574            1 1 980 981 0=1
Reshape                  Reshape_589              1 1 stride_16 982 0=-1 1=16 2=3
Permute                  Transpose_590            1 1 982 983 0=1
Reshape                  Reshape_605              1 1 stride_32 984 0=-1 1=16 2=3
Permute                  Transpose_606            1 1 984 985 0=1


================================================
FILE: ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/MainActivity.java
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

package com.tencent.ncnnyoloface;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.Spinner;

import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

public class MainActivity extends Activity implements SurfaceHolder.Callback
{
    public static final int REQUEST_CAMERA = 100;

    private NcnnYoloFace ncnnyoloface = new NcnnYoloFace();
    private int facing = 0;

    private Spinner spinnerModel;
    private Spinner spinnerCPUGPU;
    private int current_model = 0;
    private int current_cpugpu = 0;

    private SurfaceView cameraView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        cameraView = (SurfaceView) findViewById(R.id.cameraview);

        cameraView.getHolder().setFormat(PixelFormat.RGBA_8888);
        cameraView.getHolder().addCallback(this);

        Button buttonSwitchCamera = (Button) findViewById(R.id.buttonSwitchCamera);
        buttonSwitchCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                int new_facing = 1 - facing;

                ncnnyoloface.closeCamera();

                ncnnyoloface.openCamera(new_facing);

                facing = new_facing;
            }
        });

        spinnerModel = (Spinner) findViewById(R.id.spinnerModel);
        spinnerModel.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id)
            {
                if (position != current_model)
                {
                    current_model = position;
                    reload();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
            }
        });

        spinnerCPUGPU = (Spinner) findViewById(R.id.spinnerCPUGPU);
        spinnerCPUGPU.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id)
            {
                if (position != current_cpugpu)
                {
                    current_cpugpu = position;
                    reload();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
            }
        });

        reload();
    }

    private void reload()
    {
        boolean ret_init = ncnnyoloface.loadModel(getAssets(), current_model, current_cpugpu);
        if (!ret_init)
        {
            Log.e("MainActivity", "ncnnyoloface loadModel failed");
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {
        ncnnyoloface.setOutputWindow(holder.getSurface());
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
    }

    @Override
    public void onResume()
    {
        super.onResume();

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED)
        {
            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA}, REQUEST_CAMERA);
        }

        ncnnyoloface.openCamera(facing);
    }

    @Override
    public void onPause()
    {
        super.onPause();

        ncnnyoloface.closeCamera();
    }
}


================================================
FILE: ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/NcnnYoloFace.java
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

package com.tencent.ncnnyoloface;

import android.content.res.AssetManager;
import android.view.Surface;

public class NcnnYoloFace
{
    public native boolean loadModel(AssetManager mgr, int modelid, int cpugpu);
    public native boolean openCamera(int facing);
    public native boolean closeCamera();
    public native boolean setOutputWindow(Surface surface);

    static {
        System.loadLibrary("ncnnyoloface");
    }
}


================================================
FILE: ncnn-android-yolov5_face/app/src/main/jni/CMakeLists.txt
================================================
project(ncnnyoloface)

cmake_minimum_required(VERSION 3.10)

set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-android/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc)

set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20210322-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)

add_library(ncnnyoloface SHARED yolofacencnn.cpp yoloface.cpp ndkcamera.cpp)

target_link_libraries(ncnnyoloface ncnn ${OpenCV_LIBS} camera2ndk mediandk)


================================================
FILE: ncnn-android-yolov5_face/app/src/main/jni/ndkcamera.cpp
================================================
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include "ndkcamera.h"

#include <string>

#include <android/log.h>

#include <opencv2/core/core.hpp>

#include "mat.h"

static void onDisconnected(void* context, ACameraDevice* device)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onDisconnected %p", device);
}

static void onError(void* context, ACameraDevice* device, int error)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onError %p %d", device, error);
}

static void onImageAvailable(void* context, AImageReader* reader)
{
//     __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onImageAvailable %p", reader);

    AImage* image = 0;
    media_status_t status = AImageReader_acquireLatestImage(reader, &image);

    if (status != AMEDIA_OK)
    {
        // error
        return;
    }

    int32_t format;
    AImage_getFormat(image, &format);

    // assert format == AIMAGE_FORMAT_YUV_420_888

    int32_t width = 0;
    int32_t height = 0;
    AImage_getWidth(image, &width);
    AImage_getHeight(image, &height);

    int32_t y_pixelStride = 0;
    int32_t u_pixelStride = 0;
    int32_t v_pixelStride = 0;
    AImage_getPlanePixelStride(image, 0, &y_pixelStride);
    AImage_getPlanePixelStride(image, 1, &u_pixelStride);
    AImage_getPlanePixelStride(image, 2, &v_pixelStride);

    int32_t y_rowStride = 0;
    int32_t u_rowStride = 0;
    int32_t v_rowStride = 0;
    AImage_getPlaneRowStride(image, 0, &y_rowStride);
    AImage_getPlaneRowStride(image, 1, &u_rowStride);
    AImage_getPlaneRowStride(image, 2, &v_rowStride);

    uint8_t* y_data = 0;
    uint8_t* u_data = 0;
    uint8_t* v_data = 0;
    int y_len = 0;
    int u_len = 0;
    int v_len = 0;
    AImage_getPlaneData(image, 0, &y_data, &y_len);
    AImage_getPlaneData(image, 1, &u_data, &u_len);
    AImage_getPlaneData(image, 2, &v_data, &v_len);

    if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width)
    {
        // already nv21  :)
        ((NdkCamera*)context)->on_image((unsigned char*)y_data, (int)width, (int)height);
    }
    else
    {
        // construct nv21
        unsigned char* nv21 = new unsigned char[width * height + width * height / 2];
        {
            // Y
            unsigned char* yptr = nv21;
            for (int y=0; y<height; y++)
            {
                const unsigned char* y_data_ptr = y_data + y_rowStride * y;
                for (int x=0; x<width; x++)
                {
                    yptr[0] = y_data_ptr[0];
                    yptr++;
                    y_data_ptr += y_pixelStride;
                }
            }

            // UV
            unsigned char* uvptr = nv21 + width * height;
            for (int y=0; y<height/2; y++)
            {
                const unsigned char* v_data_ptr = v_data + v_rowStride * y;
                const unsigned char* u_data_ptr = u_data + u_rowStride * y;
                for (int x=0; x<width/2; x++)
                {
                    uvptr[0] = v_data_ptr[0];
                    uvptr[1] = u_data_ptr[0];
                    uvptr += 2;
                    v_data_ptr += v_pixelStride;
                    u_data_ptr += u_pixelStride;
                }
            }
        }

        ((NdkCamera*)context)->on_image((unsigned char*)nv21, (int)width, (int)height);

        delete[] nv21;
    }

    AImage_delete(image);
}

static void onSessionActive(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionActive %p", session);
}

static void onSessionReady(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionReady %p", session);
}

static void onSessionClosed(void* context, ACameraCaptureSession *session)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onSessionClosed %p", session);
}

void onCaptureFailed(void* context, ACameraCaptureSession* session, ACaptureRequest* request, ACameraCaptureFailure* failure)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureFailed %p %p %p", session, request, failure);
}

void onCaptureSequenceCompleted(void* context, ACameraCaptureSession* session, int sequenceId, int64_t frameNumber)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureSequenceCompleted %p %d %ld", session, sequenceId, frameNumber);
}

void onCaptureSequenceAborted(void* context, ACameraCaptureSession* session, int sequenceId)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureSequenceAborted %p %d", session, sequenceId);
}

void onCaptureCompleted(void* context, ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result)
{
//     __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureCompleted %p %p %p", session, request, result);
}

NdkCamera::NdkCamera()
{
    camera_facing = 0;
    camera_orientation = 0;

    camera_manager = 0;
    camera_device = 0;
    image_reader = 0;
    image_reader_surface = 0;
    image_reader_target = 0;
    capture_request = 0;
    capture_session_output_container = 0;
    capture_session_output = 0;
    capture_session = 0;


    // setup imagereader and its surface
    {
        AImageReader_new(640, 480, AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);

        AImageReader_ImageListener listener;
        listener.context = this;
        listener.onImageAvailable = onImageAvailable;

        AImageReader_setImageListener(image_reader, &listener);

        AImageReader_getWindow(image_reader, &image_reader_surface);

        ANativeWindow_acquire(image_reader_surface);
    }
}

NdkCamera::~NdkCamera()
{
    close();

    if (image_reader)
    {
        AImageReader_delete(image_reader);
        image_reader = 0;
    }

    if (image_reader_surface)
    {
        ANativeWindow_release(image_reader_surface);
        image_reader_surface = 0;
    }
}

int NdkCamera::open(int _camera_facing)
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "open");

    camera_facing = _camera_facing;

    camera_manager = ACameraManager_create();

    // find front camera
    std::string camera_id;
    {
        ACameraIdList* camera_id_list = 0;
        ACameraManager_getCameraIdList(camera_manager, &camera_id_list);

        for (int i = 0; i < camera_id_list->numCameras; ++i)
        {
            const char* id = camera_id_list->cameraIds[i];
            ACameraMetadata* camera_metadata = 0;
            ACameraManager_getCameraCharacteristics(camera_manager, id, &camera_metadata);

            // query faceing
            acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT;
            {
                ACameraMetadata_const_entry e = { 0 };
                ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_LENS_FACING, &e);
                facing = (acamera_metadata_enum_android_lens_facing_t)e.data.u8[0];
            }

            if (camera_facing == 0 && facing != ACAMERA_LENS_FACING_FRONT)
            {
                ACameraMetadata_free(camera_metadata);
                continue;
            }

            if (camera_facing == 1 && facing != ACAMERA_LENS_FACING_BACK)
            {
                ACameraMetadata_free(camera_metadata);
                continue;
            }

            camera_id = id;

            // query orientation
            int orientation = 0;
            {
                ACameraMetadata_const_entry e = { 0 };
                ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_SENSOR_ORIENTATION, &e);

                orientation = (int)e.data.i32[0];
            }

            camera_orientation = orientation;

            ACameraMetadata_free(camera_metadata);

            break;
        }

        ACameraManager_deleteCameraIdList(camera_id_list);
    }

    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "open %s %d", camera_id.c_str(), camera_orientation);

    // open camera
    {
        ACameraDevice_StateCallbacks camera_device_state_callbacks;
        camera_device_state_callbacks.context = this;
        camera_device_state_callbacks.onDisconnected = onDisconnected;
        camera_device_state_callbacks.onError = onError;

        ACameraManager_openCamera(camera_manager, camera_id.c_str(), &camera_device_state_callbacks, &camera_device);
    }

    // capture request
    {
        ACameraDevice_createCaptureRequest(camera_device, TEMPLATE_PREVIEW, &capture_request);

        ACameraOutputTarget_create(image_reader_surface, &image_reader_target);
        ACaptureRequest_addTarget(capture_request, image_reader_target);
    }

    // capture session
    {
        ACameraCaptureSession_stateCallbacks camera_capture_session_state_callbacks;
        camera_capture_session_state_callbacks.context = this;
        camera_capture_session_state_callbacks.onActive = onSessionActive;
        camera_capture_session_state_callbacks.onReady = onSessionReady;
        camera_capture_session_state_callbacks.onClosed = onSessionClosed;

        ACaptureSessionOutputContainer_create(&capture_session_output_container);

        ACaptureSessionOutput_create(image_reader_surface, &capture_session_output);

        ACaptureSessionOutputContainer_add(capture_session_output_container, capture_session_output);

        ACameraDevice_createCaptureSession(camera_device, capture_session_output_container, &camera_capture_session_state_callbacks, &capture_session);

        ACameraCaptureSession_captureCallbacks camera_capture_session_capture_callbacks;
        camera_capture_session_capture_callbacks.context = this;
        camera_capture_session_capture_callbacks.onCaptureStarted = 0;
        camera_capture_session_capture_callbacks.onCaptureProgressed = 0;
        camera_capture_session_capture_callbacks.onCaptureCompleted = onCaptureCompleted;
        camera_capture_session_capture_callbacks.onCaptureFailed = onCaptureFailed;
        camera_capture_session_capture_callbacks.onCaptureSequenceCompleted = onCaptureSequenceCompleted;
        camera_capture_session_capture_callbacks.onCaptureSequenceAborted = onCaptureSequenceAborted;
        camera_capture_session_capture_callbacks.onCaptureBufferLost = 0;

        ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, nullptr);
    }

    return 0;
}

void NdkCamera::close()
{
    __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "close");

    if (capture_session)
    {
        ACameraCaptureSession_stopRepeating(capture_session);
        ACameraCaptureSession_close(capture_session);
        capture_session = 0;
    }

    if (camera_device)
    {
        ACameraDevice_close(camera_device);
        camera_device = 0;
    }

    if (capture_session_output_container)
    {
        ACaptureSessionOutputContainer_free(capture_session_output_container);
        capture_session_output_container = 0;
    }

    if (capture_session_output)
    {
        ACaptureSessionOutput_free(capture_session_output);
        capture_session_output = 0;
    }

    if (capture_request)
    {
        ACaptureRequest_free(capture_request);
        capture_request = 0;
    }

    if (image_reader_target)
    {
        ACameraOutputTarget_free(image_reader_target);
        image_reader_target = 0;
    }

    if (camera_manager)
    {
        ACameraManager_delete(camera_manager);
        camera_manager = 0;
    }
}

void NdkCamera::on_image(const cv::Mat& rgb) const
{
}

void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const
{
    // rotate nv21
    int w = 0;
    int h = 0;
    int rotate_type = 0;
    {
        if (camera_orientation == 0)
        {
            w = nv21_width;
            h = nv21_height;
            rotate_type = camera_facing == 0 ? 2 : 1;
        }
        if (camera_orientation == 90)
        {
            w = nv21_height;
            h = nv21_width;
            rotate_type = camera_facing == 0 ? 5 : 6;
        }
        if (camera_orientation == 180)
        {
            w = nv21_width;
            h = nv21_height;
            rotate_type = camera_facing == 0 ? 4 : 3;
        }
        if (camera_orientation == 270)
        {
            w = nv21_height;
            h = nv21_width;
            rotate_type = camera_facing == 0 ? 7 : 8;
        }
    }

    cv::Mat nv21_rotated(h + h / 2, w, CV_8UC1);
    ncnn::kanna_rotate_yuv420sp(nv21, nv21_width, nv21_height, nv21_rotated.data, w, h, rotate_type);

    // nv21_rotated to rgb
    cv::Mat rgb(h, w, CV_8UC3);
    ncnn::yuv420sp2rgb(nv21_rotated.data, w, h, rgb.data);

    on_image(rgb);
}

static const int NDKCAMERAWINDOW_ID = 233;

NdkCameraWindow::NdkCameraWindow() : NdkCamera()
{
    sensor_manager = 0;
    sensor_event_queue = 0;
    accelerometer_sensor = 0;
    win = 0;

    accelerometer_orientation = 0;

    // sensor
    sensor_manager = ASensorManager_getInstance();

    accelerometer_sensor = ASensorManager_getDefaultSensor(sensor_manager, ASENSOR_TYPE_ACCELEROMETER);
}

NdkCameraWindow::~NdkCameraWindow()
{
    if (accelerometer_sensor)
    {
        ASensorEventQueue_disableSensor(sensor_event_queue, accelerometer_sensor);
        accelerometer_sensor = 0;
    }

    if (sensor_event_queue)
    {
        ASensorManager_destroyEventQueue(sensor_manager, sensor_event_queue);
        sensor_event_queue = 0;
    }

    if (win)
    {
        ANativeWindow_release(win);
    }
}

void NdkCameraWindow::set_window(ANativeWindow* _win)
{
    if (win)
    {
        ANativeWindow_release(win);
    }

    win = _win;
    ANativeWindow_acquire(win);
}

void NdkCameraWindow::on_image_render(cv::Mat& rgb) const
{
}

void NdkCameraWindow::on_image(const unsigned char* nv21, int nv21_width, int nv21_height) const
{
    // resolve orientation from camera_orientation and accelerometer_sensor
    {
        if (!sensor_event_queue)
        {
            sensor_event_queue = ASensorManager_createEventQueue(sensor_manager, ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS), NDKCAMERAWINDOW_ID, 0, 0);

            ASensorEventQueue_enableSensor(sensor_event_queue, accelerometer_sensor);
        }

        int id = ALooper_pollAll(0, 0, 0, 0);
        if (id == NDKCAMERAWINDOW_ID)
        {
            ASensorEvent e[8];
            ssize_t num_event = 0;
            while (ASensorEventQueue_hasEvents(sensor_event_queue) == 1)
            {
                num_event = ASensorEventQueue_getEvents(sensor_event_queue, e, 8);
                if (num_event < 0)
                    break;
            }

            if (num_event > 0)
            {
                float acceleration_x = e[num_event - 1].acceleration.x;
                float acceleration_y = e[num_event - 1].acceleration.y;
                float acceleration_z = e[num_event - 1].acceleration.z;
//                 __android_log_print(ANDROID_LOG_WARN, "NdkCameraWindow", "x = %f, y = %f, z = %f", x, y, z);

                if (acceleration_y > 7)
                {
                    accelerometer_orientation = 0;
                }
                if (acceleration_x < -7)
                {
                    accelerometer_orientation = 90;
                }
                if (acceleration_y < -7)
                {
                    accelerometer_orientation = 180;
                }
                if (acceleration_x > 7)
                {
                    accelerometer_orientation = 270;
                }
            }
        }
    }

    // roi crop and rotate nv21
    int nv21_roi_x = 0;
    int nv21_roi_y = 0;
    int nv21_roi_w = 0;
    int nv21_roi_h = 0;
    int roi_x = 0;
    int roi_y = 0;
    int roi_w = 0;
    int roi_h = 0;
    int rotate_type = 0;
    int render_w = 0;
    int render_h = 0;
    int render_rotate_type = 0;
    {
        int win_w = ANativeWindow_getWidth(win);
        int win_h = ANativeWindow_getHeight(win);

        if (accelerometer_orientation == 90 || accelerometer_orientation == 270)
        {
            std::swap(win_w, win_h);
        }

        const int final_orientation = (camera_orientation + accelerometer_orientation) % 360;

        if (final_orientation == 0 || final_orientation == 180)
        {
            if (win_w * nv21_height > win_h * nv21_width)
            {
                roi_w = nv21_width;
                roi_h = (nv21_width * win_h / win_w) / 2 * 2;
                roi_x = 0;
                roi_y = ((nv21_height - roi_h) / 2) / 2 * 2;
            }
            else
            {
                roi_h = nv21_height;
                roi_w = (nv21_height * win_w / win_h) / 2 * 2;
                roi_x = ((nv21_width - roi_w) / 2) / 2 * 2;
                roi_y = 0;
            }

            nv21_roi_x = roi_x;
            nv21_roi_y = roi_y;
            nv21_roi_w = roi_w;
            nv21_roi_h = roi_h;
        }
        if (final_orientation == 90 || final_orientation == 270)
        {
            if (win_w * nv21_width > win_h * nv21_height)
            {
                roi_w = nv21_height;
                roi_h = (nv21_height * win_h / win_w) / 2 * 2;
                roi_x = 0;
                roi_y = ((nv21_width - roi_h) / 2) / 2 * 2;
            }
            else
            {
                roi_h = nv21_width;
                roi_w = (nv21_width * win_w / win_h) / 2 * 2;
                roi_x = ((nv21_height - roi_w) / 2) / 2 * 2;
                roi_y = 0;
            }

            nv21_roi_x = roi_y;
            nv21_roi_y = roi_x;
            nv21_roi_w = roi_h;
            nv21_roi_h = roi_w;
        }

        if (camera_facing == 0)
        {
            if (camera_orientation == 0 && accelerometer_orientation == 0)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 90)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 180)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 0 && accelerometer_orientation == 270)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 0)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 90)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 180)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 90 && accelerometer_orientation == 270)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 0)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 90)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 180)
            {
                rotate_type = 2;
            }
            if (camera_orientation == 180 && accelerometer_orientation == 270)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 0)
            {
                rotate_type = 7;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 90)
            {
                rotate_type = 4;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 180)
            {
                rotate_type = 5;
            }
            if (camera_orientation == 270 && accelerometer_orientation == 270)
            {
                rotate_type = 2;
            }
        }
        else
        {
            if (final_orientation == 0)
            {
                rotate_type = 1;
            }
            if (final_orientation == 90)
            {
                rotate_type = 6;
            }
            if (final_orientation == 180)
            {
                rotate_type = 3;
     
Download .txt
gitextract_pop_0yey/

├── README.md
├── facemesh.onnx
├── ncnn-android-scrfd-master/
│   ├── README.md
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   ├── facemesh-op.param
│   │           │   ├── facemesh-op2.param
│   │           │   ├── faceseg-op.param
│   │           │   ├── scrfd_1g-opt2.param
│   │           │   └── scrfd_500m-opt2.param
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── scrfdncnn/
│   │           │               ├── MainActivity.java
│   │           │               └── SCRFDNcnn.java
│   │           ├── jni/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── ndkcamera.cpp
│   │           │   ├── ndkcamera.h
│   │           │   ├── scrfd.cpp
│   │           │   ├── scrfd.h
│   │           │   └── scrfdncnn.cpp
│   │           └── res/
│   │               ├── layout/
│   │               │   └── main.xml
│   │               └── values/
│   │                   └── strings.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── local.properties
│   └── settings.gradle
├── ncnn-android-yolov5_face/
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   ├── yolov5n-0.5.param
│   │           │   └── yolov5n.param
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── ncnnyoloface/
│   │           │               ├── MainActivity.java
│   │           │               └── NcnnYoloFace.java
│   │           ├── jni/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── ndkcamera.cpp
│   │           │   ├── ndkcamera.h
│   │           │   ├── yoloface.cpp
│   │           │   ├── yoloface.h
│   │           │   └── yolofacencnn.cpp
│   │           └── res/
│   │               ├── layout/
│   │               │   └── main.xml
│   │               └── values/
│   │                   └── strings.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── local.properties
│   └── settings.gradle
└── ncnn-android-yolov7_face/
    ├── app/
    │   ├── build.gradle
    │   └── src/
    │       └── main/
    │           ├── AndroidManifest.xml
    │           ├── assets/
    │           │   ├── yolov7-lite-e.param
    │           │   └── yolov7-tiny.param
    │           ├── java/
    │           │   └── com/
    │           │       └── tencent/
    │           │           └── ncnnyoloface/
    │           │               ├── MainActivity.java
    │           │               └── NcnnYoloFace.java
    │           ├── jni/
    │           │   ├── CMakeLists.txt
    │           │   ├── ndkcamera.cpp
    │           │   ├── ndkcamera.h
    │           │   ├── yoloface.cpp
    │           │   ├── yoloface.h
    │           │   └── yolofacencnn.cpp
    │           └── res/
    │               ├── layout/
    │               │   └── main.xml
    │               └── values/
    │                   └── strings.xml
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── local.properties
    └── settings.gradle
Download .txt
SYMBOL INDEX (127 symbols across 21 files)

FILE: ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/MainActivity.java
  class MainActivity (line 35) | public class MainActivity extends Activity implements SurfaceHolder.Call...
    method onCreate (line 50) | @Override
    method reload (line 117) | private void reload()
    method surfaceChanged (line 126) | @Override
    method surfaceCreated (line 132) | @Override
    method surfaceDestroyed (line 137) | @Override
    method onResume (line 142) | @Override
    method onPause (line 155) | @Override

FILE: ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/SCRFDNcnn.java
  class SCRFDNcnn (line 20) | public class SCRFDNcnn
    method loadModel (line 22) | public native boolean loadModel(AssetManager mgr, int modelid, int cpu...
    method openCamera (line 23) | public native boolean openCamera(int facing);
    method closeCamera (line 24) | public native boolean closeCamera();
    method setOutputWindow (line 25) | public native boolean setOutputWindow(Surface surface);

FILE: ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.cpp
  function onDisconnected (line 25) | static void onDisconnected(void* context, ACameraDevice* device)
  function onError (line 30) | static void onError(void* context, ACameraDevice* device, int error)
  function onImageAvailable (line 35) | static void onImageAvailable(void* context, AImageReader* reader)
  function onSessionActive (line 130) | static void onSessionActive(void* context, ACameraCaptureSession *session)
  function onSessionReady (line 135) | static void onSessionReady(void* context, ACameraCaptureSession *session)
  function onSessionClosed (line 140) | static void onSessionClosed(void* context, ACameraCaptureSession *session)
  function onCaptureFailed (line 145) | void onCaptureFailed(void* context, ACameraCaptureSession* session, ACap...
  function onCaptureSequenceCompleted (line 150) | void onCaptureSequenceCompleted(void* context, ACameraCaptureSession* se...
  function onCaptureSequenceAborted (line 155) | void onCaptureSequenceAborted(void* context, ACameraCaptureSession* sess...
  function onCaptureCompleted (line 160) | void onCaptureCompleted(void* context, ACameraCaptureSession* session, A...

FILE: ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.h
  function class (line 28) | class NdkCamera
  function class (line 58) | class NdkCameraWindow : public NdkCamera

FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfd.cpp
  function intersection_area (line 23) | static inline float intersection_area(const FaceObject& a, const FaceObj...
  function qsort_descent_inplace (line 29) | static void qsort_descent_inplace(std::vector<FaceObject>& faceobjects, ...
  function qsort_descent_inplace (line 66) | static void qsort_descent_inplace(std::vector<FaceObject>& faceobjects)
  function nms_sorted_bboxes (line 74) | static void nms_sorted_bboxes(const std::vector<FaceObject>& faceobjects...
  function generate_anchors (line 109) | static ncnn::Mat generate_anchors(int base_size, const ncnn::Mat& ratios...
  function generate_proposals (line 146) | static void generate_proposals(const ncnn::Mat& anchors, int feat_stride...

FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfd.h
  type FaceObject (line 22) | struct FaceObject
  function class (line 29) | class SCRFD

FILE: ncnn-android-scrfd-master/app/src/main/jni/scrfdncnn.cpp
  function draw_unsupported (line 40) | static int draw_unsupported(cv::Mat& rgb)
  function draw_fps (line 59) | static int draw_fps(cv::Mat& rgb)
  class MyNdkCamera (line 116) | class MyNdkCamera : public NdkCameraWindow
  function JNIEXPORT (line 148) | JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 157) | JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 173) | JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_loadMode...
  function JNIEXPORT (line 215) | JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_openCame...
  function JNIEXPORT (line 228) | JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_closeCam...
  function JNIEXPORT (line 238) | JNIEXPORT jboolean JNICALL Java_com_tencent_scrfdncnn_SCRFDNcnn_setOutpu...

FILE: ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/MainActivity.java
  class MainActivity (line 35) | public class MainActivity extends Activity implements SurfaceHolder.Call...
    method onCreate (line 50) | @Override
    method reload (line 117) | private void reload()
    method surfaceChanged (line 126) | @Override
    method surfaceCreated (line 132) | @Override
    method surfaceDestroyed (line 137) | @Override
    method onResume (line 142) | @Override
    method onPause (line 155) | @Override

FILE: ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/NcnnYoloFace.java
  class NcnnYoloFace (line 20) | public class NcnnYoloFace
    method loadModel (line 22) | public native boolean loadModel(AssetManager mgr, int modelid, int cpu...
    method openCamera (line 23) | public native boolean openCamera(int facing);
    method closeCamera (line 24) | public native boolean closeCamera();
    method setOutputWindow (line 25) | public native boolean setOutputWindow(Surface surface);

FILE: ncnn-android-yolov5_face/app/src/main/jni/ndkcamera.cpp
  function onDisconnected (line 25) | static void onDisconnected(void* context, ACameraDevice* device)
  function onError (line 30) | static void onError(void* context, ACameraDevice* device, int error)
  function onImageAvailable (line 35) | static void onImageAvailable(void* context, AImageReader* reader)
  function onSessionActive (line 130) | static void onSessionActive(void* context, ACameraCaptureSession *session)
  function onSessionReady (line 135) | static void onSessionReady(void* context, ACameraCaptureSession *session)
  function onSessionClosed (line 140) | static void onSessionClosed(void* context, ACameraCaptureSession *session)
  function onCaptureFailed (line 145) | void onCaptureFailed(void* context, ACameraCaptureSession* session, ACap...
  function onCaptureSequenceCompleted (line 150) | void onCaptureSequenceCompleted(void* context, ACameraCaptureSession* se...
  function onCaptureSequenceAborted (line 155) | void onCaptureSequenceAborted(void* context, ACameraCaptureSession* sess...
  function onCaptureCompleted (line 160) | void onCaptureCompleted(void* context, ACameraCaptureSession* session, A...

FILE: ncnn-android-yolov5_face/app/src/main/jni/ndkcamera.h
  function class (line 28) | class NdkCamera
  function class (line 58) | class NdkCameraWindow : public NdkCamera

FILE: ncnn-android-yolov5_face/app/src/main/jni/yoloface.cpp
  function intersection_area (line 24) | static inline float intersection_area(const Object& a, const Object& b)
  function qsort_descent_inplace (line 30) | static void qsort_descent_inplace(std::vector<Object>& faceobjects, int ...
  function qsort_descent_inplace (line 67) | static void qsort_descent_inplace(std::vector<Object>& faceobjects)
  function nms_sorted_bboxes (line 75) | static void nms_sorted_bboxes(const std::vector<Object>& faceobjects, st...
  function sigmoid (line 109) | static inline float sigmoid(float x)
  function generate_proposals (line 114) | static void generate_proposals(const ncnn::Mat& anchors, int stride, con...

FILE: ncnn-android-yolov5_face/app/src/main/jni/yoloface.h
  type Object (line 22) | struct Object
  function class (line 31) | class YoloFace

FILE: ncnn-android-yolov5_face/app/src/main/jni/yolofacencnn.cpp
  function draw_unsupported (line 40) | static int draw_unsupported(cv::Mat& rgb)
  function draw_fps (line 59) | static int draw_fps(cv::Mat& rgb)
  class MyNdkCamera (line 116) | class MyNdkCamera : public NdkCameraWindow
  function JNIEXPORT (line 148) | JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 157) | JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 173) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_lo...
  function JNIEXPORT (line 230) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_op...
  function JNIEXPORT (line 243) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_cl...
  function JNIEXPORT (line 253) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_se...

FILE: ncnn-android-yolov7_face/app/src/main/java/com/tencent/ncnnyoloface/MainActivity.java
  class MainActivity (line 35) | public class MainActivity extends Activity implements SurfaceHolder.Call...
    method onCreate (line 50) | @Override
    method reload (line 117) | private void reload()
    method surfaceChanged (line 126) | @Override
    method surfaceCreated (line 132) | @Override
    method surfaceDestroyed (line 137) | @Override
    method onResume (line 142) | @Override
    method onPause (line 155) | @Override

FILE: ncnn-android-yolov7_face/app/src/main/java/com/tencent/ncnnyoloface/NcnnYoloFace.java
  class NcnnYoloFace (line 20) | public class NcnnYoloFace
    method loadModel (line 22) | public native boolean loadModel(AssetManager mgr, int modelid, int cpu...
    method openCamera (line 23) | public native boolean openCamera(int facing);
    method closeCamera (line 24) | public native boolean closeCamera();
    method setOutputWindow (line 25) | public native boolean setOutputWindow(Surface surface);

FILE: ncnn-android-yolov7_face/app/src/main/jni/ndkcamera.cpp
  function onDisconnected (line 25) | static void onDisconnected(void* context, ACameraDevice* device)
  function onError (line 30) | static void onError(void* context, ACameraDevice* device, int error)
  function onImageAvailable (line 35) | static void onImageAvailable(void* context, AImageReader* reader)
  function onSessionActive (line 130) | static void onSessionActive(void* context, ACameraCaptureSession *session)
  function onSessionReady (line 135) | static void onSessionReady(void* context, ACameraCaptureSession *session)
  function onSessionClosed (line 140) | static void onSessionClosed(void* context, ACameraCaptureSession *session)
  function onCaptureFailed (line 145) | void onCaptureFailed(void* context, ACameraCaptureSession* session, ACap...
  function onCaptureSequenceCompleted (line 150) | void onCaptureSequenceCompleted(void* context, ACameraCaptureSession* se...
  function onCaptureSequenceAborted (line 155) | void onCaptureSequenceAborted(void* context, ACameraCaptureSession* sess...
  function onCaptureCompleted (line 160) | void onCaptureCompleted(void* context, ACameraCaptureSession* session, A...

FILE: ncnn-android-yolov7_face/app/src/main/jni/ndkcamera.h
  function class (line 28) | class NdkCamera
  function class (line 58) | class NdkCameraWindow : public NdkCamera

FILE: ncnn-android-yolov7_face/app/src/main/jni/yoloface.cpp
  function intersection_area (line 24) | static inline float intersection_area(const Object& a, const Object& b)
  function qsort_descent_inplace (line 30) | static void qsort_descent_inplace(std::vector<Object>& faceobjects, int ...
  function qsort_descent_inplace (line 67) | static void qsort_descent_inplace(std::vector<Object>& faceobjects)
  function nms_sorted_bboxes (line 75) | static void nms_sorted_bboxes(const std::vector<Object>& faceobjects, st...
  function sigmoid (line 109) | static inline float sigmoid(float x)
  function generate_proposals (line 114) | static void generate_proposals(const ncnn::Mat& anchors, int stride, con...

FILE: ncnn-android-yolov7_face/app/src/main/jni/yoloface.h
  type Landmarks (line 21) | struct Landmarks
  type Object (line 27) | struct Object
  function class (line 36) | class YoloFace

FILE: ncnn-android-yolov7_face/app/src/main/jni/yolofacencnn.cpp
  function draw_unsupported (line 40) | static int draw_unsupported(cv::Mat& rgb)
  function draw_fps (line 59) | static int draw_fps(cv::Mat& rgb)
  class MyNdkCamera (line 116) | class MyNdkCamera : public NdkCameraWindow
  function JNIEXPORT (line 148) | JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 157) | JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved)
  function JNIEXPORT (line 173) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_lo...
  function JNIEXPORT (line 233) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_op...
  function JNIEXPORT (line 246) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_cl...
  function JNIEXPORT (line 256) | JNIEXPORT jboolean JNICALL Java_com_tencent_ncnnyoloface_NcnnYoloFace_se...
Condensed preview — 69 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (348K chars).
[
  {
    "path": "README.md",
    "chars": 832,
    "preview": "# ncnn_Android_face\nFace detect and segmentation, facemesh by ncnn  \n\n## model support:  \n1.scrfd  \n2.yolov5-face  \n3.yo"
  },
  {
    "path": "ncnn-android-scrfd-master/README.md",
    "chars": 1328,
    "preview": "# ncnn-android-scrfd\n\nThe SCRFD face detection\n\nThis is a sample ncnn android project, it depends on ncnn library and op"
  },
  {
    "path": "ncnn-android-scrfd-master/app/build.gradle",
    "chars": 482,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion \"29.0.2\"\n\n    defaultC"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/AndroidManifest.xml",
    "chars": 800,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      packag"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/assets/facemesh-op.param",
    "chars": 11452,
    "preview": "7767517\n123 144\nInput            input.1                  0 1 input.1\nMemoryData       200                      0 1 200 "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/assets/facemesh-op2.param",
    "chars": 14558,
    "preview": "7767517\n166 206\nInput                    input                    0 1 input\nConvolution              550                "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/assets/faceseg-op.param",
    "chars": 13171,
    "preview": "7767517\n161 189\nInput                    input.1                  0 1 input\nConvolution              Conv_14            "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/assets/scrfd_1g-opt2.param",
    "chars": 8460,
    "preview": "7767517\n99 108\nInput                    input.1                  0 1 input.1\nConvolution              Conv_0            "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/assets/scrfd_500m-opt2.param",
    "chars": 8832,
    "preview": "7767517\n103 112\nInput                    input.1                  0 1 input.1\nConvolution              Conv_0           "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/MainActivity.java",
    "chars": 4843,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/java/com/tencent/scrfdncnn/SCRFDNcnn.java",
    "chars": 1133,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/CMakeLists.txt",
    "chars": 445,
    "preview": "project(scrfdncnn)\n\ncmake_minimum_required(VERSION 3.10)\n\nset(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-android"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.cpp",
    "chars": 24104,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/ndkcamera.h",
    "chars": 2328,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/scrfd.cpp",
    "chars": 20918,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/scrfd.h",
    "chars": 1677,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/jni/scrfdncnn.cpp",
    "chars": 6095,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/res/layout/main.xml",
    "chars": 1402,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        "
  },
  {
    "path": "ncnn-android-scrfd-master/app/src/main/res/values/strings.xml",
    "chars": 328,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">scrfdncnn</string>\n    <string-array name"
  },
  {
    "path": "ncnn-android-scrfd-master/build.gradle",
    "chars": 335,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    re"
  },
  {
    "path": "ncnn-android-scrfd-master/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Sun Sep 08 23:09:42 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "ncnn-android-scrfd-master/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "ncnn-android-scrfd-master/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "ncnn-android-scrfd-master/local.properties",
    "chars": 325,
    "preview": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local con"
  },
  {
    "path": "ncnn-android-scrfd-master/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "ncnn-android-yolov5_face/app/build.gradle",
    "chars": 485,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion \"29.0.2\"\n\n    defaultC"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/AndroidManifest.xml",
    "chars": 803,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      packag"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/assets/yolov5n-0.5.param",
    "chars": 17139,
    "preview": "7767517\n224 251\nInput                    data                     0 1 data\nConvolution              Conv_0              "
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/assets/yolov5n.param",
    "chars": 17239,
    "preview": "7767517\n224 251\nInput                    data                     0 1 data\nConvolution              Conv_0              "
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/MainActivity.java",
    "chars": 4876,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/java/com/tencent/ncnnyoloface/NcnnYoloFace.java",
    "chars": 1142,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/CMakeLists.txt",
    "chars": 460,
    "preview": "project(ncnnyoloface)\n\ncmake_minimum_required(VERSION 3.10)\n\nset(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-andr"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/ndkcamera.cpp",
    "chars": 24104,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/ndkcamera.h",
    "chars": 2328,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/yoloface.cpp",
    "chars": 14283,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/yoloface.h",
    "chars": 1712,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/jni/yolofacencnn.cpp",
    "chars": 6479,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/res/layout/main.xml",
    "chars": 1402,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        "
  },
  {
    "path": "ncnn-android-yolov5_face/app/src/main/res/values/strings.xml",
    "chars": 308,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">yoloface_demo</string>\n    <string-array "
  },
  {
    "path": "ncnn-android-yolov5_face/build.gradle",
    "chars": 335,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    re"
  },
  {
    "path": "ncnn-android-yolov5_face/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Sun Sep 08 23:09:42 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "ncnn-android-yolov5_face/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "ncnn-android-yolov5_face/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "ncnn-android-yolov5_face/local.properties",
    "chars": 325,
    "preview": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local con"
  },
  {
    "path": "ncnn-android-yolov5_face/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "ncnn-android-yolov7_face/app/build.gradle",
    "chars": 485,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion \"29.0.2\"\n\n    defaultC"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/AndroidManifest.xml",
    "chars": 803,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      packag"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/assets/yolov7-lite-e.param",
    "chars": 14662,
    "preview": "7767517\n169 192\nInput                    images                   0 1 images\nMemoryData               817               "
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/assets/yolov7-tiny.param",
    "chars": 18861,
    "preview": "7767517\n206 243\nInput                    images                   0 1 images\nMemoryData               338               "
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/java/com/tencent/ncnnyoloface/MainActivity.java",
    "chars": 4876,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/java/com/tencent/ncnnyoloface/NcnnYoloFace.java",
    "chars": 1142,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/CMakeLists.txt",
    "chars": 460,
    "preview": "project(ncnnyoloface)\n\ncmake_minimum_required(VERSION 3.10)\n\nset(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-andr"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/ndkcamera.cpp",
    "chars": 24104,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/ndkcamera.h",
    "chars": 2328,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/yoloface.cpp",
    "chars": 13395,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/yoloface.h",
    "chars": 1774,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/jni/yolofacencnn.cpp",
    "chars": 6558,
    "preview": "// Tencent is pleased to support the open source community by making ncnn available.\n//\n// Copyright (C) 2021 THL A29 Li"
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/res/layout/main.xml",
    "chars": 1402,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        "
  },
  {
    "path": "ncnn-android-yolov7_face/app/src/main/res/values/strings.xml",
    "chars": 352,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">yolov7face_demo</string>\n    <string-arra"
  },
  {
    "path": "ncnn-android-yolov7_face/build.gradle",
    "chars": 335,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    re"
  },
  {
    "path": "ncnn-android-yolov7_face/gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Sun Sep 08 23:09:42 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "ncnn-android-yolov7_face/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "ncnn-android-yolov7_face/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "ncnn-android-yolov7_face/local.properties",
    "chars": 325,
    "preview": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local con"
  },
  {
    "path": "ncnn-android-yolov7_face/settings.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  }
]

// ... and 4 more files (download for full content)

About this extraction

This page contains the full source code of the FeiGeChuanShu/ncnn_Android_face GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 69 files (324.5 KB), approximately 104.5k tokens, and a symbol index with 127 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!