From e13e6dd85e0d05a9c88501585921dda5692f146f Mon Sep 17 00:00:00 2001 From: Jaeyun Date: Wed, 25 Sep 2019 16:31:43 +0900 Subject: [PATCH] [Android/Sample] move sample app to nnstreamere-example repo Remove sample app in this repo. I newly uploaded the sample code to use Android API in example repository. Signed-off-by: Jaeyun Jung --- api/android/sample/build.gradle | 27 - api/android/sample/libs/Readme.txt | 1 - api/android/sample/proguard-rules.pro | 21 - api/android/sample/src/main/AndroidManifest.xml | 20 - .../nnsuite/nnstreamer/sample/MainActivity.java | 652 --------------------- .../sample/src/main/res/drawable/nnsuite_logo.png | Bin 4852 -> 0 bytes .../sample/src/main/res/layout/activity_main.xml | 18 - api/android/sample/src/main/res/values/colors.xml | 6 - api/android/sample/src/main/res/values/strings.xml | 3 - api/android/sample/src/main/res/values/styles.xml | 11 - 10 files changed, 759 deletions(-) delete mode 100644 api/android/sample/build.gradle delete mode 100644 api/android/sample/libs/Readme.txt delete mode 100644 api/android/sample/proguard-rules.pro delete mode 100644 api/android/sample/src/main/AndroidManifest.xml delete mode 100644 api/android/sample/src/main/java/org/nnsuite/nnstreamer/sample/MainActivity.java delete mode 100644 api/android/sample/src/main/res/drawable/nnsuite_logo.png delete mode 100644 api/android/sample/src/main/res/layout/activity_main.xml delete mode 100644 api/android/sample/src/main/res/values/colors.xml delete mode 100644 api/android/sample/src/main/res/values/strings.xml delete mode 100644 api/android/sample/src/main/res/values/styles.xml diff --git a/api/android/sample/build.gradle b/api/android/sample/build.gradle deleted file mode 100644 index 6e3321b..0000000 --- a/api/android/sample/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 28 - defaultConfig { - applicationId "com.samsung.android.nnstreamer.sample" - minSdkVersion 24 - targetSdkVersion 28 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - buildToolsVersion '28.0.3' -} - -dependencies { - implementation fileTree(include: ['*.aar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - // Set latest version of NNStreamer API - // implementation 'org.nnsuite:nnstreamer:0.0.1' -} diff --git a/api/android/sample/libs/Readme.txt b/api/android/sample/libs/Readme.txt deleted file mode 100644 index 8ac7b1e..0000000 --- a/api/android/sample/libs/Readme.txt +++ /dev/null @@ -1 +0,0 @@ -To run this sample, copy nnstreamer-api library file into 'libs' directory. diff --git a/api/android/sample/proguard-rules.pro b/api/android/sample/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/api/android/sample/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/api/android/sample/src/main/AndroidManifest.xml b/api/android/sample/src/main/AndroidManifest.xml deleted file mode 100644 index d2e3dec..0000000 --- a/api/android/sample/src/main/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - diff --git a/api/android/sample/src/main/java/org/nnsuite/nnstreamer/sample/MainActivity.java b/api/android/sample/src/main/java/org/nnsuite/nnstreamer/sample/MainActivity.java deleted file mode 100644 index 6750f9a..0000000 --- a/api/android/sample/src/main/java/org/nnsuite/nnstreamer/sample/MainActivity.java +++ /dev/null @@ -1,652 +0,0 @@ -package org.nnsuite.nnstreamer.sample; - -import android.Manifest; -import android.app.Activity; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.os.CountDownTimer; -import android.os.Environment; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.util.Log; - -import org.nnsuite.nnstreamer.CustomFilter; -import org.nnsuite.nnstreamer.NNStreamer; -import org.nnsuite.nnstreamer.Pipeline; -import org.nnsuite.nnstreamer.SingleShot; -import org.nnsuite.nnstreamer.TensorsData; -import org.nnsuite.nnstreamer.TensorsInfo; - -import java.io.File; -import java.nio.ByteBuffer; - -/** - * Sample code to run the application with nnstreamer-api. - * Before building this sample, copy nnstreamer-api library file into 'libs' directory. - */ -public class MainActivity extends Activity { - private static final String TAG = "NNStreamer-Sample"; - - private static final int PERMISSION_REQUEST_CODE = 3; - private static final String[] requiredPermissions = new String[] { - Manifest.permission.READ_EXTERNAL_STORAGE - }; - - private boolean initialized = false; - private boolean isFailed = false; - private CountDownTimer exampleTimer = null; - private int exampleRun = 0; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_main); - - /* check permissions */ - for (String permission : requiredPermissions) { - if (!checkPermission(permission)) { - ActivityCompat.requestPermissions(this, - requiredPermissions, PERMISSION_REQUEST_CODE); - return; - } - } - - initNNStreamer(); - } - - @Override - public void onResume() { - super.onResume(); - - if (initialized) { - /* set timer to run examples */ - exampleRun = 0; - isFailed = false; - setExampleTimer(200); - } - } - - @Override - public void onPause() { - super.onPause(); - - stopExampleTimer(); - } - - /** - * Check the permission is granted. - */ - private boolean checkPermission(final String permission) { - return (ContextCompat.checkSelfPermission(this, permission) - == PackageManager.PERMISSION_GRANTED); - } - - @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { - if (requestCode == PERMISSION_REQUEST_CODE) { - for (int grant : grantResults) { - if (grant != PackageManager.PERMISSION_GRANTED) { - Log.i(TAG, "Permission denied, close app."); - finish(); - return; - } - } - - initNNStreamer(); - return; - } - - finish(); - } - - /** - * Initialize NNStreamer. - */ - private void initNNStreamer() { - if (initialized) { - return; - } - - try { - initialized = NNStreamer.initialize(this); - } catch(Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - } finally { - if (initialized) { - Log.i(TAG, "Version: " + NNStreamer.getVersion()); - } else { - Log.e(TAG, "Failed to initialize NNStreamer"); - finish(); - } - } - } - - /** - * Set timer to run the examples. - */ - private void setExampleTimer(long time) { - stopExampleTimer(); - - exampleTimer = new CountDownTimer(time, time) { - @Override - public void onTick(long millisUntilFinished) { - } - - @Override - public void onFinish() { - /* run the examples repeatedly */ - if (exampleRun > 5) { - Log.d(TAG, "Stop timer to run example"); - - if (isFailed) { - Log.d(TAG, "Error occurs while running the examples"); - } - - return; - } - - int option = (exampleRun % 6); - - if (option == 1) { - Log.d(TAG, "==== Run pipeline example with state callback ===="); - runPipe(true); - } else if (option == 2) { - Log.d(TAG, "==== Run pipeline example ===="); - runPipe(false); - } else if (option == 3) { - Log.d(TAG, "==== Run pipeline example with valve ===="); - runPipeValve(); - } else if (option == 4) { - Log.d(TAG, "==== Run pipeline example with switch ===="); - runPipeSwitch(); - } else if (option == 5) { - Log.d(TAG, "==== Run pipeline example with custom filter ===="); - runPipeCustomFilter(); - } else { - Log.d(TAG, "==== Run single-shot example ===="); - runSingle(); - } - - exampleRun++; - setExampleTimer(500); - } - }; - - exampleTimer.start(); - } - - /** - * Cancel example timer. - */ - private void stopExampleTimer() { - if (exampleTimer != null) { - exampleTimer.cancel(); - exampleTimer = null; - } - } - - /** - * Print tensors info. - * - * The data type of tensor in NNStreamer: - * {@link NNStreamer#TENSOR_TYPE_INT32} - * {@link NNStreamer#TENSOR_TYPE_UINT32} - * {@link NNStreamer#TENSOR_TYPE_INT16} - * {@link NNStreamer#TENSOR_TYPE_UINT16} - * {@link NNStreamer#TENSOR_TYPE_INT8} - * {@link NNStreamer#TENSOR_TYPE_UINT8} - * {@link NNStreamer#TENSOR_TYPE_FLOAT64} - * {@link NNStreamer#TENSOR_TYPE_FLOAT32} - * {@link NNStreamer#TENSOR_TYPE_UNKNOWN} - * - * The maximum rank that NNStreamer supports. - * {@link NNStreamer#TENSOR_RANK_LIMIT} - * - * The maximum number of tensor instances that tensors may have. - * {@link NNStreamer#TENSOR_SIZE_LIMIT} - */ - private void printTensorsInfo(TensorsInfo info) { - int num = info.getTensorsCount(); - - Log.d(TAG, "The number of tensors in info: " + num); - for (int i = 0; i < num; i++) { - int[] dim = info.getTensorDimension(i); - - Log.d(TAG, "Info index " + i + - " name: " + info.getTensorName(0) + - " type: " + info.getTensorType(0) + - " dim: " + dim[0] + ":" + dim[1] + ":" + dim[2] + ":" + dim[3]); - } - } - - /** - * Print tensors data. - * - * The maximum number of tensor instances that tensors may have. - * {@link NNStreamer#TENSOR_SIZE_LIMIT} - */ - private void printTensorsData(TensorsData data) { - int num = data.getTensorsCount(); - - Log.d(TAG, "The number of tensors in data: " + num); - for (int i = 0; i < num; i++) { - ByteBuffer buffer = data.getTensorData(i); - - Log.d(TAG, "Data index " + i + " received " + buffer.capacity()); - } - } - - /** - * Example to run single-shot. - */ - private void runSingle() { - /* example with image classification tf-lite model */ - String root = Environment.getExternalStorageDirectory().getAbsolutePath(); - File model = new File(root + "/nnstreamer/tflite_model_img/mobilenet_v1_1.0_224_quant.tflite"); - - if (!model.exists()) { - Log.w(TAG, "Cannot find the model file"); - return; - } - - try { - SingleShot single = new SingleShot(model); - - Log.d(TAG, "Get input tensors info"); - TensorsInfo inInfo = single.getInputInfo(); - printTensorsInfo(inInfo); - - Log.d(TAG, "Get output tensors info"); - TensorsInfo outInfo = single.getOutputInfo(); - printTensorsInfo(outInfo); - - /* set timeout (1 second) */ - single.setTimeout(1000); - - /* single-shot invoke */ - for (int i = 0; i < 15; i++) { - /* dummy input */ - TensorsData in = TensorsData.allocate(inInfo); - - Log.d(TAG, "Try to invoke data " + (i + 1)); - - TensorsData out = single.invoke(in); - printTensorsData(out); - - Thread.sleep(50); - } - - single.close(); - } catch (Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - isFailed = true; - } - } - - /** - * Example to run pipeline. - * - * The state of pipeline: - * {@link NNStreamer#PIPELINE_STATE_UNKNOWN} - * {@link NNStreamer#PIPELINE_STATE_NULL} - * {@link NNStreamer#PIPELINE_STATE_READY} - * {@link NNStreamer#PIPELINE_STATE_PAUSED} - * {@link NNStreamer#PIPELINE_STATE_PLAYING} - */ - private void runPipe(boolean addStateCb) { - /* example with image classification tf-lite model */ - String root = Environment.getExternalStorageDirectory().getAbsolutePath(); - File model = new File(root + "/nnstreamer/tflite_model_img/mobilenet_v1_1.0_224_quant.tflite"); - - if (!model.exists()) { - Log.w(TAG, "Cannot find the model file"); - return; - } - - try { - String desc = "appsrc name=srcx ! other/tensor,dimension=(string)3:224:224:1,type=(string)uint8,framerate=(fraction)0/1 ! " + - "tensor_filter framework=tensorflow-lite model=" + model.getAbsolutePath() + " ! " + - "tensor_sink name=sinkx"; - - /* pipeline state callback */ - Pipeline.StateChangeCallback stateCb = null; - - if (addStateCb) { - stateCb = new Pipeline.StateChangeCallback() { - @Override - public void onStateChanged(int state) { - Log.d(TAG, "The pipeline state changed to " + state); - } - }; - } - - Pipeline pipe = new Pipeline(desc, stateCb); - - /* register sink callback */ - pipe.setSinkCallback("sinkx", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - } - }); - - Log.d(TAG, "Current state is " + pipe.getState()); - - /* start pipeline */ - pipe.start(); - - /* push input buffer */ - for (int i = 0; i < 15; i++) { - /* dummy input */ - TensorsData in = new TensorsData(); - in.addTensorData(TensorsData.allocateByteBuffer(3 * 224 * 224)); - - Log.d(TAG, "Push input data " + (i + 1)); - - pipe.inputData("srcx", in); - Thread.sleep(50); - } - - Log.d(TAG, "Current state is " + pipe.getState()); - - pipe.close(); - } catch (Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - isFailed = true; - } - } - - /** - * Example to run pipeline with valve. - */ - private void runPipeValve() { - try { - String desc = "appsrc name=srcx ! other/tensor,dimension=(string)3:100:100:1,type=(string)uint8,framerate=(fraction)0/1 ! " + - "tee name=t " + - "t. ! queue ! tensor_sink name=sink1 " + - "t. ! queue ! valve name=valvex ! tensor_sink name=sink2"; - - Pipeline pipe = new Pipeline(desc); - - /* register sink callback */ - pipe.setSinkCallback("sink1", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback at sink1 " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - } - }); - - pipe.setSinkCallback("sink2", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback at sink2 " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - } - }); - - /* start pipeline */ - pipe.start(); - - /* push input buffer */ - for (int i = 0; i < 15; i++) { - /* dummy input */ - TensorsData in = new TensorsData(); - in.addTensorData(TensorsData.allocateByteBuffer(3 * 100 * 100)); - - Log.d(TAG, "Push input data " + (i + 1)); - - pipe.inputData("srcx", in); - Thread.sleep(50); - - if (i == 10) { - /* close valve */ - pipe.controlValve("valvex", false); - } - } - - pipe.close(); - } catch (Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - isFailed = true; - } - } - - /** - * Example to run pipeline with output-selector. - */ - private void runPipeSwitch() { - try { - /* Note that the sink element needs option 'async=false' - * - * Prerolling problem - * For running the pipeline, set async=false in the sink element when using an output selector. - * The pipeline state can be changed to paused after all sink element receive buffer. - */ - String desc = "appsrc name=srcx ! other/tensor,dimension=(string)3:100:100:1,type=(string)uint8,framerate=(fraction)0/1 ! " + - "output-selector name=outs " + - "outs.src_0 ! tensor_sink name=sink1 async=false " + - "outs.src_1 ! tensor_sink name=sink2 async=false"; - - Pipeline pipe = new Pipeline(desc); - - /* register sink callback */ - pipe.setSinkCallback("sink1", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback at sink1 " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - } - }); - - pipe.setSinkCallback("sink2", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback at sink2 " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - } - }); - - /* start pipeline */ - pipe.start(); - - /* push input buffer */ - for (int i = 0; i < 15; i++) { - /* dummy input */ - TensorsData in = new TensorsData(); - in.addTensorData(TensorsData.allocateByteBuffer(3 * 100 * 100)); - - Log.d(TAG, "Push input data " + (i + 1)); - - pipe.inputData("srcx", in); - Thread.sleep(50); - - if (i == 10) { - /* select pad */ - pipe.selectSwitchPad("outs", "src_1"); - } - } - - /* get pad list of output-selector */ - String[] pads = pipe.getSwitchPads("outs"); - Log.d(TAG, "Total pad in output-selector: " + pads.length); - for (String pad : pads) { - Log.d(TAG, "Pad name: " + pad); - } - - pipe.close(); - } catch (Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - isFailed = true; - } - } - - /** - * Example to run pipeline with custom filter. - */ - private void runPipeCustomFilter() { - try { - /* register custom-filter (passthrough) */ - CustomFilter customPassthrough = CustomFilter.registerCustomFilter("custom-passthrough", - new CustomFilter.CustomFilterCallback() { - @Override - public TensorsInfo getOutputInfo(TensorsInfo inInfo) { - Log.d(TAG, "Received info callback in custom-passthrough"); - return inInfo; - } - - @Override - public TensorsData invoke(TensorsData inData, TensorsInfo inInfo, TensorsInfo outInfo) { - Log.d(TAG, "Received invoke callback in custom-passthrough"); - return inData; - } - }); - - /* register custom-filter (convert data type to float) */ - CustomFilter customConvert = CustomFilter.registerCustomFilter("custom-convert", - new CustomFilter.CustomFilterCallback() { - @Override - public TensorsInfo getOutputInfo(TensorsInfo inInfo) { - Log.d(TAG, "Received info callback in custom-convert"); - - TensorsInfo out = inInfo; - out.setTensorType(0, NNStreamer.TENSOR_TYPE_FLOAT32); - - return out; - } - - @Override - public TensorsData invoke(TensorsData inData, TensorsInfo inInfo, TensorsInfo outInfo) { - Log.d(TAG, "Received invoke callback in custom-convert"); - - ByteBuffer input = inData.getTensorData(0); - ByteBuffer output = TensorsData.allocateByteBuffer(4 * 10); - - for (int i = 0; i < 10; i++) { - float value = (float) input.getInt(i * 4); - output.putFloat(i * 4, value); - } - - TensorsData out = new TensorsData(); - out.addTensorData(output); - - return out; - } - }); - - /* register custom-filter (add constant) */ - CustomFilter customAdd = CustomFilter.registerCustomFilter("custom-add", - new CustomFilter.CustomFilterCallback() { - @Override - public TensorsInfo getOutputInfo(TensorsInfo inInfo) { - Log.d(TAG, "Received info callback in custom-add"); - return inInfo; - } - - @Override - public TensorsData invoke(TensorsData inData, TensorsInfo inInfo, TensorsInfo outInfo) { - Log.d(TAG, "Received invoke callback in custom-add"); - - ByteBuffer input = inData.getTensorData(0); - ByteBuffer output = TensorsData.allocateByteBuffer(4 * 10); - - for (int i = 0; i < 10; i++) { - float value = input.getFloat(i * 4); - - /* add constant */ - value += 1.5; - output.putFloat(i * 4, value); - } - - TensorsData out = new TensorsData(); - out.addTensorData(output); - - return out; - } - }); - - String desc = "appsrc name=srcx ! other/tensor,dimension=(string)10:1:1:1,type=(string)int32,framerate=(fraction)0/1 ! " + - "tensor_filter framework=" + customPassthrough.getName() + " ! " + - "tensor_filter framework=" + customConvert.getName() + " ! " + - "tensor_filter framework=" + customAdd.getName() + " ! " + - "tensor_sink name=sinkx"; - - Pipeline pipe = new Pipeline(desc); - - /* register sink callback */ - pipe.setSinkCallback("sinkx", new Pipeline.NewDataCallback() { - int received = 0; - - @Override - public void onNewDataReceived(TensorsData data, TensorsInfo info) { - Log.d(TAG, "Received new data callback at sinkx " + (++received)); - - printTensorsInfo(info); - printTensorsData(data); - - ByteBuffer output = data.getTensorData(0); - - for (int i = 0; i < 10; i++) { - Log.d(TAG, "Received data: index " + i + " value " + output.getFloat(i * 4)); - } - } - }); - - /* start pipeline */ - pipe.start(); - - /* push input buffer */ - for (int i = 0; i < 15; i++) { - ByteBuffer input = TensorsData.allocateByteBuffer(4 * 10); - - for (int j = 0; j < 10; j++) { - input.putInt(j * 4, j); - } - - TensorsData in = new TensorsData(); - in.addTensorData(input); - - pipe.inputData("srcx", in); - Thread.sleep(50); - } - - pipe.close(); - - /* close custom-filter */ - customPassthrough.close(); - customConvert.close(); - customAdd.close(); - } catch (Exception e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - isFailed = true; - } - } -} diff --git a/api/android/sample/src/main/res/drawable/nnsuite_logo.png b/api/android/sample/src/main/res/drawable/nnsuite_logo.png deleted file mode 100644 index 723f27825a7be17aadc08df194517a5080677f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4852 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 a0RR81%4|Jy*wkkL0000 - - - - - diff --git a/api/android/sample/src/main/res/values/colors.xml b/api/android/sample/src/main/res/values/colors.xml deleted file mode 100644 index 69b2233..0000000 --- a/api/android/sample/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - #008577 - #00574B - #D81B60 - diff --git a/api/android/sample/src/main/res/values/strings.xml b/api/android/sample/src/main/res/values/strings.xml deleted file mode 100644 index eddf1b7..0000000 --- a/api/android/sample/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - NNStreamer API Sample - diff --git a/api/android/sample/src/main/res/values/styles.xml b/api/android/sample/src/main/res/values/styles.xml deleted file mode 100644 index 5885930..0000000 --- a/api/android/sample/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -- 2.7.4