ユニティちゃんGOを公開しました クローンゲーム制作最速のメソッド

こんにちは。海行です。

ポケモンGOに対抗してユニティちゃんGOを作りました。

AndroidがあればGooglePlayからダウンロードできるので、ぜひ遊んでみてください。

https://play.google.com/store/apps/details?id=jp.ne.sakura.soysoftware.unitygo


何故クローンゲームを作るのか

何故私はクローンゲームを作るのか。
その行為にどんな意味があるのでしょうか。

まず、やっぱりそのゲームが好きだからこそ真似したくなるという事があると思います。

次に、そのゲームが話題だからという事。
話題に乗っかりたいという事もあるでしょうし、何より物凄い話題になってる物というのはゲームに限らず歌や漫画などのコンテンツでも、その中に一定の真理が含まれているからこそみんなの心に響いて話題になったのでしょう。(このロジックは蒼天航路からの受け売り)

つまりクローンゲームを作ることはその元ゲーム、ひいては真理を理解するという事なのです。

もちろんゲームを普通にプレイするだけでもそのゲームのルールや攻略法は理解できます。
そのゲームが面白いのか、面白くないのかも触れば自分自身がのめり込むかどうかで判断できます。
でも、そのゲームが何故面白いのか、そもそも何故こういうルールになってるのかなどはプレイしてもハッキリこうだと理解するのは難しいです。

同じようなゲームが一杯出てジャンル化したゲームなら、似たゲームとの差分を比べてこっちはこの要素があるから面白い、など論じる事はできますが、いきなり画期的なゲームがポンと出てしまった場合は比較対象が無い内は分析は困難です。

そんな時、そのゲームの何が面白いのか理解したい時はクローンゲームを作ることが一番手っ取り早いのです。

クローンゲームを作ってみて、原作と同じように作ったのにこっちは全然面白くない、という事であれば、原作の面白さはクローン側でまだ未実装の部分か、あるいは見逃してる秘められたパラメータか何かにあると切り分けができます。

逆に、原作と同じ面白さがある!という所までいけば、後はどこまで要素を削ってその面白さが維持できるか、あるいは何をどこまで変えたらつまらなくなるか、あるいは面白くなるかを調べる事で原作の何が面白いのかが浮き彫りになります。

~のようなゲームを作りたい!と思ったら、まずは原作を完コピして面白さを理解した上でアレンジするという流れが鉄板だと思います。


クローンゲーム制作最速のメソッド

そういう訳で「クローンゲーム制作最速のメソッド」と題して、開発中のツイートの記録を頼りにユニティちゃんGOリリースまでの制作日記を書いてみたいと思います。

■7月22日 ポケモンGO日本リリース

この日の10時頃に日本でポケモンGOがリリースされました。

私はポケモンGO発表時からこれは物凄いゲームになると予測して注目していたので、リリース直後に早速ダウンロードして雨の中ピカチュウを捕まえに出撃していますね。

↑12時の時点ですでに不穏な動きが見られます。

早速クローンゲーム制作に着手しようと考え始め、まずはIntel MapからIngressのポータルデータ(これはポケストップのデータに転用されてます)をぶっこ抜こうと考えたようです。

しかし、NIANTICにとってはプレイヤー達と一緒に当然苦労して作り上げたポータルデータは大切な財産でありますし、データぶっこ抜きはサーバーに大きな負荷がかかってしまうなどの理由からか、Intel Mapにはすでにボット対策が仕掛けられており、ぶっこ抜きのスクレイピングスクリプトは動作しなくなってました。

13時には方針を転換してもう少しリーガルな方法を考えようという事で、オープンストリートマップというオープンソースの地図プロジェクトのデータを利用しようと考えたようです。
ライセンスもクリエイティブコモンズなのでこっちの方が無難でしょう。

オープンストリートマップから日本の地図データをダウンロードしてスポットのデータを抽出することに成功したようです。
抽出データはIngressのポータルデータの代用として使えそうですね。

■7月23日 仕様把握

この日はたしか仕様把握という名目でポケモンGOで遊びまくってて、とりあえずLVを5にしてジム戦を試してみたりした気がします。

オープンストリートマップから抽出したスポットデータはSQLiteに保存してUnityに読み込ませようかななどと画策しています。

昔試したマップ表示アセットを引っ張り出したようです。
ポータルデータの次は地図表示をどうするかについて考えてますね。

この時試したアセットでは内部でMapQuestというサービスを呼んでいるのですが、残念ながらすでにMapQuestのタイルマップ要求APIはクローズしてしまってました。

ActionStreetMapという、オープンストリートマップのデータを読み込んで3Dのマップを表示してくれる無料Unityアセットの使用を検討してますが、使い方がわからず(ドキュメントもない)このあと諦めます。

ここではGoogleMapのStaticMapsAPIの使用を検討してますが、まず勘違いしてるのがGoogleMapsAPIが無料というのはAndroidのViewにGoogleMapを表示できるサービスの事で、Unityからは使えない物です。

Unityでテクスチャとして読み込めるタイルマップ画像を取得できるStaticMapsAPIもありますが、こちらも無料枠は1日に2万5千枚までとかなり限定されてるのでボツに。

■7月24日

↑そろそろ私以外にもユニティちゃんGO制作に取り掛かる方が現れてます。
クローンゲーム開発競争は熾烈な争いだ。

↑その頃私はこんな漫画を描いていた。

通信でタイルマップを取得するのは諦めて、またもやオープンストリートマップから道路のデータだけを抜き取ってローカルに持たせようかなという事について画策してますね。

■7月25日

この日には、GPS使って地図表示してポケストップどうこう…って仕様を再現するのは結構手間だから、とりあえずはボールを投げてモンスターを捕獲するところだけ作ってとにかく一番乗りでリリースする事に集中しよう!という事を考え始めました。

差しあたってまずUnityでジャイロセンサーを使ってARでユニティちゃんを表示しようとしてさっそくトラブってる様子。

寝るまでにスワイプでボールを投げるあたりまでは作ったっぽいです。

■7月26日

キャラの頭の上に名前とCPが表示される奴を作ろうとしてますね。

UI周りを作っていますね。

撮影ボタンでスクショが撮れる奴を作ってますね。

■7月27日

クリアしたらLoadLevelで最初に戻してシーケンスを通そうとしてますね。

セーブ、ロード周りを作ろうとしてますね。

大体完成したのでさっさと効果音を入れて動画を撮ってアップしたいのに効果音集アセットのインポートに時間がかかりすぎてイライラしてますね。

ここに来て実機での表示バグに遭遇してテンパってますね。

結局朝までかかっちゃってますが、とりあえず完成したので動画上げて寝たようです。

寝る前にユニティちゃんの画像アセットを使ってアイコンなどをササッと作って、GooglePlayにアプリ申請も出しておきました。

■7月28日

起きて確認したらGooglePlayに提出したアプリは著作権侵害の容疑で却下されてましたが、ここは慌てずにユニティちゃん関係のアセットについては正当な権利を得て使用してる旨を返信しておいて、とにかくさっさとみんなに遊んでもらえるようにアプリ公開したかったので一旦自分のサーバにapkをアップしました。

今回、せっかくなので新しい試みとしてUnityAdsの導入もやってみました。
動画広告を観るとボールが30個もらえるって奴です。

Googleの審査中にとりあえず新機能として日本語と、英語の言語切り替えを実装してます。

そうこうしてる内に無事に審査が終了してユニティちゃんGOがGooglePlayで公開されました。
めでたしめでたしです。

という訳で以上がユニティちゃんGO制作のあらましとなります。


今後の展望

完成して公開はしたものの、だからと言って最初の方で書いたような、ユニティちゃんGOを作る事でポケモンGOの面白さの謎がわかったのか?というと、まだそこまでは…という感じですね。

話が違うやんと思われるかもしれませんが、今回は要するに再現率がまだ低いせいかなと思います。
誰よりも早く出したい!と焦るあまり、結局ボールを投げて捕獲、の部分しかできてないですからね。

という訳で、今後の展望としては、GPS地図機能周りや捕獲したキャラのコレクション機能などを強化して、より原作に近づける事が一番ではないでしょうか。

その後は独自の機能を入れたりして新たな面白さを付加していける流れに持っていけたらベストですね。

Undertaleとまなざしの話

Undertaleというゲームについての与太話。ネタバレを含みます。

