ハロウィン仮装にRaspberryPiを使って「喋る帽子」を作ってみた
はじめに
毎年,この時期は「みんなのラズパイコンテスト | 日経Linux、日経ソフトウエア、ラズパイマガジン 主催」に応募しようしようと思いつつ何もやらずに過ごしてしまっていたのですが,今年は奮起して応募しようとしています.
今回はなんとソニーセミコンダクタソリューションズさんから
をお借りすることができたので,このカメラを使って応募作品を作ろうということになりました.
我が家は毎年ハロウィンの時期になると仮装を自作しており,その仮装を作る作業とラズパイコンテストの応募が時期的にも重なるので,いっそ一緒に作ってしまおうということになり,「喋る帽子」を作成してみました.
できあがりはこちら。わかりやすいように外装がない状態です。
口のパーツが黒いので、ちょっとわかりづらいですね。
これに外装をつけたら完成です。 ハロウィンまでに間に合うといいなあ。
今年はこの仮装で
にも挑戦しようと思っています.
※Qiitaに同様の記事を書いていたのですが,
内容的にQiitaにあまり適合しないなーーということで,こちらに移しました.
動機
我が家の近所では毎年,ハロウィンの時期に付近の家々(30軒程度)で集まってハロウィンのイベントを行っています.
近所の子供たちが参加している家々を回ってお菓子をせしめるイベントです.我が家では毎年ハロウィンの仮装を自作していて,それが毎年の恒例行事になりつつあります.
例年の仮装はこんな感じ.
あとは,こんなのとか...
毎年やっていますが,後半になるとキュウビは九尾をPCファンで膨らませてしっぽを作っているし,ランタン男はLED電飾をスマホからkonashi経由でコントロールするなど,少しづつ電子工作を織り交ぜてきていました.
例えばこんな感じ
そんな中、
今年は みんなのラズパイコンテスト2017に参加することにしていて,応募作品としてどんなものをつくるか,というところで悩んでいたところに
というイベントがあり,そこに参加した際に「時期的にタイムリーであること」「驚くようなもの」「持ち運びできる」などのキーワードから作り上げたアイデアです.
前々からハロウィン仮装を長男の勉強の一環として電子工作化していきたいと思っていたので,今回は長男と一緒にチャレンジしました.
条件は以下.
1. ハロウィンの仮装であること
2. 超小型カメラIU233を使う
3. Raspberry PIならではの高負荷・高機能な処理を行う
4. Raspberry PIの小さいという特性を活かして,持ち運べるもの
実は,別にカメラを使ったアイデアがありそのためにIU233に応募したのですが,それだけではもったいないというのと,ちょっと作業が多くて間に合わなくなってしまいそうだったので,二つめの案としてこれを作ることにしました.
これでハロウィンの仮装作成とラズパイコンテストへの応募が同時に行えるということでお父さんウハウハです.
ハロウィンの仮装
ハロウィンの仮装をRaspberryPI+IU233で
ハロウィンの仮装では当然歩き回ることが要求されます.そのため身に着けられるほど小型・軽量でバッテリーでも動作するRaspberry PIは都合がよく,さらにせっかく「超小型カメラIU233」を使用するのだから撮影した画像に対して認識処理などを行いたい.そのためにはある程度の計算処理能力が要求され,今回は処理能力の高いRaspberry PI3を使用することにしました.
時間があればより軽量なRaspberry PI zero Wでもできるか検証したいと思っています.
カメラの活用方法検討
今年作る仮装には,今までにはない条件が付きました.
「超小型カメラ(IU233)を使う」です.せっかくなのでフル活用します.
仮装なので身体に装着して歩き回れるものとなりますが,IU233は
このように超小型かつ超軽量(0.1g以下)のカメラなので,いろいろなところに貼り付けて使うことができそうです.そうなると被写体を何にするかと同時にカメラをどのように貼付するかを考える必要があります.
案1)カメラを外向けに貼付
カメラを外向けに設置した場合,目線の先にあるものを撮影することになります.
IU233なら,オデコや眼鏡に張り付けるくらいできそうな感じです.
技術的に典型的な例としては,ハコスコやAR/MRなどの外部環境取得技術や,物体認識技術,SLAMなどの外界再構成技術が面白そう.他に自分を見ている人の顔や人物枠を取得することもできそうです.
でもAR/MRにしてしまうと体験するのは自分だけなので,ハロウィンっぽくないですね.
案2)カメラを内向けに貼付
カメラを内向けに設置した場合,撮影できるのは本人の身体部位です.
手を撮影すればジェスチャ,顔を撮影すれば表情などが考えられます.
OpenCVなどを使えば顔認識や表情認識もできそうで,撮影した表情の変化を使って何かを操作するような使い道があります.
表情認識であれば,
1. OpenBR:RaspberryPIでの動作実績あり
2. FaceTracker, pyFaceTracker, ofxFaceTracker これならopenframeworksにも対応しています.
3. OpenFace
4. PUX 顔認証:クラウド系ではこんなのや
5. Google Cloud Vision API:Googleさんのこんなのもあります.
かなりRaspberryPIで挑戦されていらっしゃる方もいるので,これならいけそう.
IU233は小型軽量なので貼付する場所には困らなさそうです.
そして,何を作るか?
というわけで,今回はカメラで顔をキャプチャしてその表情をもとにアバターの顔を変化させることにします.イメージとしては,正面から常時表情をキャプチャしてその表情に応じて顔ロボットに同様の表情をさせることを目指します.
問題はアバターを何にするか?
ハロウィンっぽいということになると,ゾンビや骸骨なんかが良さげなのですが,長女(4歳)が号泣しそうなので却下.
そこで出てきたのが
ハリーポッターに登場する「組み分け帽子(Sorting Hat)」や
「ドロロンえん魔くん」に登場するシャポーじい
のように頭に被る喋る帽子です.これならハロウィンっぽいし,帽子のつばにカメラを仕込めそうだし,なにより娘が泣かない.
ということで「喋る帽子」に決定しました.
設計
構成
やりたいこと
帽子を被った人の顔を検出して,その表情に合わせて帽子が表情を変える.
スマホと連携して表情認識の状態を確認したり,キャリブレーションや自動デモモードを実装すること
機能検討
A. 帽子を被った人間の顔を撮影して目・鼻・口・眉毛を検出する機能
B. 目・口・眉毛の動き量を計算し,各器官の動き量に応じてモーターで帽子を制御する機能
C. モニターがないので動作状態を確認できる機能
D. 各器官の動き量のキャリブレーション
E. 表情認識なしでも各モーターを制御する機能
F. USBカメラ,サーボモーター,Raspberry PI,バッテリーを帽子に格納し,だれでも帽子を被れば表情を撮れるようにする
機能モジュール検討
1. 撮影モジュール
フェイスキャプチャを行うためにカメラ(IU233)を配置する.
通常フェイスキャプチャを行うためのシステム構成としては,
こんな感じが業界標準のデフォルト.
しかし,できれば
こんな配置ができれば帽子を被るだけで顔認識できるようになるので,基本ラインはこの構成で.
帽子に取り付けることによって頭が動いても絶えず正面顔をキャプチャし続けることができると考えている.IU233であれば十分配置可能だが,このアングルの顔画像からどの程度器官検出ができるか要検討.
プロ向けのフェイスキャプチャのような精度は要求しないので,これでいけると期待.
もう一つの懸念点はカメラまでの距離.顔器官検出モジュールはある程度の大きさの顔が画面内に収まっていないと認識できない.場合によっては認識できる距離まで帽子のつばを伸ばさないと....
2. 顔器官検出モジュール
顔器官検出モジュールは,撮影モジュールで撮った顔画像から目・眉毛・口などの顔器官を検出するモジュールです.顔器官検出ができるライブラリはいろいろありますが,今回は「FaceTracker」を採用しました.
そこに至るまでの道のりについては,別記事で書きたいと思います.私は思ったより苦戦してしまいました.
「pyfacetracker」を一番使いたかった(最近Python使い慣れているので)のですが,RaspberryPiではコンパイル時にエラーがでてしまい結局うまくいきませんでした.
「openframeworks」もトライしたのですがちょっとうまくいかず,最終的にFaceTrackerに落ち着きました.
FaceTrackerの原理などについては「DERiVE コンピュータビジョン ブログ」が詳しいので,そちらを参照ください.
結果的には,顔画像から66点のキーポイントが取得できます.
こちらによると、
こんな配置になります。
この手法は最初の顔画像からキーポイントを検出するのに時間がかかりますが,検出してしまうと以後はトラッキングを行い高速に追跡してくれます.
Raspberry PI3で解像度をQVGA(320,240)に落としてだいたい15Hz程度.ぎりぎり行けるか,って感じ.
3. 表情生成モジュール
表情生成モジュールでは,顔器官検出モジュールで検出したキーポイント情報から,表情に必要な代表点を抽出
mouth:口の開き具合
corner:口角から顔のゆがみ具合
Right/Left eye:目の検出,瞬きなど
Right/Left eyeblow:眉毛の動き
帽子の動きについては,
口:しゃべる動きに合わせて口パクする.(リップシンクできたら最高)
左右眉毛:ここが動くと表情が豊かになるので,ぜひ対応したい
頭:口だけだと動きが地味であまり動いた感がないので,頭が動くとだいぶ動いた感が出るものと予想される.
海外ではこんな商品が売っているんだね。
Harry Potter Talking Sorting Hat
追加要望としては,動画を見るとつばも動いているのでつばを動かす機能があるといいが,つばが動いてしまうとカメラに振動が伝わってカメラがぶれてしまう可能性があるので,そこは要検討.
それぞれの動き量は帽子の動きと次のように対応関係をもっている.
口の動き,左右眉毛の動き,頭部の動き(2軸)で合計4個のサーボモーターを使用する.
4. スマホ連携モジュール
今回の開発にあたって困ったところの一つに,キャプチャしている状態を確認できない,というのがありました.
実際のハロウィンを想定したときに,うまく動作しなくなって再調整,リセット.最後の手段としてオート再生モードなどがあるとよいので,キャプチャしている状態を外部でモニタできるようにスマートフォン(iPhone,Android)でリモートモニタリングする機能を実装する.
実装には「Blynk」を用いた.
どのようなものかは
を参照してもらいたい.
びっくりするほど簡単にスマホと連携できます.
5. 帽子外装
帽子の外装についてはある程度サイズ感などが確定してからでないとなかなかできませんが、基本的には帽子の中にRaspberry PI,バッテリー,サーボモータを装着します.
しかも帽子の上部は表情に応じて動くための機構を備えていなければなりません.どのように収めるのかは結構大変な問題です.
基本的には帽子内部に背骨・肋骨をいれて単体で動くようにして,外側を外套で覆う構造にします.
外套部分にはビンテージ感のある服,スカートをヤフオクで購入(一つ500円くらい)しました.
ピッグスエードの古着でなかなか良い感じ.
ただ,一つ気づいたのはスカートを購入したとき.
当然分解するためにハサミを入れたのですが,なんでしょう,この背徳感...女性のスカートにハサミを入れるのにこんなに心理的抵抗を感じるとは思いもしませんでした.
でもハサミいれましたよ.まずはシャツから.
両袖を切り出します.残った身はスギちゃんみたい..
シャツの背中の革からつばの部分を切り出して作成.
これを本体にかぶせていきます.
帽子本体は両袖をつなげて一本の筒状にします.
口の下の部分は,ボタン穴があるのがわかりますか?シャツの前立て(ボタン止めるところ)を使っています.袖を使った筒部分は,ちょっと太くなりすぎたので修正が必要.帽子のつばのフチは自在針金で強化してあります.
帽子のとんがりが自重で折れ曲がっているので見えませんが,上の方には袖口のボタン留めが見えています.ただ,ちょっと長すぎるので修正は必要ですね.
ひとまず外装はこんな感じ
その他の懸念点
- 頭が動いたときにカメラがフラフラして,ブラーが発生してしまわないか?
- カメラの光量が足りなくて照明が必要なのでは?
- カメラの画角によっては広角または望遠レンズが必要
実装
撮影モジュール
撮影モジュールについてはIU233を使うことがきまっています.
IU233の構成については
にいろいろとメモを取りました.
基本構成としては,
- IU233N2-Z(カラー)
- IU233N USB-EVB(上記カメラをUSB接続するための変換コネクタ)
これを使って通常のUSBカメラとしてRaspberryPIに接続します.
とてもシンプル.
この状態だと
の記事で書いたようなシンプルな構成で画像を取得できます.
顔器官検出モジュール
OpenCVで画像が取得できるとFaceTrackerを使って顔器官検出ができます.
FaceTrackerをインストールすると
$(FaceTracker)/src/exe/facetracker.cc
にサンプルがあり,これをコンパイルすると目鼻口,輪郭にメッシュの入ったマスクを被ったような画像を取得できます.
カメラの取得サイズを調整
カメラの向きを90度回転
などを追加したくらいで素直に顔器官検出ができるようになりました.(インストールしていろいろ動かす部分にはかなり苦労しているのですが,そこはまた別の機会に書きます)
トラブル!
ところが,USB基板 IU233N USB-EVBが突然の故障。いきなりUSBとして認識しなくなってしまいました。回路が死んでしまったようです。
USB基板からVPFに切り替えて動作確認をしてみると画像は取れるのでカメラは死んでいない模様。
買い直そうとコミュニティに質問を投げたらチップワンストップさんで販売しているとのこと。
値段を見てびっくり。
18,000円! まだ製品化されていないようなのでしょうがないのでしょうが流石にこれは手が出ない。
急遽picamraケーブルを使ってlibSSPで動作させる方向に変更します。
LibSSPを使う方法については
でいろいろトライしているのでなんとか対応できました。
「libSSPのサンプルFaceDetector」を改造します。
FaceDetectorを採用している理由はcppで書かれているから。それでもopencv部分もIplimageだったりと、自分としては色々手を加えています。
また、libSSPを使用したことでカメラの画角やゲインの調節が変わってしまい、結構コミュニティにも問い合わせをしてしまっています。
こちらがlibSSPベースでの実例(距離30cmに配置)
USB基板を使って、OpenCVベースでキャプチャした例が
こんな感じになります。
libSSPでもパラメータファイルを調整することで、ゲインやシャッタースピードを調整できるようです。
ところが!!
USB基板が故障してしまい 「ビジョンプロセッシング・コミュニティで相談」 していたところ「みんなのラズパイコンテストを主催する日経BPさんに相談してみては?」とアドバイスいただいてダメ元で問い合わせたところ、迅速に対応して頂きまして今日USB基板が送られてきました! 感謝!!
これでひとまずUSB基板ベースで進めていくことができそうです。
カメラの配置
カメラを配置します.
カメラケーブルだと長さが足りなさそうだったので,USBで動作してよかったです.カメラを配置するために長男の帽子部分とその先端にカメラを取り付けるフレームを作成しました.
SB基板を使用した場合ステーの距離は20cm,これが帽子のつばの先端までの距離になります.
カメラが頭部に固定されるのでカメラ映像内の頭部位置は絶えず固定されています.そのため認識にもかなり有利に働きますし,トラッキングに失敗した時も対処が楽になります.
理想的には帽子のつばの先端に設置したかったのですが、画角の問題で30cm程度の距離に設置した方が認識率が良いので帽子のつばからさらに10cmほどステーを伸ばしてカメラを設置するのが良さそうです。
こうゆうときにIU233だと小さくて軽いので、そのような選択ができますね。
結果的にはこのような配置になりました。
さすがIU233。小さいですね。
頭を動かしても映像はほとんどブレません。
サーボモーターの制御
構成要素
サーボモーターはお手軽なマイクロサーボ「SG90」を使用
今回は4ch使用します.
サーボモーターのドライバには,PCA9685系の
このモータードライバはI2C経由でRaspberry PIと繋がっているので,Raspberry PIから簡単なコマンドで操作することができます。
各部位の設置状況はこのようになっています。
①と②が頭部、眉を動かすのに使用するモーターで、③が口を開閉するモーターになります。
スマホ連携モジュール
これで,カメラで顔画像を撮影・顔機関検出を通して口や眉毛などの変化を捉えることができるようになっています. ところがこれを帽子に組み込んでしまうとHDMIやキーボードなどを接続することができません.
当然 ssh,VNCを使ってリモート接続して情報を取得することもできるわけですが一つ問題があり,FaceTrackerやlibSSPを使用してOpenGLベースで画像を出力するとフレームバッファに直接出力されてしまうため,HDMI出力にしか画面やウィンドウが出力されないのです.
そうなるとトラキングが失敗しているか,顔器官の追跡具合はどの程度か,などを確認することができません.
そこで計測した結果をモニタリングするための実装を行います.
今回使用したのは
です.これはスマホ側で部品を配置すると,それをVirtual PinとしてたとえばWifi経由でRaspberry PI上のプログラム上で現物のGPIOピンに相当する仮想PINに信号を入力したり,信号を出力したりすることができます.
このBlynkのキャプチャ画面は表情認識結果を表示するダッシュボードのDISPLAYタブ部分です.
① のLED表示は,FaceTrackerの認識エンジンのCaptureFlag情報をRPIからスマホに反映してLED表示しています.映像から顔をキャッチできていれば点灯します.
②,③ は眉毛の動きに対応したレベルメーターで,Raspberry PIで左右の眉毛の動きを取得してスマホに送信して,反映します.
④ はリセットボタンです.
うまく認識ができていないなどあった時に押すことで,顔器官検出トラッキングをリセットする信号をスマホからRaspberry PIに送ります.
⑤ は口の開き具合を表現します.上が縦方向の口の動きで,下が横方向の口の動き.
次はスマホからRPIに対してパラメータを送信する「FREE CONTROL」タブです.表情認識だけではなくスマホからも帽子の動きをコントロールできるようにしたものです.
① はジョイスティックで,帽子の頭(先端部分)を前後左右に動かすためのコントローラです.ジョイスティックを動かすと頭部がユラユラすることを想定しています.
② は口の開閉をコントロールできるスライダ,
③ は眉毛の上下をコントロールできます.
④ は目または帽子のどこかにフルカラーLEDを装着して点灯することを想定してつけてみました.
これがスマホと連携して動作している動画がこちら
完成。。?
上のパーツにピッグスエードで作った外套を被せて、試験動作させてみました。
口はアンティークのチャック。
目はまだ付いていません。
トルクがさすがにSG90では足りなかったかw
ラズパイコンテストに向けてやりたいことと機能は完成したので、一応の完成とします。
今後としては、
- モーターにトルクがあるものが必要
- 口のモーターは二つ必要
- 目の部分の実装
- 口の中や目の周りなどにフルカラーLEDを配置して光るように
- 帽子をかぶっている人たちの喋っている音声をピッチシフトなどで怪物チックな声にする
など考えています。
今回はraspberry pi を使ってハロウィン用の仮装 「喋る帽子」を作成しました。カワハロにも応募したので、あと一ヶ月かけてもうちょっとブラッシュアップしていこうと思っています。
修正
ここからさらに修正をかけました.
上の今後に対して,
- モーターにトルクがあるものが必要
- 口のモーターは二つ必要
この二点を改良.
もともと使用している サーボモーターはSG90
これのトルクが1.8kgf・cmで,外套を被っていない時点ではある程度動いてくれているのですが,外套を被るとその重さによってかなり動きが小さくなってしまっていました.
そこで今回はデジタルサーボをパワーアップ.
トルクは5.5kgf・cmと二倍以上!
これでうまく動いてくれることを期待します.
さらに,口の動きもファスナーの重さもあってか,かなり動きが小さく制限されてしまっていたので,両側に二個取り付けました.
こんな感じ.
本体のみで動かすと
さすが! ギュイギュイいってます.
最後にこれに外套をかぶせて動作確認
ハロウィン当日
ハロウィン当日は台風の影響で大変でした.
カワハロに関しては,大雨の影響と子供の都合でぎりぎりまでできるかがんばったのですが結局不参加になってしまいました.
しかし毎年参加している近所のハロウィンには参加してきました.
長男のハロウィン中は,カメラで顔認識しても喋る暇などない感じなので,オートで適当に喋るようなデモモードを作成して,動かしていました.
某魔法使いの「組み分け帽子」の仕立てになっておりますw
中身の構造がわかりやすいように帽子をスケルトンにしたバージョンです.
結果発表
11/1に結果発表がありまして,
みんなのラズパイコンテスト |ラズパイマガジン、 日経Linux、日経ソフトウエア 主催
「グレープシティXojo(ゾージョー)賞」を頂きました!!
嬉しいです.
授賞式は,11/02-3に行われるTREND EXPO 2017にて表彰されるとのこと.
私の賞はそこでは表彰されないのですが,やっぱりイベント大好きなので長男がサッカーの大会に参加するにもかかわらず,こちらに参加しました.
TREND EXPO のセミナー内でコントスト受賞者の授賞式があるのですが,会場内では展示できるスペースもある模様.
TREND EXPO 2017 みんなのラズパイコンテスト授賞式にきてます。私の賞は登壇しないらしいけれど pic.twitter.com/UwnyIr28Ik
— yakatano (@Yakatano) 2017年11月3日
2017年ヒット商品ベスト30 などテレビでも見たことあるイベントなどに混じって展示を行っていました.
「みんなのラズパイコンテスト」は今回初めての参加になり,授賞式の様子などは全くわからない状態でした.
現物を持って行っても展示するスペースがあるかもわかりませんし,他の方がどのようにされているかもわかりませんでした.
しかし今までいろいろハッカソンとかやってきた時に,展示していろいろな人に説明するのが好きなので,今回はダメ元で帽子を折りたたんで現物を持ってきたのです.
恐る恐る賞をくださったグレープシティさんのブースに現物を持っていくと,快く置かせていただけることになりました.
グレープシティさんのブースに置かせてもらうことになりました。
— yakatano (@Yakatano) 2017年11月3日
持ってきてよかった! pic.twitter.com/FnScZVtdmS
動作をデモモード(顔認識なしでも適当に口と頭を動かすモード)に切り替えて,会期時間中ずっと展示させていただきました.
最後は耐久性が足りず,口元あたりが破損してしまいましたが,正直それは想定内(子供のハロウィンイベント+今回の展示までは想定外).
家に帰ってさっそく補修して,現在はまた元気に喋っています.
今回は,ハロウィンのイベントと「みんなのラズパイコンテスト」 を兼ねて電子工作を使ったハロウィン衣装を作成しました.
TREND EXPO 2017を見にきてくださった方にも「私も作ってみたい」と言っていただけたことはとてもうれしいです.
さて
来年は何作ろうかな
謝辞
IU233を貸与していただきました、ソニーセミコンダクターズ様.おかげで面白いハロウィンになりそうです.
IU233について色々な質問を投げさせていただき、そこにいつも丁寧に回答していただきましたビジョンプロセッシング・コミュニティの皆様方.
そして、USB基板のトラブルに迅速に対応していただけました日経BPさんに感謝いたします。
皆さんの助力がなければここまで辿り着くことはできなかったと思います。
また,賞をいただいたグレープシティ株式会社様.
TREND EXPO 2017の会場にいきなり実物を持ち込んだにも関わらず,快く展示させてくださいました.
今回の喋る帽子は,カワサキハロウィンのイベントが台風の影響でパレードが中止になってしまい参加を取りやめてしまったので,ご近所さん以外にお披露目する機会がなくなってしまいました.
展示させていただいたおかげで,たくさんの皆さんに見て頂くことができました.
ありがとうございました.
賞品が届きました.