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)
def camerax_version = "1.1.0-beta01"
以降を追加しますexternalNativeBuild
を上記のように追加しますviewBinding true
も上記のように追加しますminSdk
は24以上に設定しますcompileSdk
は33以上が必要です。compileSdk
に合わせて、targetSdk
も33に設定します。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.kt
のDetect
関数を以下のように修正します。(Array<Obj?>?
をArray<Obj>?
に変更します)
external fun Detect(bitmap: Bitmap?, use_gpu: Boolean): Array<Obj>?
Code language: Kotlin (kotlin)
AndroidManifest.xml
AndroidManifest.xml
のapplication
タグの上部に以下を追加します。
<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.