以前から少しずつ、将棋の駒を画像分類するためのデータセット作りをしていて
最初は自分のローカル環境でやっていたりしたけど やっぱりWebアプリで管理できた方が良いと思って Webアプリ上に保存して管理するようにしていた。
肖像権などの問題も無いはずだし あったら使いたいというヒトもいるかもしれない、と思ったので公開するようにした。
現状では 「空白」「各種14種類の駒 x 先手後手2種類ずつ」で29種類を、素材から自動生成した各種200枚 それに自分で写真や盤面映像をキャプチャした画像などから切り抜いてラベル付けしたもの数十枚ずつ などが保存されている。これから少しずつ集めて増やしていく予定。
仕様
画像データセットを管理するWebアプリを作るときに考えるのは こんな点。
- 最低限必要な機能は以下
- 画像アップロード
- 各画像にアノテーション付与
- 一覧表示
- 一括ダウンロード的なもの
- できれば欲しい認証機能
- アップロードや編集は特別な権限を持ったユーザだけが可能
- 閲覧やダウンロードは権限ないユーザにも可能にして良い
- 自前のサーバではなくどこかのPaaSでアプリケーションだけ動かしたい
- できるだけ安く。
- 画像の保存場所も必要
以前のアイドル顔識別のためのデータセットでも管理Webアプリを作ったけど、さくらVPS上でRuby on Railsで動かし画像データはすべてPostgreSQLにバイナリで保存、などやっていて あまりこのへんの条件を満たすことは出来なかった。
今回はGoogle Cloud Platform を使って App Engine でアプリを作ってみた。
- アプリケーションは Standard Environment のGo環境で
- 画像は Cloud Storage にすべてアップロード
- 画像とラベルの関連付けなどの情報は当然 Cloud Datastore で管理
- 認証は Github での OAuth Login
実装
最初は普通に Go 1.9 のruntimeで動かしていたのだけど、途中から興味が出たので Go1.11 に切り替えた。 けど結構変更が必要になる部分が多くて大変だった。。
- Remote APIで一括ダウンロードできるようにしていたけど使えなくなる
- ユーザ認証機能は自前で実装する必要がある
- Memcache的なものも別サービスを利用する必要がある
https://cloud.google.com/appengine/docs/standard/go111/go-differences
特に認証のところは 以前は app.yaml
で login
とか admin
とか設定するだけでアクセス制御できていて便利だったのが使えなくなってしまったので自分で用意する必要があった。
github.com/gorilla/sessions でセッション管理して OAuth2 login の設定を書いて。
ログインはもはやGoogleアカウントである必要もなかったので Github の OAuth を使うことにした。
各API endpointは github.com/gorilla/mux で書き分けて、MiddlewareでSessionからでもAuthorization Headerからでも認証情報を取得しアクセス制御できるようにした。
Datastoreは基本的にラベルごとの表示や更新順表示ができればいいだけなのでそんなに難しいクエリなどは要らない。ただ各ラベルの画像総件数は常に把握したいので Total
情報を格納するEntityを1つだけ作って新規追加・編集・削除時に毎回値を増減させるようにした。
追加・編集操作は結局自分しか使わない感じになりそうだけど、できるだけ便利なUIを追求して作業を効率化していきたい。
あとアプリケーションのテストを書いていないので testerator とか使ってちゃんと書いておきたい…