Waakvlam blog

Waakvlam blog

「創りたい気持ち」に火をつけるWaakvlamの活動記録

Random Forestが生成した決定木からルールを抽出する

UEQareer Advent Calendar 2018 | 23日目
こんにちは!
Appleが大好きななかりんです٩( ᐛ )و
2日前とは別のアドベントカレンダーです.

今回は機械学習のRandom Forestを題材にして書きます.
(実はiOSアプリ開発以外もやってます!)
PythonのsklearnのRandomForestClassifierを使います.

RFへの入力データがどのように分類されたかを調べたかったのですが,
画像で出力する以外の記事がなかなか見当たらなかったため,
試行錯誤の結果をまとめてみました.

【目次】

あらすじ

学習後のRandom Forestにデータを入力して
出力した結果がどのように分類されたかを分析します.

f:id:Waakvlam:20181223205711j:plain

とりあえずRandom Forestで学習させよう

sklearnが用意しているirisのデータセットを用います.
コードは以下のようになります.

import numpy as np
from sklearn import datasets
from sklearn import __version__ as sklearn_version
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

def main():
    use_feature_index = [2, 3]
    iris = datasets.load_iris()
    X = iris.data[:, use_feature_index]
    y = iris.target
    feature_names = np.array(iris.feature_names)[use_feature_index]
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=0)

    rf = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=0)
    rf.fit(X_train, y_train)
    score_s = rf.score(X_test, y_test)

    # scoreの出力
    print("sklearn random forest score:" + str(score_s))

if __name__ == "__main__":
    main()

出力は以下のようになります.

sklearn random forest score:0.977777777778

RFが生成した木の中身を見よう

よく見る可視化の定番のやつです.
以下のものが必要になります.

導入に関して,
Windowsの方は こちら
Macの方は こちらの下の方

コードは以下のようになります.

import numpy as np
from sklearn import datasets
from sklearn import __version__ as sklearn_version
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import pydotplus as pdp

def main():
    use_feature_index = [2, 3]
    iris = datasets.load_iris()
    X = iris.data[:, use_feature_index]
    y = iris.target
    features = np.array(iris.feature_names)[use_feature_index]
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=0)

    rf = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=0)
    rf.fit(X_train, y_train)
    score_s = rf.score(X_test, y_test)

    # scoreの出力
    print("-" * 50)
    print("sklearn random forest score:" + str(score_s))

    # 生成された木の1個目を可視化
    estimator = rf.estimators_[0]
    filename = "./tree.png"
    dot_data = tree.export_graphviz(
				estimator,
				out_file=None,
				filled=True,
				rounded=True,
				feature_names=features,
				class_names=iris.target_names,
				special_characters=True
				)
    graph = pdp.graph_from_dot_data(dot_data)
    graph.write_png(filename)

if __name__ == "__main__":
    main()

50個生成された木の1本目は下図のようになっています.

f:id:Waakvlam:20181223182525p:plain

各ノードの不等式が条件で,valuesが各種の花の数となってます.

values[0] → setosaの数
values[1] → versicolorの数
values[2] → virginicaの数

さて,出力できた木の画像ですが,これは学習させたデータの分類の過程を示していて,
実際に入力したデータがどのように分類できたかがわかりません.

決定木にあるメソッドを使う

RFで生成されるものは結局ただの決定木です.
その決定木ですが,当然ながら,sklearnの決定木のように扱えます.
ドキュメントを読んでいたら,

decision_path(X, check_input=True)

こんなものがありました.
入力データの分類の過程が見れるらしい!
ということで実行.

>>> path = estimator.decision_path(X_test[0])
>>> print(path)
  (0, 0)	1
  (0, 6)	1
  (0, 10)	1

一瞬見た時,「なんだこれは?🤔」となりましたが,
それぞれの括弧の中の2つ目の数字がノード番号を表しています.
ノードの順番は以下のようになっています.
f:id:Waakvlam:20181223202346p:plain

データを入力した時,そいつがどのように分類されるかがわかるようになりました.
しかし,大量の入力データ,大量な木があるため,
このように出力してもとても扱いづらいです.
せめて,(0, 6, 10)という感じにしたいですね.

ではやりましょう.

出力結果に一工夫

以下のようにすると0と1だけのリストに変換することができます.
1が通ったノードです.

>>> np.array(path.todense())[0]
array([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1])

これを以下のように処理してあげれば
(0,6,10)というように変換できます.

>>> new_array = np.array(path.todense())[0]
>>> new_path = []
>>> for i in range(len(new_array)):
...     if new_array[i] == 1:
...             new_path.append(i)
... 
>>> new_path
[0, 6, 10]

これで,扱いやすくなりました.

応用編

せっかく扱いやすくしたので,色々試してみましょう.

複数の入力データの分類経路とその経路が使われた回数を出力

コードを見せるのが一番早いですね.

import collections # これ必要!
import csv # これ必要!

