APDS9960ジェスチャーセンサーで電源切り替え

 

やりたいこと

ジェスチャーセンサーを利用してスマートコンセントと赤外線LEDの電源切り替え操作をする

 

利用するもの

・APDS9960ジェスチャーセンサー

・Espr Developer Rev.4(2G) : wifi接続用

・Arduino Uno R3 

・Kasa スマートプラグ

(N極対応プラグ変換アダプタ)

・赤外線リモコン - ライト

・赤外線リモコン受信モジュール

・その他抵抗やコンデンサ、ブレッドボードなど


環境

・windows10

・Arduino IDE 1.8.12

・IFTTT

・Kasa Smartアプリ

 

※IFTTTが有料化されてました!

 

接続

f:id:filot_nextd2:20201007171611j:plain

APDS9960ジェスチャーセンサー秋月電子通商で購入しました

センサー基盤裏のJP1とJP2 を結線しておきます

 

ツール

・ユニバーサル基盤に配置する際はmarmeloというエディタを利用しました

配置を反転させるのに便利でした

カラー抵抗早見表も便利でした

 

実装

Arduino Unoでサンプル実行

目的 : 左右上下の手の動きを取得する

Arduino IDEを使って書き込みます

SparkFunのLibが使えるらしいので使います

サンプルも一緒になっているので、そちらを参考にするとジェスチャーによる判定ができます

明るさやRGBを読み取るサンプルも入っているので遊んでみると楽しいです

ジェスチャーのセンサー範囲ですが、おおよそ20cmほどまでのようでした

遮るものがあったりあまり遠くなると判定できません

また、NEARとFARは難しく、反応したりしなかったりでした

ゆっくり動かすと反応しやすいです

手を動かして出力した結果は以下の画像のような感じで出力されます

f:id:filot_nextd2:20201007200817p:plain

Espr Developer Rev.4でWifi接続

シリアル通信を使うため、ATコマンドの確認をします

 ArduinoとEsprDevはTx-Rxとなるように接続します

ArduinoUno EspDeveloper
Rx Tx
Tx Rx

 

SoftwareSerialについてはいろんなところで詳しく書かれているので割愛します

シリアル通信ができ、ATコマンドを打てることが確認できたらOKです

 

私はこちらを参考にさせてもらいました

 

-- 注意点 --
EsprDeveloperには2つのモードがあります
IO0ピンの接続が間違っていると動きません

モード 説明 IO0ピン接続

Flash Boot Mode

(実行モード)

ATコマンドでやりとり、書き込んだスケッチを実行する IO0 ピン HIGH

UART Download Mode

(書き込みモード)

スケッチを書き込み、ファームウェアアップデートを行う IO0 ピン LOW

 

もしEsprDeveloperにスケッチを書き込んだ場合はファームウェアの書き直しが必要になります


ATコマンドについてはこちら

 

ATコマンドが使えればWifi接続も可能なはずです

SSIDを使って接続する場合はこちらの人がスケッチをアップしてくれていました

そのまま動くと思います

 

私はprintlnを使ってATコマンドを書き込み、WPSを利用しました

 コマンドは以下を使っています

wifi変数で利用しているメソッドはESP8266libのメソッドです

AT+UART_DEF
AT+CIPSTA?
AT+CWMODE_CUR=1
wifi.setOprToStation()
AT+WPS=1
wifi.disableMUX
wifi.createTCP

 

IFTTTとスマートプラグ

目的 : RIGHTやLEFTが来た時にスマートプラグの電源を切り替える

先ほど左右のイベントは取得できているので、まずはスマートプラグとIFTTT連携をします

IFTTTのアカウントを作成し、webhookを使ったアプレット作成をします

「If This」を選んで「webhook」を選択し、イベント名を入力してスマートプラグのONとOFFのイベントを追加します

f:id:filot_nextd2:20201007203048p:plain
f:id:filot_nextd2:20201007203052p:plain
f:id:filot_nextd2:20201007203055p:plain

次にスマートプラグの設定をします

スマートプラグのアプリ「Kasa Smart」を入れてアカウントを作成します

プラスアイコンから端末を追加=>スマートプラグ=>スマートプラグ「ライト」/「ミニ」を選択します

特に問題もなく簡単に設定できるので、Kasaの説明書通りに進めて設定してください

スマートプラグの設定をしたらIFTTTの設定をします

「create your own」ページの「Then That」を選択します

そこでスマートプラグの名称で検索してKasaで作成したアカウントで操作するデバイスを選択すればスマートプラグとの連携完了です

maker_webhookページのDocumentationを押下するとWebhookのURLが確認できます

f:id:filot_nextd2:20201008152233p:plain

あとはジェスチャーイベント発生時にこのURLを利用すればONOFFできるようになります

 

 

ジェスチャーのイベントはサンプル実行で取得できていますので

そこにONOFFトリガを追加します

ESP8266libのメソッドであるsendを使って通信しました

 

 

