Raspberry PiとOpenCVでスプラトゥーンの勝敗を自動記録する仕組みを作ってみた

f:id:hogesuke_1:20150802040434p:plain ikashot.net
※ 現在、IEで画像が表示できない不具合があります。お手数ですがIE以外でのアクセスをお願い致します…すみません。

何を作ったか

スプラトゥーンではバトルの履歴を見れないようになっているので、勝率がわかりません。自分の勝率がどの程度なのか知りたいなーと思ったので、勝敗を自動記録する仕組みを作ってみました。

仕組み

以下のような流れで処理しています。

  • Raspberry Piのpicameraで、TV画面をキャプチャする
  • キャプチャ画像のなかにWIN or LOSEの結果が表示されているかOpenCVを使って判定する
  • WIN or LOSEが検出されたら、WebAPIを通して結果画面のイメージと勝敗をアップロードする

f:id:hogesuke_1:20150802131319j:plain:w400
不格好ですが、こんな具合にラズパイをセットしてTV画面をキャプチャしてます。

OpenCVの画像認識について

WIN or LOSEの判定はOpenCVを使用して行っています。
画像認識できるようにするまでの手順はだいたい以下のような感じです。

  • サンプル画像の取得
  • 特徴の抽出
  • 検出器の生成
  • OpenCVの画像認識コードの実装

サンプル画像の取得

まず、検出対象の「WIN」と「LOSE」のポジティブサンプルと、どちらでもないネガティブサンプルを用意する必要があります。
今回はWINサンプルを400、LOSEサンプルを300、またどちらでもないネガティブサンプルを3万用意しました。精度の高い検出をするには、数千単位でサンプルを用意する必要があるみたいですが、そこまでやるのは辛いので妥協しています。
f:id:hogesuke_1:20150715212348j:plain:w180 f:id:hogesuke_1:20150715213014j:plain:w180 f:id:hogesuke_1:20150710195159j:plain:w180
左: WINサンプル 中央: LOSEサンプル 右: ネガティブサンプル

特徴の抽出

特徴抽出っていうのは、ここが目でここが鼻でここが口みたいなのを示してあげることです(たぶん)。

難しいことはよく分からなかったので、今回は結果画面の「WIN」「LOSE」っていうのはここのことだよっていう座標を示しています。
これにはTrainingAssistantというツールを使用しました。 github.com

このツールを使うとブラウザで簡単にポジティブサンプルとネガティブサンプルの分類と、特徴の抽出(検出対象座標の記録)ができます。
f:id:hogesuke_1:20150802143253p:plain:w400
こんな具合です。詳しくは作者さんのブログ記事に記載されています。
OpenCV 2.4.2で分類器を作る - shkh's blog

検出器の生成

ツールを使って生成されたポジティブ、ネガティブの分類と特徴点が示されたテキストファイルをもとに検出器を生成します。 これにはOpenCVのコマンドを使用します。

これもTrainingAssistantの作者さんのブログ記事を参考に実行しました。
OpenCV 2.4.2で分類器を作る - shkh's blog

この工程が一番時間がかかります。Core i5、メモリ16GBのMacBookProで完了まで丸2日かかりました。
ただ今回はネガティブサンプルが3万とポジティブサンプルに比べて多すぎたことが原因かもしれません。減らせばもうちょい速くなりそう。

OpenCVの画像認識コードの実装

生成された検出器を使って実際に画像認識するコードを実装します。 これは検索するとたくさんサンプルコードが出てくるので、それを参考にすると簡単に実装可能です。

自分はこのQiitaの記事を参考に実装しました。
python+OpenCVで顔認識をやってみる - Qiita

f:id:hogesuke_1:20150802145617j:plain f:id:hogesuke_1:20150802145621j:plain f:id:hogesuke_1:20150802174714g:plain
こんな具合に検出してくれます。

一応、検出してくれますが精度は悪いです。部屋が暗いと認識されずらかったり、WINをLOSEと間違えたりします。
この精度の悪さを補うため実際のコードでは、20フレーム中に3フレーム以上認識したら正しい検出として画像をアップロードする、といったようなワークアラウンドを埋め込まんでます。
精度が悪い原因はポジティブサンプル数が少ないことだと思うので、しばらくしてサンプルが集まったら検出器を作りなおそうかと思います。

