機械音痴な情報系

メモ帳.txt

【論文】Visual Discovery at Piterest

どんな論文?

この論文ではPinterestで使用されている,画像検索・レコメンデーションシステムについてその概要を述べるものである.
具体的には以下のサービスについて説明する.

また,これらを説明する上で,まずはじめにPinterestでの画像の扱い方について(Pinterest Images),特徴の表現方法(Feature Representation),物体の検出方法(Object Detection)について書いていく.

📌Pinterest Images

Pinterestでは,ユーザが各々の「ボード」を作成し,そこに気に入った画像をブックマークしていくのが基本的な使い方となる.
ほとんどの画像にはシャープ始まりのタグ(annotated)がついており、画像をピンする際にユーザが任意のタグを付けることが出来る.
その画像が,違うユーザによって異なるボードにピンされると,オリジナルのピンは新しいメタデータを取得することになる.
このようにして画像がシェアされたり,ピンされるたびに拡大していくたびにデータ構造は大きくなっていく.
f:id:saneeeatsu:20180712152729p:plain

📌Feature Representation

実験の条件

データの種類は「raw」と「binary」の2種類(2進数の表現にするとメモリの使用量が抑えられる).
距離の測定方法は,ユークリッド距離(L1)とマンハッタン距離(L2)の2種類.
フレームワークはCaffeを使用.

モデル

モデルは,ImageNetの画像分類のために訓練されたモデルに,Pinterestの学習用データも追加して作成した.
具体的には,予め訓練されたベースモデルのsoftmaxによる分類レイヤを,同じ中間層・下位層の重みを使用して初期化したPinterestの画像を分類するよう訓練された新しい分類レイヤに置き換えることによって微調整される.

データセット

トレーニングデータセットは,2万クラスに分類される数百万の画像から構成される.
評価用データセットは,図6ではクラスごとにまとめられた10万枚の画像で構成される.
このどちらもタグ付けされたPinterestの画像を使用している.

まず,上位10万件のタグを検索し,そのうち2万個を無作為にサンプリングする.
その後,サンプルのクエリ(トレーニングデータセットのこと?)と一致するタグを持つ画像を探し出し,その中からランダムにサンプリングすることで,バランスの取れた評価用データセットを作成した.

画像の生成に用いられたタグ(query annotation)はクラスのラベルとなる.
評価データセットから2000枚を検索用画像(query image)として使用し,残りはPinterestの画像検索システムによって評価用として索引付けされる(indexed).
そして,クエリとなる画像の結果のリストを距離によってソートし取得する.(???)
画像検索の結果は,2つの画像が同じクラスラベルを共有する場合,クエリとなる画像に関連していると考えられる.
f:id:saneeeatsu:20180712152825p:plain

検証結果

関連するクラスラベルを使用した検索結果のリストから,モデル評価のために「Percision@K metrics」を計算する. データがrawの場合,fc8やfc1000などの意味的な特徴(semantic features)より,pool5やfc6,fc7などの中間層の方が良い結果を得ることが出来た.
またL2を利用したResNet152のpool5が最も良い性能を示した.

しかし,拡張性を考慮すると,バイナリデータを用いた方に関心が行く.
こちらはVGG16のfc6で最も良い性能を示した.
バイナリ化されたfc6はrawのpool5と比べて性能は劣るものの,サイズは16分の1になった.
Pinterestのデータの重みを調整することでこのパフォーマンスの違いは改善することが出来る.

バイナリ化におけるパフォーマンスの改善

バイナリ化したときにResNetのpool5のパフォーマンスが低下した原因は,pool5でのReLU関数によるものだと考えられる.
ReLU関数はそれぞれが2値化された正のpool5に偏ってしまう(?)
ResNet101のpool5では平均の83.86%が正だった.

2値化によってAlexNetとVGG16のパフォーマンスが向上した.
表2はPascal VOC2011のデータセットに対する結果である.

http://acsi.hpcc.jp/2016/download/ACSI2016-tutorial2.pdf

📌Object Detection

Pinterestでは特定オブジェクトを抽出する機能があるが、Faster R-CNNとSingle Shot Detectionを使用している。

Faster R-CNN

  • 検出精度と、リアルタイムのアプリケーションで採用する上で、レイテンシの観点でとても良い
  • 分類クラス数が多くなってもスケーラビリティが良い。