赤外線リモコンとLED照明

目的 : UPやDOWNが来た時に照明のONOFFを切り替える

赤外線の規格は各会社によって異なるようです
なので、実際にリモコン操作をしてフォーマットをみてみます
一旦いろいろ繋げていた物をArduinoUnoから外します

赤外線リモコン受信モジュールとIRemoteというLibを使って規格を調べます

データシートがあるのでInOutをみてArduinoUnoと繋げます

ArduinoUno 赤外線受信モジュール
5V Vcc

11(受信するピン)

Output
GND GND

 

あとはLibのソースをそのまま使います

IRecvDumpを実行してリモコン操作をすればデータが受信できるはずです

シリアルモニタは9600kbpsなので注意してください

 

データが取得できたと思いますので、ジェスチャーイベントが発生した際にIRemoteを使ってsendするだけです

これで照明のONOFFができます 

 

ケース作成 

ケースには3Dプリンタを使いました
モデリングにはFusion360を使ってます

無償版を利用してみましたが、上蓋と土台が接触しているかを確認することができてよかったです

また、初心者でも使いやすかったです

使い方はUdemyで勉強しました

 

実行結果

f:id:filot_nextd2:20201008165137g:plain

UP : 照明OFF

DOWN : 照明ON

RIGHT : スマートプラグOFF

LEFT : スマートプラグON

スマートプラグと携帯電話を繋いでいます
小さくて見えづらいですがONにすると充電中に切り替わります

青く光っているのはジェスチャーが読み取れた場合です
何かわからなかった場合は赤く光るようにしています

 

エラーなどでひっかかったところ

スケッチを書く前段階、環境を設定するまでにひっかかった内容を過去にFacebookにアップしています

ページトップに[困った問題 => 解決法]を書いてます


エラーではありませんが、スケッチでprintlnする際にFマクロを使うとSRAM使用量が少なくなることを初めて知りました

また、赤外線がカメラ越しなら光っていることがわかるということも今回初めて知りました

 

 

MediaPipeを使ってみた

公式ページを参考にMediaPipeのデモを使ってみます
どれも試してみたいですが、とりあえず使ってみたいのはMediaPipe Handsです

環境

macOS 10.14.4 Desktop (HandsにはAndroid, iOS, Desktop, Webの環境がある)

インストール

MediaPipeのページが詳しいのでそのまま進めていきます

Hello Worldの実行でエラーがでました

bazel run --define MEDIAPIPE_DISABLE_GPU=1   mediapipe/examples/desktop/hello_world:hello_world
ERROR: Analysis of target ‘//mediapipe/examples/desktop/hello_world:hello_world’ failed; build aborted: Either the path attribute of android_sdk_repository or the ANDROID_HOME environment variable must be set.
INFO: Elapsed time: 0.161s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)
  currently loading: @rules_foreign_cc//tools/build_defs/shell_toolchain/toolchains
  Fetching @local_config_cc_toolchains; fetching

公式ページのAndroidのところに

MediaPipe recommends setting up Android SDK and NDK via Android Studio (and see below for Android Studio setup). However, if you prefer using MediaPipe without Android Studio, please run setup_android_sdk_and_ndk.sh to download and setup Android SDK and NDK before building any Android example apps.

とあるので入れてみました

再度実行すると無事表示Hello World実行できました!

I20200918 14:23:55.252943 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254393 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254407 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254418 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254428 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254437 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254446 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254456 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254465 380831168 hello_world.cc:56] Hello World!
I20200918 14:23:55.254477 380831168 hello_world.cc:56] Hello World!

こちらにしたがって進めていきます

デモ実行

どれも問題なく実行できて、サンプル画像の通りの結果になりました

Face Detection

6つのランドマークとマルチフェイスサポートを備えた超高速の顔検出ソリューション

実行コマンド

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/face_detection:face_detection_cpu
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/face_detection/face_detection_cpu \
  --calculator_graph_config_file=mediapipe/graphs/face_detection/face_detection_desktop_live.pbtxt

横を向いても追従してきます
ちなみにマスクをしてみても追従してきました
顔を画面からはみ出させても追従してきます
画面に顔が一つもない状態で顔が認識されるということがありました
判定されたものは小物だったりバッグだったり、目鼻口に見えるものがあったわけではありません

Face Mesh

リアルタイムで468の3D顔ランドマークを推定する顔ジオメトリソリューション

実行コマンドはFace Detectionを参考にファイル名を変更するだけです

f:id:filot_nextd2:20200930173509p:plain:w100 f:id:filot_nextd2:20200930181357p:plain:w100 f:id:filot_nextd2:20200930181519p:plain:w100
こちらもマスク着用で判定され、少し横を向いても横から覗き込んでも追従してきました
真横になると判定できないようです
f:id:filot_nextd2:20201001170026p:plain:w80
複数顔が写った画像も試してみましたが1人しか認識されませんでした ついでに目と鼻っぽい3点があれば認識されるのだろうかと思ってプーさんに登場してもらいました
f:id:filot_nextd2:20201001175506p:plain:w100

