Android で CloudVision API を使ってラベル検出する
の続きです。
前回の記事では、ラベル検出を行った。
今回は、顔検出を行う。
下記を参考にした。
リクエストの作成
基本的な処理は、ラベル検出と同じです。
違いは、機能のタイプに顔検出を指定すること。
Feature feature = new Feature();
// 顔検出を指定する
feature.setType("FACE_DETECTION");
顔検出のレスポンス
ラベル検出では、取得できるアノテーションはラベルだけでした。
顔検出では、下記のアノテーションが取得できる。
- 顔の輪郭
- 目や口などのランドマーク
- 顔の角度
- 喜びや怒りなどの感情
まずは、チュートリアルにあるように、
顔の輪郭を描画する。
顔の輪郭を取得する
FaceAnnotation
顔検出のレスポンスのクラス
getBoundingPoly と getFdBoundingPoly という
よく似た2つのメソッドがあり、どちらを使うのか迷う。
下記の注釈がついているが、よく分からない。
fd_bounding_poly は boundingPoly よりもタイトで、
顔の肌の部分のみを囲みます。
これはランドマークの結果には基づいておらず、最初の顔検出のみに基づいているため、fd(顔検出)プレフィックスが付いています。
幾つか試してみると、getBoundingPoly には2つの頂点の値しかの入っていない場合があった。
2つでは多角形にならないので、
fd_bounding_poly を使うことにする。
BoundingPoly
顔の輪郭を示す多角形のメタデータ
多角形の頂点のx y 座標が取得できる
Vertex
多角形の頂点のメタデータ
x y 座標が取得できる
下記のように、顔の輪郭の情報を取得する
FaceAnnotation faceAnnotation;
BoundingPoly boundingPoly = faceAnnotation.getFdBoundingPoly();
List<Vertex> vertices = boundingPoly.getVertices()
顔の輪郭を描画する
下記のように、顔の輪郭の情報をAndroid の Path クラスに変換する
List<Vertex> vertices;
Path path = new Path();
int x0 = 0;
int y0 = 0;
for (int i=0; i<vertices; i++ ) {
Vertex = vertice = vertices.get(i);
int x = vertice.getX();
int y = vertice.getY();
if(i == 0) {
x0 = x;
y0 = y;
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
path.lineTo(x0, y0);
実行例
感情の検出
下記のような結果になる。
いずれも VERY_UNLIKELY なので、無表情かな。
joyLikelihood: VERY_UNLIKELY
angerLikelihood: VERY_UNLIKELY
sorrowLikelihood: VERY_UNLIKELY
surpriseLikelihood: VERY_UNLIKELY
headwearLikelihood: VERY_UNLIKELY
blurredLikelihood: VERY_UNLIKELY
underExposedLikelihood: VERY_UNLIKELY
underExposedLikelihood: VERY_UNLIKELY
underExposedLikelihood: VERY_UNLIKELY
underExposedLikelihood: VERY_UNLIKELY
感情の検出はこれといったアプリの案が浮かばなかった。
参考までに、下記の記事を紹介する。
サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/CloudVision4