forked from opencv/opencv
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request opencv#24680 from AleksandrPanov:update_android_mo…
…bilenet_tutorial Update Android mobilenet tutorial
- Loading branch information
Showing
21 changed files
with
108 additions
and
115 deletions.
There are no files selected for viewing
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,107 +1 @@ | ||
# How to run deep networks on Android device {#tutorial_dnn_android} | ||
|
||
@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`. | ||
![](1_start_new_project.png) | ||
|
||
- Keep default target settings. | ||
![](2_start_new_project.png) | ||
|
||
- Use "Empty Activity" template. Name activity as `MainActivity` with a | ||
corresponding layout `activity_main`. | ||
![](3_start_new_project.png) | ||
|
||
![](4_start_new_project.png) | ||
|
||
- Wait until a project was created. Go to `Run->Edit Configurations`. | ||
Choose `USB Device` as target device for runs. | ||
![](5_setup.png) | ||
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. | ||
|
||
![](6_run_empty_project.png) | ||
|
||
## 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. | ||
![](7_import_module.png) | ||
|
||
![](8_import_module.png) | ||
|
||
- 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. | ||
![](9_opencv_dependency.png) | ||
|
||
![](10_opencv_dependency.png) | ||
|
||
- 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! | ||
![](11_demo.jpg) | ||
The page was moved to @ref tutorial_android_dnn_intro |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
85 changes: 85 additions & 0 deletions
85
doc/tutorials/introduction/android_binary_package/android_dnn_intro.markdown
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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! | ||
![](images/11_demo.jpg) |
2 changes: 1 addition & 1 deletion
2
doc/tutorials/introduction/android_binary_package/android_ocl_intro.markdown
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters