画像収集基盤の構築ログ2
目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。
画像収集基盤という名前だが、何かコードネームが欲しい。
進捗
- 管理サーバーをインターネットに公開した
- illustration2vecで画像の特徴ベクトルを抽出できることがわかった
- Jubatusを使って類似画像の近傍探索ができることがわかった
- プライベートGitLabにリポジトリを作成した
- YOLOv2を用いた画像の自動クロッピングを実装した
- mitproxyを使えば閲覧とスクレイピングが同時に行えることがわかった
- 画像のランキング・選抜について調査をした
- 構成図を書いた
次にやること
- 画像収集用のストレージを購入する(購入完了)
- illustration2vec + Jubatusを使った類似画像検索を試す
- alt-i2vを試してもいいかもしれない
- YOLO v2によるスマートクロッピングを管理画面に導入する
- MySQLを使ったバッチ処理環境を構築する
- 画像をillustration2vecを使ってメタ情報を付与する
- クローラー戦略を考える
- どのようにURLを探っていくか
- どのURLをスクレイピングするか
- ユーザが気軽に画像分類するにはどうするか考える
- ユーザ行動を教師データとして利用するにはどうするか
- Labellio
- 構想を整理する
- ユーザが好みそうな画像を収集するクローラー戦略を作るのか
- ユーザが好みそうな画像を推薦するのか
作業記録
スマートクロップ
画像を正方形サムネイルに変換するときのクロッピング戦略をYOLO v2という一般物体認識アルゴリズムを基に構築した。アルゴリズムの実装自体は難しくなかったが、PILとOpenCV(Numpy)のデータ構造の相互変換に戸惑った。クロッピングがうまく行ったかどうかの指標はあるのだろうか?まだ調べていないが、画像周りのアルゴリズムの指標はまだ未成熟のようだ。
インターネットへの公開
自宅の外でも作業がしたかったため、サーバーをインターネットへ公開することにした。キャッシュ+リバースプロキシとしてNginxを導入した。現在サムネイル生成には、thumborというpythonで書かれた画像変換サーバーを用いている。クエリとして画像変換対象のURLを含める必要があるが、Nginxのmerge_slashにより//
が/
に変換されてしまい、原因を調べるのに多くの時間使ってしまった。今までlocalhostだけで動作確認ができていた管理サーバーだが、外部公開の問題を早期に解消できたのは良かった。
人力ソート
人の判断基準を学習させたいと昔から思っていた。そのきっかけはキャラソートだった。特定の作品に登場するキャラクターを2名表示して「どちらが好きか」という二者択一の比較を行っていくもの。人の「好き」という気持ちは体系化されていないことが多く、このようなツールを利用することで自分の嗜好が整理されることに僕は感動を覚えた。自分の判断基準を学習して将来的には自分の代わりに自分の分身がインターネットを探ってくれる未来を夢見ている。
画像収集のための判断基準を学習するためには、ユーザ行動を画像の評価として結びつけなければならない。評価についてはいくつかアイデアがある。画像のLike
などは重要な指標になることはあたりまえだが、多くの画像が並んでいるような状況でその画像を選んだことにも着目したい。選ばれなかった画像の評価を下げるという評価を試してみたい。また、人は好きよりも嫌いに反応しやすいため、Like
よりもDislike
に比重を置きたいと思っている。
類似画像検索
類似画像検索を行うにあたり思い出したことがあった。とあるニュースで、類似画像検索では違いが重要であると報道されていた(http://jp.techcrunch.com/2011/12/07/20111206cmu-researchers-one-up-google-image-search-and-photosynth-with-visual-similarity-engine/)。可能であれば、現在構築中のシステムにもこのアイデアは導入したい。
この記事を書いている最中に、以下の記事を見つけた。このOSSをうまく使えれば、Jubatusよりも早い類似画像検索が実装できるかもしれない。
参考資料
- http://www.clouderaworldtokyo.com/session-download/C2-Cloudera_Tokyo_2016_DMM_submit%20.pdf
- GitHub - GINK03/alt-i2v
- C89 3日目に行ってきた - kivantium活動日記
- ブラウザで巡回しながら、特定の条件にマッチする URL の場合にダウンロード - Qiita
- jubatusでおすすめのいらすとをレコメンドしてみた - Qiita
- ディープラーニングを使ったイメージの切り抜き | カメリオ開発者ブログ
- 「多数決」以上に民意を反映できる選挙方法とはどのようなものなのか? - GIGAZINE
- 推薦システムになにができるのか - Techcompass
- ベイズ推定とDeep Learningを使用したレコメンドエンジン開発
- Mac OS Xでlaunchdでcronのように定期実行するメモ - launchd.plistの作成とか - tweeeetyのぶろぐ的めも
- launchd を使ってスクリプトを自動実行してみた
- [python] PILでリサイズしたファイルデータを保存せずにS3にアップロードする | とりあえずやってミタ
- python - How can Pillow open uploaded image file from StringIO directly? - Stack Overflow
- python - Can an uploaded image be loaded directly by cv2? - Stack Overflow
- python - cv2.imread flags not found - Stack Overflow
- Does python-opencv support to read in-memory image - Stack Overflow
- python - How to send image generated by PIL to browser? - Stack Overflow
- OpenCVとPIL(python Image library)のデータ変換 - tataboxの備忘録
- Crop Images with PIL/Pillow
- Jubatusにcurlでアクセスするインタフェースについて - Qiita
- Jubatus をインストールして使ってみる【2017年版】 - Qiita
- nginx: How to keep double slashes in urls - Stack Overflow
- nginxのproxy_passの注意点 -- ぺけみさお
- Module ngx_http_core_module
- NGINX コンテントのキャッシング | NGINX 日本語訳
- GitHub - rezoo/illustration2vec: A simple deep learning library for estimating a set of tags and extracting semantic feature vectors from given illustrations.
- Nearest Neighbor — Jubatus
- Jubatusを使った感情分析を行うLINE Botの作成 - Qiita