VGG16とResNet101の両方をし応しているFaster R-CNNで実験を行う。
ResNet101に手を加えたものは、現在Pinterestの製品で使用されている検出モデルの一つ。

Faster R-CNNのモデルの訓練方法

1. 元の論文のAlternating optimizationではなく、直接End-to-endの最適化を使用してモデルを学習させる。
2. 計算量を削減するために、物体が存在している領域の候補数を300から100に削減する。または、ROI(Region of Interest: 物体の存在する領域)の物体のスコアに対して動的に閾値を設定する。
3. Pinterestのクラス分類タスクで、畳み込み機能(convolution features)は事前に学習され、内部のPinterestのデータセットを使用して30万回反復学習をさせる。

Single Shot Detection

Faster R-CNNは従来手法より高速だが、レイテンシとGPUメモリの要件は依然として限定的であった。

速度に関してが主な関心ごと。290x290という比較的小さめな解像度の画像に対してSSDを実行する。 違いは以下。

  • IoU値を0.5ではなく0.7に設定することで、問題の物体と検出された物体が強く結びつくようにする。
  • オリジナルのSSDで、畳み込み層のストライドは2だが、IoUを0.7にしたことで、局所的なパフォーマンスの低下につながった。そこで、全畳み込み層においてストライドは1にし、バウンディングボックスの局所化を大幅に改善した。

検出用データセットは74,653枚あるので、ポジとネガの比率が1:3になるようにランダムにサンプリングすると、収束が遅くなることが分かったので、OHEM(Online Hard Example Mining)を利用した。

📌Pinterest Related Pins

どんなサービス?

Related Pins(似ているピン)というのは現在のピンを参考にしたレコメンデーションシステム。 f:id:saneeeatsu:20180712153011p:plain

どんな仕組み?

ユーザエンゲージメントの定義

  1. 「保存する」をクリック
  2. 画像の詳細が表示されるので関連するものをクリックすることが出来る
  3. 長時間その場にいれば、long clickとみなされる
  4. 自分のボードに保存する

“Related Pins Save Propensity”の定義

「似ているピン」を保存したユーザ数/「似ているピン」を見たユーザ数

Covnet features for recommendations

📌Pinterest Flashlight

どんなサービス?

Pinterestの画像の中の物体を検出出来るサービス.
Shop-the-Lookという画像にある物体に青い丸印が付き,それらを買うことが出来るサービスなどで利用されている.
入力は2種類あり,Object Detectionの章で説明したように物体検出する方法と,ユーザが任意に画像をクリッピングする方法がある.
2015年に発表されたPinterest Similar Looksという類似画像検索システムをベースにしている.
f:id:saneeeatsu:20180712153106p:plain f:id:saneeeatsu:20180712153102p:plain

どんな仕組み?

Convnet Features for Retrieval

初期のFlashlightには自動物体検出機能はついていなかった.
画像右上(現在は右下)の半透明の検索アイコンを押すことで,ユーザはクリッピング出来る.
クリッピングすると,リアルタイムで検索結果(タグ,画像)が返ってくる.
ローンチ後は1日当たり2%,400万件検索された.
クリッピングした画像を検索する際,その画像はメタデータを持っていないため,検索候補に適用される再ランキング機能(re-ranking function)は非常に小さくなる.
よって,返される結果はDeep Learning Embeddingsの最初の最近傍検索によって決定することが出来る.
これによって,長年開発してきた既存のテキストによる検索のエンゲージメント率の2/3を達成することが出来る.

Object Detection for Retrieval

Pinterest FlashlightではFaster R-CNNを用いてリアルタイムの物体検出を実現している.
利点は以下の2点.

  • 自動で検出するためクリッピングに比べて,UIがシンプル
  • ユーザのエンゲージメントシグナルを構築することが出来る (初期のFlashlightはユーザが自身でクリッピングしたものを検索していたためこのように集約させることは不可能だった)

問題点

直感的には物体検出によってUIが改善されているのでエンゲージメントは改善されるように思えた.
しかし,初期のFlashlight(手動による物体検出)と改良版のFlashlight(図2のように画像にドットがつけられるもの)でA/Bテストを実施したところ,オブジェクトを検出した初期起動時にエンゲージメントメトリクスが減少した.