顔として認識されているようですが、やっぱり人間とは違っておかしいです

ついでに会社のマスコットキャラのトドも試してみました
f:id:filot_nextd2:20201001175559p:plain:w100

こちらは顔とすら認識されませんでした

Iris

虹彩、瞳孔、目の輪郭を含むランドマークをリアルタイムで追跡

f:id:filot_nextd2:20201001155705p:plain:w80f:id:filot_nextd2:20201001155753p:plain:w80 f:id:filot_nextd2:20201001160010p:plain:w100f:id:filot_nextd2:20201001155837p:plain:w100 f:id:filot_nextd2:20201001160024p:plain:w130

目の輪郭を追跡ということでしたが、顔の認識もしてくれてるのでこちらもマスクをしてみました
見えていない鼻と口が多少ゆがんでます 片目を隠した状態でも同じように歪みましたが画面に写ってる目はしっかり追跡されました
f:id:filot_nextd2:20201001161729p:plain:w70
目をつむった場合はちゃんと目の輪郭が一本になりました

こちらもプーさんに登場してもらいました
かろうじて顔として認識されていますが、やはり目鼻口の位置はわからないようです
Faceの枠は表示されたり消えたりするので顔としての認識は怪しいです またトドも登場させてみましたが認識されませんでした 鼻と口の問題なのでしょうか。。

Hands

画像全体を操作し、方向付けられた手のバウンディングボックスを返す手のひら検出モデル

f:id:filot_nextd2:20201001150604p:plain:w100 f:id:filot_nextd2:20201001150320p:plain:w100f:id:filot_nextd2:20201001150340p:plain:w100f:id:filot_nextd2:20201001150407p:plain:w100f:id:filot_nextd2:20201001150450p:plain:w100
手の表裏と左右、指が見えないように縦にしたりしてみました すべて右手なのですが、掌がわからない状態だとLeftになる場合がありました
はじめに掌か手の甲を見せて認識させて動かすと良いようです 早い動きにも問題なく付いてきます

f:id:filot_nextd2:20201001161058p:plain:w100f:id:filot_nextd2:20201001161309p:plain:w90

指が5本見える状態で手の向きなどを変えた場合は問題なく認識されました

Pose

BlazePoseの調査を利用して、RGBビデオフレームから25の2D上半身ランドマークを推測する、忠実度の高い上半身ポーズ追跡用のMLソリューション

上半身のポーズ追跡をやってみました カメラから遠ざかるのでスクショはできませんでしたが、サンプル通りの結果になりました
画面から顔や体を半分はみ出させても追従されます アクロバティックにY字バランスポーズなどもやってみましたが足が手と認識されることはありませんでした
横向きは認識されなかったり、奥側にまわる腕の認識が点滅したりしてました
後ろ向きはでも認識され、目もそれっぽいところに配置されていました

広い部屋(後ろに何もない場所)で試してみると横向きになっても奥に位置する腕も認識されました

Hair Segmentation

DesktopはLinux対応なようなので、webで実行しました
f:id:filot_nextd2:20201002141657p:plain:w110 f:id:filot_nextd2:20201002141735p:plain:w100 f:id:filot_nextd2:20201002142014p:plain:w100
RGB(0,0,255)に設定されてます 少し下を向くと全体青くなりました
跳ねてる髪まで色が変わってますが前髪は変化しないときもありました
赤と緑もしてみました
青にしたときより黒髪が目立つ気がします
f:id:filot_nextd2:20201002142449p:plain:w100 f:id:filot_nextd2:20201002142839p:plain:w100 f:id:filot_nextd2:20201002151828p:plain:w100 f:id:filot_nextd2:20201002151848p:plain:w90

ついでにEdge Detectionもやってみました
f:id:filot_nextd2:20201002143104p:plain:w100
細かい髪の毛まで検出されてます こちらは参考にしてるページに詳細が載ってません

Object Detection

f:id:filot_nextd2:20201001185159p:plain:w100 f:id:filot_nextd2:20201001185314p:plain:w100

机にあったものが黒や青しかなかったせいなのか、ペンしか認識されませんでした
手を横から入れてみるとノートも認識されました プーさんは認識率が良いですね テディベアとして認識されています

会社の棚も撮ってみました
f:id:filot_nextd2:20201002150543p:plain:w150
ボトルはどれも似てるから判定されると思ったのですがそうでもないようです

デスクの上を動画に撮って認識させてみましたが、イヤホンやメガネははさみとして認識されました
ファイルはmp4で試しました
角度や背景にもコツが必要なのかもしれません
ボトルが並んでるところもmp4で試してみましたがどれも認識されませんでした
mp4で認識させると認識率が下がる気がします

Box Tracking

