MotoJapan's Tech-Memo

技術めも

【ECCV2018 論文メモ#5】Multimodal Unsupervised Image-to-Image Translation

生成モデルの論文。
画像の潜在空間は、content空間とstyle空間により構成されている仮説に基づき、encoderとdecoderを定義。
contentは残しながらターゲットドメインのstyleをサンプリングして画像変換を行うものらしい。
犬画像を猫画像にスタイル変換するようなイメージ。
f:id:motojapan:20180825144511p:plain
(画像変換サンプル:出典より抜粋)

今回の論文と出典

Multimodal Unsupervised Image-to-Image Translation
https://arxiv.org/abs/1804.04732

著者

Xun Huang, Ming-Yu Liu, Serge Belongie, Jan Kautz

内容

  • マルチモーダル教師なし画像変換
  • 画像変換における既存手法の決定的モデルの弱点は、可能性のある出力の全分布を捉えることに失敗するということ
  • 仮説は「画像表現はcontent code(ドメイン不変成分)とstyle code(ドメイン依存成分)から成り立つ」ということ
  • 確率的要素を含めてこのロジックで画像を再構成することで画像生成を行う
  • ポイントは次の3点
  1. ラベリングとしてのデータペアは不要で教師なし学習であること
  2. 既存手法のような1-to-1の決定的なマッピングを行うモデルではなく、画像表現マルチモーダルな出力を得ることができること
  3. ユーザがstyleを入力できること

詳細

  • 「画像表現はcontent code(ドメイン不変成分)とstyle code(ドメイン依存成分)から成り立つ」という仮説が前提
  • この前提の下、encoderにより画像からcontent codeを取り出し、targetドメインのstyleをサンプリングしてdecoderで再構成する

f:id:motojapan:20180825144459p:plain
(提案手法の概略図:出典より抜粋)

  • encoder/decoderは決定的であるが、styleサンプリングが確率的(正規分布)であるため、既存手法より多様で連続的な出力を得られるという話らしい

f:id:motojapan:20180825144504p:plain
ドメイン内変換/クロスドメイン変換:出典より抜粋)

  • encoderとdecoder(generator)は逆関数として定義される
  • S2は事前分布に従い、それ自体は単一モーダルであるが、
  • decoderの非線形性が出力画像のマルチモーダル性を生み出している
  • 潜在空間(変数)を推定という点でやっていることはVAEに近い気もする

f:id:motojapan:20180825144508p:plain
(生成モデルブロック図:出典より抜粋)

  • CycleGANに似ているようにも感じるが、入力をドメイン変換してから逆方向に入力すると同じ画像が得られるという特性とは異なる

読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。

【ECCV2018 論文メモ#4】Person Search by Multi-Scale Matching

人物検索(照合)ですね、単なる人検出ではなくクエリ画像と同じ人物を未加工なシーン情報からロバストに検索するものとなっているようです。

今回の論文と出典

Person Search by Multi-Scale Matching
https://arxiv.org/abs/1807.08582

著者

Xu Lan, Xiatian Zhu, Shaogang Gong

内容

  • マルチスケール対応人物検索
  • 技術としては、人検出と人物認識の組み合わせ
  • 現在の人検出技術は、ミスアライメントや検出ミスなどによるネガティブ効果を軽減することに注力している
  • 提案手法ではFaster-RCNNベースで改善を加え、十分に信頼度の高い人検出を行う(ということは遅いのか?) 
  • 人物検索は人検出より課題をもつタスク(スケール面で)ではあるが、Cross-Level Semantic Alignment (CLSA)という深層学習のアプローチを提案
  • CLSAはResNet50をベースに改善を加えている

f:id:motojapan:20180823070753p:plain
(提案モデルブロック図:出典より抜粋)

詳細

  • 人物認識と人検出は設定されるタスク難易度が異なり、
    • 人物認識は事前処理ですでにクロップ済みの人に対して推論を行うが、
    • 人検出はエラーやミスアライメントの程度もわからない未加工のシーンから得られる様々なスケール画像に検出を行う。
  • そのため、実世界での検証の機会を失っている
  • 既存手法のre-idはスケールなど修正済みで検証されている
  • 下図はデータセットベンチマークのスケール分布をしてしている

