Merge pull request #24680 from AleksandrPanov:update_android_mobilenet_tutorial
Update Android mobilenet tutorialpull/24653/head
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 56 KiB |
@ -1,107 +1 @@ |
|||||||
# How to run deep networks on Android device {#tutorial_dnn_android} |
The page was moved to @ref tutorial_android_dnn_intro |
||||||
|
|
||||||
@tableofcontents |
|
||||||
|
|
||||||
@prev_tutorial{tutorial_dnn_openvino} |
|
||||||
@next_tutorial{tutorial_dnn_yolo} |
|
||||||
|
|
||||||
| | | |
|
||||||
| -: | :- | |
|
||||||
| Original author | Dmitry Kurtaev | |
|
||||||
| Compatibility | OpenCV >= 3.3 | |
|
||||||
|
|
||||||
## Introduction |
|
||||||
In this tutorial you'll know how to run deep learning networks on Android device |
|
||||||
using OpenCV deep learning module. |
|
||||||
|
|
||||||
Tutorial was written for the following versions of corresponding software: |
|
||||||
- Android Studio 2.3.3 |
|
||||||
- OpenCV 3.3.0+ |
|
||||||
|
|
||||||
## Requirements |
|
||||||
|
|
||||||
- Download and install Android Studio from https://developer.android.com/studio. |
|
||||||
|
|
||||||
- Get the latest pre-built OpenCV for Android release from https://github.com/opencv/opencv/releases and unpack it (for example, `opencv-4.X.Y-android-sdk.zip`). |
|
||||||
|
|
||||||
- Download MobileNet object detection model from https://github.com/chuanqi305/MobileNet-SSD. We need a configuration file `MobileNetSSD_deploy.prototxt` and weights `MobileNetSSD_deploy.caffemodel`. |
|
||||||
|
|
||||||
## Create an empty Android Studio project |
|
||||||
- Open Android Studio. Start a new project. Let's call it `opencv_mobilenet`. |
|
||||||
 |
|
||||||
|
|
||||||
- Keep default target settings. |
|
||||||
 |
|
||||||
|
|
||||||
- Use "Empty Activity" template. Name activity as `MainActivity` with a |
|
||||||
corresponding layout `activity_main`. |
|
||||||
 |
|
||||||
|
|
||||||
 |
|
||||||
|
|
||||||
- Wait until a project was created. Go to `Run->Edit Configurations`. |
|
||||||
Choose `USB Device` as target device for runs. |
|
||||||
 |
|
||||||
Plug in your device and run the project. It should be installed and launched |
|
||||||
successfully before we'll go next. |
|
||||||
@note Read @ref tutorial_android_dev_intro in case of problems. |
|
||||||
|
|
||||||
 |
|
||||||
|
|
||||||
## Add OpenCV dependency |
|
||||||
|
|
||||||
- Go to `File->New->Import module` and provide a path to `unpacked_OpenCV_package/sdk/java`. The name of module detects automatically. |
|
||||||
Disable all features that Android Studio will suggest you on the next window. |
|
||||||
 |
|
||||||
|
|
||||||
 |
|
||||||
|
|
||||||
- Open two files: |
|
||||||
|
|
||||||
1. `AndroidStudioProjects/opencv_mobilenet/app/build.gradle` |
|
||||||
|
|
||||||
2. `AndroidStudioProjects/opencv_mobilenet/openCVLibrary330/build.gradle` |
|
||||||
|
|
||||||
Copy both `compileSdkVersion` and `buildToolsVersion` from the first file to |
|
||||||
the second one. |
|
||||||
|
|
||||||
`compileSdkVersion 14` -> `compileSdkVersion 26` |
|
||||||
|
|
||||||
`buildToolsVersion "25.0.0"` -> `buildToolsVersion "26.0.1"` |
|
||||||
|
|
||||||
- Make the project. There is no errors should be at this point. |
|
||||||
|
|
||||||
- Go to `File->Project Structure`. Add OpenCV module dependency. |
|
||||||
 |
|
||||||
|
|
||||||
 |
|
||||||
|
|
||||||
- Install once an appropriate OpenCV manager from `unpacked_OpenCV_package/apk` |
|
||||||
to target device. |
|
||||||
@code |
|
||||||
adb install OpenCV_3.3.0_Manager_3.30_armeabi-v7a.apk |
|
||||||
@endcode |
|
||||||
|
|
||||||
- Congratulations! We're ready now to make a sample using OpenCV. |
|
||||||
|
|
||||||
## Make a sample |
|
||||||
Our sample will takes pictures from a camera, forwards it into a deep network and |
|
||||||
receives a set of rectangles, class identifiers and confidence values in `[0, 1]` |
|
||||||
range. |
|
||||||
|
|
||||||
- First of all, we need to add a necessary widget which displays processed |
|
||||||
frames. Modify `app/src/main/res/layout/activity_main.xml`: |
|
||||||
@include android/mobilenet-objdetect/res/layout/activity_main.xml |
|
||||||
|
|
||||||
- Put downloaded `MobileNetSSD_deploy.prototxt` and `MobileNetSSD_deploy.caffemodel` |
|
||||||
into `app/build/intermediates/assets/debug` folder. |
|
||||||
|
|
||||||
- Modify `/app/src/main/AndroidManifest.xml` to enable full-screen mode, set up |
|
||||||
a correct screen orientation and allow to use a camera. |
|
||||||
@include android/mobilenet-objdetect/gradle/AndroidManifest.xml |
|
||||||
|
|
||||||
- Replace content of `app/src/main/java/org/opencv/samples/opencv_mobilenet/MainActivity.java`: |
|
||||||
@include android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java |
|
||||||
|
|
||||||
- Launch an application and make a fun! |
|
||||||
 |