私たちは常に他人の視線に晒されています。
街を歩いている時に他人から見られないで済ますというわけには行きません。ある意味で我々の行動は他人のまなざしによって規定され、制限されています。
例えばファミレスで明太パスタを食べた後、皿に残った明太子の粒々をねぶりとったりしないのは、そこに他人の視線があるからでしょう。
家の中にいれば他人のまなざしから逃げられるでしょうか?しかし、家の中に籠って隠れても、LINEの友達からはあなたからのメッセージが来ないことを監視されている、そうではないでしょうか。
じゃあ無人島に住めばまなざしから逃れられるでしょうか?しかし無人島で一人で生き抜くのは困難です。
というわけで我々はこの社会で生きてる限り他人からのまなざしから逃れる事は不可能でしょう。
そして、他者からのまなざしによって自分の人生が規定され、束縛を受ける事からは逃れられないのです。

ちなみに僕は読んでないですが、見田宗助さんの「まなざしの地獄」という本には、他者とは生きる意味と喜びの源泉であり、また、ありとあらゆる不幸の元であるというような事が書いてあるそうです。

前置きはこれくらいにして、Undertaleの話に入ります。
Undertaleでは主人公(Frisk)は執拗に徹底的に他者のまなざしに晒されます。

トリエルさんは最初、主人公の一挙手一投足を見守ってますし、別れた後も執拗に電話してきます。

次に現れるフラウィーも「君が誰も殺さないでどこまでいけるか楽しみだ」というような事を言ったのち、後をつけてきて見張ってきます(もと来た道を歩くとたまにチラチラ映る)

一番極端なところでは、RUINSを抜けたら茂みやら何やらそこらじゅうに監視カメラがあり後ほどアルフィス博士が主人公の行動を常に見張っているという。映画のトゥルーマンショーばりの見られっぷりです。

サンズも行く先々で現れて、主人公の冒険を監視してるみたいだし、最終的には主人公の行いの審判を下します。やはり強力な眼差しです。(「ちゃんと目ん玉ひん剥いて見といてやるからよ」)
雪かけらを持ってエンディングを迎えるとその事について言及しますが、つまりそういうところまで見張られてます。

マフェットの蜘蛛もクモのドーナツやサイダーを買ったかどうかで対応が変わりますね。

パピルスとアンダインは友達になるまでは主人公を追いかけて捕まえようとします。追跡のまなざしですね。友達になった後も常に電話に応じてくれるので、ある意味で間接的な監視と言えるかもしれません。

隠しキャラのガスターさんも、次元のはざまに砕け散って世界に遍在するようになってしまい、主人公の事を見ているらしいです。

主人公を何度もTVショーに出演を強制するメタトンなんかは、まさに主人公をトゥルーマンに仕立て上げようとしてると言えるでしょう。EX戦なんかは視聴率も爆上げになってしまって、まさに地下世界中のまなざしを主人公に集めてしまった感じです。

さて、これでどいつもこいつも主人公にまなざしを向けている事はわかりましたが、どのまなざしにもある期待が込められてします。
「いい子にしてなさい」という期待です。
Gルートのパピルス戦でのパピルスのセリフなんかが象徴的だと思います。
これらの期待のまなざしによって主人公の行動は規定され、不殺を貫いたりもするでしょう。

しかしまなざしは同時に束縛でもあります。
他者からのまなざしに縛られたくない、しかし他者が存在する以上まなざしからは逃れられない。

本当にそうかしら?だったら他者がいなくなればいいじゃない。
というのがGルートって感じでしょうか。

Gルートを完遂して、世界を破壊して、これで誰も眼差しを向ける者はいなくなった。
私は自由だ!
と思ってたら出てくるのがCharaです。Charaは主人公の中に潜んでいて、主人公の事をずっと見ていた存在です。
ある意味自分自身みたいなものです。
世界を破壊してそして誰もいなくなっても、結局自分を見つめる自身のまなざしからは逃げられなかった…というオチだった…?

そういえばCharaがお目目パッチリなのに対して主人公はずーっと目を閉じています。
つまり主人公はまなざしを持っていないという事です。
という事は他者を規定し縛ることができません。
トリエルさんやアルフィスやパピルスにアプローチしてデートしても毎回フラれるのは主人公がまなざしを持たざる者だからかもしれませんね。(Charaにはベストフレンドがいる)

UnityAframeExporterを作った話

こんにちは、海行です。

そう言えば去年の年末にUnityAframeExporterを作ったんですが、そのまま放置してて、ブログにも記事にしてなかったので、書いてみます。

UnityAframeExporterとは何か?
UnityのSceneをA-Frameとして出力できるUnityアセットです。

ではA-Frameとは何か?

A-Frameとは?


Mozillaが開発している、手軽にWebVRコンテンツを作れるフレームワークです。
ブラウザから閲覧できる3DのVRコンテンツを、htmlのタグ打ちみたいなノリでササッと作れます。

公式サイトはこちら
Examplesで色々なサンプルを見れるので、どんな事ができるのか大体確認できます。

詳細な情報はすでに親切な解説を上げてくださってる方々がいらっしゃるのでそちらをご参考に。

参考リンク:
新しいWebVRフレームワークA-Frame入門
HTML数行でVRできるA-Frame

A-Frameで何が嬉しいかというと、これまであまり簡単に制作する手段の無かったWebVRコンテンツを、お手軽に制作できるようになりました。
何でWebVRがいいのかというと、何といってもマルチプラットフォームですから、一つのコンテンツをOculus Riftからでも普通のPCブラウザからでも、Cardboardからでもスマホ単体からでも楽しむことができます。
わざわざユーザーにアプリをインストールしてもらう必要もないのでめんどくさくなくて、気軽に体験してもらえるはずです。

とりあえず今すぐA-Frameが活躍できそうな分野は、

・全天球写真、動画をHMDやブラウザで楽しむコンテンツは一瞬で作れる(全天球動画はYoutubeでも楽しめますが)
・自作の3DモデルをHMDやブラウザで眺めたりウォークスルーするコンテンツは一瞬で作れる

要するにこういう置いただけのライトなコンテンツはすぐ作れます。
ただしそれ以上に色々凝ったギミックをやろうとするとjavascriptを書きまくるはめになります。

UnityAframeExporterとは?


A-Frameのおかげで簡単にWebVRコンテンツが作れるようになりました。
しかし、私なんかはA-Frameのタグ打ち自体がすでにダルい!

3D空間にタグで座標指定してhtmlを保存してブラウザをリロードして確認して…もうちょっと上かな…って修正して…
なんて事チマチマやってられないという訳です。

3Dにオブジェクトを配置するならエディタが必要不可欠でしょう。
が、A-Frameのためにイチから3Dエディタの開発なんてそれこそやってられません。

そこで一計を案じて、UnityエディタをA-Frameエディタとして使ってしまおうという訳です。
Unityエディタで好きなように3Dオブジェクトを配置して、そのシーンをそのままA-Frameとして出力出来れば一発OKです。

今回はA-Frameを出力しましたが、フォーマットさえ変えれば、どんな形式の物でも出力できると思います。
やろうと思えばUE4に対して出力することもできるでしょう。
というかもう作られてます。

参考リンク:
Thread: Unity to UE4 scene converter

さて、UnityのシーンをA-Frameに変換するわけですが、これでUnityのアセットストアの3DモデルをA-Frameに持ち込んだらどうなるんだろう?
そもそもアセットストアのアセットをUnity以外で使っていいのか?
アセットストアの人に訊いてみました。

との事でした。
アセットストアのアセットはUnityからしか使えません!

ちなみに、ユニティちゃん関係のアセットはアセットストアじゃなくてユニティちゃんオフィシャルウェブサイトで配布されてますので、ライセンスはユニティちゃんライセンスのみが適用されます。

現在のユニティちゃんライセンスの規約ではUnityに縛る規定は無いので、A-Frameで出力も可能ですね。

UnityAframeExporterを使ってみよう


とりあえずサンプルの出力までを解説してみます。

まず、GitHubのUnityAframeExporterのリポジトリをクローンするか、「Download Zip」のボタンを押してZipファイルをダウンロードして解凍します。

Unityを起動してダウンロードしたリポジトリをプロジェクトとして開きます。

↓「sample」シーンを開きます。

AFrame1

↓プロジェクトビューのAFrameExporterプレハブをクリックしてインスペクタを開きます

AFrame2

インスペクタのExportボタンを押すとexportというフォルダにA-Frameを出力できます。

↓Runボタンを押すと出力したA-Frameをブラウザで実行できます。

AFrame3

Unityのシーンビューとほぼ同じ見た目でA-Frameに出力できました。

こんな感じです。
その他の細かい仕様や注意点はGitHubリポジトリのREADMEをご確認ください。

互換性はかなり低いので、Unityで作ったバリバリのゲームのシーンをそのままA-Frameにコンバートしようとしても表示が崩れると思います。
そこはあくまでUnityエディタをA-Frameエディタとして使えればいいと私は割り切ってるので、ご了承願います。