以上!

以上で、簡単な画像認識を実現できました。ツールやサンプルコードを上げてくれている方がけっこういるので、その恩恵にあずかると割と簡単に実現できますね。ほんとう、みなさんには圧倒的感謝です。

Raspberry Piについて

最近、ラズパイ2がでて性能が飛躍的に上がりましたが、自分は間違って古いモデルを買ってしまいました。

この古いモデルは、CPU1コア、メモリ512MBというスペックで、OpenCVのビルドに6時間、Pythonのビルドに2時間かかります。けっこう厳しいです。picameraでのキャプチャについても5fpsぐらいしか出ていなくて、だいぶカクカクです。
ラズパイを購入する際は、まちがって古いモデルを買わないようにご注意ください…

ラズパイのセットアップについても情報はネットにたくさんあるので、困ることはありませんでした。OSもRaspbianというDebian系のLinuxなのでDebianUbuntuの情報を転用でき、情報がなくて困るということはまずないかなぁという気がしています。

もし使ってみたい方がいたら…

GitHubで検出器を含めてソースコードを公開していますので、自由に使っていただくことが可能です。
github.com github.com

しかながら、インストール手順をまったく書けていません…
もし、使ってみたいという方がいましたら@hogesuke_1までメンションください。まじめにインストール手順を書こうと思います。

ところで

いま、さくらインターネットRapidSSLを1年無料で使えるキャンペーンをやっています。イカショットもこのキャンペーンを利用してhttps化してみました。
さくらのサービスを使っている方は利用されてみてはいかがでしょうか(イカだけに)。 ラピッドSSL提供開始記念キャンペーン! | さくらインターネット

【さくらのクラウド】Minecraftサーバをコマンド操作なしで簡単構築

さくらのクラウドには、スタートアップスクリプトという機能があり、サーバ作成時に任意のスクリプトを実行することができます。Minecraftサーバを構築するスクリプトを指定すれば、簡単にコマンド操作なしでマルチユーザで遊べる環境を構築できます。

とはいうものの、さくらのクラウド公式ではMinecraftサーバ構築のスクリプトは提供されていません。今回、自分のメモを兼ねて、構築に必要な手順をスクリプトにまとめたのでそれを公開します。

これをコピペすれば、すぐに遊べる環境が構築できるはずです。

Minecraftサーバ構築スクリプト

#!/bin/bash
# @sacloud-once
# @sacloud-desc Minecraft Serverをセットアップします。
# @sacloud-desc (このスクリプトは、CentOS6.XもしくはScientific Linux6.Xでのみ動作します)
# @sacloud-require-archive distro-centos distro-ver-6.*
# @sacloud-require-archive distro-sl distro-ver-6.*

#---------iptablesの設定---------#
cat <<'EOT' > /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-SSH 
-A INPUT -p TCP -m state --state NEW ! --syn -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 25565 -j ACCEPT 
-A fail2ban-SSH -j RETURN
COMMIT
EOT
service iptables restart
#---------iptablesの設定終わり---------#
#---------Javaのインストール---------#
yum install -y java-1.8.0-openjdk
#---------Javaのインストール終わり---------#
#---------Minecraft Serverのインストール---------#
wget -P ~/minecraft https://s3.amazonaws.com/Minecraft.Download/versions/1.8.7/minecraft_server.1.8.7.jar

# 一度起動し、eula.txtファイルを生成させる
java -Xms1024M -Xmx1024M -jar minecraft_server.1.8.7.jar nogui
echo eula=true > ~/minecraft/eula.txt

# upstartの設定ファイルを作成
cat <<'EOT' > /etc/init/minecraft.conf
description "Minecraft server"
chdir /root/minecraft
exec java -Xms1024M -Xmx1024M -jar minecraft_server.1.8.7.jar nogui
start on startup
EOT

# 起動
start minecraft
#---------Minecraft Serverのインストール終わり---------#

注意点

Minecraftサーバを利用するにあたって、ライセンス利用規約に同意する必要があります。
スクリプト上ではこの利用規約に承認する処理が組み込まれているため、利用規約を確認し承認したうえで上記のスクリプトを使用するようにしてください。
https://account.mojang.com/documents/minecraft_eula

