모바일/안드로이드

Flutter를 사용해서 Yolov5를 안드로이드에서 돌려보자!

jinmc 2023. 1. 18. 11:10
반응형

안녕하세요

이번에는 Flutter를 사용해서 Yolov5를 안드로이드에서 돌려보는 작업을 포스팅 해보도록 하겠습니다.

우선 yolov5에 대한 소개입니다.

https://github.com/ultralytics/yolov5

 

그리고 flutter같은 경우에는 android, ios 둘다 적용이 가능하기 때문에 범용적으로 많이 쓰이는 플랫폼입니다.

안드로이드에서 머신러닝을 돌리는 경우 tflite를 활용하는데, 

flutter의 경우 tflite library가 있지만, 지원을 하지 않는 것으로 확인되고, 

v2 embedding에 지원이 안된다고 합니다.

 

그래서 flutter로 하는것을 포기하려던 차에, 

새로운 깃헙을 찾게 되었고, 저희 팀원의 도움으로, 구현에 성공하였습니다.

https://github.com/vladiH/flutter_vision

 

실제로 구현을 해보는 와중에도 android sdk 버전 문제, gradle 버전 문제 등 여러가지 문제들이 있었고,

build.gradle을 많이 만져야되긴 하지만, 

결국 성공하였습니다.

 

git clone을 해서, example 폴더 안에서 flutter run을 하면, 

다음과 같은 에러가 나옵니다

 

/flutter_vision/example/android/app/build.gradle' line: 39

* What went wrong:
A problem occurred evaluating project ':app'.
> Cannot invoke method toInteger() on null object

 

build.gradle로 가서 파일을 보면, 다음 과 같이 되어 있습니다.

 

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion flutter.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.vladih.computer_vision.flutter_vision_example"
        minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

이중에 39번째 라인은 

minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()

이렇게 되어있는데, 이를 21으로 바꿉니다.

minSdkVersion 21

하면 실행됩니다!!

실행화면은 다음과 같고, 민증이나 신분증, 지문 등을 넣고 play를 누르면 실행되는걸 볼수 있습니다. 

 

여기서 저희가 원하는 모델로 바꾸려면, 

tflite 모델 변환 (여기서 다루지는 않겠습니다)

한 이후에, assets 폴더 안의 labels.txt파일과 best-fp16.tflite 파일을 바꿔주면 우리가 원하는 형식으로 나오게 됩니다.

앱 구동 화면, play 를 누르면 inference한 사진들이 옆과 같이 뜹니다

반응형