f:id:motojapan:20180823070747p:plain
ベンチマーク別のスケールにおけるバイアス:出典より抜粋)

  • 人検出は、Faster-RCNNを改善し、信頼度の高い人検出座標を求める
    • ネットワーク改善
    • バックボーンとしてResNet-50で事前学習
    • 1st-4th層をファインチューニング(低レベルでの特徴量を目的に適用させることが目的)
    • オーバーオールのパフォーマンス向上を実現
  • 人物識別(CLSA)では、End2Endのピラミッド特徴量表現の学習をベースに、 マルチスケールの人画像に対してロバスト性を高める
    • ピラミッドネットワーク特徴量はスケール不変性を学習可能
    • 課題としてネットワークは低レイヤーほど識別能力が低いこと
    • 組み込みピラミッド特徴量はこの性質と高レイヤーの特徴量を共同で使うことで全体性能を下げる可能性があるが、提案手法で工夫

f:id:motojapan:20180823070800p:plain
(Lossの解説:出典より抜粋)

読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。

【ECCV2018 論文メモ#3】StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction

テーマだけで面白そうだったので読んでみた(らgoogle様の論文でした)

今回の論文と出典

StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction
https://arxiv.org/abs/1807.08865

著者

Sameh Khamis, Sean Fanello, Christoph Rhemann, Adarsh Kowdle, Julien Valentin, Shahram Izadi

内容

  • StereoNet:リアルタイムエッジ認識デプス推定のためのガイド付き階層的精緻化
  • ステレオRGBを入力にエッジ情報を保存しながらデプスをEnd2Endのネットワークで推定
  • 既存手法に比べてサブピクセル精度でステレオ推定が可能で高速
  • このステレオ推定により、リアルタイムなパフォーマンスを低解像度コストボリューム(Cost Volumes)を用いることで実現している
  • Cost Volumesは、高精度な視差を求めるのに必要な情報をエンコードする
  • Titan X GPUを用いることで720 [p] 60 [fps] を実現
  • 実装は細かく記載あり

詳細

  • 既存のステレオマッチング手法(SoTa)ではCRFベースのアプローチが存在する
    • 精度は良いが、Computational Costが高く遅い
    • 一般的にsolvingはNP困難とされている

NP困難わからない場合は下記参考
motojapan.hateblo.jp

  • 提案手法は5つに言及
  1. 古典手法を超えるサブピクセルマッチ精度をDeepで実現
  2. 上記により、古典手法ステレオマッチングのデプス推定を、非常な効率的なアルゴリズムをもたらす低解像度コストボリューム(Cost Volumes)で導くことを実証
  3. 以前のDeepアーキ手法では、タスクに対して過剰にパラメタ化されており、これが低コスト化へ役立つことを提示
  4. 新しい階層的デプス精緻化層は、エッジ情報を保ちながら高品質にアップサンプルが可能
  5. 提案システムはハイエンドGPUアーキテクチャで動作

f:id:motojapan:20180820234227p:plain
(ネットワーク構造:出典より抜粋)

  • Networkブロックは下記3つ
    • DownSampling Feature Network
      • ステレオ推定の主課題は、一致推定の難易度(完璧な特徴量の一致が理想)
      • カラー情報などに依存した既存手法より低コストに特徴量抽出を行う
      • Siamese networkベース
      • 入力は右目と左目のRGB画像
      • 受容野を用いて既存手法同等以上の特徴量を得ることを目標とする
    • Cost Volume Filtering
      • Cost Volume Filteringは既存手法[25]であり、マッチングのためにカラー情報を直接利用する
      • 一方、提案手法ではピクセルレベルでの特徴量を利用し、マッチングを行う
      • 入力はDownSampling Feature Networkの出力
      • モバイル動くほど軽量化、サブピクセル精度を実現
      • 視差コスト関数は、”soft arg min”を採用
      • このネットワークの出力時点では推定精度は荒い
    • Hierarchical Refinement
      • カラー情報をガイドとして、高周波詳細をブレンドするために視差値を拡張させる
      • 具体的には、このネットワークはResidualな構造を持ち、出力される視差の残差を加算する
      • 更にそれを階層的に粗い推定結果にマージをしていく
  • cost volume output出力(下図上)を、refinement networkの結果(下図下)で更新していく動き

f:id:motojapan:20180820234231p:plain
(階層的精緻化の結果:出典より抜粋)

  • 性能的は精度(precison)と速度(speed)で測定
  • 目視でもHashMatchには限界があり、StereoNet w/ refinementがよく効いている

f:id:motojapan:20180820234236p:plain
(既存手法との比較:出典より抜粋)

  • 1/16解像度時点のコストボリュームで、high qualityな視差マップを生成するに必要な情報を得ている

f:id:motojapan:20180820234240p:plain
(階層的精緻化の階層別効果検証:出典より抜粋)

  • errorは全体を通して1以上あるが、高速なステレオ推定実行が可能

f:id:motojapan:20180820235103p:plain
(古典手法との精度とスループットについて:出典より抜粋)


読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。

【ECCV2018 論文メモ#2】Contemplating Visual Emotions: Understanding and Overcoming Dataset Bias

