diff --git a/mace/examples/android/README.md b/mace/examples/android/README.md index 673f4e96fd1a0bc296f18d8c9e7cc35eacf32ae4..5edfff76050c2e904ce1afa69a6518e81b281077 100644 --- a/mace/examples/android/README.md +++ b/mace/examples/android/README.md @@ -11,4 +11,8 @@ cd mace/exampls/android Pre-built APK -------------- -Pre-built Android APK can be downloaded [here](https://cnbj1.fds.api.xiaomi.com/mace/demo/mace_android_demo.apk). \ No newline at end of file +Pre-built Android APK can be downloaded [here](https://cnbj1.fds.api.xiaomi.com/mace/demo/mace_android_demo.apk). + +Note +-------------- +We use two big cores for CPU inference. diff --git a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/CameraActivity.java b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/CameraActivity.java index f8adafc845c37e341e084fa208085dfaeaf4c3a2..8d91872f119b7f05894b8472888fdf2f7780a47c 100644 --- a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/CameraActivity.java +++ b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/CameraActivity.java @@ -180,11 +180,23 @@ public class CameraActivity extends Activity implements View.OnClickListener, Ap public void onCLickItem(String content) { mSelectMode.setText(content); initData.setModel(content); + handleOnlyCpuSupportByModel(content); AppModel.instance.maceMobilenetCreateEngine(initData, CameraActivity.this); } }); } + private void handleOnlyCpuSupportByModel(String model) { + if (InitData.isOnlySupportCpuByModel(model)) { + String device = InitData.getCpuDevice(); + mSelectPhoneType.setText(device); + mSelectPhoneType.setEnabled(false); + initData.setDevice(device); + } else { + mSelectPhoneType.setEnabled(true); + } + } + @Override public void onCreateEngineFail(final boolean quit) { AlertDialog.Builder builder = new AlertDialog.Builder(this); diff --git a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java index ffcbde9605a841f959fcec3ba5016618f004e223..c9787e6f9978907a9989aa0ff897eebce266a425 100644 --- a/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java +++ b/mace/examples/android/app/src/main/java/com/xiaomi/mace/demo/result/InitData.java @@ -21,7 +21,8 @@ import java.io.File; public class InitData { public static final String[] DEVICES = new String[]{"CPU", "GPU"}; - public static final String[] MODELS = new String[]{"mobilenet_v1", "mobilenet_v2"}; + public static final String[] MODELS = new String[]{"mobilenet_v1", "mobilenet_v2", "mobilenet_v1_quant", "mobilenet_v2_quant"}; + private static final String[] ONLY_CPU_MODELS = new String[]{"mobilenet_v1_quant", "mobilenet_v2_quant"}; private String model; private String device = ""; @@ -34,7 +35,7 @@ public class InitData { public InitData() { model = MODELS[0]; ompNumThreads = 2; - cpuAffinityPolicy = 0; + cpuAffinityPolicy = 1; gpuPerfHint = 3; gpuPriorityHint = 3; device = DEVICES[0]; @@ -101,4 +102,17 @@ public class InitData { public void setStoragePath(String storagePath) { this.storagePath = storagePath; } + + public static String getCpuDevice() { + return DEVICES[0]; + } + + public static boolean isOnlySupportCpuByModel(String model) { + for (String m : ONLY_CPU_MODELS) { + if (m.equals(model)) { + return true; + } + } + return false; + } } diff --git a/mace/examples/android/macelibrary/src/main/cpp/image_classify.cc b/mace/examples/android/macelibrary/src/main/cpp/image_classify.cc index 4ccba56efa6b1a8de476eb6c7c7e00632136099f..9928686c82b3162550d2e99ffd01d632a4b99259 100755 --- a/mace/examples/android/macelibrary/src/main/cpp/image_classify.cc +++ b/mace/examples/android/macelibrary/src/main/cpp/image_classify.cc @@ -46,7 +46,11 @@ struct MaceContext { {"mobilenet_v1", {"input", "MobilenetV1/Predictions/Reshape_1", {1, 224, 224, 3}, {1, 1001}}}, {"mobilenet_v2", {"input", "MobilenetV2/Predictions/Reshape_1", - {1, 224, 224, 3}, {1, 1001}}} + {1, 224, 224, 3}, {1, 1001}}}, + {"mobilenet_v1_quant", {"input", "MobilenetV1/Predictions/Softmax:0", + {1, 224, 224, 3}, {1, 1001}}}, + {"mobilenet_v2_quant", {"input", "output", + {1, 224, 224, 3}, {1, 1001}}} }; }; @@ -107,7 +111,8 @@ Java_com_xiaomi_mace_JniMaceUtils_maceMobilenetCreateEngine( mace::MaceEngineConfig config(mace_context.device_type); status = config.SetCPUThreadPolicy( omp_num_threads, - static_cast(cpu_affinity_policy)); + static_cast(cpu_affinity_policy), + true); if (status != mace::MACE_SUCCESS) { __android_log_print(ANDROID_LOG_ERROR, "image_classify attrs", diff --git a/mace/examples/android/mobilenet.yml b/mace/examples/android/mobilenet.yml index ac5ba77830da9b3447bd5a18580da83be517d9ae..302f29f52379637e133d70eea8a7711e4db01b34 100644 --- a/mace/examples/android/mobilenet.yml +++ b/mace/examples/android/mobilenet.yml @@ -39,3 +39,45 @@ models: nnlib_graph_mode: 0 obfuscate: 0 winograd: 0 + mobilenet_v1_quant: + platform: tensorflow + model_file_path: http://cnbj1.fds.api.xiaomi.com/mace/miai-models/mobilenet-v1/mobilenet_v1_1.0_224_quant_retrain.pb + model_sha256_checksum: c3faa9bd790310eb3dec411d2f2e2dd8802394e31ccb47daaa5e3b6369fadfa3 + subgraphs: + - input_tensors: + - input + input_shapes: + - 1,224,224,3 + input_ranges: + - -1.0,1.0 + output_tensors: + - MobilenetV1/Predictions/Softmax:0 + output_shapes: + - 1,1001 + runtime: cpu + limit_opencl_kernel_time: 0 + nnlib_graph_mode: 0 + obfuscate: 0 + winograd: 0 + quantize: 1 + mobilenet_v2_quant: + platform: tensorflow + model_file_path: https://cnbj1.fds.api.xiaomi.com/mace/miai-models/mobilenet-v2/mobilenet_v2_1.0_224_quant_retrain.pb + model_sha256_checksum: 1429c8e2a91b251c9fa0dae43dfa5817c5a798bd30284f8c0690e7569a8817f1 + subgraphs: + - input_tensors: + - input + input_shapes: + - 1,224,224,3 + input_ranges: + - -1.0,1.0 + output_tensors: + - output + output_shapes: + - 1,1001 + runtime: cpu + limit_opencl_kernel_time: 0 + nnlib_graph_mode: 0 + obfuscate: 0 + winograd: 0 + quantize: 1