Androidの 顔検出API 笑顔判定 は「笑いながら怒る人」をどう認識するか

こんなのが公開されています.

Google Play サービスでの顔検出 - Google Developer Japan Blog

顔認識をして「笑顔かどうか」の判定もできる.

image01

公式リファレンスをみてみると.

com.google.android.gms.vision.face.Face

public float getIsSmilingProbability ()

Returns a value between 0.0 and 1.0 giving a probability that the face is smiling.

This returns UNCOMPUTED_PROBABILITY if the probability was not computed. The probability is not computed if smile classification is not enabled via setClassificationType(int) or the required landmarks are not found. The LEFT_MOUTH, RIGHT_MOUTH, and NOSE_BASE landmarks are required to compute a smile probability.

Returns
the probability that the face is smiling

画像内の顔が笑顔であるかどうかを0から1の数値で取得できます.

Googleの公開しているサンプルをみてみると,

android-vision/FaceGraphic.java at master · googlesamples/android-vision

...
canvas.drawText("happiness: " + String.format("%.2f", face.getIsSmilingProbability()), x - ID_X_OFFSET, y - ID_Y_OFFSET, mIdPaint);
...

カメラに写っている画像にオーバーレイして「happiness: 0.92」のように「笑顔度」を表示します.
1に近いほど笑顔という判定です.

いくつか画像を試してみました.

20150928-145235

20150928-145057

20150928-145340

20150928-144823

20150928-144744

20150928-144605

20150928-144452

20150928-144225

20150928-144123

ほぼ正しく認識します.

では「笑いながら怒る人」はどうなるか.


20150928-145803

笑顔度 0.96 と判定されました.

声とセリフだけが「怒ってる」んですねこの芸って.


その「SIMフリー端末」は実質ロックされてないか?

そもそもこんな目的でした.

- 利用者の利便性の向上
- MNPによる新規利用契約者と長期利用契約者の間に生じている不公平感を是正する目的

SIMロック解除に関するガイドライン 総務省

なので, その機種自体の能力として各キャリアの電波を拾えるものとすれば,

フツーに

「購入した端末でドコモでもソフバンでも格安SIMでも挿せば通信・通話できる」

「Appleや海外からSIMフリーの端末買えば国内でも使える」

と思っていました.

最近, iPhone 6s (SIMフリー) 関連の記事がありました.

「ドコモオンライン手続き」から一番下の「SIMロック解除」を選択し、IMEIをペーストします。
そのまま進めばSIMロック解除完了です。

ドコモオンラインショップ購入のiPhone 6sを到着前にSIMロック解除してみた!

簡単すぎて拍子抜け iPhoneのSIMロック解除:日本経済新聞

購入後, ドコモサイトから「IMEI」を入力すると「SIMロック解除」できるという.

ドコモオンラインショップ購入のiPhone_6sを到着前にSIMロック解除してみた!

で「IMEI」.

全ての携帯電話や一部の衛星電話に付与される識別番号。
GSMのネットワークでは、正当なデバイスかどうかを識別するのに使われており、盗まれた携帯電話を使えないようにすることもできる。例えば携帯電話を盗まれた場合、携帯電話会社に電話してそのIMEIの電話でネットワークにアクセスできないようにしてもらうことができる。そうするとその電話はSIMカードを入れ替えても使えなくなる。

International Mobile Equipment Identity - Wikipedia

それぞれの端末(IMEI)によって, 通信キャリアが制限をかけることができたら「SIMフリー」って意味ないのでは?

少し古い記事になるけど.

今回総務省が推進しているのはSIMロックの解除だが、SIMロックと並んでユーザーに不便を敷いているのがIMEI規制ではないかと思う。SIMロックは、携帯端末が特定のキャリアのがSIMでしか動作しないようにする仕組みだが、IMEI規制はキャリア側で端末の固有の製造番号(IMEI)を利用して、特定の端末しか通信させないようにする仕組みだ。SIMロックは端末側、IMEI規制はキャリア側の規制であると言える。

建前上は、IMEI規制は不法に入手された端末の通信を拒否することができるという大義名分があるのだが、実際にはそれ以上の規制が行われている。SIMフリーでは誠実な対応をしてきたドコモも、IMEI規制ではまだまだ誠実さに欠けているのではないかと思う。例えば、iPhone用のSIMを、SIMフリーのAndroid端末に挿しても通信ができないという話もある。これではせっかくのSIMフリー端末も意味がなくなってしまう。

総務省はSIMはフリーの次はIMEI規制にも切り込んでもらいたいと思う。

漢(オトコ)のコンピュータ道: SIMロック解除義務化を受けてひとこと。「土管をくれ、手頃でいいヤツを!」

すなわち, わしがイメージしていた

「SIM入れ替えればどこの通信キャリアでも使える」

には以下の2つの制限が解除されないとならない.

1. SIMロック (端末 -> SIM )
携帯端末が特定のキャリアのSIMでしか動作しないようにするしくみ

2. IMEI規制 (通信キャリア -> 端末)
キャリア側で端末の固有の製造番号(IMEI)を利用して, 特定の端末しか
通信させないようにするしくみ

先ほどの, ドコモサイトの「SIMロック解除」の画面て「IMEI規制解除」のことではないのかな.

このキャリアの行っている「IMEI規制」を現在どうなっているかを確認できるサイトがある.

DoCoMo ネットワーク利用制限携帯電話機確認サイト

Au ネットワーク利用制限携帯電話機照会