スタートアップスクリプトの登録方法

  1. コンパネ右上のユーザ名表示部のプルダウンをクリック
  2. プルダウンメニューの「設定」をクリック
  3. 左サイドのメニューからスクリプトを選択
  4. 画面上部の「+追加」ボタンをクリック
  5. 上記のスクリプトをすべてコピー&ペーストし作成

以上の操作によりスクリプトが追加可能です。
追加したスクリプトサーバ作成画面->ディスク修正->配置するスタートアップスクリプトで選択してください。

最小サーバスペック

CPU: 1コア
メモリ: 2GB
OS: CentOS 6.X, Scientific Linux6.X

Minecraftサーバの起動には最低1GBのメモリが必要となるため、1GBより大きいサイズのメモリが必要となります。

2万円クーポン

キャンペーンをやっているようなので、今なら無料で試せますよ。

ニコニコ動画の再生画面を少しだけシンプルにするChrome拡張を作ってみた

ニコニコ動画の再生画面、いろんな情報がひっきりなしに目に飛び込んできて動画に集中できない。 なので、これを少しシンプルにして集中できるようにしてみました。

ニコニコ動画 Light - Chrome ウェブストア

before

f:id:hogesuke_1:20150508125445p:plain

after

f:id:hogesuke_1:20150508125448p:plain

なにが違うの?

  • 動画上部のニュース表示部を削除
  • 動画下部のオススメ動画一覧を削除

リンク

chrome.google.com

AngularJSを使ってタグベースのはてブビューアを作ってみた

f:id:hogesuke_1:20150330180058p:plain

はてブビューア Skimii
http://skimii.net

作ったもの

タグベースのはてブビューアを作りました。
ウォッチしたいキーワードをタグとして登録すると、ブックマークされたエントリをタグごとに一覧表示します。

Skimii

作った理由

自分の興味対象にピンポイントでアクセスしたいという理由です。 はてなブックマーク公式では、かなり大きなくくりでのカテゴリ分けなので、ウォッチしたい対象にピンポイントでアクセスしにくいなぁと感じていました。

タグごとにエントリを表示できるので、対象を絞ることができノイズの少ない情報を得られるかと思います。

しかしながら…

インタレスト機能 - はてなブックマークヘルプ
すでに公式で同じものが提供されています。作成途中で気づいた…

ただ、公式には無い機能もあります。

  • ブックマーク数の閾値設定
  • すでに読んだエントリを表示しない設定

構成

  • フロントエンド:AngularJS1.3、Bootstrap3
  • バックエンド:Ruby + Sinatra
  • サーバ:さくらVPS 1G
  • DB:MySQL
  • HTTPサーバ:Nginx
  • APサーバ:Unicorn

AngularJSの感想

Angularの最初の印象は、便利すごい最高って感じで完全に浮かれてた。これがあれば何でも簡単に作れると感じた。ただ、どんなものでもそうだけど正しい使い方をしなければだんだんと辛みが積もってくる。

自分の場合、Angularの正しい使い方がよく分からなくて、だいぶ右往左往した。そして、少し前の反Angular的なノリに便乗して、自分ワルクナイ、Angularワルイみたいな言い訳をしていた。

ただ、辛みが頂点に達して、どうにか改善しようと調べ始めるとだいたい解決策が存在して、それを適用するとかなり改善されるというブレイクスルーを何度か経験した。やっぱり自分が悪かったんや…。
しかし、これはかなり初心者的な話しなので、Angularはやっぱり最強だってことじゃなくて、最初の取っ付きやすさに反してAngularもそれなりに習得大変だなという感想。

ただ、ほんとにミニマムなツールであれば、辛みに気づく前に完成するので、そういうところで使うと最強であるかもしれない。

Angularで2つ作ったので、次はAngular2の正式リリースまで冬眠しようと思う。

Sinatraの感想

シンプルでいい。前にRailsに取り組んだときは覚えること多くてかなり辛かった思い出があるので、このシンプルさは本当にうれしい。

ただ、規模が大きくなったり複数人で開発するとなった場合は、Railsのレールが大いに機能するのだろうと思う。その点、sinatraは大規模な開発は弱いかもしれない。 だけど、自分が趣味で作る規模であればSinatraで十分だし、情報も多く転がってるのでこれからもお世話になりそう。