原因

図11のように関係ない物体が自動検出されてしまった.

改善策

画像検索の信頼性に関して物体検出のランク付けをする方法を開発した.
画像検索システムから返される3つのシグナルに着目
4096次元の2値化された畳み込み層から出てくるビジュアルハミング距離の上位の結果,…??

結果は表5に示す(各信号に対しては最小の閾値を設定)

改善結果

Flashlightによるエンゲージメントは4.9%増加した.

📌Pinterest Lens

どんなサービス?

スマホのカメラを入力としている検索サービス。
得意とするのはインテリア、ファッション、食べ物。
食べ物の場合は、その食材を使ったレシピも表示される。

どんな仕組み?

2つの論理コンポーネントから成り立っている。

Query understanding layer

入力画像に対して、物体の名前や色など、意味をもった特徴を返す

Blending layer

以下の3つの、ソースの結果を使用

検索方法
Visual Search|Flashlightから見た目が似ている画像の情報をとってくる
Object Search|Pinterestの画像検索の結果
Image Search|コンテキストの結果(ユーザが撮影した写真の椅子を含む部屋のデザイン等)は、物体検知システムの結果

BlenderはQuery understanding layerから導出された特徴に基づき、ブレンドの比率や、コンテンツのソースを動的に変更する。
例えば、annotationsの信頼度が低い場合、Image Searchは実行されない。

Object Searchは従来の画像全体にではなく、物体に対してタグ付けをしていくようなシステム。

例えば図3のように、針がローマ数字の時計を撮影した場合、その時計だけではなく、それを含んだ部屋のデザインなどにも興味があるのかもしれない。
そのために「Object Detection」で説明したSSDによる物体検知システムを使用して、Objects Index作成のために10億枚の画像から物体を抽出する。
これによって10億以上の物体を持つImage Corpusが作成される。クエリが与えられると、似ている物体を見つけ出し、それが含まれる画像全体(靴だけでなく、靴を履いている男性の写真)を返す。

📌用語

IoU:

ある候補領域において、それより高い得点の他領域との重なり度合いを示す。
SSDではIoUが訓練によって設定された閾値を超えた場合、その領域候補を削除する。

OHEM(Online Hard Example Mining):

難しいサンプルを自動選択する事で学習効率を向上させる。
従来のヒューリスティクスに頼る必要はなく、またより高効率な学習を実現する事が可能

参考:機械学習論文読みメモ_59

📌参考

レジストリをいじらずに3ステップでWindowsのCtrlとCapslockを入れ替える

レジストリいじらなくても簡単スリーステップ。

1. ダウンロード

以下のサイトからソフトをダウンロード。 technet.microsoft.com

2. コマンド実行

ダウンロードした先で、コマンドを実行して有効にする。

$ ctrl2cap /install   # 有効化
$ ctrl2cap /uninstall # 無効化

rebootしたら有効にするとのメッセージが出るはず。

3. 再起動

再起動して終わり!

Windowsで秘密鍵を作成する

Git for Windowsをダウンロード

以下から。 gitforwindows.org

いざ作成

Gitbashを立ち上げる。 コマンドあるか確認

$ which ssh-keygen
/usr/bin/ssh-keygen

フォルダを作成。 キーを作成。 作られた!

$ mkdir ~/.ssh 
$ ssh-keygen -t rsa -b 4096 -C "user@example.com" -f ~/.ssh/id_rsa
$ ls
id_rsa  id_rsa.pub  known_hosts

調べながらやったけど、デフォルトではWindowsってsudoも使えないのか。あぁ…。

関連記事

saneeeatsu.hatenablog.com

Goodbye, Atom. Hello, Vim!!

Hello, Vim!

EmacsSublimeAtom(仕事・研究ではEclipse、たまーーーーに気まぐれでVisual Studio Code)という順番で乗り換えてきた。

ということでもっぱらAtomを使っているけど、jsxファイルに対応させるプラグインを入れてからどうやら動作がおかしい。
例えばCtrl+HやCtrl+BをHTMLのタグ内で行うと、インデントされた括弧{}が出てきてしまう。
Unixキーに慣れてしまうと、矢印キーやBackspaceなんてもんを使うのなんてもう絶対無理(とか言いながら会社のWindowsでは泣く泣く使っているんだけど)。

