TAMALOG

プログラミングがあれば遠いところへ行けます。プログラムと人の共生を記録します。

画像収集基盤の構築ログ6

目的

目的は、人間の代わりに画像を集めてきてくれるシステムを構築することです。個人的な趣味からイラスト画像を対象としています。

進捗

  • 画像ストレージを用意するにあたってオブジェクトストレージを用意した
    • RiakCSかCephを利用しようとしたが、ローカルホストだけで動作できるminioを利用した
  • オーケストレーションが困難になってきたため、Dockerの調査を行った
    • 新規導入したオブジェクトストレージ(minio)と画像変換(thumbor)だけDockerで起動するようにした

興味深い記事

画像処理において、学習したい画像かどうかをスクリーニングすることは膨大なコストがかかるので、この作業自体を自動化したい

人と機械学習のちょうど良い住み分けだと思います。この方のブログは、いつも面白いです。

参考資料

画像収集基盤の構築ログ5

目的は、人間の代わりに画像を集めてきてくれるシステムを構築することです。個人的な趣味からイラスト画像を対象としています。

tamanobi.hatenablog.com

広告配信システムを構築し、十数年間運用してきた人と話す機会がありました。その人が構築したシステムは細かい変更こそされど、アーキテクチャを変えずに運用しているそうです。その堅牢でハイパフォーマンス、そして何よりも柔軟なシステムに強い感銘を受けました。

現在の構築中の画像収集基盤は、かなりポータビリティが低く、別の環境で再構築しようとするとかなり時間がかかる見込みです。最近、簡単なウェブアプリを通じて、Dockerを触る機会があったので少し勉強をしています。

画像収集基盤の構成要素

各サーバーは試験的に立ち上げたものを含めると、それなりに数があります。これまで少しずつ増やしていきましたが、再度構築するには骨が折れる数です。特にインストール手順が複雑なライブラリがいくつかあるので、再現すらできないかもしれないです。

Dockerの基本的な操作についてはわかるようになったので、これらの構成をコンテナに分けようかな。

  • データベースサーバー
  • 自動タグ付けサーバー
  • 自動クロップサーバー
  • 特徴抽出サーバー
  • 管理サーバー
  • コンテンツ推薦サーバー
  • 行動ログ集約サーバー
  • スクレイピングサーバー
  • データ収集バッチサーバー
  • プロキシサーバー
  • クローラーサーバー(未定)
  • オブジェクティブストレージ(未定)

参考資料

画像収集基盤の構築ログ4

目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。

tamanobi.hatenablog.com

進捗

  • illustration2vecのタグ学習済みモデルの全結合層から特徴ベクトルを抽出
  • 自動クロッピングAPIを作成
  • DBへ挿入
    • Tumblr APIを用いてLike済み画像をDBへ挿入
    • これまでに収集した出処の分かる画像をDBへ挿入
  • システムが煩雑化してきたのでDockerを検討
  • 画像のランク付けのために、k-top selectionを検討
  • 画像ストレージをセットアップ
  • グラフDBを調査
  • Image Influence APIを調査

作業記録

Jubatusのレコメンダーか近似最近傍探索を利用するため、画像特徴量が必要になった。 illustration2vecextract_feature という関数が用意されていたが、配布しているモデルのレイヤー名が変わったせいで、動作しなかった。直したものをPull Requestする予定。 http://illustration2vec.net/models/illust2vec_tag.prototxt によれば全結合層は conv6_4 のようだった。

参考資料

画像収集基盤の構築ログ3

目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。

tamanobi.hatenablog.com

まだ良いコードネームは思いつかない。

進捗

  • 自動で画像収集を行い始めた
    • エラーに対応できるようにスクリプトを改良
    • RedisとSidekiqを使ったジョブキューの導入の検討
  • 参考資料を漁った
    • 国内でクローラーと言えば、VASILY。ブログ記事を読み漁った。
  • 画像変換サーバーへの依存をRMagickへの依存へ変更。ネットワークを介さなくした。
  • スマートクロップの改良の検討
    • AnimeFaceのカスケーディングを使って顔認識してみたが思ったように検出できなかったため断念
  • 画像収集用のストレージを購入する
  • ユーザが気軽に画像分類するにはどうするか考えた(検討段階)
    • ランダムサンプリングによる二者択一の比較
      • エンターテイメント性皆無(ニコニコ静画のように「どっちがけしからん」くらいやらないとおもしろくない)
    • いくつか表示した画像を、ドラッグ&ドロップによって配置する
      • ユーザが独自の価値観で距離を定める。うまくクラスタリングできる可能性は低いが直感的。
    • 選択された画像の横に並ぶ画像に対しても評価を勝手に行う
      • サムネイル画像が並んでいる中で一つの画像が選ばれたときに、周辺にある画像は相対的に関心が低いはず。それを評価として反映させたらどうか。

