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/jniCode 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.