personやcell phoneは認識されますが、ペンは認識されませんでした
イヤホン(結んだ状態)は認識されるときもありましたがすぐ外れました
ノートも認識されるノートとされないノートがありました
こちらはなかなかコツが必要そうです

Face Tracking

ちょうどこの記事を書こうとしていたときにMediaPipeを使ったセミナーがあったので参加してみました

顔に画像を貼り付けて追従させるものです
会社のマスコットであるトドフェイスを貼り付けてみました

f:id:filot_nextd2:20201001200717j:plain:w100 f:id:filot_nextd2:20201001195446p:plain:w80

サンプル画像として用意されていた画像(目鼻口がちゃんと人の顔の通りになっている)だとやはりいい感じでした

これだけ簡単で正確に認識できるのでMediaPipeを使って色々遊べそうです
Hands機能を使ってハンドジェスチャーの認識をやってみたいです

UE4公式オンラインラーニングの備忘録を作る_5

目的

UE4公式オンラインラーニングの備忘録を作る_1
本記事の目的は↑を参照のこと

後で振り返りそうな内容のみ記載

今回の題材

リアルタイムレンダリング基礎入門
リアルタイムレンダリング基礎~リアルタイムレンダリング詳細
※ログイン必要

感想

エンジンに特化した内容ではなく、
レンダリング、シェーダー周りの用語やフローといった、全体像が知れる。

リアルタイムレンダリング基礎

リアルタイムレンダリングの裏側

r.ShadowQuality = 0~5

リアルタイムレンダリングのパフォーマンス

t.MaxFPS = xxx
stat fps
stat unit
Game -> CPU
stat rhi
stat scenerendering

リアルタイムレンダリングの詳細

リアルタイムレンダリングの詳細

透過処理は、フォワードレンダリングの方がディファードレンダリングより有利
world Settingss -> Pre Computed Visibility(Pre Computed Visibility Volume)
freezerenderingコマンド

ジオメトリのレンダリング (パート 1)

ドローコール

ジオメトリのレンダリング (パート 2)

UE4 <--> RenderDocの使い方
パフォーマンスに適するマージの条件
Instanced Static Mesh

ラスタライズ、オーバーシェーディング、GBuffer

GBufferと取得方法 -> High Resolution Screen Shot(Render Custom Depth Pass、Use Custom Depth as a mask、Include Buffer Visualization Targetsの設定必要)

リアルタイムレンダリングの詳細 - 反射

Plane Reflection(Capture Every Frame)
Post Process Volume(Screen Space Reflection)
優先度:Screen Space Reflection -> Plane Reflection -> Reflection Capture
短所を補うために3つを組み合わせる
Project Settingで反射の詳細設定可能(Reflection Capture Resolution)
r.SSR.Quality
SkyLightでワールド全体のバックアップ

静的ライティング

WorldSettingsからライトマップの確認可能
Lightmass Importance Volume(Indirect Lighting Cache)
Lightmass Character Indirect Detail Volume

動的ライティング

Cascade Shadow
Distance Field Shadow
Inset Shadow
Contact Shadow
Capsule Shadow
動的ライトと静的ライトの併用

フォグと透過処理

透過コスト高い
Sub Surface Rendering
Reflection
Displacement Mapping
Screen Space Ambient Occlusion
UI Rendering
Decals

リアルタイムレンダリングの詳細 - ポストプロセス

Light Bloom
Depth Of Field/Blurring
Lensflares
LightShafts
Vignette
ToneMapping/Color Collection
Exposure
Motion Blur

AnacondaでHMR2.0環境をつくってみる

参考にしたのはこちら
russoale/hmr2.0

前回HMRを試してみたのですがpython2.7で環境を作りました
サポートされていないのでやはりpython3で試してみたくなり、こちらを発見しました

実行環境

・MacBook Pro10.14.4
・Anaconda3
・python3.6.10

結論

環境はつくれませんでした
SMPLのTFRecordが作れずうまくいきませんでした
トレーニング方法も記載してくれていたのですが作れず、、
時間がかかってしまったので断念することにしました

注意点

今回はpython3で試すことが目的でしたが、SMPLのデータセットがfor python2.7になってるのが気になります
また容量の少ないPCでやっているため、何をするにもディスクがいっぱいになってしまって辛かったので
容量は確保してやるべきでした
MPIIのデータセットダウンロードには何時間かかかったので注意です

推奨通りにvirtualenv+python3.x環境

Python > 3.6
が推奨されていますので、3.7で試してみました
3.8もありますが、安定しているのは3.7らしいので3.7をvirtualenvでいれてみたところ
エラーが発生しました

エラー

どうやら前回作ったanaconda環境と競合が発生したようです
参考リンク - pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類

Anacondaの環境は残しておきたかったのでAnacondaで環境をつくってみます

Anaconda3で環境作り

conda環境でpython3.8でHMR2.0を試してみましたがこちらもできませんでした
pythonを3.8にした理由は新しいからというだけです
Recomendが3.xなので新しい方が良いだろうという安易な判断です

