Gppgle Play サービス 7.8から、Face APIを利用できるようになりました。
画像やカメラの映像から人の顔を検出ことができます。
顔検出を行うにはOpenCVのライブラリを使う必要がありました。
Google Play サービスで提供されるようになったので手軽に使用できます。
サンプルアプリケーション
サンプルアプリケーションはGitHubに公開されています。
photo-demoは、顔の画像から特徴点を検出するサンプルです。
ソースコードを見てみます。
顔検出のためのインスタンスを作成します。
PhotoViewerActivityクラスのonCreateメソッドで検出しています。
静止画のため、setTrackingEnabledをfalseにします。
動画や連続した画像の時はtrueにします。
すべてのランドマークを検出するためにsetLandmarkTypeをALL_LANDMARKSに設定します。
FaceDetector detector = new FaceDetector.Builder(getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.build();
SafeFaceDetectorを使うのは、非常に小さな画像上の顔検出のバグを回避するための処理とのこと。
Detector<Face> safeDetector = new SafeFaceDetector(detector);
画像からFrameを作成します。
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
作成したFrameから顔検出処理を実行します。
SparseArray<Face> faces = safeDetector.detect(frame);
Faceクラスのインスタンスのコレクションを取得しました。
これをFaceViewクラスのdrawFaceAnnotationsメソッドで描画しています。
個々のFaceインスタンスの座標を取得して円を描画しています。
for (int i = 0; i < mFaces.size(); ++i) {
Face face = mFaces.valueAt(i);
for (Landmark landmark : face.getLandmarks()) {
int cx = (int) (landmark.getPosition().x * scale);
int cy = (int) (landmark.getPosition().y * scale);
canvas.drawCircle(cx, cy, 10, paint);
}
}
サンプルを少し変更して、笑顔の可能性を取得してみます。
FaceDetector detector = new FaceDetector.Builder(getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.build();
Detector<Face> safeDetector = new SafeFaceDetector(detector);
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<Face> faces = safeDetector.detect(frame);
if (faces.size() > 0) {
String text = "SmilingProbability: " + String.format("%.2f", faces.get(0).getIsSmilingProbability());
Toast.makeText(this,text, Toast.LENGTH_LONG).show();
}
「SmilingProbability: 0.59」と表示されました。
値は0.0から1.0の間を取るようです。
やや笑顔かな、といったところでしょうか。
サンプルアプリケーションは他に、「FaceTracker」と、「multi-tracker」があります。
カメラの映像から認識するサンプルです。