Repository: nihui/ncnn-android-scrfd Branch: master Commit: f94e2630ac1b Files: 28 Total size: 164.8 KB Directory structure: gitextract_t36i4fjw/ ├── .github/ │ └── workflows/ │ └── release-apk.yml ├── README.md ├── app/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ ├── scrfd_10g-opt2.param │ │ ├── scrfd_10g_kps-opt2.param │ │ ├── scrfd_1g-opt2.param │ │ ├── scrfd_2.5g-opt2.param │ │ ├── scrfd_2.5g_kps-opt2.param │ │ ├── scrfd_34g-opt2.param │ │ ├── scrfd_500m-opt2.param │ │ └── scrfd_500m_kps-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 └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/release-apk.yml ================================================ name: release-apk on: workflow_dispatch env: NCNN_VERSION: 20260113 OPENCV_VERSION: 4.13.0 OPENCV_MOBILE_TAG: v35 BUILD_TOOLS_VERSION: 36.0.0 jobs: release-apk: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' - name: ncnn run: | wget -q https://github.com/Tencent/ncnn/releases/download/${NCNN_VERSION}/ncnn-${NCNN_VERSION}-android-vulkan.zip unzip -q ncnn-${NCNN_VERSION}-android-vulkan.zip -d app/src/main/jni - name: opencv-mobile run: | wget -q https://github.com/nihui/opencv-mobile/releases/download/${OPENCV_MOBILE_TAG}/opencv-mobile-${OPENCV_VERSION}-android.zip unzip -q opencv-mobile-${OPENCV_VERSION}-android.zip -d app/src/main/jni - name: modify-jni-cmakelists run: | sed -i "s@ncnn-[^-]*-android-vulkan@ncnn-${NCNN_VERSION}-android-vulkan@g" app/src/main/jni/CMakeLists.txt sed -i "s@opencv-mobile-[^-]*-android@opencv-mobile-${OPENCV_VERSION}-android@g" app/src/main/jni/CMakeLists.txt - name: build-apk run: | bash ./gradlew assembleRelease --stacktrace - name: sign-apk id: signapk run: | DATE=`date +'%Y%m%d'` SHA_SHORT=`git rev-parse --short HEAD` UNSIGNED_APK=`find app/build/outputs/apk/release -type f -name "*-release-unsigned.apk" | head -n 1` ALIGNED_APK=${UNSIGNED_APK//-release-unsigned.apk/-release-unsigned-aligned.apk} SIGNED_APK=${{ github.event.repository.name }}-${DATE}.${SHA_SHORT}.apk keytool -genkey -noprompt -alias ncnn \ -dname "CN=mqttserver.ibm.com, OU=ID, O=IBM, L=Hursley, S=Hants, C=GB"\ -keystore ncnn.keystore -storepass 7767517 -keypass 7767517 \ -keyalg RSA -keysize 2048 -validity 10000 ${ANDROID_HOME}/build-tools/${BUILD_TOOLS_VERSION}/zipalign -f -v 4 ${UNSIGNED_APK} ${SIGNED_APK} ${ANDROID_HOME}/build-tools/${BUILD_TOOLS_VERSION}/apksigner sign --ks ncnn.keystore --ks-key-alias ncnn \ --ks-pass pass:7767517 --key-pass pass:7767517 --out ${SIGNED_APK} ${SIGNED_APK} ${ANDROID_HOME}/build-tools/${BUILD_TOOLS_VERSION}/apksigner verify ${SIGNED_APK} echo "SIGNED_APK=${SIGNED_APK}" >> $GITHUB_OUTPUT echo "APK_VERSION=${DATE}.${SHA_SHORT}" >> $GITHUB_OUTPUT - name: create-release uses: softprops/action-gh-release@v1 with: token: ${{ secrets.GITHUB_TOKEN }} tag_name: ${{ steps.signapk.outputs.APK_VERSION }} name: Release ${{ steps.signapk.outputs.APK_VERSION }} files: ${{ steps.signapk.outputs.SIGNED_APK }} ================================================ FILE: 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/latest ## 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: app/build.gradle ================================================ plugins { id 'com.android.application' } android { namespace 'com.tencent.scrfdncnn' compileSdk 33 ndkVersion "29.0.14206865" defaultConfig { applicationId "com.tencent.scrfdncnn" archivesBaseName = "$applicationId" minSdkVersion 24 targetSdkVersion 35 externalNativeBuild { cmake { arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" } } } externalNativeBuild { cmake { version "3.31.5" path file('src/main/jni/CMakeLists.txt') } } dependencies { implementation 'com.android.support:support-v4:24.0.0' } packaging { jniLibs { useLegacyPackaging true } } } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/assets/scrfd_10g-opt2.param ================================================ 7767517 133 154 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 220 0=28 1=3 3=2 4=1 5=1 6=756 9=1 Convolution Conv_2 1 1 220 223 0=28 1=3 4=1 5=1 6=7056 9=1 Convolution Conv_4 1 1 223 226 0=56 1=3 4=1 5=1 6=14112 9=1 Pooling MaxPool_6 1 1 226 227 1=2 2=2 5=1 Split splitncnn_0 1 2 227 227_splitncnn_0 227_splitncnn_1 Convolution Conv_7 1 1 227_splitncnn_1 230 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_9 1 1 230 532 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_10 2 1 532 227_splitncnn_0 233 ReLU Relu_11 1 1 233 234 Split splitncnn_1 1 2 234 234_splitncnn_0 234_splitncnn_1 Convolution Conv_12 1 1 234_splitncnn_1 237 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_14 1 1 237 538 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_15 2 1 538 234_splitncnn_0 240 ReLU Relu_16 1 1 240 241 Split splitncnn_2 1 2 241 241_splitncnn_0 241_splitncnn_1 Convolution Conv_17 1 1 241_splitncnn_1 244 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_19 1 1 244 544 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_20 2 1 544 241_splitncnn_0 247 ReLU Relu_21 1 1 247 248 Split splitncnn_3 1 2 248 248_splitncnn_0 248_splitncnn_1 Convolution Conv_22 1 1 248_splitncnn_1 251 0=88 1=3 3=2 4=1 5=1 6=44352 9=1 Convolution Conv_24 1 1 251 550 0=88 1=3 4=1 5=1 6=69696 Pooling AveragePool_25 1 1 248_splitncnn_0 254 0=1 1=2 2=2 Convolution Conv_26 1 1 254 553 0=88 1=1 5=1 6=4928 BinaryOp Add_27 2 1 550 553 257 ReLU Relu_28 1 1 257 258 Split splitncnn_4 1 2 258 258_splitncnn_0 258_splitncnn_1 Convolution Conv_29 1 1 258_splitncnn_1 261 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_31 1 1 261 559 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_32 2 1 559 258_splitncnn_0 264 ReLU Relu_33 1 1 264 265 Split splitncnn_5 1 2 265 265_splitncnn_0 265_splitncnn_1 Convolution Conv_34 1 1 265_splitncnn_1 268 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_36 1 1 268 565 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_37 2 1 565 265_splitncnn_0 271 ReLU Relu_38 1 1 271 272 Split splitncnn_6 1 2 272 272_splitncnn_0 272_splitncnn_1 Convolution Conv_39 1 1 272_splitncnn_1 275 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_41 1 1 275 571 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_42 2 1 571 272_splitncnn_0 278 ReLU Relu_43 1 1 278 279 Split splitncnn_7 1 3 279 279_splitncnn_0 279_splitncnn_1 279_splitncnn_2 Convolution Conv_44 1 1 279_splitncnn_2 282 0=88 1=3 3=2 4=1 5=1 6=69696 9=1 Convolution Conv_46 1 1 282 577 0=88 1=3 4=1 5=1 6=69696 Pooling AveragePool_47 1 1 279_splitncnn_1 285 0=1 1=2 2=2 Convolution Conv_48 1 1 285 580 0=88 1=1 5=1 6=7744 BinaryOp Add_49 2 1 577 580 288 ReLU Relu_50 1 1 288 289 Split splitncnn_8 1 2 289 289_splitncnn_0 289_splitncnn_1 Convolution Conv_51 1 1 289_splitncnn_1 292 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_53 1 1 292 586 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_54 2 1 586 289_splitncnn_0 295 ReLU Relu_55 1 1 295 296 Split splitncnn_9 1 3 296 296_splitncnn_0 296_splitncnn_1 296_splitncnn_2 Convolution Conv_56 1 1 296_splitncnn_2 299 0=224 1=3 3=2 4=1 5=1 6=177408 9=1 Convolution Conv_58 1 1 299 592 0=224 1=3 4=1 5=1 6=451584 Pooling AveragePool_59 1 1 296_splitncnn_1 302 0=1 1=2 2=2 Convolution Conv_60 1 1 302 595 0=224 1=1 5=1 6=19712 BinaryOp Add_61 2 1 592 595 305 ReLU Relu_62 1 1 305 306 Split splitncnn_10 1 2 306 306_splitncnn_0 306_splitncnn_1 Convolution Conv_63 1 1 306_splitncnn_1 309 0=224 1=3 4=1 5=1 6=451584 9=1 Convolution Conv_65 1 1 309 601 0=224 1=3 4=1 5=1 6=451584 BinaryOp Add_66 2 1 601 306_splitncnn_0 312 ReLU Relu_67 1 1 312 313 Split splitncnn_11 1 2 313 313_splitncnn_0 313_splitncnn_1 Convolution Conv_68 1 1 313_splitncnn_1 316 0=224 1=3 4=1 5=1 6=451584 9=1 Convolution Conv_70 1 1 316 607 0=224 1=3 4=1 5=1 6=451584 BinaryOp Add_71 2 1 607 313_splitncnn_0 319 ReLU Relu_72 1 1 319 320 Convolution Conv_73 1 1 279_splitncnn_0 321 0=56 1=1 5=1 6=4928 Convolution Conv_74 1 1 296_splitncnn_0 322 0=56 1=1 5=1 6=4928 Convolution Conv_75 1 1 320 323 0=56 1=1 5=1 6=12544 Split splitncnn_12 1 2 323 323_splitncnn_0 323_splitncnn_1 Interp Resize_94 1 1 323_splitncnn_1 342 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_95 2 1 322 342 343 Split splitncnn_13 1 2 343 343_splitncnn_0 343_splitncnn_1 Interp Resize_114 1 1 343_splitncnn_1 362 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_115 2 1 321 362 363 Convolution Conv_116 1 1 363 364 0=56 1=3 4=1 5=1 6=28224 Split splitncnn_14 1 2 364 364_splitncnn_0 364_splitncnn_1 Convolution Conv_117 1 1 343_splitncnn_0 365 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_118 1 1 323_splitncnn_0 366 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_119 1 1 364_splitncnn_1 367 0=56 1=3 3=2 4=1 5=1 6=28224 BinaryOp Add_120 2 1 365 367 368 Split splitncnn_15 1 2 368 368_splitncnn_0 368_splitncnn_1 Convolution Conv_121 1 1 368_splitncnn_1 369 0=56 1=3 3=2 4=1 5=1 6=28224 BinaryOp Add_122 2 1 366 369 370 Convolution Conv_123 1 1 368_splitncnn_0 371 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_124 1 1 370 372 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_125 1 1 364_splitncnn_0 373 0=80 1=3 4=1 6=40320 GroupNorm Add_134 1 1 373 384 0=16 1=80 2=1.000000e-05 ReLU Relu_135 1 1 384 385 Convolution Conv_136 1 1 385 386 0=80 1=3 4=1 6=57600 GroupNorm Add_145 1 1 386 397 0=16 1=80 2=1.000000e-05 ReLU Relu_146 1 1 397 398 Convolution Conv_147 1 1 398 399 0=80 1=3 4=1 6=57600 GroupNorm Add_156 1 1 399 410 0=16 1=80 2=1.000000e-05 ReLU Relu_157 1 1 410 411 Split splitncnn_16 1 2 411 411_splitncnn_0 411_splitncnn_1 Convolution Conv_158 1 1 411_splitncnn_1 417 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_159 1 1 411_splitncnn_0 413 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_160 1 1 413 bbox_8 0=2 1=1 2=8.170338e-01 Sigmoid Sigmoid_164 1 1 417 score_8 Convolution Conv_168 1 1 371 422 0=80 1=3 4=1 6=40320 GroupNorm Add_177 1 1 422 433 0=16 1=80 2=1.000000e-05 ReLU Relu_178 1 1 433 434 Convolution Conv_179 1 1 434 435 0=80 1=3 4=1 6=57600 GroupNorm Add_188 1 1 435 446 0=16 1=80 2=1.000000e-05 ReLU Relu_189 1 1 446 447 Convolution Conv_190 1 1 447 448 0=80 1=3 4=1 6=57600 GroupNorm Add_199 1 1 448 459 0=16 1=80 2=1.000000e-05 ReLU Relu_200 1 1 459 460 Split splitncnn_17 1 2 460 460_splitncnn_0 460_splitncnn_1 Convolution Conv_201 1 1 460_splitncnn_1 466 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_202 1 1 460_splitncnn_0 462 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_203 1 1 462 bbox_16 0=2 1=1 2=1.195922e+00 Sigmoid Sigmoid_207 1 1 466 score_16 Convolution Conv_211 1 1 372 471 0=80 1=3 4=1 6=40320 GroupNorm Add_220 1 1 471 482 0=16 1=80 2=1.000000e-05 ReLU Relu_221 1 1 482 483 Convolution Conv_222 1 1 483 484 0=80 1=3 4=1 6=57600 GroupNorm Add_231 1 1 484 495 0=16 1=80 2=1.000000e-05 ReLU Relu_232 1 1 495 496 Convolution Conv_233 1 1 496 497 0=80 1=3 4=1 6=57600 GroupNorm Add_242 1 1 497 508 0=16 1=80 2=1.000000e-05 ReLU Relu_243 1 1 508 509 Split splitncnn_18 1 2 509 509_splitncnn_0 509_splitncnn_1 Convolution Conv_244 1 1 509_splitncnn_1 515 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_245 1 1 509_splitncnn_0 511 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_246 1 1 511 bbox_32 0=2 1=1 2=1.814443e+00 Sigmoid Sigmoid_250 1 1 515 score_32 ================================================ FILE: app/src/main/assets/scrfd_10g_kps-opt2.param ================================================ 7767517 118 142 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 279 0=28 1=3 3=2 4=1 5=1 6=756 9=1 Convolution Conv_2 1 1 279 282 0=28 1=3 4=1 5=1 6=7056 9=1 Convolution Conv_4 1 1 282 285 0=56 1=3 4=1 5=1 6=14112 9=1 Pooling MaxPool_6 1 1 285 286 1=2 2=2 5=1 Split splitncnn_0 1 2 286 286_splitncnn_0 286_splitncnn_1 Convolution Conv_7 1 1 286_splitncnn_1 289 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_9 1 1 289 513 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_10 2 1 513 286_splitncnn_0 292 ReLU Relu_11 1 1 292 293 Split splitncnn_1 1 2 293 293_splitncnn_0 293_splitncnn_1 Convolution Conv_12 1 1 293_splitncnn_1 296 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_14 1 1 296 519 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_15 2 1 519 293_splitncnn_0 299 ReLU Relu_16 1 1 299 300 Split splitncnn_2 1 2 300 300_splitncnn_0 300_splitncnn_1 Convolution Conv_17 1 1 300_splitncnn_1 303 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_19 1 1 303 525 0=56 1=3 4=1 5=1 6=28224 BinaryOp Add_20 2 1 525 300_splitncnn_0 306 ReLU Relu_21 1 1 306 307 Split splitncnn_3 1 2 307 307_splitncnn_0 307_splitncnn_1 Convolution Conv_22 1 1 307_splitncnn_1 310 0=88 1=3 3=2 4=1 5=1 6=44352 9=1 Convolution Conv_24 1 1 310 531 0=88 1=3 4=1 5=1 6=69696 Pooling AveragePool_25 1 1 307_splitncnn_0 313 0=1 1=2 2=2 Convolution Conv_26 1 1 313 534 0=88 1=1 5=1 6=4928 BinaryOp Add_27 2 1 531 534 316 ReLU Relu_28 1 1 316 317 Split splitncnn_4 1 2 317 317_splitncnn_0 317_splitncnn_1 Convolution Conv_29 1 1 317_splitncnn_1 320 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_31 1 1 320 540 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_32 2 1 540 317_splitncnn_0 323 ReLU Relu_33 1 1 323 324 Split splitncnn_5 1 2 324 324_splitncnn_0 324_splitncnn_1 Convolution Conv_34 1 1 324_splitncnn_1 327 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_36 1 1 327 546 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_37 2 1 546 324_splitncnn_0 330 ReLU Relu_38 1 1 330 331 Split splitncnn_6 1 2 331 331_splitncnn_0 331_splitncnn_1 Convolution Conv_39 1 1 331_splitncnn_1 334 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_41 1 1 334 552 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_42 2 1 552 331_splitncnn_0 337 ReLU Relu_43 1 1 337 338 Split splitncnn_7 1 3 338 338_splitncnn_0 338_splitncnn_1 338_splitncnn_2 Convolution Conv_44 1 1 338_splitncnn_2 341 0=88 1=3 3=2 4=1 5=1 6=69696 9=1 Convolution Conv_46 1 1 341 558 0=88 1=3 4=1 5=1 6=69696 Pooling AveragePool_47 1 1 338_splitncnn_1 344 0=1 1=2 2=2 Convolution Conv_48 1 1 344 561 0=88 1=1 5=1 6=7744 BinaryOp Add_49 2 1 558 561 347 ReLU Relu_50 1 1 347 348 Split splitncnn_8 1 2 348 348_splitncnn_0 348_splitncnn_1 Convolution Conv_51 1 1 348_splitncnn_1 351 0=88 1=3 4=1 5=1 6=69696 9=1 Convolution Conv_53 1 1 351 567 0=88 1=3 4=1 5=1 6=69696 BinaryOp Add_54 2 1 567 348_splitncnn_0 354 ReLU Relu_55 1 1 354 355 Split splitncnn_9 1 3 355 355_splitncnn_0 355_splitncnn_1 355_splitncnn_2 Convolution Conv_56 1 1 355_splitncnn_2 358 0=224 1=3 3=2 4=1 5=1 6=177408 9=1 Convolution Conv_58 1 1 358 573 0=224 1=3 4=1 5=1 6=451584 Pooling AveragePool_59 1 1 355_splitncnn_1 361 0=1 1=2 2=2 Convolution Conv_60 1 1 361 576 0=224 1=1 5=1 6=19712 BinaryOp Add_61 2 1 573 576 364 ReLU Relu_62 1 1 364 365 Split splitncnn_10 1 2 365 365_splitncnn_0 365_splitncnn_1 Convolution Conv_63 1 1 365_splitncnn_1 368 0=224 1=3 4=1 5=1 6=451584 9=1 Convolution Conv_65 1 1 368 582 0=224 1=3 4=1 5=1 6=451584 BinaryOp Add_66 2 1 582 365_splitncnn_0 371 ReLU Relu_67 1 1 371 372 Split splitncnn_11 1 2 372 372_splitncnn_0 372_splitncnn_1 Convolution Conv_68 1 1 372_splitncnn_1 375 0=224 1=3 4=1 5=1 6=451584 9=1 Convolution Conv_70 1 1 375 588 0=224 1=3 4=1 5=1 6=451584 BinaryOp Add_71 2 1 588 372_splitncnn_0 378 ReLU Relu_72 1 1 378 379 Convolution Conv_73 1 1 338_splitncnn_0 380 0=56 1=1 5=1 6=4928 Convolution Conv_74 1 1 355_splitncnn_0 381 0=56 1=1 5=1 6=4928 Convolution Conv_75 1 1 379 382 0=56 1=1 5=1 6=12544 Split splitncnn_12 1 2 382 382_splitncnn_0 382_splitncnn_1 Interp Resize_94 1 1 382_splitncnn_1 401 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_95 2 1 381 401 402 Split splitncnn_13 1 2 402 402_splitncnn_0 402_splitncnn_1 Interp Resize_114 1 1 402_splitncnn_1 421 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_115 2 1 380 421 422 Convolution Conv_116 1 1 422 423 0=56 1=3 4=1 5=1 6=28224 Split splitncnn_14 1 2 423 423_splitncnn_0 423_splitncnn_1 Convolution Conv_117 1 1 402_splitncnn_0 424 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_118 1 1 382_splitncnn_0 425 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_119 1 1 423_splitncnn_1 426 0=56 1=3 3=2 4=1 5=1 6=28224 BinaryOp Add_120 2 1 424 426 427 Split splitncnn_15 1 2 427 427_splitncnn_0 427_splitncnn_1 Convolution Conv_121 1 1 427_splitncnn_1 428 0=56 1=3 3=2 4=1 5=1 6=28224 BinaryOp Add_122 2 1 425 428 429 Convolution Conv_123 1 1 427_splitncnn_0 430 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_124 1 1 429 431 0=56 1=3 4=1 5=1 6=28224 Convolution Conv_125 1 1 423_splitncnn_0 434 0=80 1=3 4=1 5=1 6=40320 9=1 Convolution Conv_127 1 1 434 437 0=80 1=3 4=1 5=1 6=57600 9=1 Convolution Conv_129 1 1 437 440 0=80 1=3 4=1 5=1 6=57600 9=1 Split splitncnn_16 1 3 440 440_splitncnn_0 440_splitncnn_1 440_splitncnn_2 Convolution Conv_131 1 1 440_splitncnn_2 447 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_132 1 1 440_splitncnn_1 442 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_133 1 1 442 bbox_8 0=2 1=1 2=8.463594e-01 Convolution Conv_134 1 1 440_splitncnn_0 kps_8 0=20 1=3 4=1 5=1 6=14400 Sigmoid Sigmoid_138 1 1 447 score_8 Convolution Conv_145 1 1 430 457 0=80 1=3 4=1 5=1 6=40320 9=1 Convolution Conv_147 1 1 457 460 0=80 1=3 4=1 5=1 6=57600 9=1 Convolution Conv_149 1 1 460 463 0=80 1=3 4=1 5=1 6=57600 9=1 Split splitncnn_17 1 3 463 463_splitncnn_0 463_splitncnn_1 463_splitncnn_2 Convolution Conv_151 1 1 463_splitncnn_2 470 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_152 1 1 463_splitncnn_1 465 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_153 1 1 465 bbox_16 0=2 1=1 2=8.996264e-01 Convolution Conv_154 1 1 463_splitncnn_0 kps_16 0=20 1=3 4=1 5=1 6=14400 Sigmoid Sigmoid_158 1 1 470 score_16 Convolution Conv_165 1 1 431 480 0=80 1=3 4=1 5=1 6=40320 9=1 Convolution Conv_167 1 1 480 483 0=80 1=3 4=1 5=1 6=57600 9=1 Convolution Conv_169 1 1 483 486 0=80 1=3 4=1 5=1 6=57600 9=1 Split splitncnn_18 1 3 486 486_splitncnn_0 486_splitncnn_1 486_splitncnn_2 Convolution Conv_171 1 1 486_splitncnn_2 493 0=2 1=3 4=1 5=1 6=1440 Convolution Conv_172 1 1 486_splitncnn_1 488 0=8 1=3 4=1 5=1 6=5760 BinaryOp Mul_173 1 1 488 bbox_32 0=2 1=1 2=1.081209e+00 Convolution Conv_174 1 1 486_splitncnn_0 kps_32 0=20 1=3 4=1 5=1 6=14400 Sigmoid Sigmoid_178 1 1 493 score_32 ================================================ FILE: 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: app/src/main/assets/scrfd_2.5g-opt2.param ================================================ 7767517 129 151 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 229 0=12 1=3 3=2 4=1 5=1 6=324 9=1 Convolution Conv_2 1 1 229 232 0=12 1=3 4=1 5=1 6=1296 9=1 Convolution Conv_4 1 1 232 235 0=24 1=3 4=1 5=1 6=2592 9=1 Pooling MaxPool_6 1 1 235 236 1=2 2=2 5=1 Split splitncnn_0 1 2 236 236_splitncnn_0 236_splitncnn_1 Convolution Conv_7 1 1 236_splitncnn_1 239 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_9 1 1 239 509 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_10 2 1 509 236_splitncnn_0 242 ReLU Relu_11 1 1 242 243 Split splitncnn_1 1 2 243 243_splitncnn_0 243_splitncnn_1 Convolution Conv_12 1 1 243_splitncnn_1 246 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_14 1 1 246 515 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_15 2 1 515 243_splitncnn_0 249 ReLU Relu_16 1 1 249 250 Split splitncnn_2 1 2 250 250_splitncnn_0 250_splitncnn_1 Convolution Conv_17 1 1 250_splitncnn_1 253 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_19 1 1 253 521 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_20 2 1 521 250_splitncnn_0 256 ReLU Relu_21 1 1 256 257 Split splitncnn_3 1 2 257 257_splitncnn_0 257_splitncnn_1 Convolution Conv_22 1 1 257_splitncnn_1 260 0=48 1=3 3=2 4=1 5=1 6=10368 9=1 Convolution Conv_24 1 1 260 527 0=48 1=3 4=1 5=1 6=20736 Pooling AveragePool_25 1 1 257_splitncnn_0 263 0=1 1=2 2=2 Convolution Conv_26 1 1 263 530 0=48 1=1 5=1 6=1152 BinaryOp Add_27 2 1 527 530 266 ReLU Relu_28 1 1 266 267 Split splitncnn_4 1 2 267 267_splitncnn_0 267_splitncnn_1 Convolution Conv_29 1 1 267_splitncnn_1 270 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_31 1 1 270 536 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_32 2 1 536 267_splitncnn_0 273 ReLU Relu_33 1 1 273 274 Split splitncnn_5 1 2 274 274_splitncnn_0 274_splitncnn_1 Convolution Conv_34 1 1 274_splitncnn_1 277 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_36 1 1 277 542 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_37 2 1 542 274_splitncnn_0 280 ReLU Relu_38 1 1 280 281 Split splitncnn_6 1 2 281 281_splitncnn_0 281_splitncnn_1 Convolution Conv_39 1 1 281_splitncnn_1 284 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_41 1 1 284 548 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_42 2 1 548 281_splitncnn_0 287 ReLU Relu_43 1 1 287 288 Split splitncnn_7 1 2 288 288_splitncnn_0 288_splitncnn_1 Convolution Conv_44 1 1 288_splitncnn_1 291 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_46 1 1 291 554 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_47 2 1 554 288_splitncnn_0 294 ReLU Relu_48 1 1 294 295 Split splitncnn_8 1 3 295 295_splitncnn_0 295_splitncnn_1 295_splitncnn_2 Convolution Conv_49 1 1 295_splitncnn_2 298 0=48 1=3 3=2 4=1 5=1 6=20736 9=1 Convolution Conv_51 1 1 298 560 0=48 1=3 4=1 5=1 6=20736 Pooling AveragePool_52 1 1 295_splitncnn_1 301 0=1 1=2 2=2 Convolution Conv_53 1 1 301 563 0=48 1=1 5=1 6=2304 BinaryOp Add_54 2 1 560 563 304 ReLU Relu_55 1 1 304 305 Split splitncnn_9 1 2 305 305_splitncnn_0 305_splitncnn_1 Convolution Conv_56 1 1 305_splitncnn_1 308 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_58 1 1 308 569 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_59 2 1 569 305_splitncnn_0 311 ReLU Relu_60 1 1 311 312 Split splitncnn_10 1 2 312 312_splitncnn_0 312_splitncnn_1 Convolution Conv_61 1 1 312_splitncnn_1 315 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_63 1 1 315 575 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_64 2 1 575 312_splitncnn_0 318 ReLU Relu_65 1 1 318 319 Split splitncnn_11 1 3 319 319_splitncnn_0 319_splitncnn_1 319_splitncnn_2 Convolution Conv_66 1 1 319_splitncnn_2 322 0=80 1=3 3=2 4=1 5=1 6=34560 9=1 Convolution Conv_68 1 1 322 581 0=80 1=3 4=1 5=1 6=57600 Pooling AveragePool_69 1 1 319_splitncnn_1 325 0=1 1=2 2=2 Convolution Conv_70 1 1 325 584 0=80 1=1 5=1 6=3840 BinaryOp Add_71 2 1 581 584 328 ReLU Relu_72 1 1 328 329 Split splitncnn_12 1 2 329 329_splitncnn_0 329_splitncnn_1 Convolution Conv_73 1 1 329_splitncnn_1 332 0=80 1=3 4=1 5=1 6=57600 9=1 Convolution Conv_75 1 1 332 590 0=80 1=3 4=1 5=1 6=57600 BinaryOp Add_76 2 1 590 329_splitncnn_0 335 ReLU Relu_77 1 1 335 336 Convolution Conv_78 1 1 295_splitncnn_0 337 0=24 1=1 5=1 6=1152 Convolution Conv_79 1 1 319_splitncnn_0 338 0=24 1=1 5=1 6=1152 Convolution Conv_80 1 1 336 339 0=24 1=1 5=1 6=1920 Split splitncnn_13 1 2 339 339_splitncnn_0 339_splitncnn_1 Interp Resize_99 1 1 339_splitncnn_1 358 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_100 2 1 338 358 359 Split splitncnn_14 1 2 359 359_splitncnn_0 359_splitncnn_1 Interp Resize_119 1 1 359_splitncnn_1 378 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_120 2 1 337 378 379 Convolution Conv_121 1 1 379 380 0=24 1=3 4=1 5=1 6=5184 Split splitncnn_15 1 2 380 380_splitncnn_0 380_splitncnn_1 Convolution Conv_122 1 1 359_splitncnn_0 381 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_123 1 1 339_splitncnn_0 382 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_124 1 1 380_splitncnn_1 383 0=24 1=3 3=2 4=1 5=1 6=5184 BinaryOp Add_125 2 1 381 383 384 Split splitncnn_16 1 2 384 384_splitncnn_0 384_splitncnn_1 Convolution Conv_126 1 1 384_splitncnn_1 385 0=24 1=3 3=2 4=1 5=1 6=5184 BinaryOp Add_127 2 1 382 385 386 Convolution Conv_128 1 1 384_splitncnn_0 387 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_129 1 1 386 388 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_130 1 1 380_splitncnn_0 389 0=64 1=3 4=1 6=13824 GroupNorm Add_139 1 1 389 400 0=16 1=64 2=1.000000e-05 ReLU Relu_140 1 1 400 401 Convolution Conv_141 1 1 401 402 0=64 1=3 4=1 6=36864 GroupNorm Add_150 1 1 402 413 0=16 1=64 2=1.000000e-05 ReLU Relu_151 1 1 413 414 Split splitncnn_17 1 2 414 414_splitncnn_0 414_splitncnn_1 Convolution Conv_152 1 1 414_splitncnn_1 420 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_153 1 1 414_splitncnn_0 416 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_154 1 1 416 bbox_8 0=2 1=1 2=8.394209e-01 Sigmoid Sigmoid_158 1 1 420 score_8 Convolution Conv_162 1 1 387 425 0=64 1=3 4=1 6=13824 GroupNorm Add_171 1 1 425 436 0=16 1=64 2=1.000000e-05 ReLU Relu_172 1 1 436 437 Convolution Conv_173 1 1 437 438 0=64 1=3 4=1 6=36864 GroupNorm Add_182 1 1 438 449 0=16 1=64 2=1.000000e-05 ReLU Relu_183 1 1 449 450 Split splitncnn_18 1 2 450 450_splitncnn_0 450_splitncnn_1 Convolution Conv_184 1 1 450_splitncnn_1 456 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_185 1 1 450_splitncnn_0 452 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_186 1 1 452 bbox_16 0=2 1=1 2=1.251327e+00 Sigmoid Sigmoid_190 1 1 456 score_16 Convolution Conv_194 1 1 388 461 0=64 1=3 4=1 6=13824 GroupNorm Add_203 1 1 461 472 0=16 1=64 2=1.000000e-05 ReLU Relu_204 1 1 472 473 Convolution Conv_205 1 1 473 474 0=64 1=3 4=1 6=36864 GroupNorm Add_214 1 1 474 485 0=16 1=64 2=1.000000e-05 ReLU Relu_215 1 1 485 486 Split splitncnn_19 1 2 486 486_splitncnn_0 486_splitncnn_1 Convolution Conv_216 1 1 486_splitncnn_1 492 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_217 1 1 486_splitncnn_0 488 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_218 1 1 488 bbox_32 0=2 1=1 2=1.961941e+00 Sigmoid Sigmoid_222 1 1 492 score_32 ================================================ FILE: app/src/main/assets/scrfd_2.5g_kps-opt2.param ================================================ 7767517 120 145 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 273 0=12 1=3 3=2 4=1 5=1 6=324 9=1 Convolution Conv_2 1 1 273 276 0=12 1=3 4=1 5=1 6=1296 9=1 Convolution Conv_4 1 1 276 279 0=24 1=3 4=1 5=1 6=2592 9=1 Pooling MaxPool_6 1 1 279 280 1=2 2=2 5=1 Split splitncnn_0 1 2 280 280_splitncnn_0 280_splitncnn_1 Convolution Conv_7 1 1 280_splitncnn_1 283 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_9 1 1 283 505 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_10 2 1 505 280_splitncnn_0 286 ReLU Relu_11 1 1 286 287 Split splitncnn_1 1 2 287 287_splitncnn_0 287_splitncnn_1 Convolution Conv_12 1 1 287_splitncnn_1 290 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_14 1 1 290 511 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_15 2 1 511 287_splitncnn_0 293 ReLU Relu_16 1 1 293 294 Split splitncnn_2 1 2 294 294_splitncnn_0 294_splitncnn_1 Convolution Conv_17 1 1 294_splitncnn_1 297 0=24 1=3 4=1 5=1 6=5184 9=1 Convolution Conv_19 1 1 297 517 0=24 1=3 4=1 5=1 6=5184 BinaryOp Add_20 2 1 517 294_splitncnn_0 300 ReLU Relu_21 1 1 300 301 Split splitncnn_3 1 2 301 301_splitncnn_0 301_splitncnn_1 Convolution Conv_22 1 1 301_splitncnn_1 304 0=48 1=3 3=2 4=1 5=1 6=10368 9=1 Convolution Conv_24 1 1 304 523 0=48 1=3 4=1 5=1 6=20736 Pooling AveragePool_25 1 1 301_splitncnn_0 307 0=1 1=2 2=2 Convolution Conv_26 1 1 307 526 0=48 1=1 5=1 6=1152 BinaryOp Add_27 2 1 523 526 310 ReLU Relu_28 1 1 310 311 Split splitncnn_4 1 2 311 311_splitncnn_0 311_splitncnn_1 Convolution Conv_29 1 1 311_splitncnn_1 314 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_31 1 1 314 532 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_32 2 1 532 311_splitncnn_0 317 ReLU Relu_33 1 1 317 318 Split splitncnn_5 1 2 318 318_splitncnn_0 318_splitncnn_1 Convolution Conv_34 1 1 318_splitncnn_1 321 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_36 1 1 321 538 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_37 2 1 538 318_splitncnn_0 324 ReLU Relu_38 1 1 324 325 Split splitncnn_6 1 2 325 325_splitncnn_0 325_splitncnn_1 Convolution Conv_39 1 1 325_splitncnn_1 328 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_41 1 1 328 544 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_42 2 1 544 325_splitncnn_0 331 ReLU Relu_43 1 1 331 332 Split splitncnn_7 1 2 332 332_splitncnn_0 332_splitncnn_1 Convolution Conv_44 1 1 332_splitncnn_1 335 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_46 1 1 335 550 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_47 2 1 550 332_splitncnn_0 338 ReLU Relu_48 1 1 338 339 Split splitncnn_8 1 3 339 339_splitncnn_0 339_splitncnn_1 339_splitncnn_2 Convolution Conv_49 1 1 339_splitncnn_2 342 0=48 1=3 3=2 4=1 5=1 6=20736 9=1 Convolution Conv_51 1 1 342 556 0=48 1=3 4=1 5=1 6=20736 Pooling AveragePool_52 1 1 339_splitncnn_1 345 0=1 1=2 2=2 Convolution Conv_53 1 1 345 559 0=48 1=1 5=1 6=2304 BinaryOp Add_54 2 1 556 559 348 ReLU Relu_55 1 1 348 349 Split splitncnn_9 1 2 349 349_splitncnn_0 349_splitncnn_1 Convolution Conv_56 1 1 349_splitncnn_1 352 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_58 1 1 352 565 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_59 2 1 565 349_splitncnn_0 355 ReLU Relu_60 1 1 355 356 Split splitncnn_10 1 2 356 356_splitncnn_0 356_splitncnn_1 Convolution Conv_61 1 1 356_splitncnn_1 359 0=48 1=3 4=1 5=1 6=20736 9=1 Convolution Conv_63 1 1 359 571 0=48 1=3 4=1 5=1 6=20736 BinaryOp Add_64 2 1 571 356_splitncnn_0 362 ReLU Relu_65 1 1 362 363 Split splitncnn_11 1 3 363 363_splitncnn_0 363_splitncnn_1 363_splitncnn_2 Convolution Conv_66 1 1 363_splitncnn_2 366 0=80 1=3 3=2 4=1 5=1 6=34560 9=1 Convolution Conv_68 1 1 366 577 0=80 1=3 4=1 5=1 6=57600 Pooling AveragePool_69 1 1 363_splitncnn_1 369 0=1 1=2 2=2 Convolution Conv_70 1 1 369 580 0=80 1=1 5=1 6=3840 BinaryOp Add_71 2 1 577 580 372 ReLU Relu_72 1 1 372 373 Split splitncnn_12 1 2 373 373_splitncnn_0 373_splitncnn_1 Convolution Conv_73 1 1 373_splitncnn_1 376 0=80 1=3 4=1 5=1 6=57600 9=1 Convolution Conv_75 1 1 376 586 0=80 1=3 4=1 5=1 6=57600 BinaryOp Add_76 2 1 586 373_splitncnn_0 379 ReLU Relu_77 1 1 379 380 Convolution Conv_78 1 1 339_splitncnn_0 381 0=24 1=1 5=1 6=1152 Convolution Conv_79 1 1 363_splitncnn_0 382 0=24 1=1 5=1 6=1152 Convolution Conv_80 1 1 380 383 0=24 1=1 5=1 6=1920 Split splitncnn_13 1 2 383 383_splitncnn_0 383_splitncnn_1 Interp Resize_99 1 1 383_splitncnn_1 402 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_100 2 1 382 402 403 Split splitncnn_14 1 2 403 403_splitncnn_0 403_splitncnn_1 Interp Resize_119 1 1 403_splitncnn_1 422 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_120 2 1 381 422 423 Convolution Conv_121 1 1 423 424 0=24 1=3 4=1 5=1 6=5184 Split splitncnn_15 1 2 424 424_splitncnn_0 424_splitncnn_1 Convolution Conv_122 1 1 403_splitncnn_0 425 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_123 1 1 383_splitncnn_0 426 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_124 1 1 424_splitncnn_1 427 0=24 1=3 3=2 4=1 5=1 6=5184 BinaryOp Add_125 2 1 425 427 428 Split splitncnn_16 1 2 428 428_splitncnn_0 428_splitncnn_1 Convolution Conv_126 1 1 428_splitncnn_1 429 0=24 1=3 3=2 4=1 5=1 6=5184 BinaryOp Add_127 2 1 426 429 430 Convolution Conv_128 1 1 428_splitncnn_0 431 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_129 1 1 430 432 0=24 1=3 4=1 5=1 6=5184 Convolution Conv_130 1 1 424_splitncnn_0 435 0=64 1=3 4=1 5=1 6=13824 9=1 Convolution Conv_132 1 1 435 438 0=64 1=3 4=1 5=1 6=36864 9=1 Split splitncnn_17 1 3 438 438_splitncnn_0 438_splitncnn_1 438_splitncnn_2 Convolution Conv_134 1 1 438_splitncnn_2 445 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_135 1 1 438_splitncnn_1 440 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_136 1 1 440 bbox_8 0=2 1=1 2=8.807251e-01 Convolution Conv_137 1 1 438_splitncnn_0 kps_8 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_141 1 1 445 score_8 Convolution Conv_148 1 1 431 455 0=64 1=3 4=1 5=1 6=13824 9=1 Convolution Conv_150 1 1 455 458 0=64 1=3 4=1 5=1 6=36864 9=1 Split splitncnn_18 1 3 458 458_splitncnn_0 458_splitncnn_1 458_splitncnn_2 Convolution Conv_152 1 1 458_splitncnn_2 465 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_153 1 1 458_splitncnn_1 460 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_154 1 1 460 bbox_16 0=2 1=1 2=9.315465e-01 Convolution Conv_155 1 1 458_splitncnn_0 kps_16 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_159 1 1 465 score_16 Convolution Conv_166 1 1 432 475 0=64 1=3 4=1 5=1 6=13824 9=1 Convolution Conv_168 1 1 475 478 0=64 1=3 4=1 5=1 6=36864 9=1 Split splitncnn_19 1 3 478 478_splitncnn_0 478_splitncnn_1 478_splitncnn_2 Convolution Conv_170 1 1 478_splitncnn_2 485 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_171 1 1 478_splitncnn_1 480 0=8 1=3 4=1 5=1 6=4608 BinaryOp Mul_172 1 1 480 bbox_32 0=2 1=1 2=1.142366e+00 Convolution Conv_173 1 1 478_splitncnn_0 kps_32 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_177 1 1 485 score_32 ================================================ FILE: app/src/main/assets/scrfd_34g-opt2.param ================================================ 7767517 323 375 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 853 0=28 1=3 3=2 4=1 5=1 6=756 9=1 Convolution Conv_2 1 1 853 856 0=28 1=3 4=1 5=1 6=7056 9=1 Convolution Conv_4 1 1 856 859 0=56 1=3 4=1 5=1 6=14112 9=1 Pooling MaxPool_6 1 1 859 860 1=2 2=2 5=1 Split splitncnn_0 1 2 860 869 860_splitncnn_1 Convolution Conv_7 1 1 860_splitncnn_1 863 0=56 1=1 5=1 6=3136 9=1 Convolution Conv_9 1 1 863 866 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_11 1 1 866 1478 0=224 1=1 5=1 6=12544 Convolution Conv_13 1 1 869 1481 0=224 1=1 5=1 6=12544 BinaryOp Add_14 2 1 1478 1481 872 ReLU Relu_15 1 1 872 873 Split splitncnn_1 1 2 873 873_splitncnn_0 873_splitncnn_1 Convolution Conv_16 1 1 873_splitncnn_1 876 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_18 1 1 876 879 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_20 1 1 879 1490 0=224 1=1 5=1 6=12544 BinaryOp Add_21 2 1 1490 873_splitncnn_0 882 ReLU Relu_22 1 1 882 883 Split splitncnn_2 1 2 883 883_splitncnn_0 883_splitncnn_1 Convolution Conv_23 1 1 883_splitncnn_1 886 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_25 1 1 886 889 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_27 1 1 889 1499 0=224 1=1 5=1 6=12544 BinaryOp Add_28 2 1 1499 883_splitncnn_0 892 ReLU Relu_29 1 1 892 893 Split splitncnn_3 1 2 893 893_splitncnn_0 893_splitncnn_1 Convolution Conv_30 1 1 893_splitncnn_1 896 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_32 1 1 896 899 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_34 1 1 899 1508 0=224 1=1 5=1 6=12544 BinaryOp Add_35 2 1 1508 893_splitncnn_0 902 ReLU Relu_36 1 1 902 903 Split splitncnn_4 1 2 903 903_splitncnn_0 903_splitncnn_1 Convolution Conv_37 1 1 903_splitncnn_1 906 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_39 1 1 906 909 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_41 1 1 909 1517 0=224 1=1 5=1 6=12544 BinaryOp Add_42 2 1 1517 903_splitncnn_0 912 ReLU Relu_43 1 1 912 913 Split splitncnn_5 1 2 913 913_splitncnn_0 913_splitncnn_1 Convolution Conv_44 1 1 913_splitncnn_1 916 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_46 1 1 916 919 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_48 1 1 919 1526 0=224 1=1 5=1 6=12544 BinaryOp Add_49 2 1 1526 913_splitncnn_0 922 ReLU Relu_50 1 1 922 923 Split splitncnn_6 1 2 923 923_splitncnn_0 923_splitncnn_1 Convolution Conv_51 1 1 923_splitncnn_1 926 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_53 1 1 926 929 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_55 1 1 929 1535 0=224 1=1 5=1 6=12544 BinaryOp Add_56 2 1 1535 923_splitncnn_0 932 ReLU Relu_57 1 1 932 933 Split splitncnn_7 1 2 933 933_splitncnn_0 933_splitncnn_1 Convolution Conv_58 1 1 933_splitncnn_1 936 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_60 1 1 936 939 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_62 1 1 939 1544 0=224 1=1 5=1 6=12544 BinaryOp Add_63 2 1 1544 933_splitncnn_0 942 ReLU Relu_64 1 1 942 943 Split splitncnn_8 1 2 943 943_splitncnn_0 943_splitncnn_1 Convolution Conv_65 1 1 943_splitncnn_1 946 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_67 1 1 946 949 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_69 1 1 949 1553 0=224 1=1 5=1 6=12544 BinaryOp Add_70 2 1 1553 943_splitncnn_0 952 ReLU Relu_71 1 1 952 953 Split splitncnn_9 1 2 953 953_splitncnn_0 953_splitncnn_1 Convolution Conv_72 1 1 953_splitncnn_1 956 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_74 1 1 956 959 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_76 1 1 959 1562 0=224 1=1 5=1 6=12544 BinaryOp Add_77 2 1 1562 953_splitncnn_0 962 ReLU Relu_78 1 1 962 963 Split splitncnn_10 1 2 963 963_splitncnn_0 963_splitncnn_1 Convolution Conv_79 1 1 963_splitncnn_1 966 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_81 1 1 966 969 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_83 1 1 969 1571 0=224 1=1 5=1 6=12544 BinaryOp Add_84 2 1 1571 963_splitncnn_0 972 ReLU Relu_85 1 1 972 973 Split splitncnn_11 1 2 973 973_splitncnn_0 973_splitncnn_1 Convolution Conv_86 1 1 973_splitncnn_1 976 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_88 1 1 976 979 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_90 1 1 979 1580 0=224 1=1 5=1 6=12544 BinaryOp Add_91 2 1 1580 973_splitncnn_0 982 ReLU Relu_92 1 1 982 983 Split splitncnn_12 1 2 983 983_splitncnn_0 983_splitncnn_1 Convolution Conv_93 1 1 983_splitncnn_1 986 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_95 1 1 986 989 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_97 1 1 989 1589 0=224 1=1 5=1 6=12544 BinaryOp Add_98 2 1 1589 983_splitncnn_0 992 ReLU Relu_99 1 1 992 993 Split splitncnn_13 1 2 993 993_splitncnn_0 993_splitncnn_1 Convolution Conv_100 1 1 993_splitncnn_1 996 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_102 1 1 996 999 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_104 1 1 999 1598 0=224 1=1 5=1 6=12544 BinaryOp Add_105 2 1 1598 993_splitncnn_0 1002 ReLU Relu_106 1 1 1002 1003 Split splitncnn_14 1 2 1003 1003_splitncnn_0 1003_splitncnn_1 Convolution Conv_107 1 1 1003_splitncnn_1 1006 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_109 1 1 1006 1009 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_111 1 1 1009 1607 0=224 1=1 5=1 6=12544 BinaryOp Add_112 2 1 1607 1003_splitncnn_0 1012 ReLU Relu_113 1 1 1012 1013 Split splitncnn_15 1 2 1013 1013_splitncnn_0 1013_splitncnn_1 Convolution Conv_114 1 1 1013_splitncnn_1 1016 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_116 1 1 1016 1019 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_118 1 1 1019 1616 0=224 1=1 5=1 6=12544 BinaryOp Add_119 2 1 1616 1013_splitncnn_0 1022 ReLU Relu_120 1 1 1022 1023 Split splitncnn_16 1 2 1023 1023_splitncnn_0 1023_splitncnn_1 Convolution Conv_121 1 1 1023_splitncnn_1 1026 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_123 1 1 1026 1029 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_125 1 1 1029 1625 0=224 1=1 5=1 6=12544 BinaryOp Add_126 2 1 1625 1023_splitncnn_0 1032 ReLU Relu_127 1 1 1032 1033 Split splitncnn_17 1 2 1033 1033_splitncnn_0 1033_splitncnn_1 Convolution Conv_128 1 1 1033_splitncnn_1 1036 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_130 1 1 1036 1039 0=56 1=3 3=2 4=1 5=1 6=28224 9=1 Convolution Conv_132 1 1 1039 1634 0=224 1=1 5=1 6=12544 Pooling AveragePool_133 1 1 1033_splitncnn_0 1042 0=1 1=2 2=2 Convolution Conv_134 1 1 1042 1637 0=224 1=1 5=1 6=50176 BinaryOp Add_135 2 1 1634 1637 1045 ReLU Relu_136 1 1 1045 1046 Split splitncnn_18 1 2 1046 1046_splitncnn_0 1046_splitncnn_1 Convolution Conv_137 1 1 1046_splitncnn_1 1049 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_139 1 1 1049 1052 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_141 1 1 1052 1646 0=224 1=1 5=1 6=12544 BinaryOp Add_142 2 1 1646 1046_splitncnn_0 1055 ReLU Relu_143 1 1 1055 1056 Split splitncnn_19 1 2 1056 1056_splitncnn_0 1056_splitncnn_1 Convolution Conv_144 1 1 1056_splitncnn_1 1059 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_146 1 1 1059 1062 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_148 1 1 1062 1655 0=224 1=1 5=1 6=12544 BinaryOp Add_149 2 1 1655 1056_splitncnn_0 1065 ReLU Relu_150 1 1 1065 1066 Split splitncnn_20 1 2 1066 1066_splitncnn_0 1066_splitncnn_1 Convolution Conv_151 1 1 1066_splitncnn_1 1069 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_153 1 1 1069 1072 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_155 1 1 1072 1664 0=224 1=1 5=1 6=12544 BinaryOp Add_156 2 1 1664 1066_splitncnn_0 1075 ReLU Relu_157 1 1 1075 1076 Split splitncnn_21 1 2 1076 1076_splitncnn_0 1076_splitncnn_1 Convolution Conv_158 1 1 1076_splitncnn_1 1079 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_160 1 1 1079 1082 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_162 1 1 1082 1673 0=224 1=1 5=1 6=12544 BinaryOp Add_163 2 1 1673 1076_splitncnn_0 1085 ReLU Relu_164 1 1 1085 1086 Split splitncnn_22 1 2 1086 1086_splitncnn_0 1086_splitncnn_1 Convolution Conv_165 1 1 1086_splitncnn_1 1089 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_167 1 1 1089 1092 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_169 1 1 1092 1682 0=224 1=1 5=1 6=12544 BinaryOp Add_170 2 1 1682 1086_splitncnn_0 1095 ReLU Relu_171 1 1 1095 1096 Split splitncnn_23 1 2 1096 1096_splitncnn_0 1096_splitncnn_1 Convolution Conv_172 1 1 1096_splitncnn_1 1099 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_174 1 1 1099 1102 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_176 1 1 1102 1691 0=224 1=1 5=1 6=12544 BinaryOp Add_177 2 1 1691 1096_splitncnn_0 1105 ReLU Relu_178 1 1 1105 1106 Split splitncnn_24 1 2 1106 1106_splitncnn_0 1106_splitncnn_1 Convolution Conv_179 1 1 1106_splitncnn_1 1109 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_181 1 1 1109 1112 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_183 1 1 1112 1700 0=224 1=1 5=1 6=12544 BinaryOp Add_184 2 1 1700 1106_splitncnn_0 1115 ReLU Relu_185 1 1 1115 1116 Split splitncnn_25 1 2 1116 1116_splitncnn_0 1116_splitncnn_1 Convolution Conv_186 1 1 1116_splitncnn_1 1119 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_188 1 1 1119 1122 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_190 1 1 1122 1709 0=224 1=1 5=1 6=12544 BinaryOp Add_191 2 1 1709 1116_splitncnn_0 1125 ReLU Relu_192 1 1 1125 1126 Split splitncnn_26 1 2 1126 1126_splitncnn_0 1126_splitncnn_1 Convolution Conv_193 1 1 1126_splitncnn_1 1129 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_195 1 1 1129 1132 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_197 1 1 1132 1718 0=224 1=1 5=1 6=12544 BinaryOp Add_198 2 1 1718 1126_splitncnn_0 1135 ReLU Relu_199 1 1 1135 1136 Split splitncnn_27 1 2 1136 1136_splitncnn_0 1136_splitncnn_1 Convolution Conv_200 1 1 1136_splitncnn_1 1139 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_202 1 1 1139 1142 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_204 1 1 1142 1727 0=224 1=1 5=1 6=12544 BinaryOp Add_205 2 1 1727 1136_splitncnn_0 1145 ReLU Relu_206 1 1 1145 1146 Split splitncnn_28 1 2 1146 1146_splitncnn_0 1146_splitncnn_1 Convolution Conv_207 1 1 1146_splitncnn_1 1149 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_209 1 1 1149 1152 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_211 1 1 1152 1736 0=224 1=1 5=1 6=12544 BinaryOp Add_212 2 1 1736 1146_splitncnn_0 1155 ReLU Relu_213 1 1 1155 1156 Split splitncnn_29 1 2 1156 1156_splitncnn_0 1156_splitncnn_1 Convolution Conv_214 1 1 1156_splitncnn_1 1159 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_216 1 1 1159 1162 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_218 1 1 1162 1745 0=224 1=1 5=1 6=12544 BinaryOp Add_219 2 1 1745 1156_splitncnn_0 1165 ReLU Relu_220 1 1 1165 1166 Split splitncnn_30 1 2 1166 1166_splitncnn_0 1166_splitncnn_1 Convolution Conv_221 1 1 1166_splitncnn_1 1169 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_223 1 1 1169 1172 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_225 1 1 1172 1754 0=224 1=1 5=1 6=12544 BinaryOp Add_226 2 1 1754 1166_splitncnn_0 1175 ReLU Relu_227 1 1 1175 1176 Split splitncnn_31 1 2 1176 1176_splitncnn_0 1176_splitncnn_1 Convolution Conv_228 1 1 1176_splitncnn_1 1179 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_230 1 1 1179 1182 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_232 1 1 1182 1763 0=224 1=1 5=1 6=12544 BinaryOp Add_233 2 1 1763 1176_splitncnn_0 1185 ReLU Relu_234 1 1 1185 1186 Split splitncnn_32 1 2 1186 1186_splitncnn_0 1186_splitncnn_1 Convolution Conv_235 1 1 1186_splitncnn_1 1189 0=56 1=1 5=1 6=12544 9=1 Convolution Conv_237 1 1 1189 1192 0=56 1=3 4=1 5=1 6=28224 9=1 Convolution Conv_239 1 1 1192 1772 0=224 1=1 5=1 6=12544 BinaryOp Add_240 2 1 1772 1186_splitncnn_0 1195 ReLU Relu_241 1 1 1195 1196 Split splitncnn_33 1 3 1196 1196_splitncnn_0 1196_splitncnn_1 1196_splitncnn_2 Convolution Conv_242 1 1 1196_splitncnn_2 1199 0=144 1=1 5=1 6=32256 9=1 Convolution Conv_244 1 1 1199 1202 0=144 1=3 3=2 4=1 5=1 6=186624 9=1 Convolution Conv_246 1 1 1202 1781 0=576 1=1 5=1 6=82944 Pooling AveragePool_247 1 1 1196_splitncnn_1 1205 0=1 1=2 2=2 Convolution Conv_248 1 1 1205 1784 0=576 1=1 5=1 6=129024 BinaryOp Add_249 2 1 1781 1784 1208 ReLU Relu_250 1 1 1208 1209 Split splitncnn_34 1 2 1209 1209_splitncnn_0 1209_splitncnn_1 Convolution Conv_251 1 1 1209_splitncnn_1 1212 0=144 1=1 5=1 6=82944 9=1 Convolution Conv_253 1 1 1212 1215 0=144 1=3 4=1 5=1 6=186624 9=1 Convolution Conv_255 1 1 1215 1793 0=576 1=1 5=1 6=82944 BinaryOp Add_256 2 1 1793 1209_splitncnn_0 1218 ReLU Relu_257 1 1 1218 1219 Split splitncnn_35 1 3 1219 1219_splitncnn_0 1219_splitncnn_1 1219_splitncnn_2 Convolution Conv_258 1 1 1219_splitncnn_2 1222 0=184 1=1 5=1 6=105984 9=1 Convolution Conv_260 1 1 1222 1225 0=184 1=3 3=2 4=1 5=1 6=304704 9=1 Convolution Conv_262 1 1 1225 1802 0=736 1=1 5=1 6=135424 Pooling AveragePool_263 1 1 1219_splitncnn_1 1228 0=1 1=2 2=2 Convolution Conv_264 1 1 1228 1805 0=736 1=1 5=1 6=423936 BinaryOp Add_265 2 1 1802 1805 1231 ReLU Relu_266 1 1 1231 1232 Split splitncnn_36 1 2 1232 1232_splitncnn_0 1232_splitncnn_1 Convolution Conv_267 1 1 1232_splitncnn_1 1235 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_269 1 1 1235 1238 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_271 1 1 1238 1814 0=736 1=1 5=1 6=135424 BinaryOp Add_272 2 1 1814 1232_splitncnn_0 1241 ReLU Relu_273 1 1 1241 1242 Split splitncnn_37 1 2 1242 1242_splitncnn_0 1242_splitncnn_1 Convolution Conv_274 1 1 1242_splitncnn_1 1245 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_276 1 1 1245 1248 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_278 1 1 1248 1823 0=736 1=1 5=1 6=135424 BinaryOp Add_279 2 1 1823 1242_splitncnn_0 1251 ReLU Relu_280 1 1 1251 1252 Split splitncnn_38 1 2 1252 1252_splitncnn_0 1252_splitncnn_1 Convolution Conv_281 1 1 1252_splitncnn_1 1255 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_283 1 1 1255 1258 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_285 1 1 1258 1832 0=736 1=1 5=1 6=135424 BinaryOp Add_286 2 1 1832 1252_splitncnn_0 1261 ReLU Relu_287 1 1 1261 1262 Split splitncnn_39 1 2 1262 1262_splitncnn_0 1262_splitncnn_1 Convolution Conv_288 1 1 1262_splitncnn_1 1265 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_290 1 1 1265 1268 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_292 1 1 1268 1841 0=736 1=1 5=1 6=135424 BinaryOp Add_293 2 1 1841 1262_splitncnn_0 1271 ReLU Relu_294 1 1 1271 1272 Split splitncnn_40 1 2 1272 1272_splitncnn_0 1272_splitncnn_1 Convolution Conv_295 1 1 1272_splitncnn_1 1275 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_297 1 1 1275 1278 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_299 1 1 1278 1850 0=736 1=1 5=1 6=135424 BinaryOp Add_300 2 1 1850 1272_splitncnn_0 1281 ReLU Relu_301 1 1 1281 1282 Split splitncnn_41 1 2 1282 1282_splitncnn_0 1282_splitncnn_1 Convolution Conv_302 1 1 1282_splitncnn_1 1285 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_304 1 1 1285 1288 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_306 1 1 1288 1859 0=736 1=1 5=1 6=135424 BinaryOp Add_307 2 1 1859 1282_splitncnn_0 1291 ReLU Relu_308 1 1 1291 1292 Split splitncnn_42 1 2 1292 1292_splitncnn_0 1292_splitncnn_1 Convolution Conv_309 1 1 1292_splitncnn_1 1295 0=184 1=1 5=1 6=135424 9=1 Convolution Conv_311 1 1 1295 1298 0=184 1=3 4=1 5=1 6=304704 9=1 Convolution Conv_313 1 1 1298 1868 0=736 1=1 5=1 6=135424 BinaryOp Add_314 2 1 1868 1292_splitncnn_0 1301 ReLU Relu_315 1 1 1301 1302 Convolution Conv_316 1 1 1196_splitncnn_0 1303 0=128 1=1 5=1 6=28672 Convolution Conv_317 1 1 1219_splitncnn_0 1304 0=128 1=1 5=1 6=73728 Convolution Conv_318 1 1 1302 1305 0=128 1=1 5=1 6=94208 Split splitncnn_43 1 2 1305 1305_splitncnn_0 1305_splitncnn_1 Interp Resize_337 1 1 1305_splitncnn_1 1324 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_338 2 1 1304 1324 1325 Split splitncnn_44 1 2 1325 1325_splitncnn_0 1325_splitncnn_1 Interp Resize_357 1 1 1325_splitncnn_1 1344 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_358 2 1 1303 1344 1345 Convolution Conv_359 1 1 1345 1346 0=128 1=3 4=1 5=1 6=147456 Split splitncnn_45 1 2 1346 1346_splitncnn_0 1346_splitncnn_1 Convolution Conv_360 1 1 1325_splitncnn_0 1347 0=128 1=3 4=1 5=1 6=147456 Convolution Conv_361 1 1 1305_splitncnn_0 1348 0=128 1=3 4=1 5=1 6=147456 Convolution Conv_362 1 1 1346_splitncnn_1 1349 0=128 1=3 3=2 4=1 5=1 6=147456 BinaryOp Add_363 2 1 1347 1349 1350 Split splitncnn_46 1 2 1350 1350_splitncnn_0 1350_splitncnn_1 Convolution Conv_364 1 1 1350_splitncnn_1 1351 0=128 1=3 3=2 4=1 5=1 6=147456 BinaryOp Add_365 2 1 1348 1351 1352 Convolution Conv_366 1 1 1350_splitncnn_0 1353 0=128 1=3 4=1 5=1 6=147456 Convolution Conv_367 1 1 1352 1354 0=128 1=3 4=1 5=1 6=147456 Convolution Conv_368 1 1 1346_splitncnn_0 1355 0=256 1=3 4=1 6=294912 GroupNorm Add_377 1 1 1355 1366 0=32 1=256 2=1.000000e-05 ReLU Relu_378 1 1 1366 1367 Convolution Conv_379 1 1 1367 1368 0=256 1=3 4=1 6=589824 GroupNorm Add_388 1 1 1368 1379 0=32 1=256 2=1.000000e-05 ReLU Relu_389 1 1 1379 1380 Split splitncnn_47 1 2 1380 1380_splitncnn_0 1380_splitncnn_1 Convolution Conv_390 1 1 1380_splitncnn_1 1386 0=2 1=3 4=1 5=1 6=4608 Convolution Conv_391 1 1 1380_splitncnn_0 1382 0=8 1=3 4=1 5=1 6=18432 BinaryOp Mul_392 1 1 1382 bbox_8 0=2 1=1 2=9.446464e-01 Sigmoid Sigmoid_396 1 1 1386 score_8 Convolution Conv_400 1 1 1353 1391 0=256 1=3 4=1 6=294912 GroupNorm Add_409 1 1 1391 1402 0=32 1=256 2=1.000000e-05 ReLU Relu_410 1 1 1402 1403 Convolution Conv_411 1 1 1403 1404 0=256 1=3 4=1 6=589824 GroupNorm Add_420 1 1 1404 1415 0=32 1=256 2=1.000000e-05 ReLU Relu_421 1 1 1415 1416 Split splitncnn_48 1 2 1416 1416_splitncnn_0 1416_splitncnn_1 Convolution Conv_422 1 1 1416_splitncnn_1 1422 0=2 1=3 4=1 5=1 6=4608 Convolution Conv_423 1 1 1416_splitncnn_0 1418 0=8 1=3 4=1 5=1 6=18432 BinaryOp Mul_424 1 1 1418 bbox_16 0=2 1=1 2=1.461800e+00 Sigmoid Sigmoid_428 1 1 1422 score_16 Convolution Conv_432 1 1 1354 1427 0=256 1=3 4=1 6=294912 GroupNorm Add_441 1 1 1427 1438 0=32 1=256 2=1.000000e-05 ReLU Relu_442 1 1 1438 1439 Convolution Conv_443 1 1 1439 1440 0=256 1=3 4=1 6=589824 GroupNorm Add_452 1 1 1440 1451 0=32 1=256 2=1.000000e-05 ReLU Relu_453 1 1 1451 1452 Split splitncnn_49 1 2 1452 1452_splitncnn_0 1452_splitncnn_1 Convolution Conv_454 1 1 1452_splitncnn_1 1458 0=2 1=3 4=1 5=1 6=4608 Convolution Conv_455 1 1 1452_splitncnn_0 1454 0=8 1=3 4=1 5=1 6=18432 BinaryOp Mul_456 1 1 1454 bbox_32 0=2 1=1 2=1.589572e+00 Sigmoid Sigmoid_460 1 1 1458 score_32 ================================================ FILE: 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: app/src/main/assets/scrfd_500m_kps-opt2.param ================================================ 7767517 79 91 Input input.1 0 1 input.1 Convolution Conv_0 1 1 input.1 288 0=16 1=3 3=2 4=1 5=1 6=432 9=1 ConvolutionDepthWise Conv_3 1 1 288 291 0=16 1=3 4=1 5=1 6=144 7=16 9=1 Convolution Conv_6 1 1 291 294 0=16 1=1 5=1 6=256 9=1 ConvolutionDepthWise Conv_9 1 1 294 297 0=16 1=3 3=2 4=1 5=1 6=144 7=16 9=1 Convolution Conv_12 1 1 297 300 0=40 1=1 5=1 6=640 9=1 ConvolutionDepthWise Conv_15 1 1 300 303 0=40 1=3 4=1 5=1 6=360 7=40 9=1 Convolution Conv_18 1 1 303 306 0=40 1=1 5=1 6=1600 9=1 ConvolutionDepthWise Conv_21 1 1 306 309 0=40 1=3 3=2 4=1 5=1 6=360 7=40 9=1 Convolution Conv_24 1 1 309 312 0=72 1=1 5=1 6=2880 9=1 ConvolutionDepthWise Conv_27 1 1 312 315 0=72 1=3 4=1 5=1 6=648 7=72 9=1 Convolution Conv_30 1 1 315 318 0=72 1=1 5=1 6=5184 9=1 ConvolutionDepthWise Conv_33 1 1 318 321 0=72 1=3 4=1 5=1 6=648 7=72 9=1 Convolution Conv_36 1 1 321 324 0=72 1=1 5=1 6=5184 9=1 Split splitncnn_0 1 2 324 324_splitncnn_0 324_splitncnn_1 ConvolutionDepthWise Conv_39 1 1 324_splitncnn_1 327 0=72 1=3 3=2 4=1 5=1 6=648 7=72 9=1 Convolution Conv_42 1 1 327 330 0=152 1=1 5=1 6=10944 9=1 ConvolutionDepthWise Conv_45 1 1 330 333 0=152 1=3 4=1 5=1 6=1368 7=152 9=1 Convolution Conv_48 1 1 333 336 0=152 1=1 5=1 6=23104 9=1 Split splitncnn_1 1 2 336 336_splitncnn_0 336_splitncnn_1 ConvolutionDepthWise Conv_51 1 1 336_splitncnn_1 339 0=152 1=3 3=2 4=1 5=1 6=1368 7=152 9=1 Convolution Conv_54 1 1 339 342 0=288 1=1 5=1 6=43776 9=1 ConvolutionDepthWise Conv_57 1 1 342 345 0=288 1=3 4=1 5=1 6=2592 7=288 9=1 Convolution Conv_60 1 1 345 348 0=288 1=1 5=1 6=82944 9=1 ConvolutionDepthWise Conv_63 1 1 348 351 0=288 1=3 4=1 5=1 6=2592 7=288 9=1 Convolution Conv_66 1 1 351 354 0=288 1=1 5=1 6=82944 9=1 ConvolutionDepthWise Conv_69 1 1 354 357 0=288 1=3 4=1 5=1 6=2592 7=288 9=1 Convolution Conv_72 1 1 357 360 0=288 1=1 5=1 6=82944 9=1 ConvolutionDepthWise Conv_75 1 1 360 363 0=288 1=3 4=1 5=1 6=2592 7=288 9=1 Convolution Conv_78 1 1 363 366 0=288 1=1 5=1 6=82944 9=1 ConvolutionDepthWise Conv_81 1 1 366 369 0=288 1=3 4=1 5=1 6=2592 7=288 9=1 Convolution Conv_84 1 1 369 372 0=288 1=1 5=1 6=82944 9=1 Convolution Conv_87 1 1 324_splitncnn_0 373 0=16 1=1 5=1 6=1152 Convolution Conv_88 1 1 336_splitncnn_0 374 0=16 1=1 5=1 6=2432 Convolution Conv_89 1 1 372 375 0=16 1=1 5=1 6=4608 Split splitncnn_2 1 2 375 375_splitncnn_0 375_splitncnn_1 Interp Resize_108 1 1 375_splitncnn_1 394 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_109 2 1 374 394 395 Split splitncnn_3 1 2 395 395_splitncnn_0 395_splitncnn_1 Interp Resize_128 1 1 395_splitncnn_1 414 0=1 1=2.000000e+00 2=2.000000e+00 BinaryOp Add_129 2 1 373 414 415 Convolution Conv_130 1 1 415 416 0=16 1=3 4=1 5=1 6=2304 Split splitncnn_4 1 2 416 416_splitncnn_0 416_splitncnn_1 Convolution Conv_131 1 1 395_splitncnn_0 417 0=16 1=3 4=1 5=1 6=2304 Convolution Conv_132 1 1 375_splitncnn_0 418 0=16 1=3 4=1 5=1 6=2304 Convolution Conv_133 1 1 416_splitncnn_1 419 0=16 1=3 3=2 4=1 5=1 6=2304 BinaryOp Add_134 2 1 417 419 420 Split splitncnn_5 1 2 420 420_splitncnn_0 420_splitncnn_1 Convolution Conv_135 1 1 420_splitncnn_1 421 0=16 1=3 3=2 4=1 5=1 6=2304 BinaryOp Add_136 2 1 418 421 422 Convolution Conv_137 1 1 420_splitncnn_0 423 0=16 1=3 4=1 5=1 6=2304 Convolution Conv_138 1 1 422 424 0=16 1=3 4=1 5=1 6=2304 ConvolutionDepthWise Conv_139 1 1 416_splitncnn_0 427 0=16 1=3 4=1 5=1 6=144 7=16 9=1 Convolution Conv_142 1 1 427 430 0=64 1=1 5=1 6=1024 9=1 ConvolutionDepthWise Conv_145 1 1 430 433 0=64 1=3 4=1 5=1 6=576 7=64 9=1 Convolution Conv_148 1 1 433 436 0=64 1=1 5=1 6=4096 9=1 Split splitncnn_6 1 3 436 436_splitncnn_0 436_splitncnn_1 436_splitncnn_2 Convolution Conv_151 1 1 436_splitncnn_2 442 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_152 1 1 436_splitncnn_1 bbox_8 0=8 1=3 4=1 5=1 6=4608 Convolution Conv_153 1 1 436_splitncnn_0 kps_8 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_157 1 1 442 score_8 ConvolutionDepthWise Conv_164 1 1 423 452 0=16 1=3 4=1 5=1 6=144 7=16 9=1 Convolution Conv_167 1 1 452 455 0=64 1=1 5=1 6=1024 9=1 ConvolutionDepthWise Conv_170 1 1 455 458 0=64 1=3 4=1 5=1 6=576 7=64 9=1 Convolution Conv_173 1 1 458 461 0=64 1=1 5=1 6=4096 9=1 Split splitncnn_7 1 3 461 461_splitncnn_0 461_splitncnn_1 461_splitncnn_2 Convolution Conv_176 1 1 461_splitncnn_2 467 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_177 1 1 461_splitncnn_1 bbox_16 0=8 1=3 4=1 5=1 6=4608 Convolution Conv_178 1 1 461_splitncnn_0 kps_16 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_182 1 1 467 score_16 ConvolutionDepthWise Conv_189 1 1 424 477 0=16 1=3 4=1 5=1 6=144 7=16 9=1 Convolution Conv_192 1 1 477 480 0=64 1=1 5=1 6=1024 9=1 ConvolutionDepthWise Conv_195 1 1 480 483 0=64 1=3 4=1 5=1 6=576 7=64 9=1 Convolution Conv_198 1 1 483 486 0=64 1=1 5=1 6=4096 9=1 Split splitncnn_8 1 3 486 486_splitncnn_0 486_splitncnn_1 486_splitncnn_2 Convolution Conv_201 1 1 486_splitncnn_2 492 0=2 1=3 4=1 5=1 6=1152 Convolution Conv_202 1 1 486_splitncnn_1 bbox_32 0=8 1=3 4=1 5=1 6=4608 Convolution Conv_203 1 1 486_splitncnn_0 kps_32 0=20 1=3 4=1 5=1 6=11520 Sigmoid Sigmoid_207 1 1 492 score_32 ================================================ FILE: 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: 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: app/src/main/jni/CMakeLists.txt ================================================ project(scrfdncnn) cmake_minimum_required(VERSION 3.10) set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.13.0-android/sdk/native/jni) find_package(OpenCV REQUIRED core imgproc) set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20260113-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: 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 #include #include #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; yon_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_pollOnce(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(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: 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 #include #include #include #include #include #include #include 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: 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 #include #include #include "cpu.h" static inline float intersection_area(const FaceObject& a, const FaceObject& b) { cv::Rect_ inter = a.rect & b.rect; return inter.area(); } static void qsort_descent_inplace(std::vector& 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& faceobjects) { if (faceobjects.empty()) return; qsort_descent_inplace(faceobjects, 0, faceobjects.size() - 1); } static void nms_sorted_bboxes(const std::vector& faceobjects, std::vector& picked, float nms_threshold) { picked.clear(); const int n = faceobjects.size(); std::vector 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& 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(); #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(mgr, parampath); scrfd.load_model(mgr, modelpath); has_kps = strstr(modeltype, "_kps") != NULL; return 0; } int SCRFD::detect(const cv::Mat& rgb, std::vector& 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 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 faceobjects8; generate_proposals(anchors, feat_stride, score_blob, bbox_blob, kps_blob, prob_threshold, faceobjects8); faceproposals.insert(faceproposals.end(), faceobjects8.begin(), faceobjects8.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 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 faceobjects32; generate_proposals(anchors, feat_stride, score_blob, bbox_blob, kps_blob, prob_threshold, faceobjects32); faceproposals.insert(faceproposals.end(), faceobjects32.begin(), faceobjects32.end()); } // sort all proposals by score from highest to lowest qsort_descent_inplace(faceproposals); // apply nms with nms_threshold std::vector 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; } int SCRFD::draw(cv::Mat& rgb, const std::vector& faceobjects) { for (size_t i = 0; i < faceobjects.size(); i++) { const FaceObject& obj = faceobjects[i]; // fprintf(stderr, "%.5f at %.2f %.2f %.2f x %.2f\n", obj.prob, // obj.rect.x, obj.rect.y, obj.rect.width, obj.rect.height); 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: 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 #include struct FaceObject { cv::Rect_ 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& faceobjects, float prob_threshold = 0.5f, float nms_threshold = 0.45f); int draw(cv::Mat& rgb, const std::vector& faceobjects); private: ncnn::Net scrfd; bool has_kps; }; #endif // SCRFD_H ================================================ FILE: 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 #include #include #include #include #include #include #include #include #include "scrfd.h" #include "ndkcamera.h" #include #include #if __ARM_NEON #include #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 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 > 7 || 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", "500m_kps", "1g", "2.5g", "2.5g_kps", "10g", "10g_kps", "34g" }; 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: app/src/main/res/layout/main.xml ================================================