with open("./tree_analyze.csv", "w") as f:
    writer = csv.writer(f, lineterminator='\n')
    for tree in rf.estimators_:
        all_path = []
        for input in X_test:
            new_array = np.array(tree.decision_path(input).todense())[0]
            new_path = ""
            for i in range(len(new_array)):
                if new_array[i] == 1:
                    new_path = new_path + "," + str(i)
            all_path.append(new_path)
    
        counted_array = collections.Counter(all_path)
        values, counts = zip(*counted_array.most_common())
        output_line = []
        for i in range(len(values)):
            output_line.append(values[i])
            output_line.append(counts[i])
        writer.writerow(output_line)

各木に対して,使われた経路が多い順に
並べたものをCSVとして出力するプログラムです.

決定木のpredictというメソッドを使えば,出力結果がわかります.
こいつと正解データを組み合わせれば,
正しく分類できた経路だけを抽出することも可能ですね.

抽出した経路の判定条件を抽出する

経路がわかったら,各ノードの分類条件も知りたいですねよ.
sklearnの決定木にtree_というものがあります.
このtree_の中の

  • feature (各ノードで使用している特徴量)
  • threshold (各ノードで使用している特徴量の閾値)

を使ってあげれば各ノードの分類条件を抽出できます.

>>> tree.tree_.feature
array([ 0,  1, -2,  0, -2, -2,  1,  1, -2, -2, -2])
>>> tree.tree_.threshold
array([ 4.94999981,  0.75      , -2.        ,  4.44999981, -2.        ,
       -2.        ,  1.75      ,  1.60000002, -2.        , -2.        , -2.        ])

こいつらを使ったプログラムが以下のものです.

tree = rf.estimators_[0]
features = np.array(iris.feature_names)[use_feature_index]

path = estimator.decision_path(X_test[0])
new_array = np.array(path.todense())[0]
new_path = []
for i in range(len(new_array)):
    if new_array[i] == 1:
        new_path.append(i)

for i in range(1, len(new_path)):
    label = features[tree.tree_.feature[new_path[i-1]]]
    if new_path[i] - new_path[i-1] == 1:
        label = label + " ≦ "
    else:
        label = label + " > "
    print(label + str(tree.tree_.threshold[new_path[i-1]]))

(出力)
petal length (cm) > 4.94999980927
petal width (cm) > 1.75

先に示した決定木の画像と見比べると,
各ノードにある条件をしっかり抽出できてますね.

おわりに

決定木を画像として出力する記事はたくさんあります.
しかし,画像データではちょっと不便ですよね.
RFで生成された決定木の中身を見る場合,数が膨大になるし,
深さが深いほど分析が大変になります.
よって今回は画像ではなく扱いやすいリスト型とかで
抽出するということに試みました.
これで頑張ろうと思えば各分類経路をクラスタリングして,
入力データがどんな特徴を持って何種類あるのか
ということとかもわかるかもしれませんね.

※方法は上記の他にもあると思います


P.S.
機械学習に関してまだまだ未熟なので
頑張って勉強します...
世界のRFを使っている研究者と繋がりたい.

今後も宜しくお願いします٩( ᐛ )و
twitter.com
github.com
ほしい物リスト

iOS App開発でライブラリが古くて使えない経験ありませんか?

Team サイゼリヤ Advent Calendar 2018 | 21日目
こんにちは!
Appleが大好きななかりんです٩( ᐛ )و
最近は大学で研究に専念しています.

約1年ぶりの更新ですね...
もっと記事書けるように努力します.

【目次】

あらすじ

開発中のプロジェクトのSwiftのバージョンが使いたいライブラリよりも新しく,
ライブラリを導入できないときの対処法を3つ紹介します.

方法1:力試し

ライブラリのコードを参考にしながら,自前で実装する

ライブラリの中身を見ると意外と簡単に実装できてしまうことがあります!
実装力の向上にも繋がるのでおすすめですね!

しかし...

実装が大変だからライブラリを導入することが多いですよね.

そんな時は...

方法2:のんびり待つ

githubの該当リポジトリissueを書く

issueを書くなどして開発者に直接連絡したら,開発者が修正をしてくれるでしょう.

f:id:Waakvlam:20181220235836p:plain

でもでも...

修正を待つ時間がない!
そもそも,数年更新されていない!

そんな方の最終手段はこちら!!

方法3:修正して導入

ライブラリをインストールして修正してからbuildしよう!

Swiftをバージョンアップするだけで治るエラーならサクッと修正してしまいましょう!
幸運なことに,XcodeにはSwift 3からSwift 4にconvertする機能があります.
こちらを使って少し手直しするだけで簡単にエラーを解消できます.

もし修正をするのであればついでに,ライブラリのリポジトリへプルリク送りましょう.
開発者も利用者もお互いにwin-winになれます.


それでは方法3について具体的な手順を紹介します!

今回は以下のライブラリで実演します.
(約1年前インターン先で使いたかったけど使えなかったやつ...)
github.com


1. 該当リポジトリをforkしてクローン

git clone git@github.com:"自分のgithub ID"/TKSwarmAlert.git


2. サンプルのプロジェクトを開く

どのライブラリのリポジトリにもサンプルのプロジェクトがあるはずです.
(きっとあるはず!なかったらごめんなさい…)


3. Warningをクリックして詳細を確認