あれやこれや入れて行くと、自分の意図しない動作をしはじめてそれを解決するのも面倒。
最近4年半使っていたMacBookAir13も壊れたし、退職することも決まったので新しい会社に行ってPC変えると色々入れなおすのも面倒。

ってことでこれを機にVimに乗り換えよう!
最近友人のVimmerから勧誘を受けていたし(?)
Vimの設定ファイルを書くのは育てる感があるし、勉強にもなるしあまり面倒だと思わない...。

Vimのモードいろいろ

ノーマルモード

  • 起動直後のモード。カーソル移動、削除、編集を行う
  • このモードから編集モードやコマンドモードに移る。
  • ノーマルモードに戻る方法:「Esc」「Ctrl + [」「Ctrl + c」

挿入モード

  • テキストを書き込む時のモード。
  • ノーマルモードから入る方法:「i」「I」「a」「A」「o」「O」

ビジュアルモード

  • 領域を選択してコピー範囲を指定する際のモード。
  • ノーマルモードから入る方法:「v」「V」「Ctrl + v」「gv」など

コマンドラインモード

  • ファイル保存、Vimの終了、検索や置換などをするモード。
  • ノーマルモードから入る方法:「:」「/」「?」など

基本コマンド

[Vim] Vim初心者の自分が、初心者の視点からVim入門を書いてみました。 - YoheiM .NET

Emacs風にしたい

元々Emacs使ってたからUnixキーバインドゴリゴリに使いたいんだけど、Vimって上に移動するのに一回ノーマルモードに入ってからhjkl押すの????めんどくせええ!!!とか思ってたら設定出来るようですね。そりゃそうだ。

"""""""""""""""""""""""""""""""""""""""""""""""""
" Emacs Keybind
"""""""""""""""""""""""""""""""""""""""""""""""""
imap <C-p> <Up>
imap <C-n> <Down>
imap <C-b> <Left>
imap <C-f> <Right>
imap <C-a> <C-o>:call <SID>home()<CR>
imap <C-e> <End>
imap <C-d> <Del>
imap <C-h> <BS>
imap <C-k> <C-r>=<SID>kill()<CR>

function! s:home()
  let start_column = col('.')
  normal! ^
  if col('.') == start_column
  ¦ normal! 0
  endif
  return ''
endfunction

function! s:kill()
  let [text_before, text_after] = s:split_line()
  if len(text_after) == 0
  ¦ normal! J
  else
  ¦ call setline(line('.'), text_before)
  endif
  return ''
endfunction

function! s:split_line()
  let line_text = getline(line('.'))
  let text_after  = line_text[col('.')-1 :]
  let text_before = (col('.') > 1) ? line_text[: col('.')-2] : ''
  return [text_before, text_after]
endfunction

じっくりコトコト育てていこう

vimrcはgithubに上げようと思ってたけど、dotfilesという名前で色々な設定ファイルをあげるようなので、自分もリポジトリを作ってみました。
じっくり育てていきます。
githubからファイル落とすだけでどこでも同じ環境に出来るの強い。
github.com

参考

OpenCVを使って動画をフレームごとに分割→加工→Kerasで水増し→手の形を(グー・チョキ・パー)認識をした際に参考になったサイトまとめ

これ何?

OpenCVを使用したアプリケーションの作成の際に参考になったサイトを自分用にメモっておく。

どんなものかというと

  1. OpenCVで動画をフレーム毎に分割
  2. トリミング、リサイズ、回転をさせ、256x256の画像に加工
  3. Kerasを使って動画を水増し
  4. 手の形(グー、チョキ、パー)を認識させるモデルを作成(作成中)

ってとこまでやる。

github.com


Zero padding

  # %
  image_file='img_%s.jpg'
  cv2.imwrite(image_dir+image_file % str(i).zfill(6), frame)

  # format
  image_file='{0}_{1:06d}.jpg'
  cv2.imwrite((image_dir+image_file).format(hand_sign,i))

ssh公開鍵コピーコマンド忘れるからメモっとく

忘れがち

# Mac
$ pbcopy < ~/.ssh/id_rsa.pub

# Windows
$ clip < ~/.ssh/id_rsa.pub

DeepLearningを学ぶときに参考になった記事まとめ

自分のメモ用に随時更新

CNN