Maker Faire Tokyo 2018では感情推定ロボットを出展したので感情繋がりでこの論文。

今回の論文と出典

Contemplating Visual Emotions: Understanding and Overcoming Dataset Bias
https://arxiv.org/abs/1808.02212

著者

Rameswar Panda, Jianming Zhang, Haoxiang Li, Joon-Young Lee, Xin Lu, Amit K. Roy-Chowdhury

内容

  • 視覚的感情の考察:データセットバイアスの理解とその克服
  • 感情データセットには、バイアスが存在する
  • 話したいのは3つの話題
  1. 最新のデータセットや精度の話を追わず、既存データセットの持つバイアス問題点を認識し、方法論の見直すこと
  2. Webなどの大規模データを用いることで、バイアス効果を軽減できること、シンプルなカリキュラム(体系的)学習方法を提案し、SoTAを達成したこと
  3. データセットの提案すること

詳細

  • データセットは、Deep Sentiment, Deep Emotion, Deep Emotion-6の3つで話が展開される
  • バイアスの例(Deep Emotion)は、下図の通りで、
    • Postive : amusementな画像は、ほぼamusement parkの画像で、視覚的コンセプトの多様性が低い
    • Negative : sadnessな画像は、amusement parkの画像は無く、その属性を十分に表現できていない

f:id:motojapan:20180818155938p:plain
(バイアスの考察例1:出典より抜粋)

  • データセットの持つバイアスを評価する手法をいくつか紹介している
    • 3データセットを分類する手法 (ResNet-50)
      • 期待値は、全て同じ精度だが偏りがある
      • 高い信頼度を示す画像を見ると、Deep Emotionは「屋外画像が多い」、Deep Emotion-6は「中心に対象物があり、背景はクリア」というバイアスがある

f:id:motojapan:20180818160008p:plain
(データセットを3クラス分類した結果(左)と信頼度の高い画像(右):出典より抜粋)

    • Pos/Neg2クラス分類する手法 (ResNet-60)
      • 感情情報を圧縮して2クラス(Pos/Neg)分類する
      • 各データセットでcrossにtrain/testした結果を考察
      • Binary Coss-Dataset Generationと呼ぶが、これの優位点は次の2点
        • 「シンプルな2値分類は評価の難しいデータセットにフェアな比較が可能」
        • 「シンプルなテストに一般化できていないモデルの場合、適切な粒度に分類したデータでもうなく動かないことがわかる」

f:id:motojapan:20180818160037p:plain
(各データセットをPos/Neg2クラス分類した結果:出典より抜粋)

    • オブジェクトとシーンについて条件付きエントロピーの分布で評価する手法
      • これでデータセットの中のデータ量を調査
      • 条件:確率をふっても変化が少ない感情属性はそもそもデータセットに少ないと解釈できる

f:id:motojapan:20180818160045p:plain
(バイアスの考察例2:出典より抜粋)

  • データセットの提案
    • WEBEmoというデータセットを提案
    • Deep Emotion の12倍のデータ量
    • Web上に存在するデータを既存研究をベースに組織化したもの
    • 良い点は、下記の2点
      • 検索エンジン差を軽減できること」
      • 「異なるタスクを学習することで区別可能な感情特徴量を学習できること」
    • 感情データセットは階層化
      • level 1 : 2 [categories](basic)
      • level 2 : 6 [categories]
      • level 3 : 25 [categories](fine-grained)

f:id:motojapan:20180818160049p:plain
(適切な粒度と呼ばれる25分類:出典より抜粋)

  • 効率的なカリキュラム的学習
    • データセットに跨った様々なタスクに対してパフォーマンスがでる
    • 連続的手順により学習することが可能
    • 基本は、学習ステージを分け、早期ステージではlebel 1、後半に進について高いlevelを学習
    • 上記を満たすようにCNNに情報を挿入していくようなモデル(ResNet-50 base)

f:id:motojapan:20180818160053p:plain
(各データセットでのテスト結果:出典より抜粋)
f:id:motojapan:20180818160057p:plain
(テスト結果:出典より抜粋)

読み時間2時間:執筆時間30分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。

【ECCV2018 論文メモ#1】Learning to Anonymize Faces for Privacy Preserving Action Detection