SoftBank ネットワーク利用制限 携帯電話機の確認

画面からIMEIを入力すると現在のその端末のIMEI制限状態が確認できる.

◯:
そのキャリアが端末を認識している.
SIM-キャリア間の完全接続.

△:
そのキャリアで販売されたもの.
SIM-キャリア間にほぼ制限はないが, キャリア制限をかけることができる状態

x:
そのキャリアで販売された不正端末. 改修される.

-:
そのキャリアで販売されていない.

やってみた.

gn

...

「振り込め詐欺や不正利用に端末が利用されていないか順次IMEIの確認を行っており、古い機種であろうと新規に一括で購入した端末であろうと、全ての端末について「△」表示でスタートさせている」とのことだ。そのため「確認が取れ次第「◯」表示に切り替わっていく」が、「確認が完了するタイミングは人それぞれ」であり「場合によっては数ヶ月ほど待ってもらう」可能性があるという。

ということらしいが.

「IMEI規制」は「通信キャリアが端末を制限する」ので, 解除するには「通信キャリア」に伝えることが必要.

しかし, 端末を購入したところ(販売元)別に制限解除や確認のサイトがあるので困る.

窓口持ち込みはどうなのか.

他社製品の携帯電話機などをドコモのSIMカードでご利用する際の手続き | お客様サポート | NTTドコモ

他社が販売する携帯電話をソフトバンクで利用する | SIMロック解除、他社製品でのソフトバンクのご利用について確認する | お客さまサポート | モバイル | ソフトバンク

手数料が2-3千円かかる.

まとめてみると,

SIMロックの解除:
SIMフリーな端末を購入する.
※ 分割(期間縛り)にしないと高額.

IMEI規制の解除:
端末(IMEI)を利用するの通信事業者(SIM購入元)で手続きする.
※ 端末代支払状況や機種など制限あり.
※ 他社SIMの場合 手数料あり.

孫さんが以前こんなこと.

「もしSIMロックが外れても、極端に流れが変わることはない」

ソフトバンク孫氏、SIMロック解除に「総務省の意向に従うが、極端に流れは変わらない」 - CNET Japan

なんとなく, ややこしい料金体系のように騙されたような気がするのですが,

気のせいかな.


Chrome CustomTabs 使い方 バックグランド処理で高速に

nexus2cee_stuff_thumb

[I/O 2015] Chrome Custom Tabs Will Add Easy And Rich Web Content To Any App With Chrome Capabilities

サービス経由で「ウォームアップ」,「URL先読み」を行って
高速に開く.

公開されている Googleサンプルのうち利用するヘルパークラスなどは
前回エントリを参照.

 

1. バインド

ウォームアップも同時に行う.
アクテビティのライフサイクルに合わせて.

public class SampleActivity extends AppCompatActivity
        implements CustomTabActivityHelper.ConnectionCallback {

    private CustomTabActivityHelper mCustomTabActivityHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mCustomTabActivityHelper = new CustomTabActivityHelper();
        mCustomTabActivityHelper.setConnectionCallback(this);

    }

    @Override
    protected void onStart() {
        super.onStart();
        mCustomTabActivityHelper.bindCustomTabsService(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mCustomTabActivityHelper.unbindCustomTabsService(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCustomTabActivityHelper.setConnectionCallback(null);
    }

    @Override
    public void onCustomTabsConnected() {
    }

    @Override
    public void onCustomTabsDisconnected() {
    }

}

 

2. プリフェッチ

開くであろうURLが確定した時点でバックグランドで先読み.

mCustomTabActivityHelper.mayLaunchUrl(uri, null, null);

 

3. 起動

前回とほぼ同じ.
タイトル, アニメーションを付けてなめらかな体感に.
R.anim.slide_* はサンプルのものを利用.

CustomTabsIntent customTabsIntent =
    new CustomTabsIntent.Builder(mCustomTabActivityHelper.getSession())
        .setShowTitle(true)
        .setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
        .setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
        .build();
CustomTabActivityHelper.openCustomTab(this, customTabsIntent, uri, new WebViewFallback());

 

以上をまとめてテンプレート的に

public class SampleActivity extends AppCompatActivity
        implements CustomTabActivityHelper.ConnectionCallback {

    private CustomTabActivityHelper mCustomTabActivityHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mCustomTabActivityHelper = new CustomTabActivityHelper();
        mCustomTabActivityHelper.setConnectionCallback(this);

    }

    private void preFetchUrl(Uri uri) {
        mCustomTabActivityHelper.mayLaunchUrl(uri, null, null);
    }

    private void open(Uri uri) {
         CustomTabsIntent customTabsIntent = 
            new CustomTabsIntent.Builder(mCustomTabActivityHelper.getSession())
            .setShowTitle(true)
            .setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
            .setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
            .build();
         CustomTabActivityHelper.openCustomTab(this, customTabsIntent, uri, new WebViewFallback());
    }

    @Override
    protected void onStart() {
        super.onStart();
        mCustomTabActivityHelper.bindCustomTabsService(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mCustomTabActivityHelper.unbindCustomTabsService(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCustomTabActivityHelper.setConnectionCallback(null);
    }

    @Override
    public void onCustomTabsConnected() {
    }

    @Override
    public void onCustomTabsDisconnected() {
    }

}

イベントからプリフェッチしてからのオープンすればよい.

しかし「先読みのタイミング」て…

(つづく)

Chrome Custom Tabs を とりあえず数行で使う