黄色い三角の注意マークみたいなやつをクリック.

f:id:Waakvlam:20181221003800p:plain

すると左側のNavigator Areaで詳細を見れます.

f:id:Waakvlam:20181221004518p:plain


4. Swiftのバージョンを更新しよう

Conversion to Swift 4.2 is availableをクリックすると以下のものが出てきます.

f:id:Waakvlam:20181221004854p:plain

Next > Minimize Inference (recommended)を選択してNext

これで自動でSwift 4.2へ移行開始されます!

以下のように変更前と変更後の差分が表示されます.
気になる人はさらっと目を通しておきましょう.

f:id:Waakvlam:20181221005257p:plain

OK > Save


5. 残りのWarningを1つずつ解消

ほとんどのWarningsはクリックする誘導されて解消できますが,
クリックするだけでは表示されないものとかをピックアップします.

Swift 3 mode has been deprecated and will be removed in a later version of Xcode.
Please migrate "TKSwarmAlert" to Swift 4.2 using "Convert > To Current Swift Syntax…" in the Edit menu.
(in target 'TKSwarmAlert')

プロジェクトのバージョンをSwift 4.2に変更してBuildすると解消

f:id:Waakvlam:20181221010654p:plain

The use of Swift 3 @objc inference in Swift 4 mode is deprecated.
Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled,
and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default"
for the "TKSwarmAlert" target. (in target 'TKSwarmAlert')

TargetのBuild Settingsの中に、Swift3 @objc Infenceという項目があるので、
これをDefaultに変更してBuildすると解消


6. Waring解消して綺麗にBuildできたらpushしてプルリクを送りましょう

開発者が修正する手間が省けるし,他のユーザのためにもなるので,
ぜひプルリク送りましょう!
(githubの草生やしていこう!!)
f:id:Waakvlam:20181221011906p:plain


7. CarthageでTKSwarmAlertを利用したいプロジェクトへインストール

Carthageの使い方は こちら

インストールしてからパッケージ化中にエラー吐かれて停止するはずです.

インストールしたライブラリのフォルダ(Carthage/Checkouts/TKSwarmAlert)と,
修正したライブラリのフォルダを開きます.

TKSwarmAlertというソースファイルが入ったフォルダがあるので,
修正した方のフォルダをコピーして
インストールした方の(Carthage/Checkouts/TKSwarmAlert/TKSwarmAlert)
に貼り付けて置き換えます.

Carthage/Checkouts/TKSwarmAlert にあるサンプルプロジェクトを開いて
Warningを解消して,さらにTargetsの
Build Settings > Swift Compiler - Language
でSwiftのバージョンを開発中のプロジェクトに合わせます.

ここでサンプルプロジェクトのBuildを通すことができたらOK!

そしたら,terminalで開発中のプロジェクとのrootにもどってきて

carthage build TKSwarmAlert

と打ち込みます.(たぶん通ります)


8. プロジェクトに紐づけてimport

生成されたframeworkをプロジェクトに紐づけて.
使いたいところで import して Build すると...


Buildできた!!
🎉🥳🎉


おわりに

ライブラリ導入できなくてもすぐ諦めない💪
※方法は上記の他にもあると思います



↓実際に導入して実行してみた結果
f:id:Waakvlam:20181221035831g:plain:w200
一応クソコードは こちら


P.S.
記事書くの久しぶりでもともと書くの下手なのに
長々とお付き合いしていただきありがとうございました.
ほんの一部の人にでもこの記事が役立ってくれると嬉しいです.

今後も宜しくお願いします٩( ᐛ )و
twitter.com
github.com

話題のiPhone XとARKitでFace Trackingを試してみた

こんにちは!
最近、iPhone Xを買った、
Appleが大好きななかりんです٩( ᐛ )و

【目次】

「ARKit」とは

ARKitとは、iOSバイスのカメラとモーションの機能を統合して、アプリやゲームで拡張現実を作り出せるライブラリです。
【参考: https://developer.apple.com/arkit/

「Face Tracking」とは

ざっくりと説明します・・・

顔を認識します!!!!

iPhone Xの端末全面のカメラには色々なセンサが埋め込まれていて、
これらのセンサーユニットを総称してTrueDepthカメラと呼びます

このTrueDepthカメラは、空間の深度情報を取得し、
なんと、顔の奥行きを認識することができる!!

この取得したデータを用いて、Face Trackingを実現しています。

Face Trackingで有名なものはFace IDやAnimojiですね。
f:id:Waakvlam:20171223182348g:plain

Let's Face Tracking!

Face Trackingを実際に使いたい!
なので、iPhone Xを買っちゃいましたー!
(とても高かった・・・)

Apple公式ドキュメント

みなさん、Appleの公式ドキュメントみたことありますか?
公式ドキュメントを漁っていたら、Face Trackingを用いたサンプルがありました。


今回はこれを用いて遊んでみました!
f:id:Waakvlam:20171223200121p:plain

ダウンロードしてbuildしたらこんな感じでした。
f:id:Waakvlam:20171223200229p:plainf:id:Waakvlam:20171223200249p:plain

