画像収集基盤の構築ログ6
目的
目的は、人間の代わりに画像を集めてきてくれるシステムを構築することです。個人的な趣味からイラスト画像を対象としています。
進捗
- 画像ストレージを用意するにあたってオブジェクトストレージを用意した
- RiakCSかCephを利用しようとしたが、ローカルホストだけで動作できるminioを利用した
- オーケストレーションが困難になってきたため、Dockerの調査を行った
- 新規導入したオブジェクトストレージ(minio)と画像変換(thumbor)だけDockerで起動するようにした
興味深い記事
画像処理において、学習したい画像かどうかをスクリーニングすることは膨大なコストがかかるので、この作業自体を自動化したい
人と機械学習のちょうど良い住み分けだと思います。この方のブログは、いつも面白いです。
参考資料
- Compose file version 3 reference - Docker Documentation
- データ分析環境の構築にDockerを利用しよう - Qiita
- minioを使ってS3の環境をローカルで再現する - notebook
- docker-composeを使うと複数コンテナの管理が便利に - Qiita
- Docker の Data Volume まわりを整理する - Qiita
- Alpine Linux で Docker イメージを劇的に小さくする - Qiita
- 効率的に安全な Dockerfile を作るには - Qiita
- GitHub - minio/minio: Minio is an open source object storage server compatible with Amazon S3 APIs
- [Minio] Minio導入手順(Ubuntu 16.04) - Life with IT
画像収集基盤の構築ログ5
目的は、人間の代わりに画像を集めてきてくれるシステムを構築することです。個人的な趣味からイラスト画像を対象としています。
広告配信システムを構築し、十数年間運用してきた人と話す機会がありました。その人が構築したシステムは細かい変更こそされど、アーキテクチャを変えずに運用しているそうです。その堅牢でハイパフォーマンス、そして何よりも柔軟なシステムに強い感銘を受けました。
現在の構築中の画像収集基盤は、かなりポータビリティが低く、別の環境で再構築しようとするとかなり時間がかかる見込みです。最近、簡単なウェブアプリを通じて、Dockerを触る機会があったので少し勉強をしています。
画像収集基盤の構成要素
各サーバーは試験的に立ち上げたものを含めると、それなりに数があります。これまで少しずつ増やしていきましたが、再度構築するには骨が折れる数です。特にインストール手順が複雑なライブラリがいくつかあるので、再現すらできないかもしれないです。
Dockerの基本的な操作についてはわかるようになったので、これらの構成をコンテナに分けようかな。
- データベースサーバー
- 自動タグ付けサーバー
- 自動クロップサーバー
- 特徴抽出サーバー
- 管理サーバー
- コンテンツ推薦サーバー
- 行動ログ集約サーバー
- スクレイピングサーバー
- データ収集バッチサーバー
- プロキシサーバー
- クローラーサーバー(未定)
- オブジェクティブストレージ(未定)
参考資料
画像収集基盤の構築ログ4
目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。
進捗
- illustration2vecのタグ学習済みモデルの全結合層から特徴ベクトルを抽出
- 自動クロッピングのAPIを作成
- DBへ挿入
- システムが煩雑化してきたのでDockerを検討
- 画像のランク付けのために、k-top selectionを検討
- 画像ストレージをセットアップ
- グラフDBを調査
- Image Influence APIを調査
作業記録
Jubatusのレコメンダーか近似最近傍探索を利用するため、画像特徴量が必要になった。 illustration2vec
に extract_feature
という関数が用意されていたが、配布しているモデルのレイヤー名が変わったせいで、動作しなかった。直したものをPull Requestする予定。 http://illustration2vec.net/models/illust2vec_tag.prototxt
によれば全結合層は conv6_4
のようだった。
参考資料
- [Python] numpy.ndarrayを普通の配列(list)にする
- Python: Converting Epoch time into the datetime - Stack Overflow
- API | Tumblr
- GitHub - cayleygraph/cayley: An open-source graph database
- Demo of Cayley - Graph Database written in Go - YouTube
- Image Influence API|PRODUCT|A3RT
- MySQL :: MySQL 5.7 Reference Manual :: 11.1.9.8 Converting Between 3-Byte and 4-Byte Unicode Character Sets
画像収集基盤の構築ログ3
目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。
まだ良いコードネームは思いつかない。
進捗
- 自動で画像収集を行い始めた
- エラーに対応できるようにスクリプトを改良
- RedisとSidekiqを使ったジョブキューの導入の検討
- 参考資料を漁った
- 国内でクローラーと言えば、VASILY。ブログ記事を読み漁った。
- 画像変換サーバーへの依存をRMagickへの依存へ変更。ネットワークを介さなくした。
- スマートクロップの改良の検討
- AnimeFaceのカスケーディングを使って顔認識してみたが思ったように検出できなかったため断念
- 画像収集用のストレージを購入する
- ユーザが気軽に画像分類するにはどうするか考えた(検討段階)
雑記
タスク管理が困難になってきたので、todoistのCLIクライアントを使って管理しようと思う。
おすすめリンク
VASILYのブログはいつも参考になる。クローラーや画像処理まさに僕がやりたいことが揃っている。
画像収集基盤の構築ログ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
画像収集基盤の構築ログ1
自動画像収集基盤を作成しています。
- 収集基盤管理サーバー: Sinatra
- 動的サムネイル変換: thumbor
- クローラー+スクレイパー: Rubyスクリプト
- 画像メタ情報推定サーバー: Flask+illustration2vec
- DB: MySQL
RubyはGemが充実しているので、最短時間が作れると判断しました。将来的にLispでリプレイス予定です。
1日目
スクレイピングをするための基盤を作りました。スクレイパーにはURLを与えます。スクレイパーは、URLから設定ファイルをディスパッチします。設定ファイルにはスクレイピングするためのレシピが入っています。その後、設定ファイルをたくさん作成し、動作確認をしておきました。
2日目
DB設計を始めます。プロトタイプなので、そんなに複雑に考えません。たくさんのサイトを巡って情報の共通点を探り出しました。そこからどういう情報が必要か、どういう関連図になるかDB設計に落としていきます。スクレイピング時にDBへ記録するようにしました。
DBに格納したデータに基いてクローラーを回します。この時点では、まだタスクキューにはしていません。クローリング時に、画像は動的サムネイル変換サーバーを介して縮小変換をかけて、ストレージに保存しました。
管理サーバーの作成に取り掛かり、管理者の入力に応じてDBの値をいじったり、特筆事項をメモできるようにしました。
スクレイピングで剥ぎ取れなかったデータを補間するため、保存した画像をillustration2vecによるメタ情報取得を検討します。なかなかな精度だったため、本格的に載せることにしました。illustration2vecはPythonで動いているため、Flaskを導入し画像を入力とするメタ情報推定サーバーを構築しました。
つづく
まだシステム構築中ですが、引き続き作業を継続していきます。
A-FrameでWebVRを試した
A-Frameというライブラリを使って、WebVRを試しました。 aframe.io
説明
パブリックドメインの天球画像を使って、カメラ(自分)を取り囲むように画像を配置しています。
デモ
コード
デモのコードはここから触れます。一部デッドコードがあるので注意してください。
vr_gallery/index.html at master · tamanobi/vr_gallery · GitHub