UnityAframeExporterの使用例


なにか使用例があった方がいいだろうなと思って作りました。

ユニティちゃん達

ユニティちゃん達を置いただけのA-Frameです。

↓URLはこちら
http://umiyuki.github.io/aframe-sample/

GitHubPagesに置くだけで公開できるのでラクでいいですね。
ホントはもうちょっと何かギミックを仕込もうと思ってアレコレ触ってたんですが、色々あって断念しました。

さて、まるですんなりとUnityからA-Frameをエクスポートできたように言ってますが、実際には色々と手間がかかりました。
まず、前述のサンプル出力画像を見てもらえばわかるのですが、出力されたユニティちゃんに微妙なシェーディングがかかってます。
これはA-FrameではUnityのシェーダをそのまま適用できる訳ではないので適当に変換してるせいです。
微妙なシェーディングになるくらいなら、いっそシェーディング無しにしましょう。

UnityでUnlit系のシェーダを適用するとA-FrameのFlat(シェーディング無し)になるようにしてあるので、ユニティちゃん達のすべてのメッシュのシェーダをUnlit/Textureに差し替えます。
さらに、ユニティちゃん達のテクスチャはtga形式ですが、A-Frameはtgaに対応してないのでpngで保存し直した物に差し替えます。
これで大体OKかなとGitHubPagesに上げてみたら何故かユニティちゃん達の身体が表示されずに生首が浮いてました。

なぜ?とあれこれ調べてたら、何故かはわかりませんがGitHubPagesだとアンダーバーから始まる名前のファイルの読み込みに失敗するようです。
これもチマチマリネームしました。

そんなこんなで結局一筋縄ではいかない感じですが、それでも使いこなせば便利かもしれないので、よかったら使ってみてください。

A-Frameについて思う事


そんなA-Frameですが、試した感じとしてはまだちょっと安定してないかな?という印象です。
なんかローカルだとファイル読み込みが上手くできなかったり、CHANGELOGを見たらガッツンガッツン仕様変更が入ったりしてます。
個人的には、VRモードのままA-Frameから別のアドレスのA-Frameにジャンプしたりしたいのに、ブラウザの制限のせいでできないのがつらい所ですね。

慌てて使うより、もう少し成熟するのを待った方がいいかな?と思いますが、WebVRやる必要があるなら試す価値アリです。
スマホでどこまで動作するのか怪しいあたりがイマイチ手放しにプッシュできない所なんですよね。

記事では散々ライトなコンテンツしか作れない的な言い方をしてますが、実はかなり奥深いところもあります。

例えばこちらのa-invadersでは、A-Frameでゲームっぽいものが動いてます!

A-Frame内の要素はEntity-Componentパターンで構成されています。
つまり、自分でjavascriptで書いたコンポーネントを各エンティティにアタッチして機能拡張することができます。
考え方としてはUnityのコンポーネント指向に似てるんですよね~。

使いこなせば結構凝ったゲームとか作れるかも!?

だからA-Frameは今後成熟にともなって大きなポテンシャルを発揮するかもしれないと思ってます。

今後の展望