conda install matplotlib==3.1.2

こちらが異常に時間がかかり、はいりません
どうやらpythonのバージョンを落とす必要があります
参考リンク

python3.6に変更することでmatplotlibは入りました!

他にも入らないものが、、

  • opendr==0.77
  • deepdish[version='>=0.3']
  • opencv-python
  • ipdb

ダウンロード先チャンネルを追加することで2つは入るようになりました

conda config --append conda-forge

残った2つをどう入れるのか。。
- opendr==0.77
- opencv-python

condaとpipは混在NGですが、pipだと入るみたいなので入れてみました

× conda install opencv-python
○ pip install opencv-python==4.1.2.30
とりあえず今のところ問題なく入ってるのでopendrの解消を目指します

こちらを参考に進めますがダウンロードが長い!
入らない気がするので中断します
こちらを参考にtensorflowを入れます

conda install -c conda-forge tensorflow

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.  

と言われることがあるので、その時は言われた通り --use-feature=2020-resolver をつけてあげれば大丈夫です

この後もまだtensorflowをいれるためにエラーが発生します

ERROR: awscli 1.16.144 requires botocore==1.12.134, which is not installed.  
awscli 1.16.144 requires docutils>=0.10, which is not installed.  
awscli 1.16.144 requires s3transfer<0.3.0,>=0.2.0, which is not installed.  
awscli 1.16.144 requires rsa<=3.5.0,>=3.1.2, but you’ll have rsa 4.6 which is incompatible.   

そしてawscliを入れるとbotocore、s3transfer、、とないものが続きます
必要なものはいれていき、requirements.txtに書かれているものは入れてしまいます

名称 バージョン
matplotlib 3.1.2
numpy 1.18.1
scipy 1.4.1
opencv-python 4.1.2.30
pycocotools 2.0.2
trimesh 3.8.5
tqdm 4.48.2

デモを実行

環境が整ったはずなので手順通りにlogsフォルダの作成をしてパッケージを解凍します
解凍したらデモの実行をします

cd src/notebooks
python trimesh_renderer.py

ここからまだまだエラーが続きます
実行した流れの通りに記載します

importエラー

デモ実行後、importエラーが発生しました

Traceback (most recent call last):
File "trimesh_renderer.py", line 8, in
from main.local import LocalConfig
ModuleNotFoundError: No module named 'main'

どうやらlocalのimportに失敗しているのでパスを通してみます

import sys
sys.path.append(os.path.join('..', 'main'))
import local

実行するとエラー内容が変わりました

PermissionError

mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/data'

mkdirに失敗しているようです
main/config.py
の中でフォルダ作成されているようです

ROOT_DATA_DIR = os.path.join('/', 'data', 'ssd1', 'russales')

パスの場所を自分で管理できる場所にしたいので
os.path.join の第一引数の場所を適当に自分のわかる場所に変更してしまします

そしてデモを実行

Configurations:

と表示されて情報が表示されていきます、、、
building model...
Downloading data、、、、、
、、、、、、、、、、、、、、
いけそうでしたが エラー発生です

AttributeError

...main/model.py", line 434, in detect
AttributeError: 'Model' object has no attribute 'restore_check'

ソースを確認してみると↓でひっかかっているようです

if self.restore_check is None:
raise RuntimeError('restore did not succeed, pleas check if you set config.LOG_DIR correctly')

checkpoint_manager.latest_checkpointNoneとなっているため、self.restore_checkがNoneになるようです
公式の例文をみるとcheckpoint_manager.latest_checkpointは取得できそうなので調べてみます
ちなみにcheckpoint_manager.checkpointsも[]でした

初め、matplotlib==3.3.1、numpy==1.19.1を入れていたので推奨通りに入れなおしましたがエラーに変化はありませんでした

checkpoint.save()を呼ぶことでself.checkpoint_manager.latest_checkpointが作成され、restoreに成功しましたが、ドキュメントをみるとここでsaveする必要がなさそうに感じますが、restoreできなければ次へ進めないのでsaveすることにしました
とりあえず次のエラーが出たので解消します

ModuleNotFoundError : networkx, pyglet

ModuleNotFoundError: No module named 'networkx'
ModuleNotFoundError: No module named 'pyglet'

conda install によって解消しました

名称 バージョン
networkx 2.5
pyglet 1.5.7
ValueError

ValueError: operands could not be broadcast together with shapes (448,448) (224,224)

for c in range(0, 3):  
        img[y1:y2, x1:x2, c] = (alpha_mesh * image[:, :, c] + alpha_image * img[y1:y2, x1:x2, c])  

imageとimgのサイズが違うのでこのエラーがでているようです
調べてみると引数にあたるresolutionとは解像度なようです
渡しているh, wは画像のサイズのようなのでいい感じに同じサイズにしてくれるというわけではなさそうでした

image_bytes = scene.save_image(resolution=(h, w), background=bg_color, visible=True)

save_imageでなんとかできるのかもしれないのですが、見つからず
opencvでリサイズすることにしました

image2 = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), -1)
image = cv2.resize(image2 , (w, h))

デコード後にリサイズします
ここでやっとデモが動きました!
f:id:filot_nextd2:20200925153902p:plain

ただこれはデモの結果として理想としているものとは違います
このissueはclosedになっていたのでさっそく試してみます

トレーニング

  • データセットをダウンロードしてdatasets_preprocessing/convert_datasets.shのパスを書き換えます
  • data/ssd1/russalesdatasets/xxxtfrecords_with_toes/xxxフォルダを作成しスクリプトを実行します

  • HMR2のREADME.mdにしたがってjupyterをいれます

    conda install jupyter

名称 バージョン
jupyter 1.0.0
jupyter_client 6.1.6
jupyter_console 6.2.0
jupyter_core 4.6.3
  • 実行します

    jupyter nbconvert inspect_dataset.ipynb --to python

[NbConvertApp] Converting notebook inspect_dataset.ipynb to python  
[NbConvertApp] Writing 3368 bytes to inspect_dataset.py  

これでpyファイルが作成されたはずです

python model.py
を実行しましたが、エラーです

six.raise_from(core._status_to_exception(e.code, message), None)
File "", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: buffer_size must be greater than zero. [Op:ShuffleDatasetV2]

smplデータセットが無いことが原因なようです
またrussalesの下にtfrecordsフォルダも必要なようです

pklファイルをデータセットの下に置く必要がありますが、このファイルがどれにあたるものなのかがわからず、ここで断念することにしました

keypoint_markerフォルダ内にあるpklファイルを使ってみたところ

key = 'poses' if 'poses' in res.keys() else 'new_poses'  

というところでエラーがでました
確かにpklファイル内部にposesというキーもnew_posesというキーもありません
SMPL公式ページからファイルをダウンロードしても同じようにキーがありませんでした

そこでlsplsp_extをダウンロードしてTFRecordファイルを作成します

こちらは説明通りTFRecordファイルの作成ができます
SMPLのTFRecordもmodel.pyの実行に必要なのですが、どう作れば良いのかわからず
ここでどうやって進めれば良いのかがわからなくなり作業が止まってしまいました
model.pyファイルの途中でsaveが悪影響になっているのではないかとも思いました
時間をかけすぎてしまったのでちょっとここら辺でストップして他の作業をしながら空いた時間で引き続きみていきたいと思います

あとちょっとでできそうなのに。。

pklファイルの中身をterminalでみる

python -m pickle [filename]

UE4公式オンラインラーニングの備忘録を作る_4

目的

UE4公式オンラインラーニングの備忘録を作る_1
本記事の目的は↑を参照のこと

後で振り返りそうな内容のみ記載

今回の題材

ブループリントの学習
ブループリントの基礎概念~ブループリントによるプロダクトコンフィギュレータの作成
※ログイン必要

感想

ブループリントの基本知識や扱い方を、作りながら習得できるので、
最初の一歩としてアリ。

ブループリントの基礎概念

ブループリントとは?

Object - Actor - Pawn - Character
Level Blueprint(One Per Level)
Class Blueprint(Multiple, Modular)

ブループリントの作成とエディタのUI

Construction Script
関数ライブラリとマクロライブラリ

ブループリントコンポーネント

Default Scene Root

ブループリントグラフ

Ctrl + マウスホイール -> イベントグラフ内のズーム比率を+(1:1以上)
Context Sensitive
Alt + 左クリック -> ノード接続解除
ノード選択 + C -> コメント挿入
Graph, Macro, Function

様々な種類のブループリント

Level, Actor, Animation, UMG(Widget), 子

ブループリント使用時に注意すべきこと

Cast to XXX

ブループリントを使用したインタラクティブなマテリアル切り替え

コース紹介とマテリアルコレクション

Material Parameter Collection
Ctr + ドラッグ -> ノード切り替え
Component Maskノード

ウィジェットユーザーインターフェイスへの表示

Create Widgetノード
Add to Viewportノード
Player Controllerノード
Show Mouse Cursorノード

ウィジェットボタンとマテリアルコントロールの接続

Make LinearColorノード
Vector Parameter Valueノード

UIウィジェットのアニメーション

Flipflopノード
Play Animationノード
Selectノード

ブループリントによるプロダクトコンフィギュレータの作成

ブループリントイベントグラフ

Event Inputノード
Consume Input

変数と配列

Get All Actors Of Classノード
For Each Loopノード

データテーブル

構造体には、データテーブルの2列目から定義(1列目のUE Identification Number(UE4)は、定義必要なし)
Get DataTableRowノード
Integer -> to String -> RowNameに接続
Out Rowからデータを取得

HUD (ヘッドアップディスプレイ)

Sequenceノード

ゲームモード

