YOLOv5 on Android – Settings

Android

Androidのカメラの映像をYOLOv5を使用し、物体検出する方法を2回に分けて解説します。この記事では設定方法について解説し、コードについては次の記事で解説します。

Androidで使用するYOLOv5はこちらの記事で紹介したncnnを使用します。Androidを使用してncnn版YOLOv5を実行する方法はこちらのレポジトリを参考にしました。

プロジェクト作成

Android Studioを起動し、New Project > Empty Activity を選択し、Nextに進みます。

なお、プロジェクトは /path/to/android_ncnn ディレクトリに作成したとして以降の説明を行います。

build.gralde(:app)

build.gradle(:app)の全体を以下に示します。

plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.android_ncnn' compileSdk 33 defaultConfig { applicationId "com.example.android_ncnn" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } externalNativeBuild { cmake { version "3.10.2" path file('src/main/jni/CMakeLists.txt') } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } } dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.6.0' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' def camerax_version = "1.1.0-beta01" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" implementation "androidx.camera:camera-video:${camerax_version}" implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}" }
Code language: Gradle (gradle)
  1. def camerax_version = "1.1.0-beta01"以降を追加します
  2. externalNativeBuildを上記のように追加します
  3. viewBinding trueも上記のように追加します
  4. minSdkは24以上に設定します
  5. compileSdkは33以上が必要です。compileSdkに合わせて、targetSdkも33に設定します。
  6. com.example.android_ncnnの部分は各自がプロジェクト作成時に設定した名前に修正します

ファイルの追加

https://github.com/nihui/ncnn-android-yolov5 をクローンし必要なファイルをコピーします。

mkdir /path/to/android_ncnn/app/src/main/jni mkdir /path/to/android_ncnn/app/src/main/assets mkdir -p /path/to/android_ncnn/app/src/main/java/com/tencent/yolov5ncnn git clone https://github.com/nihui/ncnn-android-yolov5 cp ncnn-android-yolov5/app/src/main/jni/{CMakeLists.txt,yolov5ncnn_jni.cpp} /path/to/android_ncnn/app/src/main/jni cp -r ncnn-android-yolov5/app/src/main/assets /path/to/android_ncnn/app/src/main cp ncnn-android-yolov5/app/src/main/java/com/tencent/yolov5ncnn/YoloV5Ncnn.java /path/to/android_ncnn/app/src/main/java/com/tencent/yolov5ncnn/
Code language: Bash (bash)

Android用ncnnライブラリを追加します。

wget https://github.com/Tencent/ncnn/releases/download/20221128/ncnn-20221128-android-vulkan.zi unzip ncnn-20221128-android-vulkan.zip -d /path/to/android_ncnn/app/src/main/jni
Code language: Bash (bash)

コピーしたCMakeLists.txtを修正します。

-set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20201218-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn) +set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20221128-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
Code language: Diff (diff)

追加した、com/tencent/yolov5ncnn/YoloV5Ncnn.javaを右クリックし、Converto Java File to Kotlin Fileを選択しKotlinに変換します。

変換された、YoloV5Ncnn.ktDetect関数を以下のように修正します。(Array<Obj?>?Array<Obj>?に変更します)

external fun Detect(bitmap: Bitmap?, use_gpu: Boolean): Array<Obj>?
Code language: Kotlin (kotlin)

AndroidManifest.xml

AndroidManifest.xml

AndroidManifest.xmlapplicationタグの上部に以下を追加します。

<uses-feature android:name="android.hardware.camera.any" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
Code language: HTML, XML (xml)

activity_main.xml

activity_main.xmlを開き、

以下の画面を右クリックし、Go to XMLを選択し、XMLを直接編集します。

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/vertical_centerline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent=".50" /> </androidx.constraintlayout.widget.ConstraintLayout>
Code language: HTML, XML (xml)

設定は以上です。次回はいよいよコードの修正を行います。

参照

GitHub - nihui/ncnn-android-yolov5: The YOLOv5 object detection android example
The YOLOv5 object detection android example . Contribute to nihui/ncnn-android-yolov5 development by creating an account on GitHub.
CameraX の概要  |  Android デベロッパー  |  Android Developers
Getting Started with CameraX  |  Android Developers
This codelab introduces how to create a camera app that uses CameraX to show a viewfinder, take photos and analyze an image stream from the camera.