UnityAframeExporterは改良の余地がありますが、もうあまり弄らないかも…
せっかくGithubにMitライセンスでアップしたので、誰かがいい感じに直してくれるのを期待します!(他力本願

そもそもWebVRの今後の展望が気になります。
果たしてWebVRの時代はやって来るのでしょうか。

単発のVRコンテンツが散発的にあちこち置かれてるだけだとイマイチスケールしなさそうな感じがするので、何はともあれWebVRからWebVRへシームレスにリンクして、巨大なVRネットワーク世界を形成できるようになる事が重要な気がします。

人工知能に働いてもらう!?の巻

こんにちは、海行です。

私はかねてからコンピュータに働いてもらう構想について考えていました。
コンピュータが働いてくれるなら、人件費もかからないで電気代だけのランニングコストで済むのでオトクですよね。

せっかくJetsonTK1をお借りさせて頂いてるので、TK1に仕事を振っておけば、僕が寝てようが遊んでようが24時間ぶっ続けで働いてやってくれる仕組みを作ってみようと思います。

仕様


自分でやるのが面倒くさい仕事をやってもらうという事で、とりあえずChainer-goghによる画像合成を自動化してみたいと思います。

Chainer-goghはコンテンツ画像にスタイル画像の画風を適用できて、面白い画像を生成してくれますが、試してみないとどんな絵が出てくるのか想像できないところがあります。
一枚の処理にも時間がかかるので、一枚処理させて、終わったら別の組み合わせを試して…と面白い絵ができるまで手動で繰り返してたら面倒くさい事この上なしです。

コンテンツ画像のリストとスタイル画像のリストを渡すから、総当たりで全パターン処理してね!
とTK1に指示してやってもらえれば、これはラクチンです。

画像合成できたらどこか誰でも閲覧できるインターネット上にアップしたいと思いました。
TK1をwebサーバーにして何かwebアルバムアプリを突っ込んで閲覧できるようにしてもよかったのですが、TK1にはストレージ容量があまり無いこともあり、画像を無限にアップできるGoogleフォトのアルバムにアップする方式にしました。
FlickrやInstagramでもよさそうですが、これらは写真しか上げちゃいけない雰囲気がありそうだったので避けました。

仕組みを図示するとこんな感じです。

図

①まず、ユーザー(私)がGoogle Photoのスタイル画像用アルバムとコンテンツ画像アルバムに、合成に使ってみたい画像をアップしておきます。
②TK1はGoogleフォトの2つのアルバムを参照して、ローカルに持ってない画像はダウンロードして同期します。
③TK1はまだ作ってないパターンの合成画像を探して、合成して、終わったらGoogleフォトの合成結果用アルバムにアップロードして、②に戻ります。全パターン完了するまで繰り返します。

Googleフォトを使う事で、どこにいても素材画像をアップできますし、自分以外の人に素材画像をアップしてもらう事も可能になりました。

実装


TK1にはUbuntuが入ってるので、プログラム言語の選択肢は色々あります。

要するにchainer-goghを繰り返し叩くだけなので、bashでも良さそうな気がしましたが、若干ややこしい処理が入るかもしれないですし、Pythonからでもコマンドを叩けるという事らしいので、Pythonで書く事にしました。

参考リンク:
Pythonから外部コマンドを実行する

Pythonを書くにしても何のエディタで書けばいいかなと思いましたが、Visual StudioにPython拡張があるらしく、インテリジェンスも効くらしいのでこれを使う事にしました。
メインPCのWindowsにもPythonの環境は入れてあるので、Windowsで開発して動作確認してからTK1にデプロイする流れで行くことにしました。

参考リンク:
「Visual Studio 2015」に対応した「Python Tools for Visual Studio 2.2」が正式版に

Googleフォトには画像をアップしたりできるAPIはあるのかな?とググッたら、無いようでした。
早くも挫折しそうになりましたが、どうやらPicasaウェブアルバムAPIでGoogleフォトにアップしたりできるとわかりました。
PicasaウェブアルバムAPIはPythonもサポートされてるそうです。

参考リンク:
Picasaウェブアルバムは4月いっぱいまで APIも一部サポート終了へ
Developer’s Guide: Python
Getting Started with the Google Data Python Library
日暮途遠(Linux) Posts Tagged ‘Picasaウェブアルバム’
Picasa APIの使い方まとめ(サンプルコード付き)

ちなみに、Developer’s Guide: Pythonでは

をしてからgdataとatomフォルダをコピーしてくればOKと書かれてますが、実際にはtlsliteのインストールも必要です。

さらに、Pythonを使ってGoogleフォトにアップする方法を調べてると、ありがたい事にそのものズバリのPythonスクリプトをGithubに上げてくれてる人がいました。

参考リンク:
Using Google Picasa API with Python
A python-based file uploader for PicasaWeb

これはフォルダを指定すると、そのフォルダ名でGoogleフォトにアルバムを作って、そこにローカルにしかない画像をアップするスクリプトです。
PicasaウェブアルバムAPIはメールアドレスとパスワードを入力して簡単にログインする方法は非サポートになって、ややこしいOAuth認証でのログインが必須になりましたが、このスクリプトではOAuth認証でのログインができます。

という訳で、このスクリプトをベースにさせてもらって書いていくことにしました。
ローカルにしかない画像をwebにアップする事はできますが、web側にしかない画像をローカルフォルダにダウンロードしてくる機能は無かったので追加しました。

参考リンク:
How do I download images from Picasa Web API in Java
Webサーバーにあるファイルをダウンロードする

それと、GoogleのOAuth認証を行うにはクライアントシークレットという文字列が必要になります。
Googleデベロッパーコンソールで認証情報→認証情報を作成→OAuthクライアントID→その他 で作成できます。
OAuthログインでは初回だけブラウザで許可リクエスト画面が出てくるので、いきなりリモートのsshで実行してもログインできません。
初回は手元のPCで実行するとか、TK1にディスプレイを繋いで実行する必要があります。

chainer-goghの呼び出しは普通にコマンドを叩く感じでsubprocess.check_output()を使いました。
一つの長い文字列として渡してみると、Windowsでは上手くいきましたがJetsonTK1上ではだめでした。
引数ごとに要素を区切ったリストとして渡さないといけないようです。

大体処理が上手くいったのでwhile(True)の無限ループで囲んで、全パターン終わったらsys.exit()で抜けるようにすれば完成です。
と、思ったら、APIをポツポツ叩いてると突然Googleサーバーから遮断されてエラー終了する事がありました。
負荷をかけすぎたのでしょうか。
どれくらい負荷をかけると規制されるのかはよくわかりませんが、しばらくしたらまた正常に通信できるようになりました。

なので、対策として、main関数をtryの中に入れて、何かエラーが起きてcatchしたら10分待ってリトライする処理を加えて通信エラーが起きても強制終了しないようにしました。

結果


上手い事動くようになりました。

まず、こちらがコンテンツ画像アルバムです。こちらがスタイル画像アルバムです。

ちなみに他の人からもアルバムに画像をアップできる設定にしてあるので、Google+にログインすれば今のところ誰でもTK1に画像合成させられます。

そして、こちらが合成結果画像のアルバムです。
大体8時間に1枚くらいのペースでアップされてるようですね。
使用してるモデルはi2vで画像サイズは435ピクセル四方です。

これで、TK1君に自動処理でジャンジャン画像合成させる目的は達成できました。

Twitter連携


完成はしましたが、何だか黙々と画像を合成してて、人間味がない感じがします。
画像合成に成功する度に報告もしてほしいです。

そこで、JetsonTK1からの報告用のTwitterBOTを作ることにしました。

↓こちらです。

https://twitter.com/JetsonTKoneChan

JetsonTK1はウチに入社してきた新入社員という体の設定で、JetsonTK1oneちゃんという名前にすることにしました。

Pythonからtwitterに書き込みを行うのは参考URLの情報を参考にかなり簡単にできました。

参考リンク:
Python で Twitter API にアクセス
Python で画像付きツイート

今後の展望


大体思ってた通りのものがいい感じにできたので、これからもTK1やラズパイ3に色々面倒な仕事を振っていきたいと思います。

とりあえず次に何をさせたいかというと、保有銘柄株式価格の推移やドル円の報告を一日一回くらいしてほしい感じがしますね。
そういうAPIがある訳ではないみたいですが、WebからスクレイピングしてくるPythonのライブラリがあるようです。

参考リンク:
Yahooファイナンスをスクレイピングして株価を抽出する

1万円くらいを元手にコンピュータに株を自動売買させて遊んでもみたいんですが、やっぱりそれもAPIを用意している証券会社はほぼ無いようです。
まあ、誰でも簡単にアクセスできるAPIがない状況だからこそ、スクレイピングなり何なりで自分だけやってしまえば、逆に出し抜けるチャンスではあると思いますが。

twitterのBOTが作ってみたら結構面白かったですね。
BOTをフォローしておけばツイートさせるだけでゆるい報告になって便利です。
緊急の報告はリプライやDMを飛ばせばいいでしょう。

そういえば先日のBuild2016でSkypeやSlackのBotが作れるMicrosoft Bot Frameworkが公開されましたね。

参考リンク:
Microsoft、人工知能ボット作成フレームワークを公開

Line用のBotが作成できる「BOT API Trial Account」の提供も開始されました。

参考リンク:
【LINE】メッセージングAPIのオープン化に先駆け、先着1万名限定でBOTアカウントを自由に開発できる「BOT API Trial Account」の無償提供を開始

これからはBotがアツい!?
このビッグウェーブに乗っかって何かやってみたいですね。

OpenToonzの人工知能プラグインを試そうとしたら大変だった話【DWANGO_NeuralStyle】

こんにちは、海行です。

先日、スタジオジブリでも使われていたToonzというアニメ制作ソフトがOpenToonzとなってオープンソースで無償公開されました。

参考リンク:
ジブリも使うアニメ制作ソフト「Toonz」オープンソースで無償公開 現場の声を研究に活用

このソフト自体にも興味がありますが、搭載されたというドワンゴ製の人工知能を使った画風変換プラグインというものが気になります。
とりあえず試してみようとしましたが、試すまでに物凄くハードルが高くて大変でした。
他の方が試す際に助けになるように、レポートしたいと思います。

インストール環境


私の環境はWindows10 64bitなので、この環境を前提に説明していきます。

OpenToonzのインストール


↓こちらがOpenToonzの公式ページです。

OpenToonz

下の方にダウンロードの項目があります。
「OpenToonz」「GTS」「エフェクト」と3つの項目がありますが、とりあえずOpenToonzだけダウンロードしてインストールします。

エフェクトプラグインのインストール


OpenToonz本体にはドワンゴ製エフェクトプラグインは含まれていないので、導入します。

先ほどのダウンロード項目からエフェクトをクリックすると、いきなりGitHubのリポジトリに飛びます。
下の方のREADME.mdに英語でインストール方法の説明が書いてますが、「日本語」というリンクから日本語の説明に飛べます。

説明の中に、プラグインダウンロードリンクがあるので、そちらからダウンロードして解凍して、説明に従ってpluginファイルをC:\OpenToonz 1.0 stuff\pluginsにコピーします。

さらに、OpenCV3.1.0の導入が必要との事なので、OpenCVをダウンロードして、私はCの直下に解凍しました。
opencv\build\x64\vc12\binにあるopencv_world310.dllなどをOpenToonz_1.0.exeがあるフォルダにコピーする必要があるとのことですが、私の場合は環境変数のPathにopencv\build\x64\vc12\binを追加しました。

エフェクトプラグインの実行


さて、エフェクトプラグインの導入が終わったのでOpenToonzを起動してプラグインを試してみましょう。
しかし、初めて目にしたOpenToonzのインターフェースは意味不明でどうやったらプラグインを試せるのか色々触りまくって調べる羽目になりました。
相当わかりにくいので画像を入れて解説したいと思います。

説明1

何はともあれ画像がないとエフェクトのかけようがないと思ったので、「シーン」という画面に適当な画像をドロップしてみました。
ドロップするたびにシーンの下にCol1、Col2という感じで画像が追加されてってるようです。

説明2

で、エフェクトをかける画面はどれだ!?
メニューバーのウインドウ→その他のウインドウ→スキマティックを選ぶと「ステージ・スキマティック」という画面が出てきます。
ステージ・スキマティックの一番右下のボタンを押すと「エフェクト・スキマティック」という画面に変わります。
ここから画像にエフェクトをかける事ができます。

説明3

エフェクト・スキマティックはノードエディタっぽい感じになってます。
エフェクトのノードを追加するためにエフェクト・スキマティック画面上で右クリックして「エフェクトを追加」でエフェクトを選択します。今回はPlugins→DWANGO→Kaleidoscopeを選んでみました。

説明4

エフェクトのノードが表示されたら、Col1、Col2などの画像のノードからエフェクトノードにドラッグして線をつなぎます。
エフェクトのノードをダブルクリックするとエフェクトのパラメータ設定画面が表示されてパラメータ調整できます。
エフェクトのノードを右クリックして「プレビュー」を選択することでエフェクト実行結果を確認できます。

NeuralStyleプラグインのインストール


プラグインのテストもできたところで、肝心の人工知能プラグインを試すぞ!
と思いきや、それらしいエフェクトは見当たりません。

どうやら人工知能プラグインは先ほどのプラグイン集のzipには含まれていないようです。
人工知能プラグインについての説明はこちらにありました。

Windowsへのインストールへの説明が書かれていますが、要するにChainerの実行環境とopenoptとcvxoptが必要だそうです。
いきなり難易度が上がってますが、開発者でなければ普通の人は導入は難しい気がします。

とりあえず説明に従ってインストールを行いますが、そもそものpluginファイルが配布されていない事に気付きます。
つまりこのプラグインを自前でビルドする必要があるという事です。
これはなかなか難関です。

NeuralStyleプラグインのビルド


プラグインのビルド方法についてはこちらに「サンプルのビルド方法」が書かれてます。
Cmakeが必要だという事なので、ダウンロードしてインストールします。

私はビルドにはVisual Studio 2015を使いましたが、Visual Studio 2015はデフォルトではVisualC++が入ってないのでまだ入れてない人は入れておいてください。

参考リンク:
C++/Visual Studio 2015 試用記

人工知能プラグインのリポジトリをクローンしてきて、私はCの直下におきました。
(日本語パスが含まれてるとCmakeの動作に悪影響があるらしいので)

私は自分で四苦八苦して知ったのですが、NeuralStyleプラグインをビルドするにはOpenCVのビルドも必要になるようです。

という訳でOpenCVを先にビルドします。
すでにOpenCV3.1.0は前述の通りインストールされているとします。
CMakeのGUIを起動して、「Where is the source code:」にC:\opencv\sourcesを、「Where to build the binaries:」にC:\opencv\buildを指定して、「Configure」を押します。
「Specify the generator for this project」は、私は「Visual Studio 14 2015 Win64」を選択しました。
(OpenToonzは64bitプラグインしか受け付けないようです)
そのまま「Generate」できればそれでいいのですが、私の場合はWITH_CUDAのチェックを外さないと上手くいきませんでした。

Generateに成功したらC:\opencv\buildにVisualStudio用のプロジェクトファイルが生成されてるので、開いてビルドします。
ビルドに成功すればOpenCVの準備はOKです。

続いて、本番のNeuralStyleプラグインをビルドします。
CMakeのGUIを起動して、「Where is the source code:」と「Where to build the binaries:」にC:\OpenToonz_neural_style_pluginを指定して、「Configure」を押します。
「Specify the generator for this project」は今回も「Visual Studio 14 2015 Win64」を選択しました。
OpenCV_DIRを指定しろ!と怒られるので、OpenCV_DIRをC:/opencv/buildに設定してもう一度「Configure」して上手くいけば「Generate」します。
後はやっぱりVisualStudioを開いてビルドして、成功すればC:\OpenToonz_neural_style_plugin\bin\Debugに「DWANGO_NeuralStyle.plugin」ができてます。

NeuralStyleプラグインの実行


プラグインのビルドが成功して、説明に従ってインストールも行ったら、いよいよ実行してみます。

その前に、ビルドしたOpenCVのdllファイルをOpenToonzのフォルダにコピーする必要があります。
C:\opencv\build\bin\Debugの中にあるdllファイルを全てC:\Program Files\OpenToonz 1.0にコピーしてください。

さらに、どこにも書いてませんが、C\:の直下に「TEMP」というフォルダが無いとNeuralStyleプラグインの実行でこけるので、作っておいてください。

これでようやく準備完了です。

OpenToonzからNeuralStyleプラグインを呼んでみます。
NeuralStyleノードは入力が2つあるのでスタイルに使いたい画像と変換ターゲット画像を指定します。
ちなみに何だかわかりませんがContentに入力した画像がスタイルに使われてStyleに入力した画像が変換ターゲットに使われるようです。

GPUを使いたい場合はパラメータのgpuを0にします。
イテレーションは10だとあまり効果が出ないので必要に応じて上げます。最大は1000です。
「プレビュー」を押すとプラグインの実行が始まります。
しばらく待って上手くいけば変換された画像がプレビューに表示されます。
お疲れ様でした。

説明5

それにしても、NeuralStyleプラグインのバイナリは何故プラグイン集に同梱されてないんでしょうか。
ビルドが上手くいかない人のために一応↓からビルドしたpluginファイル(windows 64bit向け)を配布します。

http://soysoftware.sakura.ne.jp/upload/other/DWANGO_NeuralStyle.zip

結局OpenCVもビルドしないといけないからあまり役に立たないかもしれませんが…

ちなみに注意しておきたい点として、OpenToonzのソフト終了時に、「編集を保存しますか?」というようなダイアログが出ますが、素直に従って保存して終了すると、二度とOpenToonzが起動しなくなる現象が頻発しました。
終了時の保存は今のところ行わない方がよさそうです。
もし起動しなくなったらC:\OpenToonz 1.0 stuffフォルダを削除か退避した上で再インストールする必要があるようです。

今後の展望


ただOpenToonzの機能を試したいだけだったのに相当苦労するハメになりましたが、それだけの価値はあったかもしれません。

私はこの人工知能プラグインというのは単なるchainer-goghのラップじゃないかと想像してましたが、chainer-goghで処理可能なサイズより大きな画像を処理できてますし、高速に動いている気がします。

もっといろいろ試してchainer-goghと比較したり、中のPythonプログラムを解析したりなど色々調べ甲斐がありそうです。

【Raspberry Pi 3 Model B】ラズパイ3を買ったのでセットアップ

こんにちは、海行です。

CeY1iA7UYAAp2JB

ラズパイ3が日本でも販売開始されたので、買ってみました。
この記事はセットアップの解説記事じゃなくて、ラズパイ3の入手自慢記事です。

ラズパイ3は2月29日に突如発表されて出荷されましたが、無線LANとBluetoothが内蔵になったため、技適マークが無いと日本国内で使用できない状況でした。
3月半ば頃に技適を通過して、国内での販売が開始されました。

ラズパイ3本体以外に必要になった機材として、まずストレージ用のmicroSDカードは32GBの物をポチりました。
そしてUSB電源アダプタについてですが、ラズパイ3は最大消費電力が12.5Wに増えたため、2.5Aを出力できる物が推奨されています。

参考リンク:「Raspberry Pi 3 Model B」発表のお知らせ

ですので、2.5A出力アダプタを確保する必要があるのですが、Amazonを見ても中々見つからなかったので、とりあえず2.4A出力のUSB電源アダプタをポチッて様子をみる事にしました。
見落としやすいポイントですが、電源アダプタだけじゃなくてUSBケーブルも2.4A対応ケーブルじゃないと必要なアンペアを出力できない場合があります。
普通のUSBケーブルと2.4A対応って何が違うんだと思いますが、銅線の太さが違います。
銅線が細いと流せる電流の量が限られてしまいます。
私はキャンドゥで2.4A対応の充電専用ケーブルを入手しました。

セットアップについては以前書いたラズパイゼロのセットアップ記事とまったく同じなので省略します。
この記事はセットアップ解説記事じゃなくてラズパイ3自慢記事です。

ただ、ラズパイゼロの時と違って起動中に画面の右上に謎の虹色の四角がずっと表示されて消えません。
なんだこれ?と思ってググッたら、これは電圧が足りない時の警告表示なんだそうです!

参考リンク:【Raspberry Pi】起動時に画面右上に出る四角の意味。

電源アダプタもUSBケーブルもしっかり用意したのに何故!?と思ったら、そういえば電源用USBケーブルの長さが足りなくてUSB延長ケーブルをかませてたんでした。
延長ケーブルを外して繋いでみたら虹色の四角は消えました。
しかし、電源とケーブル周りはしっかり準備しないと実際シビアだという事がこれでハッキリわかりましたね。

リモートログインできるようにしてlinuxマシン置き場に設置しましたが、ラズパイ3では無線LANが内蔵されてるため、ホントに電源だけ繋いでおけばよいのでスマートな感じでいいですね。

ラズパイ3はCPUが64bit対応になったので、OSのRaspbianも64bit版も出たのかな?と調べてみましたが、まだ準備されてないようです。
64bit化の恩恵が受けられるのはそれからになりそうですね!

セットアップが終わったので今後の展望について。
消費電力がかなり大きくなってるので、これまでのラズパイと比べて電子工作用途で電池で動かして遊ぶようなイメージは薄くなったかもしれませんね。
スペック的には私がレンタルしてるどのサーバーより高性能なlinuxマシンとなってしまったので、サーバーとして何かサービスを走らせる感じで使うかもしれません。
何か面白いものができたらまた紹介したいと思います!

Unityボイスチェンジャーフィルタをアセットストアで公開しました

こんにちは、海行です。

以前の記事で紹介した、ボイスチェンジャーフィルタアセットがUnityアセットストアで公開されました!

無料なので是非ダウンロードして使ってみてください。

↓こちらからダウンロードできます。
https://www.assetstore.unity3d.com/jp/#!/content/54963

使い方の説明として、OVRリップシンクプラグインデモにボイスチェンジャー機能を導入する動画を作りました。

是非ダウンロードして使ってみてください。

これで僕も晴れてUnityアセットクリエイターです。

アセット申請での知見


アセット申請は色々と大変で、すったもんだがあって公開が遅れてしまいました。

一つわかったのは、アセットストアチームにも色々な人がいるという事です。

初めての申請時は何か不備がないかドキドキしながら提出しましたが、返ってきた返事は「却下、理由は言えない」でした。

そんなにダメなアセットだったのかなとショックを受けましたが、考えてみるとそんな対応をされる謂われは無いぞという気がしてきました。
だってUnity社が「アセットどんどん作ってね~」って言うから作って申請したのに「ハイダメー!理由は言えません!」ってなめてるでしょ。

しょげてる場合じゃないな、断固抗議すべきです。
こういうすげない返事ですぐへこたれて諦めてしまうのではなく、この怒りをエネルギーにしてしつこく粘着してでも目的を達成すると心に決めました。

とりあえず、「却下はともかく理由を言えーーッ!」というニュアンスでメールを返しました。
どうなったかというと、返信無しの放置です。

完全に粘着すると決めていたので、うろたえません。
そっちがそういう事をするならこっちにも手があるぞ。という事で、まったくアセットの修正なしで再提出してみました。
何しろリジェクト理由を教えてくれないので修正しようがありません。

そうしたら今度は「パブリッシャーページに画像を設定してくれ」と返答がありました。
前よりは建設的な返答をもらえたので対応して再提出しました。

そうしたらあっさり通りました。
こういうものかな。

しかし、アセットに使用したworldという音声合成ライブラリが修正BSDライセンスなので、どのようにライセンス表示すればいいのか質問しました。

ところが、有料アセットではアセットストアのEURA以外のライセンスの混入は許されないという返答でした。

アセットストアの規約を確認してみると、確かにそのような記述がありました。
でも、現にいくつかの有料アセットではMITライセンスとかが含まれてるじゃないかと指摘してみましたが、この指摘は完全にスルーされました。

という訳で当初はVoice Changer Filterアセットは有料で提供するつもりでしたが、修正BSDライセンスが入っているので無料アセットとして公開しました。

めでたしと言ったところですが、結局何が言いたいかというと、不当な事をする人もいれば正当な行いをしてくれる人もいるので、自分の感覚を信じて諦めなければ目的は達成できるという話です。

みなさまにとって何かの参考になれば幸いです。

他に気を付けることとしては、有料アセットを提供する場合、アセットパブリッシャーの設定で収益の受け取り方法を設定しますが、口座振り込みだと手数料を取られたりするのでPaypal受け取りがオススメです。
その場合Paypal プレミアアカウントが必要になります。プレミアと言ってもお金がかかるとかではなくて、本人確認をしたアカウントはプレミアアカウントになります。
本人確認は、免許証などの画像をアップロードしたらハガキが送られてきてそこに書かれたパスコードで認証するので、合わせて1週間くらいかかります。

そのほか、アセット提出に関する情報はこちらのスライドに詳しいです。

参考URL:アセット作家になろう! ~作ったキャラクターやスクリプトをアセットストアに出品しよう!~

Jetson TK1をセットアップしてchainer-goghを叩く

こんにちは、海行です。

今回はJetson TK1のセットアップをして、GPUのCUDAのパワーを活かしてchainer-goghを走らせてみます。
(こいついつもセットアップしてんな)

CeM-zUlUEAEurzj

経緯


この前の記事でラズパイゼロにchainerを入れて走らせてみましたが、ラズパイの1GHzシングルコアのCPUでは色々とキビしい物がありました。

あのあと、ラズパイゼロでchainer-goghを走らせてみましたが、まず普通に走らせたらメモリ不足で落ちました。
そこで出力サイズを128ピクセル四方で指定して、動作が軽いninモデルを用いることで何とか実行させることができました。
しかし、丸一日かけても1000イテレーションしか進みません。
5000イテレーションで終了ですから、一枚の画像を処理するのに5日もかかってしまいます。

ちなみにLinux Mintを入れたVAIO typePでも走らせてみました。
こちらはリサイズ無しでchainer-goghが実行できましたが、丸一日かけて400イテレーションほどしか進みません。
一枚の処理に2週間弱かかってしまいますね。

勿論メインのデスクトップPCのGTX660を使えばGPUを使って一枚6分で処理できるわけですが、電力消費が大きくなってしまいますし、デスクトップPCを起動しっぱなしにするのは何となくイヤです。

ラズパイがここまで処理に時間がかかってしまうのは、NVIDIAのGPUを積んでないのでChainerのCUDAを使ったGPU実行ができないからです。
そうとわかれば、ラズパイ的な開発ボードにNVIDIAのGPUが積まれたシロモノであるJetson TK1に着目することになります。

参考リンク:
Tegra K1搭載の開発キット「Jetson TK1」を動かしてみた
NVIDIA Tegra K1搭載開発キット「Jetson TK1」ハンズオンセッションに参加してみた

そういう事をツイートしてたら、ザバさんからJetson TK1を貸していただけました!
ザバさんありがとうございます!

というわけなので取りあえずセットアップです。

セットアップ


先行事例の記事が上がっていますので、ありがたくそちらを参考にしつつ、NVIDIAの説明書に従って作業していきます。

参考リンク:
Jetson TK1事始め
Jetson TK1 をセットアップしてみた

とりあえずTK1を起動します。
すぐにsshに繋がるらしいですが、IPアドレスもホスト名も最初はわからないので、やはり例によって液晶ディスプレイ、USBハブ、USBキーボード、USBマウスを接続します。LANケーブルも刺しておきました。

付属のACアダプタを繋ぐと起動します。
早速GPUファンがうなってます。

内部ストレージのUbuntuがブートしてCUIが立ち上がります。
Linux Driver Binaryという物をインストールします。

しばらくするとインストールが終わって再起動されます。

再起動後はGUIの普通のUbuntuが普通に立ち上がります。
もうSSHでリモートログインする事もできます。
まあこれだけですでにGPUだけ異様にすごいUbuntuマシンになってますが、色々更新したりCUDAの開発環境を入れたいので、JetPack TK1という物を導入します。TK1と別のPC上でJetPackのインストーラを立ち上げてそこからUSBで繋いだTK1に書き込む形になるのですが、このJetPackがなんとUbuntu14.0.4しか対応してないという話なのです。

私のメインPCはWindows10なので、しょうがないのでVirtualBoxを使ってUbuntu14.0.4を仮想マシンとしてWindows上で実行しました。

参考リンク:
Windows の VirtualBox に Ubuntu 13.04をインストールしてみた
VirtualBoxをWindowsにインストール
VirtualBox を全画面(フルスクリーン)で表示する方法

注意点としては、JetPackの実行時に色々ダウンロードされるので仮想マシンのHDDサイズが少ないと失敗する可能性があるので、HDD容量は余裕をもって確保する必要があります。
20GBもあれば十分だと思いますが、私は50GBにしました。

また、USB接続を仮想マシンに認識させるためにUSBフィルターが必要なので、VirtualBoxにエクステンションパックも導入する必要があります。

参考リンク:
エクステンションパックの導入

さて、仮想マシンや実機などでUbuntuを起動したら、JetPack TK1をダウンロードして実行します。
TK1とPCを付属のUSBケーブルで接続します。
(この時ちょっとハマッたんですが、パスに日本語が含まれてるフォルダ上で実行すると失敗するのでjetpack~.runをhomeフォルダなどに移動してから実行してください)

JetPackに実行権限を付与します。
UbuntuではCtrl+Alt+Tでターミナルが起動します。

ファイルブラウザからダブルクリックして実行するとインストールが開始されます。

インストール途中で、TK1をリカバリモードにしてくださいという指示が出ます。
TK1には3つのボタンが付いてますが、フォースリカバリボタンを押しながらリセットボタンを押す(リセットボタンを押してから2秒くらいでフォースリカバリボタンは離してOK)とTK1がリカバリモードで起動します。
TK1の画面は真っ黒なままになりますが、これがリカバリモードです。

ホスト側のUbuntuでリカバリモードのTK1が認識されてるかどうかlsusbコマンドで確認してください。
「NVIDIA Corp.」という名前のUSBデバイスがあればOKです。
VirtualBoxを使ってる場合はこのUSBデバイスのUSBフィルターを追加しておいてください。

あとは最後まで順調にインストールが進みました。

TK1側でインストールされたサンプルを実行してみます。

エラーが出ないでデバイス情報が表示されればインストール成功です。

他にも色々なサンプルが入ってるので、試してみてください。
SmokeParticlesというサンプルを実行するとこんな感じです。
CeSGmfvUYAEHknu

GPUならではの表現って感じですね。

Chainer-goghの実行


セットアップも終わったので当初の目的だったCUDAによるchainer-goghの実行をやってみます。

この時点でCUDAやcudnnはインストールされてるので、

これでchainerのインストール完了です。

chainer-goghをクローンしてきてninモデルで実行してみます。

im_04950

35分ほどで実行完了しました!
これはいいですね!GTX660の6分に比べれば遅いですが、VAIO typePの2週間と比べれば圧倒的速度です。
これが電力消費5W以下で出来てしまうならエネルギー効率も悪くないのではないでしょうか。

しかし、ninモデルの実行には成功しましたが、vggやi2vモデルで実行すると、途中で「killed」と表示されて失敗してしまいます。
killedという事はメモリ不足でプロセスキルされたという事です。
確認してみるとTK1はデフォルトではスワップが無いので、スワップファイルを作って仮想メモリを確保してみます。

参考リンク:
Ubuntu でスワップファイルを追加する方法

とりあえず2GBのスワップを作ってみました。
これによりi2vモデルでの実行は可能となりましたが、vggモデルでは今度は「Memory error」が表示されて失敗です。

スワップが2GBでは足りなかったのかな?と思い4GBにしてみました。(内蔵ストレージは16GBなのであまりスワップを大きくするとディスクサイズが足りなくなります)
しかし結局「Memory error」です。動きを追ってみると物理メモリの2GBを使い潰した時点でエラーが発生してるみたいです。
物理メモリとスワップにまたがってメモリ確保できないのでしょうか?
あるいはVRAMのメモリ不足?

chainer-goghの実装を把握してるわけではないのでこれ以上考えても仕方ないです。
今回は深追いしないでおきます。

Jetson TK1の性能が素晴らしいという結論は変わりません。

まとめと展望


Jetson TK1は実用的速度と低消費電力(測ってないですがカタログスペックを鵜呑みにするなら)で動作する素晴らしいディープラーニング用マシンである事が検証できました。
ザバさんは使い倒してくれて構わないとおっしゃってくださったので遠慮なく色々やっていきたいと思います。

ひとまずは自動的にchainer-goghで画像を量産してアップロードしまくる仕組みを作って、勝手に色々描いてくれるマシンにしてみたいですね。

Jetson TK1の後継機であるJetson TX1ももうすぐ発売されます。

参考リンク:
カードサイズで1テラFLOPSな高速ボードコンピュータJetson TX1の日本発売が決定、開発キットは税込約9万8000円

消費電力は2倍、GPU性能は3倍以上になるらしいですが、価格も3倍以上という…
遊びで買える価格じゃないですね…本格的な使い道が思いついたら導入も検討してみたいです。

私はとにかく電気代の安さに着目したわけですが、こういう小さいコンピュータがこういった性能を発揮していく事で世の中をどのように変える事ができるのかという事についても色々想像してみたいですね。

VAIO type PをLinux Mintデュアルブート化してみました

unspecified

先ほどのラズパイゼロの記事に続いてこれです。

ラズパイゼロを弄ってる内に、しまいこんでたVAIO type Pが何だかだんだんキーボードとディスプレイとマウスを完備したラズパイに見えてきました。
無停電装置までついてる…?(ただのバッテリー

という訳でtypePにLinux Mintを入れてみます。

typePにLinux Mintを入れるのはすでにネット上で結構実績があります。

参考URL:
VAIO Type Pを三度使えるようにする
VAIO type Pには結局、Linux Mintを入れてみることに
VAIO Type P meets Linux Mint17.2

私はやっぱりVistaもあったらあったで便利な時もあるだろうと思ったので残しておいて、VistaとLinux Mintのデュアルブート化を目指しました。

手順


まず、HDDにWindowsXPが入ってるパーティションがありましたが、XPはもうサポートが切れてるので「ディスクの管理」からパーティションごと削除しました。
9GBほどの空き容量ができたので、ここにLinux Mintを突っ込む事にします。

Linux MintのイメージファイルをDLします。
https://linuxmint.com/download.php
色々ありますが、Mate no-codecsの32bit版を選びました。

USBメモリにイメージを焼くためにUNetbootinをダウンロードします。
実行してUSBメモリにLinux Mintを焼きます。

USBメモリをtypePに挿して起動するとUSBブートで早速Linux Mintが立ち上がります。
(立ち上がらない場合は起動後のVAIOロゴ表示中にF2を押してBIOS設定に入ってExternal Device Bootを有効にしてください。参考→VAIO TYPE PにUbuntuインストール (1600×768もOK)

Linux Mintのデスクトップにインストール用のアイコンがあるのでダブルクリックします。
空いている9GBにパーティションを作成してインストールします。インストール完了して、これでOKかなと思ってUSBメモリを抜いて再起動してみましたが、ブートOS選択画面にLinux Mintが出てこなくてどうやってLinuxをブートするのかわかりませんでした。

ググッたところ、こちらの方法で解決しました。
再びUSBメモリからLinux Mintをブートして、ターミナルから

と打ち込みます。(私の場合はインストールしたパーティションが/dev/sda5ですが、適宜変更してください)

mbr.imgというファイルができるのでCドライブ(vistaが入ってるドライブ)の直下にコピーします。

シャットダウンしてUSBメモリを抜いて起動します。

windowsが立ち上がったらコマンドプロンプトから

というコマンドを打ち込んでいきます。
(エントリ)というのはエントリ名を入力します。
エントリ名は最初のコマンドの成功時に表示されるものです。

ついでに私はWindowsXPのエントリの削除も行いました。

参考URL:WinXPとWin7のデュアルブートからWinXPを削除する

もう一度再起動したらブートOS選択画面に「Linux Mint」が表示されており、これを選択する事でLinux Mintを起動させることができました。

このままだと再起動時に一定時間経過後にWindowsの方が自動で起動するので、Linux Mintを優先起動したい場合はWindowsの「起動と回復」から既定のオペレーティングシステムをLinux Mintに変更します。

別PCからtypePのLinux Mintにリモートログインする


Linux MintにはSSHサーバーはデフォルトで入ってないのでインストールします。

Avahi-daemonはデフォルトで入ってるので、「ホスト名.local」でアクセスできます。
これでSSH接続できます。

接続できたのはいいんですが、typePの蓋を閉じるとサスペンドされてしまいSSHの接続も切れてしまいます。
Linux Mintのデスクトップからパワー・マネジメントの設定に入って、蓋を閉じたときの挙動を「サスペンド」から「何もしない」にする必要があります。

これでtypePをサーバみたいに使えるようになりましたが、ノートPCを業務用途でサーバにするのはよくないという意見もあります。

参考URL:ノートPCをサーバにすることがよくない理由

ノートPCはサーバとして設計されてるわけではないので、ホビーならともかく仕事で使うのには向かないのかもしれません。
用途はよく考えた方がいいのかもしれません。

今後の展望


typePにLinuxを入れて、さてどうするか…という所まではあまり考えてませんでしたが、やっぱちょっとしたサーバとして使う感じ…?

ラズパイより有利な点は処理速度が速い(ラズパイゼロよりは早いけどラズパイ2よりは遅いかも)、メモリが2GBある…ディスプレイとキーボードとマウスが付いてる…。
あ、ラズパイと違ってWake-Up-Lanができるかもしれませんね。
イチイチ電源ボタン押しにいかなくても遠隔でオンオフできれば付けっぱより省エネですね。
さっそく試してみましたが、どうもBIOSの設定でその辺の項目が隠されてるようで、上手く行きませんでした。

とりあえず、既存のwindowsマシンにLinuxデュアルブートする方法がわかったので、この調子で他のPCもドシドシLinux化できるようになった訳です。

世の中にはAndroid端末をLinux化してる人もいるそうです。

参考リンク:自宅で使う省エネサーバーをAndroidタブレットで自作

所持してる端末を片っ端からLinux化して自由にコントロールできるようになったとして、いかにそいつらを使役するか、中々面白いテーマですね。

【Raspberry Pi Zero】ラズパイゼロを買ったのでセットアップして遊んでみました

5ドルのコンピュータ、ラズパイゼロをゲットしました。

CciMA7RUEAAoG0u

pimoroniというイギリスのサイトから購入しました。
ラズパイゼロは現在かなり人気みたいで、入荷してもすぐ売り切れてしまってます。
売り切れ時は「Notifi me」というボタンを押してメールアドレスを入力しておけば、入荷時にお知らせメールをくれます。

私はラズパイゼロ単体が欲しかったのですが、お知らせを見てすぐチェックしましたがすでに単体は売り切れており、しょうがないので「Pi Zero + Adaptors + Pibow Zero Case」というセットを買いました。
結果的には色々便利だったのでこのセットにしてよかったです。

ラズパイゼロ単体は4.25ポンドなので大体(当時のレートが1ポンド160円くらい)680円です。
私が買ったセットは12.5ポンドなので大体2000円です。
明細を見ると、10.42ポンドになってました。日本から買ったので欧州での消費税(VAT)分が割引になったみたいです。これに加え送料5.5ポンドがかかって、計15.92ポンドとなり、実際に支払ったのは2538円です。
ラズパイ単体で買っていた場合は1440円くらいになるなんじゃないかと思われます。
5ドルという触れ込みですが、まあ別途色々かかってくるのは仕方ない所ですね。

2月23日に注文して3月2日に到着したので、8日くらいかかりました。

早速セットアップしようと思いましたが、色々とセットアップに必要な機材がある事がわかり、結局色々注文しました。
・OSを入れるmicroSDカード(8GB以上推奨)
→Amazonで購入 TOSHIBA 東芝 microSDHC 16GB 558円
・ラズパイゼロにはマイクロUSBポートが一つしかないのでUSBハブ
→ヨドバシ.comで購入 バッファロー BUFFALO BSH5U03BK [USB2.0ハブ 5ポートタイプ ブラック] 550円
・ラズパイゼロにはLANポートがないので無線LANドングル
→ヨドバシ.comで購入
エレコム ELECOM WDC-150SU2MBK [無線LAN子機 11n/g/b 150Mbps USB2.0用 ブラック] 759円
・USBキーボード
・USBマウス
・液晶ディスプレイ
・給電用にUSBをコンセントに挿せるようにするアダプタ
→手持ちの物を使用

結局ラズパイの支払いと合わせて4405円かかってますね。ハハハ

セットアップ


さて、機材が揃ったのでセットアップします。

CdWcSvxVIAAeukV
↑機材を繋いだ様子。せっかくのコンパクトなラズパイゼロがごちゃごちゃ繋いで台無しに…

セットアップはこちらを参考にしました。
Raspberry Pi Zeroセットアップ 完全ガイド

素晴らしい丁寧な解説で大変助かりました。
参考記事ではMacを使っていますが私の環境はWindows10なのでその辺りの違いを捕捉で書いてみます。

・RaspbianをSDカードにインストールするにはWin32DiskImagerを使います。事前にSDカードフォーマッターを使ってSDカードをフォーマットしておきます。

参考URL:Installing operating system images using Windows

・リモートログインの際、WindowsはデフォルトではZeroconfに対応してないので、ラズパイのホスト名を使ってアクセスする事ができません(IPアドレスを調べて打ち込めばアクセスできます)。itunesをインストールするか、Bonjour単体をインストールすればraspi0.localなどのホスト名でアクセスできるようになります。

さて、別のPCからリモートログインまでできるようになれば、ラズパイに直接キーボードなどを繋がなくても操作できるようになるので、USBハブ、キーボード、マウス、ディスプレイを取り外して無線LANドングルだけ繋げておけばOKです。
ごちゃごちゃしてた配線が減ってだいぶコンパクトでスマートな感じを取り戻せます。

ラズパイゼロで遊ぶ


セットアップが終わったら起動して遊んでみます。
デフォルトでMinecraft Piが入ってますね。

CdWfCEKUYAAjNRi

これは子供たちにも大ウケ間違いなしです。
正直起動したらCUIが立ち上がるもんだとばかり思ってたのでGUIでデスクトップが出てきて驚きました。

マイクラなんてバリバリの3Dゲームなのにアッサリ動いてますね…こんな事がフリスクに入るようなサイズのコンピュータにできてしまうとは驚きです。

デスクトップが開いてもマイクラ以外は特にやる事無いですが、一応リモートでもデスクトップが見れるようにしたいと思います。

windowsにはRealVNCを入れて、ラズパイ側にはTightVNCServerをインストールすればOKです。

参考URL:Raspberry Piで遊ぼう [No.5:VNC接続をしよう]

↓これがwindowsからラズパイゼロのデスクトップを見ている様子です。
CdXX-sOUIAAlohi

ちなみにリモートでマイクラを起動したら画面が真っ黒になってしまいます。
マイクラはビデオメモリに直接描画してるからVNCには映らないんだそうです。

参考URL:Raspberry PiにVNCでリモートデスクトップ接続する方法

ラズパイゼロでChainerを動かす


ラズパイゼロの消費電力は0.8Wです。

参考URL:
https://en.wikipedia.org/wiki/Raspberry_Pi
Raspberry Pi Zeroが登場。消費電力はどのくらい?

つまり、ラズパイゼロを一か月付けっぱなしておくと、電気代は17円くらいです。

対して、私のデスクトップPCは消費電力は恐らく平均200W以上あります。
200Wだとしても一か月付けっぱなしにしておくと電気代3千円以上かかります。

私はコンピュータを自分の使い魔みたいに働かせられたらいいなという構想を持ってますが、メインPCは自分が使うだけでいっぱいいっぱいで余計な事させたくないですし、やたら消費電力が大きいので付けっぱとかにしとくと電気代がもったいないです。

かといってサーバマシンを組んでもそれなりに電気代がかかりますしマシンを置く場所も無いです。

じゃあVPSを借りる手もありますが、毎月固定で結構な利用料金がかかってくるというハードルがあります。

そこを踏まえてこのラズパイゼロを見てみると、本体は5ドルという激安で、電気代も17円で痛くも痒くも無い金額です。
場所も全然取りません。
私の使い魔として働いてもらうのにふさわしいかも…

さて、何をさせてコキ使いましょうか。
取りあえずchainer-goghでランダムに画像を合成させ続けるというのはどうでしょうか。

という訳でchainerを入れてみます。

参考URL:Chainerをインストールしてみる

参考URLの通り、chainerをインストールして動作テストとしてmnistの学習を実行しました。
どうなったかというと…
なんと、いまだに実行中です。数日間ずっと頑張ってますが終わりません。

CPU実行だから時間がかかりすぎてる…?GPU(ラズパイゼロのGPUは24GFLOPSで意外と速度あるそうです)実行すれば早くなるかも…
と思いましたが、そういえばChainerはCUDAを使うので、NVIDIAのGPUでしかGPU実行できません。
う~ん、ラズパイゼロにディープラーニングはちょっと無理がありましたかね…

ラズパイゼロ用のGPGPUライブラリを開発された方がいらっしゃるので、頑張れば何とかなるのかもしれません。

ラズパイみたいな感じでNVIDIAのグラボ積んでてCUDAも使えるといえば、Jetson TK1やJetson TX1があります。
Jetson TK1は300GFLOPSでTDP5W、Jetson TX1は1TFLOPSでTDP10Wの性能だそうです。
ちなみにGTX980は4.6TFLOPSでTDP165Wです。
Jetson TK1は29160円で売られており、Jetson TX1は93798円で4月下旬入荷予定だそうです。
欲しいですねぇ。

ラズパイゼロを使い魔としてコキ使うにあたって押さえておきたいポイントがあります。
windowsからsshでリモートログイン(私はputtyを使ってます)してコマンドを実行させてる時に、windowsをスタンバイにするなどしてsshが切断されると、実行していた作業は中断されてしまいます。
これだとずっとsshクライアントを見張ってないといけなくて、全然使い魔として勝手に働いてくれてるイメージと違います。
windowsをシャットダウンしたくてもできないなら、結局電気代が無駄です。
しかしラズパイゼロにscreenというソフトを入れるとこの問題は解決します!

参考URL:【Linux】突然回線切断しても続きから作業を再開できるようにする方法

screenを使うと仮想端末を立ち上げる事ができるようになり、SSHを切断しても仮想端末は落ちないで引き続き作業を続行してくれます。
これでputtyを立ち上げっぱなしで見張る必要がなくなりました。

今後の展望


そもそもラズパイゼロを買った本来の目的は戦車のラジコンのリモコンをラズパイゼロから制御したかったからです。

Cby5VbUUEAEEd4E

そのためにはまずGPIOピンヘッダをラズパイにハンダ付けで取り付けないといけないので、ハンダゴテを買う所からですね。

どうせAndroid端末も上に載せる予定なので、ラズパイじゃなくてAndroidにUSBシリアル変換モジュール繋いでもいいかもしれません。
おいおいやっていきたいと思います。

もう一つ構想としてあるのが、ラズパイゼロを沢山繋いでグリッドコンピューティングする事です。
1個だと貧弱でも100個繋げばスーパーコンピュータになるかもしれません。
100個起動しても消費電力80Wで私のデスクトップPCより省エネですからね。価格も5ドルが100個になっても500ドルです。
ラズパイゼロは有線LANポートが無いのでLANで繋ぐのは高コストですが、USBで繋げられれば安く済みそうです。
こちらがそんな風な事をやってるようです。
問題点は現状ラズパイゼロが売り切れっぱなしで入手困難な事です。
いずれは安定的に手に入るようになって欲しいですね。

1 2 3 6