マスクがちゃんと顔に貼り付けられていてすごい!
表情も認識されている!
Appleのエンジニアすげぇ・・・。


すごいけど、
ダウンロードして、buildして使うだけなのは、
正直つまらないですよね?

なので・・・

サンプルコードをいじってみた

SceneKitというApple公式のライブラリで、マスクを生成されているのですが、
このSceneKitでテクスチャマッピングができます!
しかも、簡単に!

なので今回は、歌舞伎メイクをテクスチャマッピングしてみました。

まず、マッピングしたい画像を用意します
f:id:Waakvlam:20171223193717p:plain

用意した画像を、プロジェクトのファイルにドラッグ&ドロップ!
f:id:Waakvlam:20171223195318p:plain

マスクを生成しているMask.swiftを開いて、以下のように修正します。
f:id:Waakvlam:20171223195326p:plain

import ARKit
import SceneKit
import UIKit

class Mask: SCNNode, VirtualFaceContent {
    let material: SCNMaterial
    
    init(geometry: ARSCNFaceGeometry) {
        self.material = geometry.firstMaterial!
        /*
        material.diffuse.contents = UIColor.lightGray
        material.lightingModel = .physicallyBased
        */
        let kabuki = UIImage(named: "kabuki.png")
        self.material.diffuse.contents = kabuki
        
        super.init()
        self.geometry = geometry
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("\(#function) has not been implemented")
    }
    
    // MARK: VirtualFaceContent
    
    /// - Tag: SCNFaceGeometryUpdate
    func update(withFaceAnchor anchor: ARFaceAnchor) {
        let faceGeometry = geometry as! ARSCNFaceGeometry
        faceGeometry.update(from: anchor.geometry)
    }
}

あとはビルドするだけ!

めちゃくちゃ簡単ですね!
f:id:Waakvlam:20171223200503j:plain

今後やってみたいこと

この技術を用いて、Animojiを実際に作ってみたい!
自分で作ったキャラで、動作できたら面白そうですね
誰かの顔を読み込んで、それを自分の表情と同期させるのも面白そう!

Face Trackingのドキュメントを読み込んで実装したいと思います!


今後も宜しくお願いします٩( ᐛ )و
なかりん
GitHub: nakarin0528
Twitter: @nakarinrin0528
f:id:Waakvlam:20171223195928p:plain

ありそうでなかった?SNS形式掲示板【CodePBL】

どうも皆さん初めまして!
機械科所属なのにコーディングや開発に興味を持ちだした自称ハイブリッド系電通生のかましゅんと申します


さて、先日公開されたなかりん、ゆ~きさんの記事の通り、春休みにCodePBLが行われていましたが僕自身もそちらに参加していました!

↓CodePBLについてはこちら
waakvlam.hatenadiary.jp

それでは、僕のチームが1か月で作ったプロダクトを紹介致します



【目次】

作ったもの

大学生生活を支えるための掲示板サイト、題して「UEC b-board」です!

コンセプト

b-boardというのは、「掲示板」の英訳語「Bulletin board」から取っています。

さて、突然ですがあなたは入学したばかりの大学生です。
新入生になったあなたは自分が受ける授業の連絡を見るため大学の掲示板を見に来ました。

しかし、掲示板の掲示を見ると…

大学内旧wifiサービスの運用停止について(2014年4月24日)
3、4年生各位 カリキュラム変更による旧科目の履修について(2013年4月6日)

あなた「え…今年の授業の掲示はどこにあるの~!?!?」

f:id:Waakvlam:20170420221120p:plain
↑掲示が見つからず落胆する学生の図

大学の掲示板には古い掲示も混ざっており、重要な掲示を見逃してしまう可能性があります。
そのうえ掲示板が大学にあるため、大学から遠いところに住んでいる人は見に行くことすら億劫になってしまうでしょう。
要らない掲示が多いせいで重要な掲示を見逃しやすい。
人によっては掲示板のある大学に行く事すら面倒なのにわざわざ掲示板を見に行っても無駄な掲示に埋もれて今欲しい情報がなかなか見つからないかもしれない

…と考えると大学の掲示板というのは非常に効率の悪い情報収集であるといえます。

ちょっとまとめると

  • 掲示板の長所
    • 大学の関係者が掲示板に掲載しているので情報が確実
    • 多くの学生にある程度満遍なく情報を伝えれる
  • 掲示板の短所
    • こまめに掲示を整理しないと不要な掲示が増えて見にくくなる
    • 遠くに住んでいる人、何らかの理由で大学に行くのが困難な人にとっては非常に手間

そこで私は考えました。

「…じゃあ掲示板の代わりになるサイトを作っちゃえばいいんじゃね?」

というのも、僕が通っている電通大では数年前からTwitterが大流行しており多くの電通生が利用しています。Twitterが流行する以前も2chを模した電通大オリジナルの"掲示板"でコミュニケーションを取っており、シャイな電通生はSNSとの親和性が高い事に目を付けた訳です。

実物の掲示板と似たようなUIで、かつSNSとしてみんなが持っている情報を共有できるようにすれば電通大生にうまく親和して、皆が情報を広く得られるんじゃないか…?
ってことでそういうサイトを作ることにしました。

どんなサイト?

掲示板の代わりになるSNS、とは言っても大学の事務員や先生方が非公式なサイトに情報を公開する事は考えにくいので、大学の関係者がこのサイトに関わることは想定せず掲示板の掲示や授業の連絡などを「こんな情報が落ちてたよ!」と学生がみんなで投稿・共有して情報を整理できるサイトを作ることを目標にして作りました。

どうやって作ったの?

今回はオープンソースのブログソフトウェアであるWordpressのみを用いて制作しました。
ブログの記事ひとつひとつを掲示に見立てて記事の共有をすれば、製作期間が限られているなかで開発初心者でも簡単に自由度の高いサイトの作成ができるWordpressは相性がいいと考えました。


実物を見てみよう

では今回のCodePBLで作ったサイトを見てみましょう。

f:id:Waakvlam:20170423213531p:plain

はい、トップページです。四角いやつひとつひとつが掲示(記事)になります。

f:id:Waakvlam:20170423214216p:plain
矢印の部分をクリックして投稿の画面に移ると…

f:id:Waakvlam:20170423215222p:plain
このような画面になり新しい掲示を製作して投稿することができます。
写真やファイルも投稿することができるので、実際の掲示の写真などを添付してもいいでしょう。

荒らし対策

突然ですが、「掲示板の面倒なところは何」と聞かれて真っ先に浮かぶのは何でしょうか?
はい、そうですね、すぐ荒れる事ですね。2ちゃんねるが時折荒れているのを見たことある人もいるのではないでしょうか。
少なくとも僕はそう思うのでそういう体で話を進めます( ゚Д゚)

f:id:Waakvlam:20170423215222p:plain
例えば、先ほどお見せしたこちら、よく見ると…

タイトル:hogehoge
内容:
・これは新しい投稿の編集画面です
----------------------------------
windowsでコンピュータの世界が広がります
……(略)

掲示でも何でもありません。誰かが面白がって意味のない掲示を編集して投稿しているようです。

こういう意味のない投稿が増えると結局正しい掲示を見逃す原因になりかねません。

そこで、掲示ひとつひとつを評価できる機能を実装しました!

f:id:Waakvlam:20170423221251p:plain
赤い四角の部分、上下を向いた矢印がありますが、これをクリックすると評価できるようになっています。
「この掲示はためになった!」と感じた時にいい評価を
「この掲示はただの荒らしじゃん、いらない…」と感じた時に悪い評価をします。

画面の下部では、いい評価の多かったものが順番に表示されています。この画面では評価の総数が少ないので変な記事も残ってますが、いたずらで投稿された掲示を皆が悪い評価を付けると一覧に表示されなくなるので悪い掲示が自動的に排斥される効果があります。


CodePBLでの結果は…?

先述の通りこれをCodePBLに出品したわけですが結果は…

f:id:Waakvlam:20170423225126j:plain
なんと!リヴァンプビジネスソリューションさんから企業賞をいただきました!!
プロダクトの完成度としてあまり自信を持てていなかったので驚くとともに非常に嬉しかったです


プロダクトの今後

まず、このプロダクトについてですが、制作は一時中断とさせていただきます。

その理由ですがこのサイトは、

  • 色んな人が投稿・共有できる分信憑性に欠けている
  • 情報を大学の外部まで流出させない対策ができていない

という欠点を持ちます。

更にリリースするには大学の関係者等にコンタクトを取る等の行程が必要になり、非常に時間がかかってしまうことが見込めます。
今回のプロダクトは全員開発初心者の中で作った進行になり、今後これらの欠点を補って改良、リリースするにはあまりにも自分に勉強が足りないと感じたためです。
先に、少し違う所で経験を積んで勉強をしてからこのプロダクトに戻ってきます!


関連記事

↓WaakvlamメンバーのCodePBL参加レポ
waakvlam.hatenadiary.jp
waakvlam.hatenadiary.jp

↓CodePBLについて
f:id:Waakvlam:20170412135535p:plain

http://codepbl.com/
waakvlam.hatenadiary.jp
waakvlam.hatenadiary.jp

最先端!スマホ上で試着ができる「AiRfitting」

お久しぶりです!
ゆ~きです。
卒業研究も後半戦に入り、日々ごりごり勉強してます(´・ω・`)
春休みに参加していましたCodePBLの最終成果発表会がありましたのでその報告をしたいと思います。
チームWaakvlamの初陣として、メンバーの廉、もーりー、岸とともに作り上げた自慢のプロダクト、是非最後まで読んでくださいm(__)m
CodePBLについては過去記事を参考にしてください
 ↓↓↓
CodePBL Kick off!! - Waakvlam blog


【目次】

プロダクト説明

早速作ったものの説明に入りまーす!

コンセプト

皆さんお店に行って服買いますよね?
その際一つの服の購入を決めるのにどれくらい試着しますか?
一つの服を決めるのにも、デザインを見るためにいろいろなもの着て、それが決まれば次はサイズを見るためにいくつか着て、また次の服を選ぶのに・・・。
こんな経験一度はあると思います。
デザインやサイズを何度も変えて試着するのはとってもめんどくさい!!
そんなお悩みを解決して楽にたのしい試着を提供してくれるシステムがこのAiRfittingになります。

このシステムはセンサーを使って身体を計測して、そのデータをもとにスマホ上で服を試着するといったものになっています。
f:id:Waakvlam:20170416164937p:plain
今までにも仮想的に試着をするアプリはいくつかありますが、このシステムは身体計測をすることで、デザインだけでなくその服を着た時のサイズ感まで判定してくれるといったものになっています。
これによって試着せずともデザイン、サイズともに自分にあった服が選べ、試着のめんどくささともおさらばできます!!

それでは各機能の方詳しく説明していきます(/・ω・)/

身体計測

センサにはKinectv2を利用しています。
Kinectセンサーは対象物体までの距離(深度)を測ることができます。
また、人体関節の3次元位置を求めることができます。
これらの機能を使って身長、肩幅、ウエスト、チェストを計測しています。
カメラの配置さえうまく設定してしまえば、計測誤差は1cm程度という精度で計測可能です!!

下の写真は測定中の画像です。
kinectSDKでサポートされている関節位置に加えて、チェスト、ウエストの中心と左右の位置が追加で求められています(写真上円描画部分)。
また、この時の自分の測定結果です。
事前にメジャーで測定したときは、
身長:168.5
肩幅:44.5
胸囲:94.6
エスト:93.5
という結果だったので、それなりの精度が出ていることが確認できます!
f:id:Waakvlam:20170416171041p:plainf:id:Waakvlam:20170416172315p:plain

仮想試着アプリ

スマホアプリ上での仮想試着には主に3つの機能があります。

1つ目の機能としては定番の仮想試着です。
QRコードを読み取ることで、服のデータをアプリに呼び出し、その服を試着することができます。
呼び出された服は画面左にアイコンになって格納されていきますので、試着したい服を選ぶとモデルがその服を着ることができます。
f:id:Waakvlam:20170416173447p:plain

2つ目の機能はサイズ感判定です。
身体計測したデータと服のデータを比較して、実際に来た時のサイズ感を判定してくれます。
サイズを画面右から選ぶと、モデルの下に、身長、肩幅、ウエスト、チェストのサイズ感を、小さめ、やや小さめ、ちょうどいい、やや大きめ、大きめ、の5段階で判定してくれます!
下の写真はLを選んだ時の判定画面になります。
うちにチームの巨人こと岸君の実寸データで判定させてみたのですが・・・、肩幅がかなり広いようですね(笑)
f:id:Waakvlam:20170416174505p:plain

そして3つ目、最後の機能はAR重畳させつつの仮想試着です
試着している自分って鏡越しだと見える範囲が限られますよね?
このアプリを使えば試着した自分の姿をいろいろな角度から見ることができます!
ARを使用しているので画面上で見る角度を変えるよりも、よりリアルな試着姿を見ることができます。

f:id:Waakvlam:20170420103715p:plain
それだけじゃなくて、ARは楽しさを提供してくれます!
最近はやりのsnowなんかがいい例ではないでしょうか?
いろいろな演出を加えることで仮想試着が単に画面上の行為でなく、楽しみながらできるものにしていきたいと思っています。
また、現実空間を使うことで、ショップへ足を運んでもらうといった作り方もできると考えています!

結果は・・・

そんな私たちのプロダクトですが、企業さん方の投票による最終発表の結果は・・・
なんと、最優秀賞でした!!
創り込みきれなかった部分は多くありましたが、コンセプトやこの1ヵ月での実装内容を評価していただけてとてもうれしかったです。
f:id:Waakvlam:20170416181822j:plain

ちなみに、別のチームではありますが、Waakvlamのメンバーがリーダーを務めたチームも各企業さんが個別に選ぶ企業賞をもらいました!
チームWaakvlamとしてもいいスタートが切れたと思い、この熱が冷めないうちにどんどん開発を進めていきたいです!

f:id:Waakvlam:20170416182058j:plain

別チームのプロダクトは以下にリンクを張っておきますのでぜひ見てください(/・ω・)/
合コンで活躍!?フィーリングカップルアプリ - Waakvlam blog
ありそうでなかった?SNS形式掲示板【CodePBL】 - Waakvlam blog


今後の展望

私たちのプロダクトの今後の展望をお話しさせていただきます。
もちろん最終的に目指すのはリリースですが、まだまだ課題が多いです・・・。
これからの改善点としては、

  • 測定やサイズ感判定の制度の向上
  • Kinectで取得したデータをスマホに送る機能の追加
  • 自身の3Dモデルを作成し、そのモデルに試着する機能の追加

などなどたくさんあります。
今度はこのプロトタイプをより洗練させていくことになりますね!頑張ります!!

合コンで活躍!?フィーリングカップルアプリ

こんにちは!
今月、beats Solo3というBluetooth対応のヘッドホンを買った、
Bluetoothが大好きななかりんです٩( ᐛ )و

早速本題なんですが…
この前の春休みに!
第2回CodePBLに参加しました!!


f:id:Waakvlam:20170412135535p:plain

↓詳しくはこちらをご覧ください
https://ueqareer.net/1848#CodePBL


【目次】

創ったモノ

今回僕のチームが創ったものは合コンとかで使える「feeling couple」です。

「feeling couple」とは

f:id:Waakvlam:20170412135518j:plain
グループの中で両思いのカップルを見つけるゲームです。
合コンとか街コン,飲み会でのちょっとした盛り上げなどに使えます。
↓ちょっと古いですが、こんな感じのゲームです。
www.youtube.com

既存のアプリ

どんな感じかというと...

  1. 参加者の性別と名前を一人ずつ記入

f:id:Waakvlam:20170412135458p:plain

  1. 一人一人気になる異性を選択

f:id:Waakvlam:20170412135428p:plain

  1. 結果発表

f:id:Waakvlam:20170412135144p:plain

  1. 毎回360円払うと誰が誰を選んだかわかる

f:id:Waakvlam:20170412140434p:plain


でも、既存のアプリだと…
時間がかかる!
回してる途中に〇〇ちゃん、〇〇くんからの通知来たらどうしよう!
実はあの人生理的に無理!スマホ触られたくない!


しかし、今回私たちが創ったアプリはこれらの問題を全て解決!!


…なぜか?

今回作ったアプリ

Bluetoothを使って通信しているからです!

f:id:Waakvlam:20170409155429p:plain

  1. 誰かが部屋を作る(ルームマスターRMを決める)
  2. 参加者は部屋を見つけて参加
  3. 全員が部屋に入ったらRMがスタートする!
  4. 異性のリストが送られてくるので、気になる人をチョイスして送信!

f:id:Waakvlam:20170409155428p:plain

  1. 全員がRMに送信し終えたら結果発表!

f:id:Waakvlam:20170409155426p:plainf:id:Waakvlam:20170409155427p:plain

  1. 参加者全員のスマホに結果が届く!(実装中)

課金すると詳細な結果を見れるシステムにしようと思ってます。


ちなみに使用言語はSwift、
BluetoothはCore Bluetoothを使いました。


ちょっと専門的な話になってしまいますが,
RMがペリフェラル(サーバー)、
他の参加者がセントラル(クライアント)
となっていて、
参加者がRMのスマホにデータを送受信する形になっています。
正直いうと、RMのスマホに負荷がかかりすぎていてなんとか改善したいです(笑
f:id:Waakvlam:20170412135104p:plain

データの処理などは全てRMでしています。

成果発表会の結果


電通大で成果発表会が行われました。
f:id:Waakvlam:20170412140917p:plain

未完成の部分があり、賞を取るのは厳しいと思っていたのですが…
なんと、future architectさんから企業賞をいただきました!
f:id:Waakvlam:20170409160326j:plain


しかも!!
優勝チームと1票差!!!
意外と高評価で驚きました。


アプリをリリースしなよ
と言ってくださる方もちらほらいました!


ということで…

今後どうするか

このアプリをリリースします。
アンドロイド版も作ります。
具体的には書きませんが機能追加します。
※いろいろあってリリースできていないです・・・


また、今回創ったアプリとは別のものになりますが
iPhoneがマイクとなり、Bluetoothでスピーカーに繋げられるアプリ
Bluetoothマイク」
を創りたいと思っています。



P.S.
4/8に群馬の猿ヶ京でバンジージャンプ(62m)してきました!
人生初のバンジージャンプです。
今年度、いろんなことに挑戦していくぞ!という気持ちで飛んできました。
今後も宜しくお願いします٩( ᐛ )و
f:id:Waakvlam:20170409154143p:plain

VRTechTokyo#6参加レポート

こんにちはゆ~きです。
先日チームメンバーのもーりー、なかりんと一緒にVRTechTokyoに参加してきました。
f:id:Waakvlam:20170406001359j:plain
今回で6回目となるVRTechTokyoは会場にMicrosoftさんの本社を借りて開催されました。
最近話題のHoloLensをはじめとするMRをから、VR、AR、といったVR技術全般のお話を聞けるイベントとなっていました。
このイベントは初の参加なので少し緊張しながら、HoloLensを楽しみに後輩を引き連れて参加してきました。
体験ブースでの各体験の感想を以下にまとめましたのでよかったら読んでください!!


【目次】

王道VR音ゲー「Airtone」 byゆ~き

株式会社ヒストリアの佐々木瞬さんによるVR音ゲー開発の際のお話とそのプロダクトである「Airtone」を体験した感想です。

こだわりのポイント

セッションではAirtone開発の際のゲームデザインのお話をしてくれました。
今回の開発のコンセプトは、

  • 王道VR音ゲー
  • 見ていて楽しいゲーム

だそうです。

王道を狙うために、今回はVRだからといってあまり新しさを求めないという方針で開発を行っていました。
音ゲーの基本的な文法を抑えた固い実装に少しVRというエッセンスを加えることで面白さ作りに取り組んだそうです。
セッションの中では、VRだからといって全く新しい取り組みをしなくてもいいというお話をしていて、VR開発に新しさを求める自分にとっては新しい見方を知ることができました。


もう一つの見ていた楽しいゲームにするためにはプレイヤの動きを大きくなるようにデザインするということをしていました。
自分に向かってくるようにキーが流れるようにすると、どうしてもキーをとるエリアは自身の手元になってしまいます。
これだと動きは手元のみで大きな動きは演出できなくなってしまいます。
これを解決するには、相当苦労したようです。
最終的にはキーをとるエリアをプレイヤは見ないということで、思い切ってキーをとるエリアをプレイヤの視界から取り去ってしまい、動く範囲が大きくなるようになるようにしていました。
この発想は単純なようでなかなか思いつかない絵ですね。

体験してみた!

セッション後にはもちろん体験してきました!
f:id:Waakvlam:20170406001407j:plain
ゲームの様子はこんな感じで、前方に5本ひかれたラインにのっているキーを手に持っているコントローラで文字通り取りに行く仕様になっています。
バイスはOculusとOculusTachでこのOculusTachをキーの方向に振ったり、ラインに合わせたりすることでキーを取っていきます。
ものによってはトリガーを引いたりとバリエーションにとんだアクションができるようになっていました。
運指を探っていく系のゲームで、やりこみ要素はありそうに思いました。


体験の感想ですが、HMDを使うならではの工夫が今ひとつだなと、HMDをかぶればVRというのにもう一工夫あるといいなと思ってしまいました。
また、動きのほうもまだ工夫の余地があるように思いました。
ゲームの形は出来上がっていたのでこれからリリースに向けて微調整を重ねていくのでしょうか?
完成が楽しみですね!!

VRの医療応用~HoloEyesのデモ~ byゆ~き

みなさんはVRと聞くと何に使われているイメージでしょうか?
大体HMDを用いたゲームを思い浮かべると思います。
今回のセッションはVRを非ゲーム系で用いることに関してのお話でした。
株式会社HoloEyesの杉本真樹さんはHoloLensに臓器を映し出し、手術前の打ち合わせや手術中の補助に使えるようなアプリケーションを作成していました。
これを実際の現場に用いることで、手術時間の削減や出血量の削減を実現することができたそうです。
海外ではこういった非ゲーム系への応用はよく聞くのですが、国内だと珍しいように思いました。
こういった企業がこれから先どんどん増えるといいと思います。
もちろん自分もその業界をねらっていきますよ~!!


f:id:Waakvlam:20170406001405j:plain
体験してみてですが、ぶっちゃけ医療関連の知識がないためこれが使えるのかどうか自分にはわかりませんでした(笑)。
そういった点では、医師でもある杉本さんにしかできない調整がありそうですね?
医療といった自身の強くない分野での社会実装の難しさを感じました・・・。


個人的に気になったのはHoloLensの装着感と視野でした。
医師の方はこういったデバイスの装着を嫌がらないのでしょうか?
視野に関しては杉本さんからお話を聞けました。
手術は手元の操作になるため今の視野でも十分だそうです。
あくまでもリアルがメインということを繰り返し主張していました。

VAQSO VR 〜匂い体験〜 by もーりー、なかりん

VAQSO VRとは、スニッカーズほどの大きさでVRから匂いを出すデバイスです。
今回はそれを実際に体験して来ました〜!

バイスはヘッドマウント(HMD)の下の部分に磁石でくっつけてありました。
椅子に座りヘッドマウントをかぶり、いざ空想の世界へ〜

気づけば自分は教室の中にいて、椅子に座っていて
机の上にはチョコレートとコーヒー
横にはunityのイメージキャラクターであるunityちゃんが立っていました。

Oculus touch(手の動きを再現するコントローラー)でコーヒーを持ち
自分の顔に近づけると・・・
なんと実際にコーヒーの匂いがしました!
チョコレートも同様に匂いがしました。

Unityちゃんに顔を近づけると女性の匂いがする・・・
はずだったのですが、、、
鼻が詰まってたのかコーヒーの匂いが強すぎたのか
匂いはあまり感じられませんでした。

しかし、VRで匂いを体験という未知なる体験ができました。
半信半疑で体験してみましたが
実際に匂いを感じれたのでとても驚きでした!
女の子の匂いには今後期待しましょう(笑)

VAQSO VR
https://vaqso.com/

HoleLenz 〜HoleLenz Gate〜 by もーりー、なかりん

HoloLensで壁や空間に穴を開け、さらに穴の向こう側の別空間へ行く体験ができるコンテンツです。
↓これです
HoloLens "HoleLenz Gate" - YouTube

実際に体験・・・

指のアクションで目の前の空間にゲートを開き、中に入ると異空間にいけました!
ちなみに異空間は静止画でした。

別のユーザと一緒に異空間に入ったら,そのユーザも見えるようにできたら面白そうですね!

この技術を応用すれば、いつか遠隔VR会議ができそう?
なにかの国際会議や,緊急会議を手軽に始められる時代がやってきそうな予感です・・・

しかし,上の動画とは違って,周りの現実部分が見えてしまっていて、VRの部分が小さく残念でした。
周りの現実部分を隠してあげるか,VRの部分の視界をもっと広げられるといいですね。
今後の発展に期待です。