雑記

タスク管理が困難になってきたので、todoistのCLIクライアントを使って管理しようと思う。

qiita.com

おすすめリンク

VASILYのブログはいつも参考になる。クローラーや画像処理まさに僕がやりたいことが揃っている。

tech.vasily.jp

画像収集基盤の構築ログ2

目的は、人間の代わりに画像を集めてきてくれるシステムを構築すること。個人的な趣味からイラスト画像を対象としている。

tamanobi.hatenablog.com

画像収集基盤という名前だが、何かコードネームが欲しい。

進捗

  • 管理サーバーをインターネットに公開した
  • illustration2vecで画像の特徴ベクトルを抽出できることがわかった
  • Jubatusを使って類似画像の近傍探索ができることがわかった
  • プライベートGitLabにリポジトリを作成した
  • YOLOv2を用いた画像の自動クロッピングを実装した
  • mitproxyを使えば閲覧とスクレイピングが同時に行えることがわかった
  • 画像のランキング・選抜について調査をした
    • 選挙方式の一つであるシュルツ方式を調べた
    • Elo Ratingを調べた
    • 多腕バンディットアルゴリズムを調べた
    • 人の手を介したソートアルゴリズムの構想をまとめた
  • 構成図を書いた

次にやること

  • 画像収集用のストレージを購入する(購入完了)
  • illustration2vec + Jubatusを使った類似画像検索を試す
    • alt-i2vを試してもいいかもしれない
  • YOLO v2によるスマートクロッピングを管理画面に導入する
  • MySQLを使ったバッチ処理環境を構築する
    • 画像をillustration2vecを使ってメタ情報を付与する
  • クローラー戦略を考える
  • ユーザが気軽に画像分類するにはどうするか考える
    • ユーザ行動を教師データとして利用するにはどうするか
    • 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よりも早い類似画像検索が実装できるかもしれない。

itpro.nikkeibp.co.jp

github.com

参考資料

画像収集基盤の構築ログ1

自動画像収集基盤を作成しています。

RubyはGemが充実しているので、最短時間が作れると判断しました。将来的にLispでリプレイス予定です。

1日目

スクレイピングをするための基盤を作りました。スクレイパーにはURLを与えます。スクレイパーは、URLから設定ファイルをディスパッチします。設定ファイルにはスクレイピングするためのレシピが入っています。その後、設定ファイルをたくさん作成し、動作確認をしておきました。

2日目

DB設計を始めます。プロトタイプなので、そんなに複雑に考えません。たくさんのサイトを巡って情報の共通点を探り出しました。そこからどういう情報が必要か、どういう関連図になるかDB設計に落としていきます。スクレイピング時にDBへ記録するようにしました。

DBに格納したデータに基いてクローラーを回します。この時点では、まだタスクキューにはしていません。クローリング時に、画像は動的サムネイル変換サーバーを介して縮小変換をかけて、ストレージに保存しました。

管理サーバーの作成に取り掛かり、管理者の入力に応じてDBの値をいじったり、特筆事項をメモできるようにしました。

スクレイピングで剥ぎ取れなかったデータを補間するため、保存した画像をillustration2vecによるメタ情報取得を検討します。なかなかな精度だったため、本格的に載せることにしました。illustration2vecはPythonで動いているため、Flaskを導入し画像を入力とするメタ情報推定サーバーを構築しました。

つづく

まだシステム構築中ですが、引き続き作業を継続していきます。

A-FrameでWebVRを試した

A-Frameというライブラリを使って、WebVRを試しました。 aframe.io

f:id:tamanobi:20170320232939p:plain

説明

パブリックドメインの天球画像を使って、カメラ(自分)を取り囲むように画像を配置しています。

デモ

パノラマギャラリー

コード

デモのコードはここから触れます。一部デッドコードがあるので注意してください。

vr_gallery/index.html at master · tamanobi/vr_gallery · GitHub