Player Controller
Game Mode
Set View Target with Blendノード

マテリアル交換 パートA: コントローラーブループリントの作成

Add ...ノード
modulusノード
switch on ... ノード

マテリアル交換 パートC: 操作への反応

Rerouteノード

起動時のカバースクリーンの有効、無効の切り替え

Set Collision Response to All Channelsノード

アクセントマテリアルの交換

Make Arrayノード

データのHUDへの設定

Pure
AsCurrency
Append

ユーザーインタラクション用のHUD準備

Event Dispatcher
bind event to...ノード
Add Custom Eventノード

カメラインタラクションロジックの開発

Integer + Integer ノード
CompareIntノード
Delayノード

ボタン操作音の追加

Play Soundノード

単純な音楽再生プレイヤーと曲トラックの追加

Audio Component
Sound Base
Stopノード
Set Soundノード
Playノード

HMR(Human Mesh Recovery) をつかってみた

参考にしたのはこちらのプロジェクト
End-to-end Recovery of Human Shape and Pose
akazawa/hmr

Python2.7が推奨されています
サポートは切れていますがとりあえず動きがみたいので2.7で環境設定していきます

環境設定

macOS 10.14.4

サイトを見るとLinuxとWindowの設定が記述されていたのでWindowsを設定していたのですが、環境が作れなかったため、macで環境設定することになりました
macでもデモが動きました

手順

  1. Anaconda3を入れます
    公式ページの下の方に Installersリンク があります
    (前の記事でAnacondaのコマンドをまとめてます)

  2. 環境を作ります
    $ conda create -n [env_name] python=2.7

  3. Tensorflowをいれる
    公式ページに入れ方が載っています

  4. モデルをダウンロード
    $ wget https://people.eecs.berkeley.edu/~kanazawa/cachedir/hmr/models.tar.gz && tar -xf models.tar.gz

  5. デモを動かす
    $ python -m demo --img_path data/im1954.jpg
    これで動くと思います

エラー

私はデモ実行で複数のエラーがでました

ImportError: No module named absl

abls-pyを入れます
$ sudo pip install abls-py
私はpipで入れてしまったのですがpipとcondaが入るのはよくないので
condaで入れた方がよかったと思います

$ conda install -c anaconda absl-py

一度pip uninstallをしてcondaで入れ直しましたが問題なくデモは動きました

ImportError: No module named cv2

absl-pyを入れたあと、さらにエラーが発生しました

pythonでopencvを使うときによくみるやつです
$ conda install opencv
こちらで入ります

ImportError: No module named opendr.camera

次のエラーはopendrです
$ conda install opendr==0.77

デフォルトチャンネルのままだと入らないようでした

PackagesNotFoundError: The following packages are not available from vurrent channels

このときpipではいるという記事をみてpipでインストールしてしましました
$ pip install opendr==0.77
無事 "Successfully installed opendr-0.77" となりましたが
インストール先のチャンネル追加ができるコマンドを見つけたので
そちらで入れた方がよかったかもしれません

ダウンロード先を追加
$ conda config --append channels [channel_name]
ダウンロード先を確認
$ conda config --get channels

次のエラーです

TypeError: load() got on unexpected keyword argument 'encoding'

このエラーの上の行に
File "src/tf_smpl?batch_smple.py" line 32, in __init_
とありました

dd = pickle.load(f, encoding="latin-1")
このpickle.loadの引数がpython2とpython3で変わってしまったようです
32行目を
dd = pickle.load(f)
と書き直して
デモ実行!

デモ実行

無事実行されました

f:id:filot_nextd2:20200925153522p:plain

名称 バージョン
abls-py 0.5.0
opencv 3.4.2
opendr 0.77

windows10で設定をやめた理由

windowsが推奨されていたため、Anaconda3を入れて環境をつくっていました
python2.7はサポートがないと思ってpython3.6でやってみてました
macと同じようにエラーが発生
cv2がないとかscikit-imageがないとか、、、
macより色々でましたがだいたいモジュールが見つからないエラーでした
ただ、致命的なのがopendrがpython3に用意されていないということです

そこでpython2.7にしようと環境をつくりなおしました
今までと同じようにエラーを一つずつ潰していきます
そしてTensorflowが対応していないことに気づきました、、
https://www.tensorflow.org/install/pip?lang=python2#windows_1
なるほど。
python2.7を推奨しているのに

Windows Setup with python 3 and Anaconda

と書いてあるわけです

python2.7の環境を消そうとしたらAnacondaが起動しなくなりました、、

anaconda-navigator 起動しない

結構検索でてきます

https://github.com/ContinuumIO/anaconda-issues/issues?q=anaconda-navigator+
結果win64bit版のインストーラーが壊れているらしいという、、
そこでmacでやってみることにしました

anaconda-navigatorが動かないことに関しては
minicondaなどを試してみてもよかったかもです
condaコマンドが使えたら良いと思うので。

