CoreMLの練習にDepth PredictionができるmacOSアプリをつくりました。

github.com

近頃macOSを開発に全く使ってなく、面白そうなアップデートに全く追従できていなかったので、サンプルが少ないCoreMLをmacOSから使うアプリを作りました。GitHubのReleasesからビルド済のアプリをダウンロードできます。PythonのMLライブラリ等と違い、ライブラリのインストール要らずで使えるのが一番の利点ですね。

Appleが既に用意してくれているFCRN-DepthPredictionモデルを使いました。 developer.apple.com

*.mlmodelファイルをXcodeにドロップするだけで、クラスとして読み込まれます。パスからファイルを読み込むなどは必要なく、非常にシンプルです。

f:id:asus4:20191014212500p:plain
CoreML model on Xcode

inputs,outputsの情報もXcodeのインスペクタから見れるのも便利。今回のモデルは低解像度で160x128pxのグレイスケール深度画像(double)を出力するのが一発でわかります。

出力される深度の値は、 0(手前)〜不定値(奥)となっているので、白黒を反転、0-255までの範囲に正規化しています。

Facebook 3D Photo

そもそもDepth Predictionを試してみた理由は、Facebookの3D Photoが簡単に対応できるようになっていることに気づいたためです。 www.oculus.com 画像と同じアスペクト比のimage_depth.pngグレイスケール画像を用意するだけで、3D Photoのポストができます。

このアプリでもFacebook 3D Photoに対応する画像を書き出します。

実験結果

iPhoneXなどで気軽にDepthつき映像が手に入るようになっているものの、Depthを持っていない画像:昔の映画や、油絵などにDepthを推定するとどうなるかという実験をしてみました。精度や出力の解像度が荒いので、まだまだな印象があります。面白そうなのでもう少し掘って見ようと思います。

UnityからWebRTCで動画を送る選択肢

Google Stadiaが発表されて、いいGPUを積むよりもレンダリングは全部サーバー側で頑張って、クライアントでは早いネットワーク表示するだけな時代が来ていますね。2019年10月時点での選択肢を調べてみました。

github.com Unity Japanチームが開発している。 - Streaming Server(送り側)はWindowsのみ。Linuxも対応予定。 - ブラウザから入力をWebRTCで送るサンプルもある。 - NVIDIA製のグラフィックカードに最適化

github.com MicrosoftがHoloLens等で使うことを想定して作った。 - Windowsのみ - iOS / Android対応したいとissueで言っているものの対応未定

tips.hecomi.com 凹みさんもNvEncを使用したNVIDIA製の高速なh264エンコードを試していた。 - Windowsのみ

…ご覧のようにWindows/Linuxからのストリーミング一択で。iOS/Androidサーバーは需要がないみたい。

assetstore.unity.com assetstore.unity.com Asset Storeからはこちらの2つを調査。どちらもフレームごとにpngエンコードして送っているので、iOSでも動いたものの遅かった。

github.com 時雨堂さんがiOS/Androidネイティブを開発しているので、UnityにWrapするのを検討中


最近はUnityからpythonへ動画飛ばしてエフェクトかける実験などをしています。

www.instagram.com

www.instagram.com

www.instagram.com

2019年前半に公開したOSS

GitHub - asus4/facial-landmark-annotation: Facial landmark annotation tool

動画の中の顔のランドマークを半自動で読み込み、ずれている部分は手作業で修正するツール。 初、Vuex - Typescript class base対応