ECCV2018まで1ヶ月を切ったので興味がある論文のメモを残していく。(
1日1本のペースで空き時間を使ってやっていきたい。(多分無理だ)

今回の論文と出典

Learning to Anonymize Faces for Privacy Preserving Action Detection
https://arxiv.org/abs/1803.11556

著者

Zhongzheng Ren, Yong Jae Lee, Michael S. Ryoo

内容

  • アクション検出を維持しながらプライバシーのための顔情報匿名化の学習
  • アクション検出とは、「電話をする、歯を磨く、化粧をする」などを指す
  • 顔情報匿名化とは、既存手法では、顔へのBlurやMask、Noiseなどを指す

f:id:motojapan:20180817012039p:plain
(既存匿名化手法例 / 上図:出典より抜粋)

  • 提案手法では、より自然にシーンやアクションを維持したピクセルレベルの匿名化が可能

f:id:motojapan:20180817012042p:plain
(左顔は提案手法匿名化前、右顔は提案手法匿名化後 / 上図:出典より抜粋)

  • GANの仕組みをベースに敵対的学習する
  • 「異なる見た目の修正顔を作るGenerator(Modifier)」
  • 「修正顔であるにも関わらず正しく個人識別できるように学習するDiscriminator」
  • 更にマルチタスク学習として、ActionDetectionを統合して精度を高めている

詳細

  • モデルは下図の通り

f:id:motojapan:20180817012036p:plain
(モデル / 上図:出典より抜粋)

  • fr_{v}は、顔画像 (r_{v}はFaceDetection後の画像となる)
  • Action Detectionは、Faster RCNN
  • Face Detectionは、SSH[29]
  • Face Recognitionは、Sphereface[26]
  • Generatorは、個人識別精度を最小化したい
    • InputとOutputで別人にしたいので
  • Discriminatorは、個人識別精度を最大化したい
    • (修正済みだろうと)どんな入力が来ても正しく識別できてしまえるようにしたいので
    • Tips : 大量のデータで事前学習しておく
  • L_{det}L_{l1}は最小化、 L_{adv}は、最大化するように最適化していく
  • L_{l1}は、Photorealistic Lossで、l1のみだと今回のプライバシータスクに最適でないため、 λを入れ、生成した顔画像の酷似を防止している

以上。

【python】raspiでwebカメラとpicameraの両対応コードを実装

モチベーション

カメラをフラグ(PICAM = True )で切り替えられるようにしたい。

[カメラ初期化] cv2.VideoCaptureの置き換え

これはpicameraだと動かないはず。
カメラのイニシャライズをcap取得のwebカメラ、piカメラ両対応する関数を作成。

def initCamera():
    cap = None
    res = False
    while res is False:
        if PICAM:
            cap = picamera.PiCamera()
            # cap.start_preview()
            cap.resolution = (640, 480)
            cap.framerate = 33
            cv2.waitKey(1000)
            res = True
        else:
            cap = cv2.VideoCapture(DEVICE_ID)
            res, _ = cap.read()
            #pass
            cv2.waitKey(1000)
            print('retry ..')
    return cap

そしてcv2.VideoCaptureを置き換え。

cap = cv2.VideoCapture(device_id)
↓
cap = initCamera()

[画像取得] cap.readの置き換え

こちらもpicameraだと動かない気がする。
picameraはstreamから取ってくるので、次のようなwebカメラpiカメラ両対応の関数を作成する。

def getImage(cap):
    c_frame = None
    if PICAM:
        with picamera.array.PiRGBArray(cap, size=(640, 480)) as stream:
            c_frame = cap.capture(stream, 'bgr')
            c_frame = stream.array
            if c_frame is None:
                exit

    else:
        end_flag, c_frame = cap.read()
        if end_flag is False or c_frame is None:
            exit
    return c_frame


そして置き換え。

img = cap.read()
↓
img = getImage(cap)

以上。

【ipython/jupyter】 ipython notebookの出力データを外部からclearする方法

ipython notebookもしくはjupyter notebookで日頃の作業をしている中で

  • 大量のログを出力したままファイルを閉じたり
  • ログを出しすぎて処理が重くなり、不用意にterminateしたり

して、次の実行時にipynbファイルの展開が遅くなったり、最悪展開できない、kernelが展開時にterminateすることがある。

その時の対処法をメモ。
やりたいこと=外部から出力カラムを削除

$ pip install nbclean
$ python
> import nbclean
> c = nbclean.clean.NotebookCleaner('./hoge.ipynb')
> c.clear(False, True)
> c.save('./hoge_cleaned.ipynb')

ポイントは下記。

> c.clear(False, True)

これの第一引数が入力カラム、第二引数は出力カラムを削除するフラグ。
間違えて、第一引数をTrueにするとコード本体が消える。

詳細はこれ。
https://www.pydoc.io/pypi/nbclean-0.1/autoapi/clean/index.html

追記: それでも開けない場合、ブラウザが未対応なデータを読み込もうとしていたりするので、起動ブラウザを変更してみる。


(個人的にipython notebookを日頃使います)