次に向けて

このWebアプリ作るのに4ヶ月かかっていて、ちょっと時間かかりすぎだなぁって思ってる。2ヶ月目ぐらいで雑に動くものはできてるんだけど、そこから詰めるのにさらに2ヶ月かかっている。
次は、ミニマムで雑だけど使えるものを目指して短時間での開発を意識したい。Reactで何か作る。1ヶ月でリリースしたいなぁ。

参考

はてブAPIでwebサービスを作りたい全ての人に向けて書きました
作成にあたり参考にしました。ありがとうございます。

英語の勉強を始めて1ヶ月。その感想。

英語の勉強を初めて1ヶ月たった。自分としてはめずらしく勉強の習慣は定着できているので、そこは良かったかなと思う。だけど、ダメなところもいろいろ感じ始めている…。

適当に感想を書いていく。

前よりもさらに時間がかかっている

最近、学習に集中できなくなってきていて、ぜんぜん関係ないことが頭の中をぐるぐる回っている。前は新規2ページと前日復習2ページを45分ぐらいだったんだけど、今では1時間超える日が多い。これは、単純に英語の勉強に飽き始めてるのか、たまたま最近心配事が多くてそうなっているのか分からないけど、あまり良くない兆候だなぁといった感じ。

あ!これDuo3.0でやったところだ!

日常に出てくる日本語が勉強した英語と紐付いて、あ、これやったなという体験が少し出てきた。こういうのが積み重なっていくと学習も楽しくなりそう。

忘れるスピードが半端ない

次の日にはちゃんと思い出せなくなるのは分かっていたことだけど、一部は思い出せたり喉まででかかってたりした。しかし、1ヶ月も経つと跡形もなく忘れていて唖然とする。1ヶ月周期ぐらいで復習しないとすべてを忘れて学習した意味もなくしてしまうかもと感じたので、近いうちに最初から復習してみたいと思う。

もっと基礎知識を付けたい

例文を覚える際に構文の成り立ちがよく分からなかったり、冠詞のルールが分かんなかったりで色々と疑問が多い。それをちゃんと覚えたらもうちょっと例文覚えるのも楽になるかもなと思う。次の1ヶ月の課題はこのへんの知識をきちんと身に付けることかな。

とりあえず1ヶ月続いたけど、つぎの1ヶ月続けられるかけっこう不安。あんまり力入れすぎると苦しくなって放り出す気がするので、いい加減にやっていきたい。

英語の勉強を始めて2週間。その感想。

英語の勉強を始めて2週間たった。英語の勉強は大学受験以来なので10年ぶりくらい。書いてて思ったけど、10年ぶりってすごい。そりゃ忘れとるわなー。

適当に感想を書いてみる。

単語を覚えるのが大変

一時的に記憶しても翌日にはすでに思い出せない。これはあかんなーと思ったので、単語を無理やりイメージに紐付けるという戦略で今は取り組んでいる。たとえば、emphasizeという単語を「円、ファッ!?サイズ」として、めちゃでかい¥記号に驚いてファッ!?となっているイメージで記憶している。すごいバカっぽいけど、こうでもしないと覚えられない。

例文を覚えるのに思った以上に時間かかる

1つの例文を覚えるのに10分から15分程度時間がかかる。こんなに時間かかるとは思ってなかった。学習に使っているDuo3.0を最後までやり通すのに5ヶ月程度かかってしまいそう。5ヶ月後には最初の方の内容は全部頭から抜けてそうで恐ろしい。

集中力がつづかない

45分を過ぎるともうやめたいって感じになる。単語を暗唱しながらまったく別のこと考えてたりするので45分が限界かなぁという感じ。

こんなもん。まだ2週間なので1ヶ月経った時にまた書こうと思う。

GitHubPagesでプロフィールページ作った

f:id:hogesuke_1:20150101034245p:plain
hogesuke.githubu.io

作成したWebサービスのURLをTwitterのプロフィールに載せていたのですが、サービスが増えるにつれてスペースが限界に近づいてきたので、GitHubPagesでプロフィールページを作ることにしました。

Githubリポジトリにpushするだけでなのでお手軽でした。
GitHub Pages