|
@ -0,0 +1,85 @@ |
|||||||
|
# How to run deep networks on Android device {#tutorial_android_dnn_intro} |
||||||
|
|
||||||
|
@tableofcontents |
||||||
|
|
||||||
|
@prev_tutorial{tutorial_dev_with_OCV_on_Android} |
||||||
|
@next_tutorial{tutorial_android_ocl_intro} |
||||||
|
|
||||||
|
@see @ref tutorial_table_of_content_dnn |
||||||
|
|
||||||
|
| | | |
||||||
|
| -: | :- | |
||||||
|
| Original author | Dmitry Kurtaev | |
||||||
|
| Compatibility | OpenCV >= 4.9 | |
||||||
|
|
||||||
|
## Introduction |
||||||
|
In this tutorial you'll know how to run deep learning networks on Android device |
||||||
|
using OpenCV deep learning module. |
||||||
|
Tutorial was written for Android Studio Android Studio 2022.2.1. |
||||||
|
|
||||||
|
## Requirements |
||||||
|
|
||||||
|
- Download and install Android Studio from https://developer.android.com/studio. |
||||||
|
|
||||||
|
- Get the latest pre-built OpenCV for Android release from https://github.com/opencv/opencv/releases |
||||||
|
and unpack it (for example, `opencv-4.X.Y-android-sdk.zip`). |
||||||
|
|
||||||
|
- Download MobileNet object detection model from https://github.com/chuanqi305/MobileNet-SSD. |
||||||
|
Configuration file `MobileNetSSD_deploy.prototxt` and model weights `MobileNetSSD_deploy.caffemodel` |
||||||
|
are required. |
||||||
|
|
||||||
|
## Create an empty Android Studio project and add OpenCV dependency |
||||||
|
|
||||||
|
Use @ref tutorial_dev_with_OCV_on_Android tutorial to initialize your project and add OpenCV. |
||||||
|
|
||||||
|
## Make an app |
||||||
|
|
||||||
|
Our sample will takes pictures from a camera, forwards it into a deep network and |
||||||
|
receives a set of rectangles, class identifiers and confidence values in range [0, 1]. |
||||||
|
|
||||||
|
- First of all, we need to add a necessary widget which displays processed |
||||||
|
frames. Modify `app/src/main/res/layout/activity_main.xml`: |
||||||
|
@include android/mobilenet-objdetect/res/layout/activity_main.xml |
||||||
|
|
||||||
|
- Modify `/app/src/main/AndroidManifest.xml` to enable full-screen mode, set up |
||||||
|
a correct screen orientation and allow to use a camera. |
||||||
|
@code{.xml} |
||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
||||||
|
|
||||||
|
<application |
||||||
|
android:label="@string/app_name"> |
||||||
|
@endcode |
||||||
|
@snippet android/mobilenet-objdetect/gradle/AndroidManifest.xml mobilenet_tutorial |
||||||
|
|
||||||
|
- Replace content of `app/src/main/java/com/example/myapplication/MainActivity.java` and set a custom package name if necessary: |
||||||
|
|
||||||
|
@snippet android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java mobilenet_tutorial_package |
||||||
|
@snippet android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java mobilenet_tutorial |
||||||
|
|
||||||
|
- Put downloaded `deploy.prototxt` and `mobilenet_iter_73000.caffemodel` |
||||||
|
into `app/src/main/res/raw` folder. OpenCV DNN model is mainly designed to load ML and DNN models |
||||||
|
from file. Modern Android does not allow it without extra permissions, but provides Java API to load |
||||||
|
bytes from resources. The sample uses alternative DNN API that initializes a model from in-memory |
||||||
|
buffer rather than a file. The following function reads model file from resources and converts it to |
||||||
|
`MatOfBytes` (analog of `std::vector<char>` in C++ world) object suitable for OpenCV Java API: |
||||||
|
|
||||||
|
@snippet android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java mobilenet_tutorial_resource |
||||||
|
|
||||||
|
And then the network initialization is done with the following lines: |
||||||
|
|
||||||
|
@snippet android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java init_model_from_memory |
||||||
|
|
||||||
|
See also [Android documentation on resources](https://developer.android.com/guide/topics/resources/providing-resources.html) |
||||||
|
|
||||||
|
- Take a look how DNN model input is prepared and inference result is interpreted: |
||||||
|
|
||||||
|
@snippet android/mobilenet-objdetect/src/org/opencv/samples/opencv_mobilenet/MainActivity.java mobilenet_handle_frame |
||||||
|
|
||||||
|
`Dnn.blobFromImage` converts camera frame to neural network input tensor. Resize and statistical |
||||||
|
normalization are applied. Each line of network output tensor contains information on one detected |
||||||
|
object in the following order: confidence in range [0, 1], class id, left, top, right, bottom box |
||||||
|
coordinates. All coordinates are in range [0, 1] and should be scaled to image size before rendering. |
||||||
|
|
||||||
|
- Launch an application and make a fun! |
||||||
|
 |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |