頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


3Dのボーン付き人体モデルをSceneKitで使う

人体のボーン付きモデルをSceneKitにimportする方法を模索中で、ひとまずいけそうな方法が見つかったので忘れないようにメモ。


1. MakeHumanでモデル作成
2. daeで出力する時にデフォではなく”Z up, face -Y”を選ぶ(daeファイルとtexturesというフォルダが出力される)↓

MakeHumanでdae出力

3. Blenderでそのdaeファイルをimport
4. Blenderでテクスチャ設定↓

Blenderでテクスチャ設定

5. Blenderでdae出力(daeファイルとテクスチャ画像が出力される)
6. Xcodeにインポート(SceneEditorでは特にやることないはず)↓

SceneEditor

SceneKitで表示

↑iPhone上で実行。spine3をz軸周りに30度回転させてる。

とりあえずこれなら人体の身長がy軸方向、顔がz軸方向を向いてくれるし、ボーンの姿勢もコントロールできそうな感じ。
MakeHumanで作成したdaeを直でSceneKitで使おうとするとオブジェクトの姿勢が理解不能だったりしたので仕方なくBlenderかましてる。
BlenderのアドオンでManuelBastioniLABってのがあるけど、こちらで作ったモデルでdae出力でXcode側に持ってくるのも試してみたけど色々とうまくいかなかった。


macOS Sierra 10.12.4
iOS 10.3.1
Xcode 8.3.1
MakeHuman 1.1.0
Blender 2.78a
ManuelBastioniLAB version 1.4.0a


機械学習(TensorFlow)で位置計測っぽいことをやってみた

データセットの元画像

↑ランダムな位置にランダム径の円を描いた64x64サイズのグレースケール画像とそのデータを持つデータセットを作成(訓練用10,000、評価用1,000枚)。


NNの構成はTensorFlowのチュートリアルにあるcifar-10と同じような感じ。各層を順に書くと
畳み込み
プーリング
LRN
畳み込み
LRN
プーリング
全結合
ドロップアウト
全結合
出力
という具合。今回のはカラーじゃないとか、出力層は半径、x座標、y座標の3個しかなかったり、といった違いはある。
損失関数は単になんのひねりもないけど各値の差の絶対値の和。

学習の推移1

↑約1時間半くらいかけて15エポック(3,000step)回した。

予測の結果1

↑いくつかの評価用元画像から予測した円を赤線で描いてる。うーん、、、精度が微妙。

学習の推移2

↑えーい、とさらに30エポック。TensorBoardが続きに書いてくれないのは損失関数のところnameを付加したからかな?

予測の結果2

↑まあちょっとはマシになったかも?
顔を見分けるというのを試した時の精度がすごく良かったので、今回の結果は精度的には残念な感じはする。
NNの構成とかハイパーパラメータいじったりで改善の余地は色々あるんでしょう、多分。
これ以上やんないけど。

とりあえず、MNISTやCifar-10みたいに正解のクラスを1つ選ぶとかじゃなくて、出力層で正解の値を得るように学習する、ということができそうということはわかった。


画面をスワイプして視線を変える時の方向

マインクラフトPE

画面をスワイプすると視線(カメラの向き)が変わる類の3Dゲームってどのように視線が動くのが自然なのかな?と思いいくつかのiOSアプリで調べてみた(いざ頭の中でどうだっけ?と思ってもわからんかったのよ)。

マインクラフトPE
World of Tank
Goat Simulator

これらのアプリ全て画面をスワイプすると、視線がスワイプ方向へ移動した。つまり右方向へスワイプするとカメラが右方向へ回転する(風景は左側へ流れる)、という具合。

どれもスワイプでカメラの回転をコントロールしてるって感じで納得。

なお、マイクラとGoat Simulatorではy軸方向(縦方向ね)のみ反転させるオプションが付いてたから、上方向へスワイプするとカメラが下を向いて欲しい!という層がいるってことなんだろうかね?


Blenderでdaeファイル出力→SceneKitへ

Blenderで作成したオブジェクト(ボーン&アニメーション付き)をdaeで出力して、それをSceneKitで使う時のメモ。

まずBlenderでの注意事項。

オブジェクトとボーンの親子関係を作る時に、オブジェクトとボーンを選択してcontrol+pするとできるけど、オブジェクト→ボーンの順に選択する。逆だとできない。

ポーズモードで回転させたオブジェクトを元に戻すのは option + r

【Blender】ボーンを動かしてアニメーションを作成する | ユガラボ
↑すごく参考になったページ

daeファイルを出力する時には対象を選択しといて
Selection Only
Include Children
Include Armatures
にチェックを入れる。

Blenderでdae出力時の設定


次にXcode。

Xcodeにインポートしたdaeファイルを見るとやっぱりx軸周りに90度回転してる。なのでシーンへの追加はコードでやる方が精神的にはいい(俺の場合は、だけど)。

ともかくこの流れでアニメーション付きオブジェクトをインポートするとXcodeのScene Editorの右側にある”Animations”のところ(下図の赤い丸のとこね)に項目が表示されてる。多分Blenderで設定したアニメーションっぽい。

XcodeのScene Editor

上図の青矢印のところのボタンを押すとアニメーションが設定できる(コードならSCNActionに相当するんかな)けど、その場合は”Animations”のところには何も表示されないからどうなってんの?と思ってた。
ただここで表示される名前はBlenderで設定したアニメーション名とは違うけど(ボーンとオブジェクトの名前はBlenderで設定したまま来てる)。

なお、SCNNodeクラスのboneオブジェクトに対し、
for (NSString *key in bone.animationKeys) {
// [bone pauseAnimationForKey:key];//止める
[bone setSpeed:10.0 forAnimationKey:key];//speed変更
}
みたいにすればそのボーンに設定されたアニメーションを止めたり、speed(って何だ?リファレンスにも書いてねえ!)の変更なんかもできた。


↑SceneKitに持ってきた時の結果。

ある程度のアニメーションをBlenderで作っておいて、動かす・止めるタイミングや微調整はコード側でもできそうだな。


TensorFlowを1.0にアップデート

TensorFlorが1.0になったとは聞いてたのでアップデートしてみた時のメモ。やってる俺が何やってるのかわかってないのできっとあなたの参考にはならない。
ちなみにアップデートする前のバージョンは0.12.1。tf.__version__ で確認できる。

Installing TensorFlow  |  TensorFlow
↑本家サイト。

とりあえず、Mac用、Pythonは3系、CPU版のが欲しいってのはわかってる。いろいろと方法が書いてるけどさて俺の場合どうやってインストールしたらいいのかよく分からない。

ターミナルで
pip3 -V 
とすると
pip 9.0.1 from /Users/hogehoge/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages (python 3.5)
と出る。pyenv使ってanacondaでpython3をインストールしたんだよな、、、この場合にどうやってインストールすればいいんだ?ここでしばらく思考停止してたけど、仕方ないからpipでやることにした。

やったことは、、、
sudo pip3 uninstall tensorflow
でまずはアンインストール。

sudo pip3 install tensorflow
でインストール。とりあえずいけたっぽいので本家ページに Validate your installation ってのがあるのでその通りにチェック。
python起動してやっていく。

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

うーむ、、、なんかごちゃごちゃ出てくる、、、やることやればもっと計算が早くなる?そんなのそっちでやっといてやと思うけどまあいいか。相変わらず最初にbって出てるけど、これなんなんだろ?

旧バージョンで動いてたサンプルコードのMNIST、畳み込みのあるDeep MNISTともに動いたわ。この二つに関しては特にコードを書き換える必要とかないみたい。


バージョン
macOS Sierra 10.12.3
Python 3.5.2 :: Anaconda 4.1.1 (x86_64)




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad