スマホのタッチパネルで"どの指"を使っているかを機械学習してみる

2016/03/06

Tweet

背景

いくつかのスマートフォン,Huawei P8のようなものは,knuckle senseという指の第二関節を認識して,ジェスチャーを行なえる.

"knuckle sense"を Nexus5X等の他のものでも使えるか調査する. さらに,可能であれば"どの指"でタッチしているかがわかるとより良い.

Androidのタッチ機能

基本的には,AndroidでタッチイベントはonTouchEventというメソッドで監視する. このonTouchEventは引数としてMotionEventというオブジェクトを受け取る. 以下がMotionEventの(使えそうな)メソッドである.

Return Type Method Name Description
float getX X座標
float getY Y座標
float getPressure 圧力
float getSize サイズ
float getTouchMajor タッチ領域の楕円の長い方の長さ
float getTouchMinor タッチ領域の楕円の短い方の長さ

機械学習

「圧力」,「サイズ」,「タッチ楕円の情報」を特徴量として学習する. ここでは,指は「親指」,「人差し指」,「第二関節」を候補とする.

データを集める

教師あり学習をしたいので,がんばって指定された指でタッチしまくる. アプリケーションを作成した.一応データもここにある.

開発したアプリ
開発したアプリ
散布図で可視化してみた(こういうのってどういうのがいいんだろう)
散布図で可視化してみた(こういうのってどういうのがいいんだろう)
plot(fing_nexus5x_1$Pressure,fing_nexus5x_1$Size, pch=20, cex=1, col=c("#ff000020","#00ff0020","#0000ff20") [unclass (fing_nexus5x_1$Finger)])
legend("topleft", legend = c("Thumb", "Index", "SecondJoint"), col = c("red", "green3", "blue"), pch = 20)

学習してみる

適当にRandomForestしてみた.

#!/usr/bin/env python
#coding:utf-8

import pandas
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation

train = pandas.read_csv("fing_nexus5x_1.csv")
test  = pandas.read_csv("fing4.csv")

# なぜか動かない?
def clean(data):
    # data.loc[data["Finger"] == "Thumb", "Finger"]       = 0
    # data.loc[data["Finger"] == "Index", "Finger"]       = 1
    # data.loc[data["Finger"] == "SecondJoint", "Finger"] = 2

    # data.loc[data["Finger"] == "Thumb", "Finger"]       = "Index"
    # data = data[data["Type"] == 2]
    return data

train = clean(train)
test  = clean(test)

want = "Finger"
predictors = ["Pressure", "Size", "Major", "Minor"]
alg = RandomForestClassifier(random_state=1, n_estimators=150, min_samples_split=4)
alg.fit(train[predictors], train[want])

predictions = alg.predict(test[predictors])
sc = 0

for exp, ans in zip(predictions, test[want]):
    sc += (exp == ans)
print(1.0 * sc / len(test[want]))

成績

うーん,悪くはないんだけど…….ジェスチャー等で使おうと思うと厳しそうだ.

分類 正答率
人差し指,親指,第二関節 0.734
人差し指か親指 ,第二関節 0.946

展望

以下の方法を試すことで正答率を向上できると考えられる.

関連研究

arcatdmzさんからの情報.音でやっているらしいです.

@Tomoki_Imai というわけで、彼らはたぶん音を使ってます。ご参考まで。OSネイティブのイベントだけで推定するのは聞いたことないですが。

— arc@dmz (@arcatdmz) 2016年3月6日