初めてさわるものばかりで
あとでこうした方が良かったと思うことがちらほらですが、
デモが動いたので次はpython3で動かしたいのと動画で実行してみたいです

UE4公式オンラインラーニングの備忘録を作る_3

目的

UE4公式オンラインラーニングの備忘録を作る_1
本記事の目的は↑を参照のこと

後で振り返りそうな内容のみ記載

今回の題材

Unreal Engine 入門
Unreal Engine 最初の一時間~よりよいパイプラインの構築
※ログイン必要

感想

「よりよいパイプラインの構築」が勉強になった

Unreal Engine 最初の一時間

Epic Games Launcherにようこそ

エンジンのインストール方法
マケプレで購入したアセットの使い方

初めてのプロジェクトを作成する

特に振り返りそうなことなし

コンテンツを扱う

Starter Contentの取り込み方
MarketPlace上のコンテンツの取り込み方
他のPJからのMigrate

初めてのレベルを作成する

Alt + ドラッグによるオブジェクト複製
Player Start
Atmosphere FogをDirectional Lightにattach
Reflection Capture

ビジュアルをコントロールする

反射光(Skylight)
露光(Post Process Volume)
BP_Sky_Sphere + Directional Light

アクタ

Lightingのビルド

Unreal Engine 入門

Viewport

Bookmark
Game View
Focus

World Outliner

ActorのGroup化(Lock、UnLock)

Details(詳細)パネル

プレイ中に非表示となるPropertyの表示方法
Property Matrix
Property Lock

Modes(モード)パネル

Geometry Editing

コンテンツブラウザ

Column View
Developer Content
Engine Content
Plugin Content
Localize Content
Collection(静的、動的)

メインツールバー

Settings(Preview Rendering Level)
BruePrintClassへの変更

エディタの環境設定

設定のexport/import

プロジェクト設定

設定のexport/import
Maps & Modes
Packaging
Collision
input
Rendering(Default Settings)

ワールドセッティング

Kill Z

プロジェクトとファイル構造について

プロジェクトの管理

新versionで開く際のプロジェクトのコピー

.uprojectファイルについて

switch version
Visual Studio Project生成
plugin version

プロジェクトの構造

削除可能(Intermediate、Binaries)
基本削除不能(Config、Content、Source)

ダウンロードキャッシュ

格納先パスの変更

DDC(Derived Data Cache)

格納先パスの変更
チームでの共有

よりよいパイプラインの構築

Document Reference
Project Download(and Powerpoint)

ソースコントロール

Perforce
SVN

テクスチャ

スタイルガイド
https://github.com/Allar/ue4-style-guide

サイズ(2の累乗)
alpha channel(埋め込み、分離)
RGB Mask Packing
Embed Alpha対応している拡張子はPNGとPSDとTGA、
HDR形式のみCube Mapが2の累乗である必要が無い
Mip Map
Mip Gen Settings(ちらつき対策)
Texture Groups

スタティックメッシュ

1 Unreal Unit = 1 Centimeter
LightMapとShadowMap(UV01内、重ねずに配置)
UCX{FullNameOfMesh}Number
Convex Decomposition
Overdrawの制限
Shader Complexity
LOD

エクスポートとインポート

Static Mesh(Smoothing Groups、Triangulate、Preserve Edge Orientation)
Skeltal Mesh(Smoothing Groups、Triangulate、Preserve Edge Orientation、Animation、Deformation、Skin)
Reimport
Auto Reimport
Full Scene Import(MaterialはDiffuseとNormalのみ、CameraはAnimationを含めない)

マテリアル パート1

Material Domain
Blend Mode
Shading Model
Master Material
Material Instance
RGB Mask Packing
Static Switches
Feature Level Switch

マスターマテリアルとマテリアル関数

VectorParameter node
テクスチャ選択後T Key
パラメータ変換
StaticSwitchPatameter node
scalar(1キー + 左クリック)
StaticComponentMaskParameter node
Lerp(Lキー + 左クリック)
Texture Cordinate node
Function Input node
Multiply(Mキー + 左クリック)

マテリアルインスタンスの活用

Material Property Overrides(確認用で使う)
頂点アニメーション
Opacity Mask
SimpleGlassWind

テクスチャストリーミング

UE4 Console 開き方(バッククオート、USキーボードはチルダ(日本語環境では@))
Default.iniで設定可能

LODとスタティックメッシュのマージ

Automatic LOD Creation Tools
BaseEngine.iniで設定可能
LOD Group

Marge Actor Tool -> 破壊的
LODSelection Type(Use specific LOD levelを選択 -> 新しいマテリアルの選択および調整が難しくなる)
Specific LOD(0を選択 -> 他はマージ後、最適か判別が難しいため)
Texture Sizing Type(用途に合わせて試す)
Blend Mode(親マテリアルによる)
マージ失敗対策で、事前にメモ帳などにコピぺ

HLOD(階層的LOD) -> 非破壊的