こんにちは、海行です。

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

せっかく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がアツい!?
このビッグウェーブに乗っかって何かやってみたいですね。