From be36bacdaafbf049ecf1cd3b35da614b8ee6e800 Mon Sep 17 00:00:00 2001 From: Mengwei Liu Date: Mon, 19 May 2025 17:20:36 +0000 Subject: [PATCH] [pytorch] Delete TorchScript based Android demo app and point user to ExecuTorch (#153767) Summary: A retry of #153656. This time start from co-dev to make sure we capture internal signals. Test Plan: Rely on CI jobs. Differential Revision: D74911818 Pull Request resolved: https://github.com/pytorch/pytorch/pull/153767 Approved by: https://github.com/kirklandsign, https://github.com/cyyever, https://github.com/Skylion007 --- android/README.md | 10 +- android/build_test_app.sh | 30 - android/build_test_app_custom.sh | 32 - android/settings.gradle | 1 - android/test_app/.gitignore | 9 - android/test_app/app/CMakeLists.txt | 38 - android/test_app/app/build.gradle | 190 ---- .../test_app/app/src/main/AndroidManifest.xml | 27 - .../test_app/app/src/main/assets/.gitignore | 3 - .../app/src/main/cpp/pytorch_testapp_jni.cpp | 77 -- .../org/pytorch/testapp/CameraActivity.java | 214 ---- .../java/org/pytorch/testapp/Constants.java | 1009 ----------------- .../pytorch/testapp/LibtorchNativeClient.java | 22 - .../org/pytorch/testapp/MainActivity.java | 171 --- .../main/java/org/pytorch/testapp/Result.java | 14 - .../main/java/org/pytorch/testapp/Utils.java | 28 - .../src/main/res/layout/activity_camera.xml | 23 - .../app/src/main/res/layout/activity_main.xml | 17 - .../app/src/main/res/layout/texture_view.xml | 5 - .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 0 bytes .../app/src/main/res/values/colors.xml | 6 - .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 11 - android/test_app/make_assets.py | 24 - android/test_app/make_assets_custom.py | 27 - 26 files changed, 4 insertions(+), 1987 deletions(-) delete mode 100755 android/build_test_app.sh delete mode 100755 android/build_test_app_custom.sh delete mode 100644 android/test_app/.gitignore delete mode 100644 android/test_app/app/CMakeLists.txt delete mode 100644 android/test_app/app/build.gradle delete mode 100644 android/test_app/app/src/main/AndroidManifest.xml delete mode 100644 android/test_app/app/src/main/assets/.gitignore delete mode 100644 android/test_app/app/src/main/cpp/pytorch_testapp_jni.cpp delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/CameraActivity.java delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/Constants.java delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/LibtorchNativeClient.java delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/MainActivity.java delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/Result.java delete mode 100644 android/test_app/app/src/main/java/org/pytorch/testapp/Utils.java delete mode 100644 android/test_app/app/src/main/res/layout/activity_camera.xml delete mode 100644 android/test_app/app/src/main/res/layout/activity_main.xml delete mode 100644 android/test_app/app/src/main/res/layout/texture_view.xml delete mode 100644 android/test_app/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/test_app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/test_app/app/src/main/res/values/colors.xml delete mode 100644 android/test_app/app/src/main/res/values/strings.xml delete mode 100644 android/test_app/app/src/main/res/values/styles.xml delete mode 100644 android/test_app/make_assets.py delete mode 100644 android/test_app/make_assets_custom.py diff --git a/android/README.md b/android/README.md index d6a1ba1d447..6b8000c13fc 100644 --- a/android/README.md +++ b/android/README.md @@ -2,7 +2,9 @@ ## Demo applications and tutorials -Demo applications with code walk-through can be find in [this github repo](https://github.com/pytorch/android-demo-app). +Please refer to [pytorch-labs/executorch-examples](https://github.com/pytorch-labs/executorch-examples/tree/main/dl3/android/DeepLabV3Demo) for the Android demo app based on [ExecuTorch](https://github.com/pytorch/executorch). + +Please join our [Discord](https://discord.com/channels/1334270993966825602/1349854760299270284) for any questions. ## Publishing @@ -119,8 +121,6 @@ We also have to add all transitive dependencies of our aars. As `pytorch_android` [depends](https://github.com/pytorch/pytorch/blob/master/android/pytorch_android/build.gradle#L76-L77) on `'com.facebook.soloader:nativeloader:0.10.5'` and `'com.facebook.fbjni:fbjni-java-only:0.2.2'`, we need to add them. (In case of using maven dependencies they are added automatically from `pom.xml`). -You can check out [test app example](https://github.com/pytorch/pytorch/blob/master/android/test_app/app/build.gradle) that uses aars directly. - ## Linking to prebuilt libtorch library from gradle dependency In some cases, you may want to use libtorch from your android native build. @@ -202,7 +202,7 @@ find_library(FBJNI_LIBRARY fbjni NO_CMAKE_FIND_ROOT_PATH) target_link_libraries(${PROJECT_NAME} - ${PYTORCH_LIBRARY}) + ${PYTORCH_LIBRARY} ${FBJNI_LIBRARY}) ``` @@ -233,8 +233,6 @@ void loadAndForwardModel(const std::string& modelPath) { To load torchscript model for mobile we need some special setup which is placed in `struct JITCallGuard` in this example. It may change in future, you can track the latest changes keeping an eye in our [pytorch android jni code]([https://github.com/pytorch/pytorch/blob/master/android/pytorch_android/src/main/cpp/pytorch_jni_jit.cpp#L28) -[Example of linking to libtorch from aar](https://github.com/pytorch/pytorch/tree/master/android/test_app) - ## PyTorch Android API Javadoc You can find more details about the PyTorch Android API in the [Javadoc](https://pytorch.org/javadoc/). diff --git a/android/build_test_app.sh b/android/build_test_app.sh deleted file mode 100755 index 1f552fa4486..00000000000 --- a/android/build_test_app.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -set -eux - -PYTORCH_DIR="$(cd $(dirname $0)/..; pwd -P)" -PYTORCH_ANDROID_DIR=$PYTORCH_DIR/android - -echo "PYTORCH_DIR:$PYTORCH_DIR" - -source "$PYTORCH_ANDROID_DIR/common.sh" - -check_android_sdk -check_gradle -parse_abis_list "$@" -build_android - -# To set proxy for gradle add following lines to ./gradle/gradle.properties: -# systemProp.http.proxyHost=... -# systemProp.http.proxyPort=8080 -# systemProp.https.proxyHost=... -# systemProp.https.proxyPort=8080 - -if [ "$CUSTOM_ABIS_LIST" = true ]; then - NDK_DEBUG=1 $GRADLE_PATH -PnativeLibsDoNotStrip=true -PABI_FILTERS=$ABIS_LIST -p $PYTORCH_ANDROID_DIR clean test_app:assembleDebug -else - NDK_DEBUG=1 $GRADLE_PATH -PnativeLibsDoNotStrip=true -p $PYTORCH_ANDROID_DIR clean test_app:assembleDebug -fi - -find $PYTORCH_ANDROID_DIR -type f -name *apk - -find $PYTORCH_ANDROID_DIR -type f -name *apk | xargs echo "To install apk run: $ANDROID_HOME/platform-tools/adb install -r " diff --git a/android/build_test_app_custom.sh b/android/build_test_app_custom.sh deleted file mode 100755 index 8577a344fa4..00000000000 --- a/android/build_test_app_custom.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -############################################################################### -# This script tests the custom selective build flow for PyTorch Android, which -# optimizes library size by only including ops used by a specific model. -############################################################################### - -set -eux - -PYTORCH_DIR="$(cd $(dirname $0)/..; pwd -P)" -PYTORCH_ANDROID_DIR="${PYTORCH_DIR}/android" -BUILD_ROOT="${PYTORCH_DIR}/build_pytorch_android_custom" - -source "${PYTORCH_ANDROID_DIR}/common.sh" - -prepare_model_and_dump_root_ops() { - cd "${BUILD_ROOT}" - MODEL="${BUILD_ROOT}/MobileNetV2.pt" - ROOT_OPS="${BUILD_ROOT}/MobileNetV2.yaml" - python "${PYTORCH_ANDROID_DIR}/test_app/make_assets_custom.py" - cp "${MODEL}" "${PYTORCH_ANDROID_DIR}/test_app/app/src/main/assets/mobilenet2.pt" -} - -# Start building -mkdir -p "${BUILD_ROOT}" -check_android_sdk -check_gradle -parse_abis_list "$@" -prepare_model_and_dump_root_ops -SELECTED_OP_LIST="${ROOT_OPS}" build_android - -# TODO: change this to build test_app instead -$GRADLE_PATH -PABI_FILTERS=$ABIS_LIST -p $PYTORCH_ANDROID_DIR clean assembleRelease diff --git a/android/settings.gradle b/android/settings.gradle index 743f388b650..6afc8a18dbc 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -3,4 +3,3 @@ include ':app', ':pytorch_android', ':pytorch_android_torchvision', ':pytorch_ho project(':pytorch_android_torchvision').projectDir = file('pytorch_android_torchvision') project(':pytorch_host').projectDir = file('pytorch_android/host') -project(':test_app').projectDir = file('test_app/app') diff --git a/android/test_app/.gitignore b/android/test_app/.gitignore deleted file mode 100644 index b90a745d805..00000000000 --- a/android/test_app/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -local.properties -**/*.iml -.gradle -gradlew* -gradle/wrapper -.idea/* -.DS_Store -build -.externalNativeBuild diff --git a/android/test_app/app/CMakeLists.txt b/android/test_app/app/CMakeLists.txt deleted file mode 100644 index c54f49f53a1..00000000000 --- a/android/test_app/app/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -set(PROJECT_NAME pytorch_testapp_jni) -project(${PROJECT_NAME} CXX) -set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ standard whose features are requested to build this target.") -set(CMAKE_VERBOSE_MAKEFILE ON) - -set(build_DIR ${CMAKE_SOURCE_DIR}/build) - -set(pytorch_testapp_cpp_DIR ${CMAKE_CURRENT_LIST_DIR}/src/main/cpp) -message(STATUS "ANDROID_STL:${ANDROID_STL}") -file(GLOB pytorch_testapp_SOURCES - ${pytorch_testapp_cpp_DIR}/pytorch_testapp_jni.cpp -) - -add_library(${PROJECT_NAME} SHARED - ${pytorch_testapp_SOURCES} -) - -file(GLOB PYTORCH_INCLUDE_DIRS "${build_DIR}/pytorch_android*.aar/headers") -file(GLOB PYTORCH_LINK_DIRS "${build_DIR}/pytorch_android*.aar/jni/${ANDROID_ABI}") - -target_compile_options(${PROJECT_NAME} PRIVATE - -fexceptions -) - -set(BUILD_SUBDIR ${ANDROID_ABI}) - -target_include_directories(${PROJECT_NAME} PRIVATE - ${PYTORCH_INCLUDE_DIRS} -) - -find_library(PYTORCH_LIBRARY pytorch_jni - PATHS ${PYTORCH_LINK_DIRS} - NO_CMAKE_FIND_ROOT_PATH) - -target_link_libraries(${PROJECT_NAME} - ${PYTORCH_LIBRARY} - log) diff --git a/android/test_app/app/build.gradle b/android/test_app/app/build.gradle deleted file mode 100644 index 963ff1a7a42..00000000000 --- a/android/test_app/app/build.gradle +++ /dev/null @@ -1,190 +0,0 @@ -apply plugin: 'com.android.application' - -repositories { - jcenter() - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - } - flatDir { - dirs 'aars' - } -} - -android { - configurations { - extractForNativeBuild - } - compileOptions { - sourceCompatibility 1.8 - targetCompatibility 1.8 - } - compileSdkVersion rootProject.compileSdkVersion - buildToolsVersion rootProject.buildToolsVersion - defaultConfig { - applicationId "org.pytorch.testapp" - minSdkVersion rootProject.minSdkVersion - targetSdkVersion rootProject.targetSdkVersion - versionCode 1 - versionName "1.0" - ndk { - abiFilters ABI_FILTERS.split(",") - } - // Commented due to dependency on local copy of pytorch_android aar to aars folder - //externalNativeBuild { - // cmake { - // abiFilters ABI_FILTERS.split(",") - // arguments "-DANDROID_STL=c++_shared" - // } - //} - buildConfigField("String", "MODULE_ASSET_NAME", "\"mobilenet2q.pt\"") - buildConfigField("String", "LOGCAT_TAG", "@string/app_name") - buildConfigField("long[]", "INPUT_TENSOR_SHAPE", "new long[]{1, 3, 224, 224}") - buildConfigField("boolean", "NATIVE_BUILD", 'false') - buildConfigField("boolean", "USE_VULKAN_DEVICE", 'false') - buildConfigField( - "int", - "BUILD_LITE_INTERPRETER", - System.env.BUILD_LITE_INTERPRETER != null ? System.env.BUILD_LITE_INTERPRETER : "1" - ) - addManifestPlaceholders([APP_NAME: "@string/app_name", MAIN_ACTIVITY: "org.pytorch.testapp.MainActivity"]) - } - buildTypes { - debug { - minifyEnabled false - debuggable true - } - release { - minifyEnabled false - } - } - // Commented due to dependency on local copy of pytorch_android aar to aars folder - //externalNativeBuild { - // cmake { - // path "CMakeLists.txt" - // } - //} - flavorDimensions "model", "build", "activity" - productFlavors { - mnet { - dimension "model" - applicationIdSuffix ".mnet" - buildConfigField("String", "MODULE_ASSET_NAME", "\"mobilenet_v2.ptl\"") - addManifestPlaceholders([APP_NAME: "MNET"]) - buildConfigField("String", "LOGCAT_TAG", "\"pytorch-mnet\"") - } - // NB: This is not working atm https://github.com/pytorch/pytorch/issues/102966 - mnetVulkan { - dimension "model" - applicationIdSuffix ".mnet_vulkan" - buildConfigField("String", "MODULE_ASSET_NAME", "\"mobilenet_v2_vulkan.ptl\"") - buildConfigField("boolean", "USE_VULKAN_DEVICE", 'true') - addManifestPlaceholders([APP_NAME: "MNET_VULKAN"]) - buildConfigField("String", "LOGCAT_TAG", "\"pytorch-mnet-vulkan\"") - } - resnet18 { - dimension "model" - applicationIdSuffix ".resnet18" - buildConfigField("String", "MODULE_ASSET_NAME", "\"resnet18.ptl\"") - addManifestPlaceholders([APP_NAME: "RN18"]) - buildConfigField("String", "LOGCAT_TAG", "\"pytorch-resnet18\"") - } - local { - dimension "build" - } - nightly { - dimension "build" - } - aar { - dimension "build" - } - // Commented due to dependency on local copy of pytorch_android aar to aars folder - //nativeBuild { - // dimension "build" - // buildConfigField("boolean", "NATIVE_BUILD", "true") - //} - camera { - dimension "activity" - addManifestPlaceholders([MAIN_ACTIVITY: "org.pytorch.testapp.CameraActivity"]) - } - base { - dimension "activity" - sourceSets { - main { - java { - exclude 'org/pytorch/testapp/CameraActivity.java' - } - } - } - } - } - packagingOptions { - doNotStrip '**.so' - } - - // Filtering for CI - if (!testAppAllVariantsEnabled.toBoolean()) { - variantFilter { variant -> - def names = variant.flavors*.name - if (names.contains("nightly") - || names.contains("camera") - || names.contains("aar") - || names.contains("nativeBuild")) { - setIgnore(true) - } - } - } -} - -tasks.all { task -> - // Disable externalNativeBuild for all but nativeBuild variant - if (task.name.startsWith('externalNativeBuild') - && !task.name.contains('NativeBuild')) { - task.enabled = false - } -} - -dependencies { - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.facebook.soloader:nativeloader:0.10.5' - - localImplementation project(':pytorch_android') - localImplementation project(':pytorch_android_torchvision') - - // Commented due to dependency on local copy of pytorch_android aar to aars folder - //nativeBuildImplementation(name: 'pytorch_android-release', ext: 'aar') - //nativeBuildImplementation(name: 'pytorch_android_torchvision-release', ext: 'aar') - //extractForNativeBuild(name: 'pytorch_android-release', ext: 'aar') - - nightlyImplementation 'org.pytorch:pytorch_android:2.2.0-SNAPSHOT' - nightlyImplementation 'org.pytorch:pytorch_android_torchvision:2.2.0-SNAPSHOT' - - aarImplementation(name:'pytorch_android', ext:'aar') - aarImplementation(name:'pytorch_android_torchvision', ext:'aar') - aarImplementation 'com.facebook.soloader:nativeloader:0.10.5' - aarImplementation 'com.facebook.fbjni:fbjni-java-only:0.2.2' - - def camerax_version = "1.0.0-alpha05" - cameraImplementation "androidx.camera:camera-core:$camerax_version" - cameraImplementation "androidx.camera:camera-camera2:$camerax_version" - cameraImplementation 'com.google.android.material:material:1.0.0-beta01' -} - -task extractAARForNativeBuild { - doLast { - configurations.extractForNativeBuild.files.each { - def file = it.absoluteFile - copy { - from zipTree(file) - into "$buildDir/$file.name" - include "headers/**" - include "jni/**" - } - } - } -} - -tasks.whenTaskAdded { task -> - if (task.name.contains('externalNativeBuild')) { - task.dependsOn(extractAARForNativeBuild) - } -} diff --git a/android/test_app/app/src/main/AndroidManifest.xml b/android/test_app/app/src/main/AndroidManifest.xml deleted file mode 100644 index abdd9a8d986..00000000000 --- a/android/test_app/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/android/test_app/app/src/main/assets/.gitignore b/android/test_app/app/src/main/assets/.gitignore deleted file mode 100644 index 94548af5beb..00000000000 --- a/android/test_app/app/src/main/assets/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -*/ -!.gitignore diff --git a/android/test_app/app/src/main/cpp/pytorch_testapp_jni.cpp b/android/test_app/app/src/main/cpp/pytorch_testapp_jni.cpp deleted file mode 100644 index d282099a283..00000000000 --- a/android/test_app/app/src/main/cpp/pytorch_testapp_jni.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include -#include -#include -#include -#define ALOGI(...) \ - __android_log_print(ANDROID_LOG_INFO, "PyTorchTestAppJni", __VA_ARGS__) -#define ALOGE(...) \ - __android_log_print(ANDROID_LOG_ERROR, "PyTorchTestAppJni", __VA_ARGS__) - -#include "jni.h" - -#include - -namespace pytorch_testapp_jni { -namespace { - -template -void log(const char* m, T t) { - std::ostringstream os; - os << t << std::endl; - ALOGI("%s %s", m, os.str().c_str()); -} - -struct JITCallGuard { - c10::InferenceMode guard; - torch::jit::GraphOptimizerEnabledGuard no_optimizer_guard{false}; -}; -} // namespace - -static void loadAndForwardModel(JNIEnv* env, jclass, jstring jModelPath) { - const char* modelPath = env->GetStringUTFChars(jModelPath, 0); - assert(modelPath); - - // To load torchscript model for mobile we need set these guards, - // because mobile build doesn't support features like autograd for smaller - // build size which is placed in `struct JITCallGuard` in this example. It may - // change in future, you can track the latest changes keeping an eye in - // android/pytorch_android/src/main/cpp/pytorch_jni_jit.cpp - JITCallGuard guard; - torch::jit::Module module = torch::jit::load(modelPath); - module.eval(); - torch::Tensor t = torch::randn({1, 3, 224, 224}); - log("input tensor:", t); - c10::IValue t_out = module.forward({t}); - log("output tensor:", t_out); - env->ReleaseStringUTFChars(jModelPath, modelPath); -} -} // namespace pytorch_testapp_jni - -JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) { - JNIEnv* env; - if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { - return JNI_ERR; - } - - jclass c = - env->FindClass("org/pytorch/testapp/LibtorchNativeClient$NativePeer"); - if (c == nullptr) { - return JNI_ERR; - } - - static const JNINativeMethod methods[] = { - {"loadAndForwardModel", - "(Ljava/lang/String;)V", - (void*)pytorch_testapp_jni::loadAndForwardModel}, - }; - int rc = env->RegisterNatives( - c, methods, sizeof(methods) / sizeof(JNINativeMethod)); - - if (rc != JNI_OK) { - return rc; - } - - return JNI_VERSION_1_6; -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/CameraActivity.java b/android/test_app/app/src/main/java/org/pytorch/testapp/CameraActivity.java deleted file mode 100644 index da3b05b7feb..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/CameraActivity.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.pytorch.testapp; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; -import android.util.Log; -import android.util.Size; -import android.view.TextureView; -import android.view.ViewStub; -import android.widget.TextView; -import android.widget.Toast; -import androidx.annotation.Nullable; -import androidx.annotation.UiThread; -import androidx.annotation.WorkerThread; -import androidx.appcompat.app.AppCompatActivity; -import androidx.camera.core.CameraX; -import androidx.camera.core.ImageAnalysis; -import androidx.camera.core.ImageAnalysisConfig; -import androidx.camera.core.ImageProxy; -import androidx.camera.core.Preview; -import androidx.camera.core.PreviewConfig; -import androidx.core.app.ActivityCompat; -import java.nio.FloatBuffer; -import org.pytorch.IValue; -import org.pytorch.MemoryFormat; -import org.pytorch.Module; -import org.pytorch.PyTorchAndroid; -import org.pytorch.Tensor; -import org.pytorch.torchvision.TensorImageUtils; - -public class CameraActivity extends AppCompatActivity { - private static final String TAG = BuildConfig.LOGCAT_TAG; - private static final int TEXT_TRIM_SIZE = 4096; - - private static final int REQUEST_CODE_CAMERA_PERMISSION = 200; - private static final String[] PERMISSIONS = {Manifest.permission.CAMERA}; - - private long mLastAnalysisResultTime; - - protected HandlerThread mBackgroundThread; - protected Handler mBackgroundHandler; - protected Handler mUIHandler; - - private TextView mTextView; - private StringBuilder mTextViewStringBuilder = new StringBuilder(); - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_camera); - mTextView = findViewById(R.id.text); - mUIHandler = new Handler(getMainLooper()); - startBackgroundThread(); - - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_CODE_CAMERA_PERMISSION); - } else { - setupCameraX(); - } - } - - @Override - protected void onPostCreate(@Nullable Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - startBackgroundThread(); - } - - protected void startBackgroundThread() { - mBackgroundThread = new HandlerThread("ModuleActivity"); - mBackgroundThread.start(); - mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); - } - - @Override - protected void onDestroy() { - stopBackgroundThread(); - super.onDestroy(); - } - - protected void stopBackgroundThread() { - mBackgroundThread.quitSafely(); - try { - mBackgroundThread.join(); - mBackgroundThread = null; - mBackgroundHandler = null; - } catch (InterruptedException e) { - Log.e(TAG, "Error on stopping background thread", e); - } - } - - @Override - public void onRequestPermissionsResult( - int requestCode, String[] permissions, int[] grantResults) { - if (requestCode == REQUEST_CODE_CAMERA_PERMISSION) { - if (grantResults[0] == PackageManager.PERMISSION_DENIED) { - Toast.makeText( - this, - "You can't use image classification example without granting CAMERA permission", - Toast.LENGTH_LONG) - .show(); - finish(); - } else { - setupCameraX(); - } - } - } - - private static final int TENSOR_WIDTH = 224; - private static final int TENSOR_HEIGHT = 224; - - private void setupCameraX() { - final TextureView textureView = - ((ViewStub) findViewById(R.id.camera_texture_view_stub)) - .inflate() - .findViewById(R.id.texture_view); - final PreviewConfig previewConfig = new PreviewConfig.Builder().build(); - final Preview preview = new Preview(previewConfig); - preview.setOnPreviewOutputUpdateListener( - new Preview.OnPreviewOutputUpdateListener() { - @Override - public void onUpdated(Preview.PreviewOutput output) { - textureView.setSurfaceTexture(output.getSurfaceTexture()); - } - }); - - final ImageAnalysisConfig imageAnalysisConfig = - new ImageAnalysisConfig.Builder() - .setTargetResolution(new Size(TENSOR_WIDTH, TENSOR_HEIGHT)) - .setCallbackHandler(mBackgroundHandler) - .setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE) - .build(); - final ImageAnalysis imageAnalysis = new ImageAnalysis(imageAnalysisConfig); - imageAnalysis.setAnalyzer( - new ImageAnalysis.Analyzer() { - @Override - public void analyze(ImageProxy image, int rotationDegrees) { - if (SystemClock.elapsedRealtime() - mLastAnalysisResultTime < 500) { - return; - } - - final Result result = CameraActivity.this.analyzeImage(image, rotationDegrees); - - if (result != null) { - mLastAnalysisResultTime = SystemClock.elapsedRealtime(); - CameraActivity.this.runOnUiThread( - new Runnable() { - @Override - public void run() { - CameraActivity.this.handleResult(result); - } - }); - } - } - }); - - CameraX.bindToLifecycle(this, preview, imageAnalysis); - } - - private Module mModule; - private FloatBuffer mInputTensorBuffer; - private Tensor mInputTensor; - - @WorkerThread - @Nullable - protected Result analyzeImage(ImageProxy image, int rotationDegrees) { - Log.i(TAG, String.format("analyzeImage(%s, %d)", image, rotationDegrees)); - if (mModule == null) { - Log.i(TAG, "Loading module from asset '" + BuildConfig.MODULE_ASSET_NAME + "'"); - mModule = PyTorchAndroid.loadModuleFromAsset(getAssets(), BuildConfig.MODULE_ASSET_NAME); - mInputTensorBuffer = Tensor.allocateFloatBuffer(3 * TENSOR_WIDTH * TENSOR_HEIGHT); - mInputTensor = - Tensor.fromBlob(mInputTensorBuffer, new long[] {1, 3, TENSOR_WIDTH, TENSOR_HEIGHT}); - } - - final long startTime = SystemClock.elapsedRealtime(); - TensorImageUtils.imageYUV420CenterCropToFloatBuffer( - image.getImage(), - rotationDegrees, - TENSOR_WIDTH, - TENSOR_HEIGHT, - TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, - TensorImageUtils.TORCHVISION_NORM_STD_RGB, - mInputTensorBuffer, - 0, - MemoryFormat.CHANNELS_LAST); - final long moduleForwardStartTime = SystemClock.elapsedRealtime(); - final Tensor outputTensor = mModule.forward(IValue.from(mInputTensor)).toTensor(); - final long moduleForwardDuration = SystemClock.elapsedRealtime() - moduleForwardStartTime; - - final float[] scores = outputTensor.getDataAsFloatArray(); - final long analysisDuration = SystemClock.elapsedRealtime() - startTime; - - return new Result(scores, moduleForwardDuration, analysisDuration); - } - - @UiThread - protected void handleResult(Result result) { - int ixs[] = Utils.topK(result.scores, 1); - String message = - String.format( - "forwardDuration:%d class:%s", - result.moduleForwardDuration, Constants.IMAGENET_CLASSES[ixs[0]]); - Log.i(TAG, message); - mTextViewStringBuilder.insert(0, '\n').insert(0, message); - if (mTextViewStringBuilder.length() > TEXT_TRIM_SIZE) { - mTextViewStringBuilder.delete(TEXT_TRIM_SIZE, mTextViewStringBuilder.length()); - } - mTextView.setText(mTextViewStringBuilder.toString()); - } -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/Constants.java b/android/test_app/app/src/main/java/org/pytorch/testapp/Constants.java deleted file mode 100644 index db60f0b0284..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/Constants.java +++ /dev/null @@ -1,1009 +0,0 @@ -package org.pytorch.testapp; - -public class Constants { - public static final String TAG = "PyTorchDemo"; - - public static String[] IMAGENET_CLASSES = - new String[] { - "tench, Tinca tinca", - "goldfish, Carassius auratus", - "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", - "tiger shark, Galeocerdo cuvieri", - "hammerhead, hammerhead shark", - "electric ray, crampfish, numbfish, torpedo", - "stingray", - "cock", - "hen", - "ostrich, Struthio camelus", - "brambling, Fringilla montifringilla", - "goldfinch, Carduelis carduelis", - "house finch, linnet, Carpodacus mexicanus", - "junco, snowbird", - "indigo bunting, indigo finch, indigo bird, Passerina cyanea", - "robin, American robin, Turdus migratorius", - "bulbul", - "jay", - "magpie", - "chickadee", - "water ouzel, dipper", - "kite", - "bald eagle, American eagle, Haliaeetus leucocephalus", - "vulture", - "great grey owl, great gray owl, Strix nebulosa", - "European fire salamander, Salamandra salamandra", - "common newt, Triturus vulgaris", - "eft", - "spotted salamander, Ambystoma maculatum", - "axolotl, mud puppy, Ambystoma mexicanum", - "bullfrog, Rana catesbeiana", - "tree frog, tree-frog", - "tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", - "loggerhead, loggerhead turtle, Caretta caretta", - "leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", - "mud turtle", - "terrapin", - "box turtle, box tortoise", - "banded gecko", - "common iguana, iguana, Iguana iguana", - "American chameleon, anole, Anolis carolinensis", - "whiptail, whiptail lizard", - "agama", - "frilled lizard, Chlamydosaurus kingi", - "alligator lizard", - "Gila monster, Heloderma suspectum", - "green lizard, Lacerta viridis", - "African chameleon, Chamaeleo chamaeleon", - "Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", - "African crocodile, Nile crocodile, Crocodylus niloticus", - "American alligator, Alligator mississipiensis", - "triceratops", - "thunder snake, worm snake, Carphophis amoenus", - "ringneck snake, ring-necked snake, ring snake", - "hognose snake, puff adder, sand viper", - "green snake, grass snake", - "king snake, kingsnake", - "garter snake, grass snake", - "water snake", - "vine snake", - "night snake, Hypsiglena torquata", - "boa constrictor, Constrictor constrictor", - "rock python, rock snake, Python sebae", - "Indian cobra, Naja naja", - "green mamba", - "sea snake", - "horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", - "diamondback, diamondback rattlesnake, Crotalus adamanteus", - "sidewinder, horned rattlesnake, Crotalus cerastes", - "trilobite", - "harvestman, daddy longlegs, Phalangium opilio", - "scorpion", - "black and gold garden spider, Argiope aurantia", - "barn spider, Araneus cavaticus", - "garden spider, Aranea diademata", - "black widow, Latrodectus mactans", - "tarantula", - "wolf spider, hunting spider", - "tick", - "centipede", - "black grouse", - "ptarmigan", - "ruffed grouse, partridge, Bonasa umbellus", - "prairie chicken, prairie grouse, prairie fowl", - "peacock", - "quail", - "partridge", - "African grey, African gray, Psittacus erithacus", - "macaw", - "sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", - "lorikeet", - "coucal", - "bee eater", - "hornbill", - "hummingbird", - "jacamar", - "toucan", - "drake", - "red-breasted merganser, Mergus serrator", - "goose", - "black swan, Cygnus atratus", - "tusker", - "echidna, spiny anteater, anteater", - "platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", - "wallaby, brush kangaroo", - "koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", - "wombat", - "jellyfish", - "sea anemone, anemone", - "brain coral", - "flatworm, platyhelminth", - "nematode, nematode worm, roundworm", - "conch", - "snail", - "slug", - "sea slug, nudibranch", - "chiton, coat-of-mail shell, sea cradle, polyplacophore", - "chambered nautilus, pearly nautilus, nautilus", - "Dungeness crab, Cancer magister", - "rock crab, Cancer irroratus", - "fiddler crab", - "king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", - "American lobster, Northern lobster, Maine lobster, Homarus americanus", - "spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", - "crayfish, crawfish, crawdad, crawdaddy", - "hermit crab", - "isopod", - "white stork, Ciconia ciconia", - "black stork, Ciconia nigra", - "spoonbill", - "flamingo", - "little blue heron, Egretta caerulea", - "American egret, great white heron, Egretta albus", - "bittern", - "crane", - "limpkin, Aramus pictus", - "European gallinule, Porphyrio porphyrio", - "American coot, marsh hen, mud hen, water hen, Fulica americana", - "bustard", - "ruddy turnstone, Arenaria interpres", - "red-backed sandpiper, dunlin, Erolia alpina", - "redshank, Tringa totanus", - "dowitcher", - "oystercatcher, oyster catcher", - "pelican", - "king penguin, Aptenodytes patagonica", - "albatross, mollymawk", - "grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", - "killer whale, killer, orca, grampus, sea wolf, Orcinus orca", - "dugong, Dugong dugon", - "sea lion", - "Chihuahua", - "Japanese spaniel", - "Maltese dog, Maltese terrier, Maltese", - "Pekinese, Pekingese, Peke", - "Shih-Tzu", - "Blenheim spaniel", - "papillon", - "toy terrier", - "Rhodesian ridgeback", - "Afghan hound, Afghan", - "basset, basset hound", - "beagle", - "bloodhound, sleuthhound", - "bluetick", - "black-and-tan coonhound", - "Walker hound, Walker foxhound", - "English foxhound", - "redbone", - "borzoi, Russian wolfhound", - "Irish wolfhound", - "Italian greyhound", - "whippet", - "Ibizan hound, Ibizan Podenco", - "Norwegian elkhound, elkhound", - "otterhound, otter hound", - "Saluki, gazelle hound", - "Scottish deerhound, deerhound", - "Weimaraner", - "Staffordshire bullterrier, Staffordshire bull terrier", - "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", - "Bedlington terrier", - "Border terrier", - "Kerry blue terrier", - "Irish terrier", - "Norfolk terrier", - "Norwich terrier", - "Yorkshire terrier", - "wire-haired fox terrier", - "Lakeland terrier", - "Sealyham terrier, Sealyham", - "Airedale, Airedale terrier", - "cairn, cairn terrier", - "Australian terrier", - "Dandie Dinmont, Dandie Dinmont terrier", - "Boston bull, Boston terrier", - "miniature schnauzer", - "giant schnauzer", - "standard schnauzer", - "Scotch terrier, Scottish terrier, Scottie", - "Tibetan terrier, chrysanthemum dog", - "silky terrier, Sydney silky", - "soft-coated wheaten terrier", - "West Highland white terrier", - "Lhasa, Lhasa apso", - "flat-coated retriever", - "curly-coated retriever", - "golden retriever", - "Labrador retriever", - "Chesapeake Bay retriever", - "German short-haired pointer", - "vizsla, Hungarian pointer", - "English setter", - "Irish setter, red setter", - "Gordon setter", - "Brittany spaniel", - "clumber, clumber spaniel", - "English springer, English springer spaniel", - "Welsh springer spaniel", - "cocker spaniel, English cocker spaniel, cocker", - "Sussex spaniel", - "Irish water spaniel", - "kuvasz", - "schipperke", - "groenendael", - "malinois", - "briard", - "kelpie", - "komondor", - "Old English sheepdog, bobtail", - "Shetland sheepdog, Shetland sheep dog, Shetland", - "collie", - "Border collie", - "Bouvier des Flandres, Bouviers des Flandres", - "Rottweiler", - "German shepherd, German shepherd dog, German police dog, alsatian", - "Doberman, Doberman pinscher", - "miniature pinscher", - "Greater Swiss Mountain dog", - "Bernese mountain dog", - "Appenzeller", - "EntleBucher", - "boxer", - "bull mastiff", - "Tibetan mastiff", - "French bulldog", - "Great Dane", - "Saint Bernard, St Bernard", - "Eskimo dog, husky", - "malamute, malemute, Alaskan malamute", - "Siberian husky", - "dalmatian, coach dog, carriage dog", - "affenpinscher, monkey pinscher, monkey dog", - "basenji", - "pug, pug-dog", - "Leonberg", - "Newfoundland, Newfoundland dog", - "Great Pyrenees", - "Samoyed, Samoyede", - "Pomeranian", - "chow, chow chow", - "keeshond", - "Brabancon griffon", - "Pembroke, Pembroke Welsh corgi", - "Cardigan, Cardigan Welsh corgi", - "toy poodle", - "miniature poodle", - "standard poodle", - "Mexican hairless", - "timber wolf, grey wolf, gray wolf, Canis lupus", - "white wolf, Arctic wolf, Canis lupus tundrarum", - "red wolf, maned wolf, Canis rufus, Canis niger", - "coyote, prairie wolf, brush wolf, Canis latrans", - "dingo, warrigal, warragal, Canis dingo", - "dhole, Cuon alpinus", - "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", - "hyena, hyaena", - "red fox, Vulpes vulpes", - "kit fox, Vulpes macrotis", - "Arctic fox, white fox, Alopex lagopus", - "grey fox, gray fox, Urocyon cinereoargenteus", - "tabby, tabby cat", - "tiger cat", - "Persian cat", - "Siamese cat, Siamese", - "Egyptian cat", - "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", - "lynx, catamount", - "leopard, Panthera pardus", - "snow leopard, ounce, Panthera uncia", - "jaguar, panther, Panthera onca, Felis onca", - "lion, king of beasts, Panthera leo", - "tiger, Panthera tigris", - "cheetah, chetah, Acinonyx jubatus", - "brown bear, bruin, Ursus arctos", - "American black bear, black bear, Ursus americanus, Euarctos americanus", - "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", - "sloth bear, Melursus ursinus, Ursus ursinus", - "mongoose", - "meerkat, mierkat", - "tiger beetle", - "ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", - "ground beetle, carabid beetle", - "long-horned beetle, longicorn, longicorn beetle", - "leaf beetle, chrysomelid", - "dung beetle", - "rhinoceros beetle", - "weevil", - "fly", - "bee", - "ant, emmet, pismire", - "grasshopper, hopper", - "cricket", - "walking stick, walkingstick, stick insect", - "cockroach, roach", - "mantis, mantid", - "cicada, cicala", - "leafhopper", - "lacewing, lacewing fly", - "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", - "damselfly", - "admiral", - "ringlet, ringlet butterfly", - "monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", - "cabbage butterfly", - "sulphur butterfly, sulfur butterfly", - "lycaenid, lycaenid butterfly", - "starfish, sea star", - "sea urchin", - "sea cucumber, holothurian", - "wood rabbit, cottontail, cottontail rabbit", - "hare", - "Angora, Angora rabbit", - "hamster", - "porcupine, hedgehog", - "fox squirrel, eastern fox squirrel, Sciurus niger", - "marmot", - "beaver", - "guinea pig, Cavia cobaya", - "sorrel", - "zebra", - "hog, pig, grunter, squealer, Sus scrofa", - "wild boar, boar, Sus scrofa", - "warthog", - "hippopotamus, hippo, river horse, Hippopotamus amphibius", - "ox", - "water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", - "bison", - "ram, tup", - "bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", - "ibex, Capra ibex", - "hartebeest", - "impala, Aepyceros melampus", - "gazelle", - "Arabian camel, dromedary, Camelus dromedarius", - "llama", - "weasel", - "mink", - "polecat, fitch, foulmart, foumart, Mustela putorius", - "black-footed ferret, ferret, Mustela nigripes", - "otter", - "skunk, polecat, wood pussy", - "badger", - "armadillo", - "three-toed sloth, ai, Bradypus tridactylus", - "orangutan, orang, orangutang, Pongo pygmaeus", - "gorilla, Gorilla gorilla", - "chimpanzee, chimp, Pan troglodytes", - "gibbon, Hylobates lar", - "siamang, Hylobates syndactylus, Symphalangus syndactylus", - "guenon, guenon monkey", - "patas, hussar monkey, Erythrocebus patas", - "baboon", - "macaque", - "langur", - "colobus, colobus monkey", - "proboscis monkey, Nasalis larvatus", - "marmoset", - "capuchin, ringtail, Cebus capucinus", - "howler monkey, howler", - "titi, titi monkey", - "spider monkey, Ateles geoffroyi", - "squirrel monkey, Saimiri sciureus", - "Madagascar cat, ring-tailed lemur, Lemur catta", - "indri, indris, Indri indri, Indri brevicaudatus", - "Indian elephant, Elephas maximus", - "African elephant, Loxodonta africana", - "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", - "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", - "barracouta, snoek", - "eel", - "coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", - "rock beauty, Holocanthus tricolor", - "anemone fish", - "sturgeon", - "gar, garfish, garpike, billfish, Lepisosteus osseus", - "lionfish", - "puffer, pufferfish, blowfish, globefish", - "abacus", - "abaya", - "academic gown, academic robe, judge's robe", - "accordion, piano accordion, squeeze box", - "acoustic guitar", - "aircraft carrier, carrier, flattop, attack aircraft carrier", - "airliner", - "airship, dirigible", - "altar", - "ambulance", - "amphibian, amphibious vehicle", - "analog clock", - "apiary, bee house", - "apron", - "ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", - "assault rifle, assault gun", - "backpack, back pack, knapsack, packsack, rucksack, haversack", - "bakery, bakeshop, bakehouse", - "balance beam, beam", - "balloon", - "ballpoint, ballpoint pen, ballpen, Biro", - "Band Aid", - "banjo", - "bannister, banister, balustrade, balusters, handrail", - "barbell", - "barber chair", - "barbershop", - "barn", - "barometer", - "barrel, cask", - "barrow, garden cart, lawn cart, wheelbarrow", - "baseball", - "basketball", - "bassinet", - "bassoon", - "bathing cap, swimming cap", - "bath towel", - "bathtub, bathing tub, bath, tub", - "beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", - "beacon, lighthouse, beacon light, pharos", - "beaker", - "bearskin, busby, shako", - "beer bottle", - "beer glass", - "bell cote, bell cot", - "bib", - "bicycle-built-for-two, tandem bicycle, tandem", - "bikini, two-piece", - "binder, ring-binder", - "binoculars, field glasses, opera glasses", - "birdhouse", - "boathouse", - "bobsled, bobsleigh, bob", - "bolo tie, bolo, bola tie, bola", - "bonnet, poke bonnet", - "bookcase", - "bookshop, bookstore, bookstall", - "bottlecap", - "bow", - "bow tie, bow-tie, bowtie", - "brass, memorial tablet, plaque", - "brassiere, bra, bandeau", - "breakwater, groin, groyne, mole, bulwark, seawall, jetty", - "breastplate, aegis, egis", - "broom", - "bucket, pail", - "buckle", - "bulletproof vest", - "bullet train, bullet", - "butcher shop, meat market", - "cab, hack, taxi, taxicab", - "caldron, cauldron", - "candle, taper, wax light", - "cannon", - "canoe", - "can opener, tin opener", - "cardigan", - "car mirror", - "carousel, carrousel, merry-go-round, roundabout, whirligig", - "carpenter's kit, tool kit", - "carton", - "car wheel", - "cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", - "cassette", - "cassette player", - "castle", - "catamaran", - "CD player", - "cello, violoncello", - "cellular telephone, cellular phone, cellphone, cell, mobile phone", - "chain", - "chainlink fence", - "chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", - "chain saw, chainsaw", - "chest", - "chiffonier, commode", - "chime, bell, gong", - "china cabinet, china closet", - "Christmas stocking", - "church, church building", - "cinema, movie theater, movie theatre, movie house, picture palace", - "cleaver, meat cleaver, chopper", - "cliff dwelling", - "cloak", - "clog, geta, patten, sabot", - "cocktail shaker", - "coffee mug", - "coffeepot", - "coil, spiral, volute, whorl, helix", - "combination lock", - "computer keyboard, keypad", - "confectionery, confectionary, candy store", - "container ship, containership, container vessel", - "convertible", - "corkscrew, bottle screw", - "cornet, horn, trumpet, trump", - "cowboy boot", - "cowboy hat, ten-gallon hat", - "cradle", - "crane", - "crash helmet", - "crate", - "crib, cot", - "Crock Pot", - "croquet ball", - "crutch", - "cuirass", - "dam, dike, dyke", - "desk", - "desktop computer", - "dial telephone, dial phone", - "diaper, nappy, napkin", - "digital clock", - "digital watch", - "dining table, board", - "dishrag, dishcloth", - "dishwasher, dish washer, dishwashing machine", - "disk brake, disc brake", - "dock, dockage, docking facility", - "dogsled, dog sled, dog sleigh", - "dome", - "doormat, welcome mat", - "drilling platform, offshore rig", - "drum, membranophone, tympan", - "drumstick", - "dumbbell", - "Dutch oven", - "electric fan, blower", - "electric guitar", - "electric locomotive", - "entertainment center", - "envelope", - "espresso maker", - "face powder", - "feather boa, boa", - "file, file cabinet, filing cabinet", - "fireboat", - "fire engine, fire truck", - "fire screen, fireguard", - "flagpole, flagstaff", - "flute, transverse flute", - "folding chair", - "football helmet", - "forklift", - "fountain", - "fountain pen", - "four-poster", - "freight car", - "French horn, horn", - "frying pan, frypan, skillet", - "fur coat", - "garbage truck, dustcart", - "gasmask, respirator, gas helmet", - "gas pump, gasoline pump, petrol pump, island dispenser", - "goblet", - "go-kart", - "golf ball", - "golfcart, golf cart", - "gondola", - "gong, tam-tam", - "gown", - "grand piano, grand", - "greenhouse, nursery, glasshouse", - "grille, radiator grille", - "grocery store, grocery, food market, market", - "guillotine", - "hair slide", - "hair spray", - "half track", - "hammer", - "hamper", - "hand blower, blow dryer, blow drier, hair dryer, hair drier", - "hand-held computer, hand-held microcomputer", - "handkerchief, hankie, hanky, hankey", - "hard disc, hard disk, fixed disk", - "harmonica, mouth organ, harp, mouth harp", - "harp", - "harvester, reaper", - "hatchet", - "holster", - "home theater, home theatre", - "honeycomb", - "hook, claw", - "hoopskirt, crinoline", - "horizontal bar, high bar", - "horse cart, horse-cart", - "hourglass", - "iPod", - "iron, smoothing iron", - "jack-o'-lantern", - "jean, blue jean, denim", - "jeep, landrover", - "jersey, T-shirt, tee shirt", - "jigsaw puzzle", - "jinrikisha, ricksha, rickshaw", - "joystick", - "kimono", - "knee pad", - "knot", - "lab coat, laboratory coat", - "ladle", - "lampshade, lamp shade", - "laptop, laptop computer", - "lawn mower, mower", - "lens cap, lens cover", - "letter opener, paper knife, paperknife", - "library", - "lifeboat", - "lighter, light, igniter, ignitor", - "limousine, limo", - "liner, ocean liner", - "lipstick, lip rouge", - "Loafer", - "lotion", - "loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", - "loupe, jeweler's loupe", - "lumbermill, sawmill", - "magnetic compass", - "mailbag, postbag", - "mailbox, letter box", - "maillot", - "maillot, tank suit", - "manhole cover", - "maraca", - "marimba, xylophone", - "mask", - "matchstick", - "maypole", - "maze, labyrinth", - "measuring cup", - "medicine chest, medicine cabinet", - "megalith, megalithic structure", - "microphone, mike", - "microwave, microwave oven", - "military uniform", - "milk can", - "minibus", - "miniskirt, mini", - "minivan", - "missile", - "mitten", - "mixing bowl", - "mobile home, manufactured home", - "Model T", - "modem", - "monastery", - "monitor", - "moped", - "mortar", - "mortarboard", - "mosque", - "mosquito net", - "motor scooter, scooter", - "mountain bike, all-terrain bike, off-roader", - "mountain tent", - "mouse, computer mouse", - "mousetrap", - "moving van", - "muzzle", - "nail", - "neck brace", - "necklace", - "nipple", - "notebook, notebook computer", - "obelisk", - "oboe, hautboy, hautbois", - "ocarina, sweet potato", - "odometer, hodometer, mileometer, milometer", - "oil filter", - "organ, pipe organ", - "oscilloscope, scope, cathode-ray oscilloscope, CRO", - "overskirt", - "oxcart", - "oxygen mask", - "packet", - "paddle, boat paddle", - "paddlewheel, paddle wheel", - "padlock", - "paintbrush", - "pajama, pyjama, pj's, jammies", - "palace", - "panpipe, pandean pipe, syrinx", - "paper towel", - "parachute, chute", - "parallel bars, bars", - "park bench", - "parking meter", - "passenger car, coach, carriage", - "patio, terrace", - "pay-phone, pay-station", - "pedestal, plinth, footstall", - "pencil box, pencil case", - "pencil sharpener", - "perfume, essence", - "Petri dish", - "photocopier", - "pick, plectrum, plectron", - "pickelhaube", - "picket fence, paling", - "pickup, pickup truck", - "pier", - "piggy bank, penny bank", - "pill bottle", - "pillow", - "ping-pong ball", - "pinwheel", - "pirate, pirate ship", - "pitcher, ewer", - "plane, carpenter's plane, woodworking plane", - "planetarium", - "plastic bag", - "plate rack", - "plow, plough", - "plunger, plumber's helper", - "Polaroid camera, Polaroid Land camera", - "pole", - "police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", - "poncho", - "pool table, billiard table, snooker table", - "pop bottle, soda bottle", - "pot, flowerpot", - "potter's wheel", - "power drill", - "prayer rug, prayer mat", - "printer", - "prison, prison house", - "projectile, missile", - "projector", - "puck, hockey puck", - "punching bag, punch bag, punching ball, punchball", - "purse", - "quill, quill pen", - "quilt, comforter, comfort, puff", - "racer, race car, racing car", - "racket, racquet", - "radiator", - "radio, wireless", - "radio telescope, radio reflector", - "rain barrel", - "recreational vehicle, RV, R.V.", - "reel", - "reflex camera", - "refrigerator, icebox", - "remote control, remote", - "restaurant, eating house, eating place, eatery", - "revolver, six-gun, six-shooter", - "rifle", - "rocking chair, rocker", - "rotisserie", - "rubber eraser, rubber, pencil eraser", - "rugby ball", - "rule, ruler", - "running shoe", - "safe", - "safety pin", - "saltshaker, salt shaker", - "sandal", - "sarong", - "sax, saxophone", - "scabbard", - "scale, weighing machine", - "school bus", - "schooner", - "scoreboard", - "screen, CRT screen", - "screw", - "screwdriver", - "seat belt, seatbelt", - "sewing machine", - "shield, buckler", - "shoe shop, shoe-shop, shoe store", - "shoji", - "shopping basket", - "shopping cart", - "shovel", - "shower cap", - "shower curtain", - "ski", - "ski mask", - "sleeping bag", - "slide rule, slipstick", - "sliding door", - "slot, one-armed bandit", - "snorkel", - "snowmobile", - "snowplow, snowplough", - "soap dispenser", - "soccer ball", - "sock", - "solar dish, solar collector, solar furnace", - "sombrero", - "soup bowl", - "space bar", - "space heater", - "space shuttle", - "spatula", - "speedboat", - "spider web, spider's web", - "spindle", - "sports car, sport car", - "spotlight, spot", - "stage", - "steam locomotive", - "steel arch bridge", - "steel drum", - "stethoscope", - "stole", - "stone wall", - "stopwatch, stop watch", - "stove", - "strainer", - "streetcar, tram, tramcar, trolley, trolley car", - "stretcher", - "studio couch, day bed", - "stupa, tope", - "submarine, pigboat, sub, U-boat", - "suit, suit of clothes", - "sundial", - "sunglass", - "sunglasses, dark glasses, shades", - "sunscreen, sunblock, sun blocker", - "suspension bridge", - "swab, swob, mop", - "sweatshirt", - "swimming trunks, bathing trunks", - "swing", - "switch, electric switch, electrical switch", - "syringe", - "table lamp", - "tank, army tank, armored combat vehicle, armoured combat vehicle", - "tape player", - "teapot", - "teddy, teddy bear", - "television, television system", - "tennis ball", - "thatch, thatched roof", - "theater curtain, theatre curtain", - "thimble", - "thresher, thrasher, threshing machine", - "throne", - "tile roof", - "toaster", - "tobacco shop, tobacconist shop, tobacconist", - "toilet seat", - "torch", - "totem pole", - "tow truck, tow car, wrecker", - "toyshop", - "tractor", - "trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", - "tray", - "trench coat", - "tricycle, trike, velocipede", - "trimaran", - "tripod", - "triumphal arch", - "trolleybus, trolley coach, trackless trolley", - "trombone", - "tub, vat", - "turnstile", - "typewriter keyboard", - "umbrella", - "unicycle, monocycle", - "upright, upright piano", - "vacuum, vacuum cleaner", - "vase", - "vault", - "velvet", - "vending machine", - "vestment", - "viaduct", - "violin, fiddle", - "volleyball", - "waffle iron", - "wall clock", - "wallet, billfold, notecase, pocketbook", - "wardrobe, closet, press", - "warplane, military plane", - "washbasin, handbasin, washbowl, lavabo, wash-hand basin", - "washer, automatic washer, washing machine", - "water bottle", - "water jug", - "water tower", - "whiskey jug", - "whistle", - "wig", - "window screen", - "window shade", - "Windsor tie", - "wine bottle", - "wing", - "wok", - "wooden spoon", - "wool, woolen, woollen", - "worm fence, snake fence, snake-rail fence, Virginia fence", - "wreck", - "yawl", - "yurt", - "web site, website, internet site, site", - "comic book", - "crossword puzzle, crossword", - "street sign", - "traffic light, traffic signal, stoplight", - "book jacket, dust cover, dust jacket, dust wrapper", - "menu", - "plate", - "guacamole", - "consomme", - "hot pot, hotpot", - "trifle", - "ice cream, icecream", - "ice lolly, lolly, lollipop, popsicle", - "French loaf", - "bagel, beigel", - "pretzel", - "cheeseburger", - "hotdog, hot dog, red hot", - "mashed potato", - "head cabbage", - "broccoli", - "cauliflower", - "zucchini, courgette", - "spaghetti squash", - "acorn squash", - "butternut squash", - "cucumber, cuke", - "artichoke, globe artichoke", - "bell pepper", - "cardoon", - "mushroom", - "Granny Smith", - "strawberry", - "orange", - "lemon", - "fig", - "pineapple, ananas", - "banana", - "jackfruit, jak, jack", - "custard apple", - "pomegranate", - "hay", - "carbonara", - "chocolate sauce, chocolate syrup", - "dough", - "meat loaf, meatloaf", - "pizza, pizza pie", - "potpie", - "burrito", - "red wine", - "espresso", - "cup", - "eggnog", - "alp", - "bubble", - "cliff, drop, drop-off", - "coral reef", - "geyser", - "lakeside, lakeshore", - "promontory, headland, head, foreland", - "sandbar, sand bar", - "seashore, coast, seacoast, sea-coast", - "valley, vale", - "volcano", - "ballplayer, baseball player", - "groom, bridegroom", - "scuba diver", - "rapeseed", - "daisy", - "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", - "corn", - "acorn", - "hip, rose hip, rosehip", - "buckeye, horse chestnut, conker", - "coral fungus", - "agaric", - "gyromitra", - "stinkhorn, carrion fungus", - "earthstar", - "hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", - "bolete", - "ear, spike, capitulum", - "toilet tissue, toilet paper, bathroom tissue" - }; -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/LibtorchNativeClient.java b/android/test_app/app/src/main/java/org/pytorch/testapp/LibtorchNativeClient.java deleted file mode 100644 index 6ff2d46166f..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/LibtorchNativeClient.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.pytorch.testapp; - -import com.facebook.soloader.nativeloader.NativeLoader; -import com.facebook.soloader.nativeloader.SystemDelegate; - -public final class LibtorchNativeClient { - - public static void loadAndForwardModel(final String modelPath) { - NativePeer.loadAndForwardModel(modelPath); - } - - private static class NativePeer { - static { - if (!NativeLoader.isInitialized()) { - NativeLoader.init(new SystemDelegate()); - } - NativeLoader.loadLibrary("pytorch_testapp_jni"); - } - - private static native void loadAndForwardModel(final String modelPath); - } -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/MainActivity.java b/android/test_app/app/src/main/java/org/pytorch/testapp/MainActivity.java deleted file mode 100644 index 3d30d9b78ec..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/MainActivity.java +++ /dev/null @@ -1,171 +0,0 @@ -package org.pytorch.testapp; - -import android.content.Context; -import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; -import android.util.Log; -import android.widget.TextView; -import androidx.annotation.Nullable; -import androidx.annotation.UiThread; -import androidx.annotation.WorkerThread; -import androidx.appcompat.app.AppCompatActivity; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.FloatBuffer; -import org.pytorch.Device; -import org.pytorch.IValue; -import org.pytorch.MemoryFormat; -import org.pytorch.Module; -import org.pytorch.PyTorchAndroid; -import org.pytorch.Tensor; - -public class MainActivity extends AppCompatActivity { - - private static final String TAG = BuildConfig.LOGCAT_TAG; - private static final int TEXT_TRIM_SIZE = 4096; - - private TextView mTextView; - - protected HandlerThread mBackgroundThread; - protected Handler mBackgroundHandler; - private Module mModule; - private FloatBuffer mInputTensorBuffer; - private Tensor mInputTensor; - private StringBuilder mTextViewStringBuilder = new StringBuilder(); - - private final Runnable mModuleForwardRunnable = - new Runnable() { - @Override - public void run() { - final Result result = doModuleForward(); - runOnUiThread( - new Runnable() { - @Override - public void run() { - handleResult(result); - if (mBackgroundHandler != null) { - mBackgroundHandler.post(mModuleForwardRunnable); - } - } - }); - } - }; - - public static String assetFilePath(Context context, String assetName) { - File file = new File(context.getFilesDir(), assetName); - if (file.exists() && file.length() > 0) { - return file.getAbsolutePath(); - } - - try (InputStream is = context.getAssets().open(assetName)) { - try (OutputStream os = new FileOutputStream(file)) { - byte[] buffer = new byte[4 * 1024]; - int read; - while ((read = is.read(buffer)) != -1) { - os.write(buffer, 0, read); - } - os.flush(); - } - return file.getAbsolutePath(); - } catch (IOException e) { - Log.e(TAG, "Error process asset " + assetName + " to file path"); - } - return null; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (BuildConfig.NATIVE_BUILD) { - final String modelFileAbsoluteFilePath = - new File(assetFilePath(this, BuildConfig.MODULE_ASSET_NAME)).getAbsolutePath(); - LibtorchNativeClient.loadAndForwardModel(modelFileAbsoluteFilePath); - return; - } - setContentView(R.layout.activity_main); - mTextView = findViewById(R.id.text); - startBackgroundThread(); - mBackgroundHandler.post(mModuleForwardRunnable); - } - - protected void startBackgroundThread() { - mBackgroundThread = new HandlerThread(TAG + "_bg"); - mBackgroundThread.start(); - mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); - } - - @Override - protected void onDestroy() { - stopBackgroundThread(); - super.onDestroy(); - } - - protected void stopBackgroundThread() { - mBackgroundThread.quitSafely(); - try { - mBackgroundThread.join(); - mBackgroundThread = null; - mBackgroundHandler = null; - } catch (InterruptedException e) { - Log.e(TAG, "Error stopping background thread", e); - } - } - - @WorkerThread - @Nullable - protected Result doModuleForward() { - if (mModule == null) { - final long[] shape = BuildConfig.INPUT_TENSOR_SHAPE; - long numElements = 1; - for (int i = 0; i < shape.length; i++) { - numElements *= shape[i]; - } - mInputTensorBuffer = Tensor.allocateFloatBuffer((int) numElements); - mInputTensor = - Tensor.fromBlob( - mInputTensorBuffer, BuildConfig.INPUT_TENSOR_SHAPE, MemoryFormat.CHANNELS_LAST); - PyTorchAndroid.setNumThreads(1); - mModule = - BuildConfig.USE_VULKAN_DEVICE - ? PyTorchAndroid.loadModuleFromAsset( - getAssets(), BuildConfig.MODULE_ASSET_NAME, Device.VULKAN) - : PyTorchAndroid.loadModuleFromAsset(getAssets(), BuildConfig.MODULE_ASSET_NAME); - } - - final long startTime = SystemClock.elapsedRealtime(); - final long moduleForwardStartTime = SystemClock.elapsedRealtime(); - final Tensor outputTensor = mModule.forward(IValue.from(mInputTensor)).toTensor(); - final long moduleForwardDuration = SystemClock.elapsedRealtime() - moduleForwardStartTime; - final float[] scores = outputTensor.getDataAsFloatArray(); - final long analysisDuration = SystemClock.elapsedRealtime() - startTime; - return new Result(scores, moduleForwardDuration, analysisDuration); - } - - static class Result { - - private final float[] scores; - private final long totalDuration; - private final long moduleForwardDuration; - - public Result(float[] scores, long moduleForwardDuration, long totalDuration) { - this.scores = scores; - this.moduleForwardDuration = moduleForwardDuration; - this.totalDuration = totalDuration; - } - } - - @UiThread - protected void handleResult(Result result) { - String message = String.format("forwardDuration:%d", result.moduleForwardDuration); - mTextViewStringBuilder.insert(0, '\n').insert(0, message); - if (mTextViewStringBuilder.length() > TEXT_TRIM_SIZE) { - mTextViewStringBuilder.delete(TEXT_TRIM_SIZE, mTextViewStringBuilder.length()); - } - mTextView.setText(mTextViewStringBuilder.toString()); - } -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/Result.java b/android/test_app/app/src/main/java/org/pytorch/testapp/Result.java deleted file mode 100644 index 7cc1148ede3..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/Result.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.pytorch.testapp; - -class Result { - - public final float[] scores; - public final long totalDuration; - public final long moduleForwardDuration; - - public Result(float[] scores, long moduleForwardDuration, long totalDuration) { - this.scores = scores; - this.moduleForwardDuration = moduleForwardDuration; - this.totalDuration = totalDuration; - } -} diff --git a/android/test_app/app/src/main/java/org/pytorch/testapp/Utils.java b/android/test_app/app/src/main/java/org/pytorch/testapp/Utils.java deleted file mode 100644 index 230d39e80ac..00000000000 --- a/android/test_app/app/src/main/java/org/pytorch/testapp/Utils.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.pytorch.testapp; - -import java.util.Arrays; - -public class Utils { - - public static int[] topK(float[] a, final int topk) { - float values[] = new float[topk]; - Arrays.fill(values, -Float.MAX_VALUE); - int ixs[] = new int[topk]; - Arrays.fill(ixs, -1); - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < topk; j++) { - if (a[i] > values[j]) { - for (int k = topk - 1; k >= j + 1; k--) { - values[k] = values[k - 1]; - ixs[k] = ixs[k - 1]; - } - values[j] = a[i]; - ixs[j] = i; - break; - } - } - } - return ixs; - } -} diff --git a/android/test_app/app/src/main/res/layout/activity_camera.xml b/android/test_app/app/src/main/res/layout/activity_camera.xml deleted file mode 100644 index 9331a2dea59..00000000000 --- a/android/test_app/app/src/main/res/layout/activity_camera.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/android/test_app/app/src/main/res/layout/activity_main.xml b/android/test_app/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 556839a994c..00000000000 --- a/android/test_app/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/android/test_app/app/src/main/res/layout/texture_view.xml b/android/test_app/app/src/main/res/layout/texture_view.xml deleted file mode 100644 index 6518c6c84c6..00000000000 --- a/android/test_app/app/src/main/res/layout/texture_view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/android/test_app/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/test_app/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 64ba76f75e9ce021aa3d95c213491f73bcacb597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2060 zcmV+n2=n)eP)3$g6n-PcZs4>q4bV;KlnN~%kbn}!V8maBKN?~PDN77Zj6xT>KxccMrJYVYoo)adu8>W% zmv*U9KCo@D{=sCEstjFGl{%?R9Bd_S;`C@G{FNG~X;+5Z0h*dJ1r|5g4wB8=?S#Zy zt3sAsXM@aL)nWAyCYz08&uXYp$}38nkeVvA0^C`|ts22ve2Y2>mf~J~_Til&y|FUz z%#l)O^+i>bDr7NsoiC}@GN^5^{=sAkPSF?VF#7ysBZm@DnF?;le_~|Un-B}Itc2u|IlX``0V1M3jKlcCTY73+_+5_^1 zO|_7<%PEyPhbqxCEnFv#uom}FdO$lY%`OKi#h<5Co8ZPBFZA{I!|wAx!c?aisEfxs z?T$*AUTc9D8_Hpt%L37MoudCVml+QIa-Q{X>F$I{4t=051yd2KXJy7g2ho;dPy9%m z&|3%hK)bgG?)N=_y3^l5BAU(HpEX16sc+%jjdr-wd5e*w`^js6LDPj(u<}q7%axih zoQB@MKIp*y%l0*noe!-3>L8Nvz`X|#;P=}%;m-Yg;Pd%Hg6jXkc0~S4=WWP7_Qlvb zG1>9)E0=~O9SWcSdXd@th$;|?3QV+Z@1bR;tdb%M2ko%(GTA+u#e@F7$5Mb+;mB`4 z!xVgv{Jp95%Y!hpT7-)jrQ~&IJFY@h`L?H{0L^~?0CJaZ z{tZjr)sT1m=#VQw^-Fg;S$l@ofMbuY0uykS+-JWJI=h~`ci}FY$50ATJ+%wA zO77DqVS>075^y6_kJfo$5r(}BH#(lkaYNw(n&Hbh&XQd-lYhgIk-UdHhZ4HzOR6cX9O(7$kLq}D}u9EB; z-dhHFDZZ<8Lc2GP(}(AKLrJ-Oau&a1s?6Nk^&FO z6KSRZhEqx_SQs6S0+Eca!Fb^G1gONmI zC+HbyhfVOuc?OI&h7uoNn}=`c_>iW5NO1q-GUX8K1^!Zxzl z4XfveR)GIBSo>}=cI+IH9~|U>#(X~teA-&84{aZTo0BMk;yjBqEL^gX=_9kDnP=}a z`+sm4^17nldnZj&U`51GznG$gf}Fz|OlbvM2~cNtN6bbO;LjW>4doDpXIHr_#-WEK zTp3oTSyarnG|L?64R(Lh#u7IM@+CF;0?j-dAKR%u-gp$bMThf`Y=V%QniZFqb4;b% z+^sU^c~$y+58W}2ds$fqbXadxS)oD}YcBF8+Kmro`dqK7bh9_jZo>N(2|7ZqH?6u% zs@LZQps|*E)s_+u&N{X0R(-hsYauy#KI0bVpUP;&tcc8vw<4D;UKP1mLj0?AU!cHb ztdAKWi}A~qZL?OzGg+1b@q^keUNsrViJ`HuE@E!RO5*b9*&nDxR@U?Q6pMIaj1kMY qJl2nQa+aK&iDQb84*TpHAJ>1BQ$$nT?9A!_0000+Hy9+Dw zQlg?UKB$_cZ8RBMYcyI%jkQf{#wz1Xr!PxQ>w~B~cKP~!=iIw{_rdOp7tZhwZ1+g(AXy-HL10DFmbXNx@L~ z3H0wQYEpsnp{iIyzhEeKgc((i$;}oAoqHl}Yb`&gx~}ISy|wl# zwdwQ;nvEgzkAnwYj%g}=Nide26RJwsNTUEE)Q2P-5}7cQ3Z84R%7rdvN4sQKhOlPcRnSrOp+WGP}nNJgfkDx!pMkypKGe90p51ezT#4MxAxQ zN3CC+fuRy0nP8u@+)%h}@FHZ>vWFTTCD?*bPf|6Oz4#LAYDsH*sO<_ z+8Vve2|wE19JrkK!TNc*tzkb>2=OxIfDS8-yiLEA$m0k(kQf0ZJlj+Q&+pg*@-o6x zTdEi#&vL>m?`;jX+>v0bbWnM`S<~tiA>-z6^m&Xo6y=iH&}dMDp40vqOvn?CbR0P3 z0YX_`z8klIalWefMaf}lN@-MvK>)C@OTMQsvEFV1j6zbmglN3)tDNw{&IYft@#yp|U;GYg&z^)Rt7d@u#0Bpe zimnOEmq&Tef~aWH7SjqERa#-iBMX%jZKUfNcy71bp|`IOKD_d0nA~D<-XkQV*jewl zx|K$GjP@M*^t)>e04FWS7-Uwy|!6q{ICob5gfvYaErq&g;Btk^VqnotOu zSN-|V;a*P<^rDbv9KD!YExR|ex)jop)as*$VeKa$K-3I_~rZ#$8n0D;V;;rwan!I2{& zEnl34toAlI^wpPe zlye)Ao4ycY%W~JdLaI0e(MHvF%G1SkH=uyAXf{=!ABS!n#lZ@o8CZ4XFmw8#1n{&R zVs(YP+3GCIkwRjs%TCiYQa(?iP=b^m$jib}=-N*{ggXx&44S-zukU>W+LOO#ZOZ!~ zOnukpUM6x&FsRNVXIChVTfbhB(rD_SHz|4}839cXjAmbiVtspfigR#uEFjIMj@si>Ore+Oei$<1cCarcfF2@0*j682U1A9rp; zlE=d6(}XYz#@Cd03QHCwxdi0=G&$N_{=Yy1XfbK~!v(L-Fa7gxu<_$VaOSVq1CpmY z8$Ujb&-~r%UfZSfpfHyQ7GTlb5>~#R>JqSaSxPVhD7~ea?b-3_j}BnQxCvh0zmvuF zfymQ6C7Oj$o(rpg(e8EsF8b6fI~#$e4S@tKotNPf@Ro97lv&dmNB}MOzKDHx{Td^7 z^e>kK&H&X>w(nxk__|+v<^;uhpfq|w0oCgN2n*&Uy98ur#zdLa9sUH2!{g=78$;%} z1L1P#zaX{-%}ARM>G(3`OF*1abzPV`HC~?1g-^B_&(OXN<=~`T0!1J)ouwb`hnx4h z9=m{>-*my^gYQ9FLp5Z*znzJYxJcY)*bL{8bEG_x3mc;?*yV2q=Kg#a+Xvy`pEue zJ2#<55|A&7Ku(lOR2IUxb#E82l~|riL@t>>J=|1!XP{(Gfq7D*RSSuh3Wmux1H9O5 zbzVzIvg#nSb+dS_bpfB9xub!%!Jvc0T8>$5O?a$?#5xXzQ6&nfaS6~B@Yl=oyt`5J zUi|^Lo>^h?bXpN!k$b{#I*o}Gg+L0KqjiNap+>{bdB$Wh1B{gdNt&z zkU*wl;*p0Tp96`fH`Pew34JvBLf)EFl)AaU3W$CXzIJ5}*_hmnyplOlgkJ%5dN1-^ zfYFOQ7f|g*o(nK@@|F3Nh4!=hOBWWfJjm^}QhYrdl{|g|c5+Shdb>Od$s<#GvjwI% znqg*ZJ*3tdIBXmlNOJbhCP>{}#ZfQ82y=FCgS0Is7aB~A{A+vOWk<4kG8-CsBA>N) z2Ro)Vo9)zRim|LCBI$`F-!JxDQG~E+nVNaMkGbGoHB3M|cbfqm?Jyjr6ln%D z61dqAY5B-YX2WN|HS&_#uo&dO1ZLdVcx6-*l>@yGiUd^twKIQ z1myy3dN1;B0z4enBibGcLp_=&v^1A84wc`CetouQG9=$!N7f##SDg2(;-$ z`!;UT3E!5cpgGLm)#4Fpf{Qj}^JF&E4%N%lmmNV4&oVB`hy6ytSLkp=a!l^3{cMD2 zTZ1ifMFW4}K)*?$c>mDR24g)rEZIEGUiM-d`ALieTX6^VNp)73C?Y9z`9d?=c(?d1 zs~_K-`cOc>&%IHK9z-;#Xp`TMv(d*wB}E%mPIu_y`4;N)(a6iqDI;Sfv%{G`Tq?Y? z`XY5qua{3ZRrAk6vM-O$&0Shch^Vh+#oUI{16*NgkrFgmFX!!x!YeN2Yr^QVW|_o)XG(ZcBN)a|R?) zB#;P8w$4loZCthCwyD)Kv~>DA|AHfFa+EnB3aXYkonv5irz&0+e_1c`|f ziIC%^3DMCrgrvlo!j#n640IkHIfLEfbrQs9Mtu8!_VBgvQKZl*M~Z$T%?|zlVT_2; lV%Z2*hu); - - #008577 - #00574B - #D81B60 - diff --git a/android/test_app/app/src/main/res/values/strings.xml b/android/test_app/app/src/main/res/values/strings.xml deleted file mode 100644 index b8c9ca13d68..00000000000 --- a/android/test_app/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - PyTest - diff --git a/android/test_app/app/src/main/res/values/styles.xml b/android/test_app/app/src/main/res/values/styles.xml deleted file mode 100644 index 5885930df6d..00000000000 --- a/android/test_app/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/android/test_app/make_assets.py b/android/test_app/make_assets.py deleted file mode 100644 index 81c1cf16bdb..00000000000 --- a/android/test_app/make_assets.py +++ /dev/null @@ -1,24 +0,0 @@ -from torchvision import models - -import torch - - -print(torch.version.__version__) - -resnet18 = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1) -resnet18.eval() -resnet18_traced = torch.jit.trace(resnet18, torch.rand(1, 3, 224, 224)).save( - "app/src/main/assets/resnet18.pt" -) - -resnet50 = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1) -resnet50.eval() -torch.jit.trace(resnet50, torch.rand(1, 3, 224, 224)).save( - "app/src/main/assets/resnet50.pt" -) - -mobilenet2q = models.quantization.mobilenet_v2(pretrained=True, quantize=True) -mobilenet2q.eval() -torch.jit.trace(mobilenet2q, torch.rand(1, 3, 224, 224)).save( - "app/src/main/assets/mobilenet2q.pt" -) diff --git a/android/test_app/make_assets_custom.py b/android/test_app/make_assets_custom.py deleted file mode 100644 index fa31dfb57ac..00000000000 --- a/android/test_app/make_assets_custom.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -This is a script for PyTorch Android custom selective build test. It prepares -MobileNetV2 TorchScript model, and dumps root ops used by the model for custom -build script to create a tailored build which only contains these used ops. -""" - -import yaml -from torchvision import models - -import torch - - -# Download and trace the model. -model = models.mobilenet_v2(weights=models.MobileNet_V2_Weights.IMAGENET1K_V1) -model.eval() -example = torch.rand(1, 3, 224, 224) -# TODO: create script model with `torch.jit.script` -traced_script_module = torch.jit.trace(model, example) - -# Save traced TorchScript model. -traced_script_module.save("MobileNetV2.pt") - -# Dump root ops used by the model (for custom build optimization). -ops = torch.jit.export_opnames(traced_script_module) - -with open("MobileNetV2.yaml", "w") as output: - yaml.dump(ops, output)