[https://twitter.com/asus4/status/1122994785873289216:embed#Added some features: copy & paste, delete, etc... and published on GitHub Pages. https://t.co/GFXppefbrA #VueJS https://t.co/QUOmHBG8S8]

GitHub - asus4/vocabulary-book

8月から息子が現地の保育園に行くので、レストランで使えるドイツ語とか要らないから、ピンポイントでこれだけ知っておけばなんとかドイツ語の保育園を生き抜ける単語帳が欲しくて作った。マスタデータはGoogle Spread Sheetにおいて誰でも編集できるように。やっきーのママ友に手伝ってもらいました。URLを入れ替えれば、自分の独自のSperadSheetも読めますよ。

vue-cliのテンプレート生成がいい感じなので、最近ちっさなプロトタイプ作るときも、

  • Vue.js
    • class base TypeScript
    • Sass
    • Pug
  • Netlifyで公開

の構成が固まってきた。

GitHub - asus4/real-emoji

これのソースコード。思いついてから30分で作った。最近顔認識をやりすぎている…。vue-cliでテンプレート作ってNetlifyでサクッと公開お手軽〜〜

GitHub - asus4/unity-poisson-blending

Poisson Blending、OpenCVでいうSeamless CloneをUnityのCompute Shader上で実装したもの。 当初、もう少し高速なアルゴリズムなどもリサーチしていたが、これで0.5ms 以内で800イテレーションをマークしたので、GPUの速さに感謝。同じ処理をOpenCV for UnityでCPU実装すると4msかかった。

https://camo.githubusercontent.com/35ab2d62a3f479ae69e4caa66b997f1c19605166/68747470733a2f2f692e696d6775722e636f6d2f474851517777722e6a7067

GitHub - asus4/mqtt-unity

MQTTnetをUnity上で動かすサンプル。案件用に作ったものの結局違う方法を使ったので、実戦投入はしてない。

GitHub - asus4/voice2midi

声をFFTにかけて、周波数帯ごとにMIDI Noteに変換してみる実験。ちょっと動作が微妙なので、ちゃんと計算し直す。

GitHub - asus4/faust-unity-playground

Faustというオーディオプログラミング言語をUnity上で動かすサンプル。Faust自体は超初心者だが、WebAudio, iOS, Andoid, PC Native, VSTなどへ書き出し機能があり、とても可能性がある。UnityのカスタムオーディオエフェクトをFaustで作れるということ。結構エラーがあって本家FaustにPR送ってやっと動いたりしたので、深堀りしたい人以外は、Unity連携はまだ様子見かもという感じ。

GitHub - asus4/unity-speech-recognizer: iOS Speech Recognizer for Unity

iOSのSpeechRecognizer機能をUnityから使えるプラグイン。安定性は、有料Assetを買うほうが良い。私の場合はこの機能で足りた。

2018年に公開したGitHubリポジトリ

2018年にGitHubに公開したツールなどをまとめました。 (頑張った感を出すためにフォークして少しだけ改良や、メンテしただけのも含む)

unity-timeline-sync

GitHub - asus4/unity-timeline-sync: Synchronize multiple Unity Timeline via UDP
複数UniyのTimelineの再生時間をUDPで同期。一台がマスター。残りをMulticastで同期させる想定。
ネットワークの遅延時間を計測してオフセットできるほうが良さそうだけど、ローカルネットワークで十分に早い環境だったので今回は未実装。

https://camo.githubusercontent.com/197aaaa3c1dac460876226974cbe3a013c5f8dd6/68747470733a2f2f692e696d6775722e636f6d2f6d4f4d5331326b2e676966

avs

GitHub - asus4/avs at settings
respeaker社のAVS(Amazon Voice Service)をフォーク。アレクサのスキルではなく、スピーカーの方を自作できるSDK。 マージしてほしかったけど、本家の開発者のレスがないのでこのまま。

  • Setting API対応で、日本語も使えるように
  • CUIのみのRaspberryPiでもデバイス登録できるようにした

AVSを作るときはAmazon本家の avs-device-sdkが一般的だけど、こちらはc++コンパイル時間かかりすぎるので、プロトタイプ用途には向かなかった。あとRaspberryPi Zeroは非対応。respeaker/avsのほうはZeroでも動く

GitHub - alexa/avs-device-sdk: An SDK for commercial device makers to integrate Alexa directly into connected products.

OscJack

GitHub - asus4/OscJack: Lightweight implementation of OSC server/client in C# (Unity)
keijiroさんのOSCライブラリをマルチキャスト対応した。軽量で設計がすてき

unity-taptic-plugin

GitHub - asus4/unity-taptic-plugin: Use iOS TAPTIC Engine from Unity
タプティックエンジンをUnityから扱えるやつ。ちょっと更新した。ゲームのエフェクトと振動を組み合わせたい。 f:id:asus4:20190120212500p:plain

go-osc-capture

GitHub - asus4/go-osc-capture
ネットワークを流れてるOSCを録画 / 再生するCLIMac/Window使える。

# Record to capture.csv
osccap record -port 7000 osc_capture.csv

# Listen from multicast addreass and record to the csv file
osccap record -multicast 225.6.7.8 -port 7000 osc_capture.csv

unity-osc-capture

GitHub - asus4/unity-osc-capture: Capture and playback OSC(Open Sound Control) packet in Unity
OSC録画のUnity版。途中でGoに移ったので、未完成かも…。

Kml.swift

GitHub - asus4/Kml.swift: Simple kml parser for swift
GoogleMapのKMLファイルを、iOSのMapKitに読み込んで表示するもの。地味に人気ある。あまりメンテしてないけど、Swift4まで対応しておいた。

https://cloud.githubusercontent.com/assets/357497/23339742/cb32971a-fc6b-11e6-9ec1-7415617285d2.png

twitter-kit-unity

GitHub - asus4/twitter-kit-unity: Twitter Kit for Unity UnityからTwitterSDKを使う。Twitter社開発のやつをフォーク。動画投稿機能を追加。

twitter-kit-unity-sample

GitHub - asus4/twitter-kit-unity-sample: This is a simple sample for Twitter-Kit-Unity 上の使い方サンプル

ARKitMapping (Unity)

GitHub - asus4/ARKitMapping: A view dependent rendering example with ARKit
ARKitでiPhoneの座標をPCまで送って、View dependentなプロジェクションマッピングしようと思ったけど、プロジェクションマッピングをするとARKitの精度が落ちるのでやめた

iVidCapPro-test

GitHub - asus4/iVidCapPro-test
iVidCapProというUnity-iOSで画面録画できるライブラリがちょっと古かったので、Unity2017でも動くように修正した

unity-replaykit-test

GitHub - asus4/unity-replaykit-test
ReplayKitの動作テスト

SimpleMapper

GitHub - asus4/SimpleMapper: Simple Mapper is a simple Syphon client for a video installation and a projection mapping.

https://github.com/asus4/SimpleMapper/raw/master/images/capture.png
ずいぶん昔に作った、デジタルサイネージ用のSyphon入力をホモグラフィ変換して、投影するだけのアプリ。
前職で四角形を出すだけでMadMapperいらんやろ。と言われカッとなって作った。
スリープしないし、常に最前面に表示されるし。マックでサイネージするときに地味に使うことがある。

MoFace

GitHub - asus4/MoFace: Morph face and voice on Web.
インビジさんとWebオーディオ実験した

UnityMusicPlayerPlugin

GitHub - asus4/UnityMusicPlayerPlugin: Access MPMusicPlayerController from Unity UnityからiOSのMusicPlayerを使えるようにした。

まとめ

プラグイン・ツールとかの公開が多いなあ。コンテンツ本体を出せることはほとんど無いのでプライベートリポジトリが多い。
だんだんクオリティも上ってくることを信じて、2019年も質より量で上げていきます。

保育園の送迎を助けるLine Bot

ex-Kayacアドベントカレンダーの5日目です。
​​昨日の投稿は堤修一さんの技術書の著者になるためにやったことでした。

近況

​​本題に入る前に、近況を
​​2011年にカヤックに新卒で入社。Flasherとして入社するはずがiPhoneFlash非搭載事件があったので、何も出来ない子として入社。先輩と2人でUnityを始める。その後、展示、IoT、ミュージックビデオなど色々やらせてもらいました。 →カヤックで作ってたもの

​​2014年にフリーランスとして独立 & dot by dot inc.に所属 →dot by dotで作ってるもの
​​​​今年2018年9月にドイツ、ベルリンへ移住しました。フリーランス & dot by dot継続中です。

asus4.hatenablog.com

引っ越してまだ2ヶ月ちょい。やっとビザが出て生活できるようになってきたばかりです。ドイツでの苦労話はおいおい聞いてください。今日はこの話を書きます↓ ​​

​​保育園送迎を助けるLine Bot

モチベーション

我が家は私がフリーランス、妻が正社員(デザイナー)、子供1歳です。世田谷区の保活は大変でしたが、期間限定で入れてくれるところが見つかり、4月から共働き復帰しました。

フリーランスの私のほうが時間に自由が効くため、保育園の送迎は基本的に
朝:妻
夕:私
でした。保育園送迎を初めてから気づいたのですが、送迎のママ・パパは自転車が主な交通手段です。都内では車での送迎が禁止のところも多く、満員電車に子供は載せられない。毎日タクシーを使うわけにもいかない。必然的に自転車になるのです。

普段の我が家のスケジュールはこんな感じでした↓

f:id:asus4:20181206104223p:plain

割とうまく回っている気がします。子供が生まれる前はかなり長時間働いていたので、超集中して働く様になりました。
ところが、自転車にとっての一番の弱点が降るとスケジュールが狂います。

雨のときのスケジュール

f:id:asus4:20181206104304p:plain
​​ 朝はいつもより早く出ないと、ただでさえ短い勤務時間が更に減るし。
午後から雨が降っても、一日中モニターに向かっていると気づかず、いざ自転車で迎えに行こうと外に出ると、雨。仕方なくタクシーで迎えに行ったこともありました。

これはミスがでるな…と。
なんとかミスを減らそうとしました。

初号機:IFTTTで雨を教える

Slackを始めプログラマーフレンドリーなツールは沢山ありますが、妻はSlackを使っていなかった、できるだけ普段からよく見るツールにしたいと思いLineに通知が飛ぶようにしました。
そんなに開発工数をかけてもしょうが無いので、最速でつくれるものから始めました。

IFTTTで雨を天気予報を教えるだけです。

IFTTTは色々な条件をトリガーに色々なサービスを動かせるものです。

実装工数10分

f:id:asus4:20181206111049j:plain

ちなみに会社からかえるときにラインするは、GPSで私の位置をトラッキングして、オフィス周辺2kmから出ると「今から帰ります」と妻にラインするボットです。仕事に集中するとお迎えを忘れる危惧が合ったので、無事に迎えに言ったことを自動で妻に通知する様にしました。(やり過ぎた自動化)ちなみにこのアプレットは時間を指定できなかったので、昼間に打ち合わせで電車に乗ったときにも発動するバグがありました。

改訂版: IFTTT + AWS Lamdaで自分の条件にあった完璧な通知をする

​​ 運用してみて、土日も雨の予報が飛ぶし、当日の朝に雨が無いときも。​​結構通知がうざいなと。通知の自動化あるあるではないでしょうか…。
慣れというのは怖いもので、多すぎる通知を勝手に無視してしまうようになりました。

そのため、大事な通知だけ送るように、Lineへの通知をカスタマイズしました。
普段の仕事の延長で考えるとRaspberryPiなどでやるところですが、勉強を兼ねてAWS Lambdaでつくりました。

作った機能

  • 朝 6:00 :その日の夕方に雨が振りそうなら、予めバスで通勤するようにお知らせ
    • 雨の強さをお知らせ
    • 平日のみ通知
  • 夕方 16:30: 雨が降っていたら、自転車で帰れないから、早めにバスに乗った方がいいとお知らせ
    • 雨の強さをお知らせ
    • 平日のみ通知
  • GPSでオフィス(渋谷)から離れると実行。
    • 平日かつ、お迎えの時間(夕方)のみ通知
    • 打ち合わせの移動、昼間の移動はフィルタリング
    • ついでに保育園の入り口のロック番号を4桁を通知(4桁も覚えられない…)

使ったAPI・ライブラリ

最終的にこんな感じになりました。

https://cdn-ak.f.st-hatena.com/images/fotolife/b/blog-media/20180905/20180905164141.png

おかげなのか、せっかく作ったから意地なのか、(忙しいときは変わってもらったことも合ったけど)、保育園のお迎えは一度も遅れずいけました!