時間がない人のためのAndroid顔認識アプリ開発ツール調べてみた
こんにちは,のぶです.
Androidアプリで顔認識したい時の技術調査をざっくりしたのでまとめます.
だれにむけたものか
・Android初心者
・とにかく開発に時間がない人
・kotlinでやりたい人
SVMとかYOLOとかの手法や識別率上げる方法について知りたい人はQiitaや参考書の方へ
顔認識って?
スマホでカメラ取る時に顔のまわりに❏の枠がでるじゃないですか.あれです.
画像から顔っぽいものを機械が判別して,その周りに❏の枠を描画してます.
調査内容
まず,顔認識といったらOpenCV
といっても,天下のGoogleさんが自社製品のAndroidに特化したお手軽パッケージ作ってるんじゃないの?!
という仮定のもと,ググりました.そして,実際に試しました.
調査結果
結論: MLkit + CameraXの組み合わせが良い
結論からいいますと,MLkit + CameraXの組み合わせが良いです.
順を追って説明します.
OpenCV
OpenCVはオープンソースの画像処理ライブラリです.企業や研究機関でもよく用いられています.
早く顔認識するなら
OpenCVは結構昔から使われているんですが,kotlinでの環境構築が結構面倒でした.ハマりまくりました.
結局,スターター用にパッケージを整備している方がいらっしゃったので,こちらのURLをcloneして中をいじったほうが早いです.
git clone https://github.com/Tokajip/FaceDetection.git
clone後,buildして,あなたのスマホにインストールすればすぐに顔認識ができます
ちなみに,OpenCVのバージョンは3.4です.バージョン4に対応してるリポジトリは見つけられませんでした.
自分で環境構築するなら
自分で環境を構築する場合は,OpenCVのSDKをダウンロードしてandroid projectにインポートする必要があります.環境構築はいくつかの記事がありましたが,以下のエラーが出てしまいました.
Dependent features configured but no package ID was set
結局,OpenCVのSDK(https://github.com/opencv/opencv/releases)のbuild.gradleに記述されている以下の手順でインポートする方法が良いです.
// (without copying into application project directory, allow to share the same module between projects)
//
// Edit "settings.gradle" and add these lines:
//
// def opencvsdk='<path_to_opencv_android_sdk_rootdir>'
// // You can put declaration above into gradle.properties file instead (including file in HOME directory),
// // but without 'def' and apostrophe symbols ('): opencvsdk=<path_to_opencv_android_sdk_rootdir>
// include ':opencv'
// project(':opencv').projectDir = new File(opencvsdk + '/sdk')
///
// Add dependency into application module:
//
// - Android Studio way:
// "Open Module Settings" (F4) -> "Dependencies" tab
//
// - or add "project(':opencv')" dependency into app/build.gradle:
//
// dependencies {
// implementation fileTree(dir: 'libs', include: ['*.jar'])
// ...
// implementation project(':opencv')
// }
// Load OpenCV native library before using:
//
// - avoid using of "OpenCVLoader.initAsync()" approach - it is deprecated
// It may load library with different version (from OpenCV Android Manager, which is installed separatelly on device)
//
// - use "System.loadLibrary("opencv_java4")" or "OpenCVLoader.initDebug()"
// TODO: Add accurate API to load OpenCV native library
参考記事:
https://stackoverflow.com/questions/63090645/adding-opencv-to-android-studio-dependent-features-configured-but-no-package-id
ただ,kotlinでの開発情報が世の中になさすぎるので開発コストは高いです.初心者はほぼ無理だと思います.一応,顔認識ではないですがkotlinでの使用例です↓
参考記事:https://qiita.com/ash8h/items/2556b9226129ba8bc34d
いろいろいじりたいなら
OpenCVは特徴量の抽出にとても良いので,自分で顔認識アルゴリズムを作成したい場合はおすすめです.例えばこちらの記事では,AKAZEといわれる軽量で識別率高めな特徴量を使っています.
参考記事: https://qiita.com/pokotsun/items/f5d9cdd2cca14fd85369
MLkit
MLkitはgoogleが提供する機械学習モジュールです.いろいろな識別モデルが入っています.CameraXというカメラを操作するパッケージと組み合わせると開発が楽です.以下に3つのサイトを紹介します.それぞれのパッケージの環境構築後,MLkit + CameraXの記事を試してみればあなたもすぐに顔認識アプリが作れます.
MLkit環境構築: https://developers.google.com/ml-kit/vision/face-detection/android
+
CameraX: https://codelabs.developers.google.com/codelabs/camerax-getting-started#0
↓
MLkit + CameraX: https://www.techceed-inc.com/engineer_blog/5989/
認識精度評価
OpenCV
識別モデル: haar cascade
顔正面画像だと識別率は良かったです.
遠目と横顔だと判別できてません
MLkit
識別モデル: FaceDetection
顔が識別され,TAKE PHOTOマークが表示されます.
結論
とりあえず早くAndroidアプリで顔認識したい,そこまでこれに開発工数かけたくない,といった状況だと,MLkitに軍配があがるのかなという結論です.
顔認識精度評価では,分類器が異なるので(OpenCV: cascade, MLkit: たぶんNN),フェアではないかと思いますが,同じ作業量で得られる結果が圧倒的にMLkitが高かったという所感です.
情報量も多く,コーディングが少なく,精度も高いという総合評価でMLkit+cameraXが開発しやすいです.
ということで,
kotlinで早く開発したい人はMLkit
画像認識の研究や勉強,自社のアルゴリズムを組み込みたい人はOpenCV
という感じでしょうか.
終わり