あどりぶろぐ=adli"B"log

表情認識を研究する海なし県民のブログ

Raspberry PIで作るIoTパズルゲーム「借り物クロスワードパズル」

f:id:shubarie:20180210183030j:plain

 はじめに

2017年11月、岐阜県で行われた親子向けの理科系イベント「ぎふサイエンスフェスティバル2017」の1ブースに「ひらめきパズル教室~借り物クロスワードパズル~」というテーマで出展させていただきました。

 

「借り物クロスワードパズル」は上の映像のように、現実世界の物体を撮影することで空きマスを埋めていく形式のクロスワードパズルゲームで、キーとなる物体を探すために実際に体を動かして物を見て、人とコミュニケーションをとることと、現実世界とインターネットのつながりを感じてもらうことの2つを目的として作りました。

 

僕ともう一人(非プログラマー)でグループを作り、プログラミングは僕が、それ以外の資材調達や外装作成、クロスワードの問題作成と資料作成をもう一人にやってもらうという体制で、1カ月程かけてのんびりと完成させました。

 

企画段階では「パズルとIoTを絡めて何か作ってほしい」と、やんわりしたテーマが与えられたので、その範疇で子供に興味を持って遊んでもらえるものは何だろうと考えました。

 

パズルの種類をリストアップして、インターネットを使えばそれぞれのパズルがどう面白くなるか…考えた末に出した結論が「クロスワードパズル x 一般物体認識API」でした。

 

つぎはハードウェアの選定。

 

持ち運びできてインターネットに繋がり、複数台揃えてもコストが低く抑えられる、、、となると槍玉にあがるのはやはりRaspberry piです。

 

今回もこの例にもれずRaspberry Pi 3 Model BRaspberry Pi Camera Module V2を使うこととしました。

処理フロー

 

まずはざっくりした処理のフローチャートを図示します。

f:id:shubarie:20180210191904p:plain

借り物クロスワードパズル フローチャート

要は、キーに対応した物体をカメラで撮影したら、画像がAPIに投げられて、API上で一般物体認識がなされ、意図したレスポンスがAPIから却ってきたら空きマスが埋まっていくということです。

 

なお、タッチ対応の3.5インチLCDを使ったので、フローチャートの「タッチ」という記述は内部的には「クリック」で判別しています。

 

スクリプトはこちらで公開しています

github.com

 

核となるAPIには「Google Cloud Vision API」を使いました。これに関しては、前々から触ってみたかったので良い機会でした。

 

「借り物クロスワードパズル」のガワは、いつものようにPyQt5で作ったGUIアプリケーションです。こうやって見ると自分、何でもかんでもPythonで作ってますね…笑 あんまし良くないな。スキルが先立ったモノづくりじゃなくて、プロジェクトに合ったスキルを身に着けていくクセを付けないといつまでたっても成長しないよな…

 

とはいいつつも、問題なく要件を満たす動作をしてくれるのがPythonの偉いトコロです笑

 

話を戻します。

 

スクリプト内部では、クロスワードパズルの空きマスの部分をそれぞれPyQtのプッシュボタンとして、クリックされた場合に問題が表示されるようになっています。

 

問題が解けたら撮影ボタン(これもプッシュボタン)をクリックします。するとダイアログが立ち上がり、カメラモジュールからの入力画像をプレビューするようになっています。

 

クリック検出で画像を書き出し、書き出した画像をそのまま「Google Cloud Vision API」に送信します。

 

Google Cloud Vision API」のlabel_detectionからは写っていると予想された物体の「単語リスト」が却ってきます。この「単語リスト」と、あらかじめ設定しておいた「回答リスト」を参照し、1か所以上一致した場合は対応した空きマスが「回答」で埋まります。

 

ちょっとわかりにくい気がしたので、以下に例を示します。

問題:"雨の日は長くなって、2つそろって1つのもの"

想定するレスポンス: ["footwear","shoe","sneakers","boot","outdoor shoe"]

実際のレスポンス:["asphalt","shoe","pattern","joiont","sneakers"]

表示される単語:クツ

 

感想

かなり力技で一般物体認識とクロスワードパズルを絡めた感がありましたが、子供たちは熱心に遊んでくれました。

f:id:shubarie:20180210183021p:plain

「借り物クロスワードパズル」で遊ぶ男の子たちとそれを見守る我々

f:id:shubarie:20180210183208j:plain

エキ(液)を撮影する女の子

今回の製作で難しかった点として、APIから却ってくる単語群だけでクロスワードパズルを作成すること、Raspberry PI Camera Moduleから画像を得てプレビューすること の2点があげられます。

 

1点目は地道にAPIをテストし、使えそうな単語をリストアップすることで(気合で)解決しました。

 

2点目はLinuxにおいてカメラデバイスにアクセスするためのVideo for Linux 2 (V4L2)という技術を見つけてそれを使うことで解決しました。ただし、実装まで紆余曲折を経てクタクタになったので、次からはUSB接続のWebカメラで撮影することにしようと決意しました笑

 

実はもう1点、タッチ対応LCDのセットアップも手間取ったのですが、そちらは以前に記事を書きました。

adliblog.hatenablog.com

 

知見

・子供が楽しそうに遊ぶ姿はモノづくりの醍醐味かもしれない

GUI実装はユーザ層に合ったわかりやすいものを作る必要がある

Raspberry PI Camera Moduleは(俺にとっては)クソだった