takuroooのブログ

勉強したこととか

You Only Look Once: Unified, Real-Time Object Detection(CVPR2016)

ObjectDetection関連の論文メモ
図は論文からの引用

目次

概要

従来の2stageの物体検出手法とは異なり、バウンディングボックス予測とクラス認識を同時に行い、リアルタイムに動作するsingle networkの提案。

論文リンク

https://arxiv.org/pdf/1506.02640.pdf

著者

  • University of Washington
    • Joseph Redmon
    • Santosh Divvala
    • Ali Farhadi
  • Facebook AI Research
    • Ross Girshick

従来の課題

  • 従来手法で性能が高いR-CNN系は構成が2stageになっているため速度が遅い。
    • まずオブジェクトが存在しそうな領域を抽出し、抽出した各領域をに対してクラス分類を行う。
    • 抽出した領域の数だけCNNを動作させるので処理時間が長くなる。

提案手法

ネットワーク構成

f:id:takuroooooo:20190629183925p:plain

  • 24層のConv layers + 2層のfully connected layers
  • 活性化関数は、最終層以外はleaky ReLUを採用
  • 解像度が高い方が物体検出に有利になるので入力は448x448

検出方法

f:id:takuroooooo:20190629185707p:plain f:id:takuroooooo:20190629184603p:plain

  • 入力画像をSxSのグリッドに分割(論文では7x7)
  • 各グリッドに対してB個のバウンディングボックス情報を予測。バウンディングボックス情報は座標(x,y,w,h)とオブジェクトの中心座標を含んでいるかのスコアで構成される。
    • xとyはグリッドの左上からバウンディングボックスの中心座標までのオフセットを表現(レンジは0-1)
    • wとhは入力画像のWidthとHeightで正規化されたバウンディングボックスの大きさを表現(レンジは0-1)
    • スコア=Pr(Object) * IOUtruth-pred 物体が存在しない場合はスコア=0
  • 各グリッドのクラスの確率を予測。
    • 1つのグリッドにつき1つのクラスしか割り当てられない。
  • Non-maximal suppressionによって重複したバウンディングボックスを削除

ロス関数

f:id:takuroooooo:20190629185958p:plain

  • ロス関数は計算が簡易な二乗誤差を採用
  • 大きなバウンディングボックスのずれよりも小さなバウンディングボックスのずれのほうが重要。なので、wとhは平方根で誤差を計算する。平方根を使うことで大きい値のときの誤差が小さくなる。
  • 論文ではλcord=5 λnoobj=0.5を設定。これはほとんどのグリッドにオブジェクトの中心が含まれないため、オブジェクトの中心が含まれないロスの影響を小さくするための対策。

結果

f:id:takuroooooo:20190630121727p:plain f:id:takuroooooo:20190630121745p:plain f:id:takuroooooo:20190630121753p:plain

  • Fast R-CNNと比べてlocalization errorが高いが、background errorが低い。
  • Fast R-CNNは画像の一部分だけで推論するのに対して、YOLOは画像全体を見て推論するためackground errorが低くなる。

f:id:takuroooooo:20190630121936p:plain

参考リンク

Introduction to YOLO detection model

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

論文メモ
図は論文からの引用

目次

概要

入力画像のサイズによらず、固定サイズの特徴マップを出力するspatial pyramid poolingの提案。

論文リンク

https://arxiv.org/pdf/1406.4729.pdf

著者

  • Kaiming He
  • Xiangyu Zhang
  • Shaoqing Ren
  • Jian Sun

従来の課題

  • CNN(convolutional layers + fully-connected layers)の入力画像のサイズは固定である必要がある。(fully-connected layerの入力次元が固定のため)
  • これを回避するために入力画像に対してcropやwarpが使用されるが、これらの処理を行うことで入力画像のオブジェクトが欠けてしまったり歪みがでてしまう弊害が発生する。

提案手法

f:id:takuroooooo:20190623175933p:plain

  • spatial pyramid pooling layerは任意のサイズの特徴マップを出力することができる。
  • convolutional layersとfully-connected layersの間にspatial pyramid pooling layerを配置することで任意のサイズの画像を入力することができる。
  • 図では、spatial pyramid pooling layerは1x1, 2x2, 4x4の複数スケールの特徴マップを出力している。(multi-level pooling)
  • multi-level poolingを使うとオブジェクトの変形や空間レイアウトに対してロバストになる。

結果

f:id:takuroooooo:20190623210714p:plain

single-sizeトレーニングは224x224のみで学習
multi-sizeトレーニングは224x224と180x180で学習
テストはどちらも224x224で行う。

実装

github.com

2019年上半期に参加した勉強会まとめ2

目次

2019/03/26 LINE AI Talk #01

line.connpass.com

LINE主催のAIに関するトークイベント。この日のセッションは2つ。一つは、ネオコグニトロンを開発した福島邦彦先生の「Deep CNN ネオコグニトロンと視覚パターン認識」。もう一つは、LINEの機械学習チームの方の「Fully Convolutional Networks における Softmax Cross Entropy Loss の変種の適用」

ネオコグニトロンはCNNのベースになったモデルで今回は最近のネオコグニトロンに使われている技術の解説だった。

主に

  • ネオコグニトロンの基本構成(S細胞、C細胞の役割)
  • Add-if-Silentによる学習
  • 内挿ベクトル法による識別

について解説されていた。 どれもDeepLearningでよくある「理論はよく分からないけど、試してみたらうまくいった」というような技術ではなく、「〜という原因があるから〜という手法が効果的だ」というように理論の解説が丁寧にされていたのが印象的だった。

講演時の資料ではないけど、発表内容は以下の資料とだいたい同じだった。
Deep CNN ネオコグニトロンの学習

2019/3/28 Machine Learning Team Building Pitch

connpass.com

株式会社scouty、エムスリー株式会社、クックパッド株式会社、Repro株式会社による共催の機械学習チームビルディングに関するトークイベント。

チームビルディングの方法で特にチームの技術力の上げ方や組織の中でどこに機械学習チームを作るべきか(機械学習チームという独立した一つの組織を作るのか、それとも各事業部にそれぞれ機械学習チームというものを作った方がいいのか)という点に興味があったので参加した。
しかし、そういう観点での発表はなく「どうやって優秀な人を採用するか」みたいな話が多かった。(scoutyがいたせいかもしれないけど....)

2019/04/06 nlpaper.challenge NLP/CV交流勉強会(最終回)

nlpaper-challenge.connpass.com

cvprの論文読み会をするするチームcvpaper.challengeとそれのNLPバージョンのnlpaper.challengeの合同勉強会。ブレインパッドで開催。

この日は画像認識の第7章〜第8章までの読み合わせとオムロン サイニックエックスの牛久 祥孝先生の講演があった。 牛久 祥孝先生の講演ではキャプション生成の最近の研究についての発表があった。(講演の資料欲しかったけどなかった。)

2019/05/11 SysML2019 論文読み会

mlxse.connpass.com

機械学習工学研究会が主催のSysML Conferenceの論文読み会。 一番興味深かったのは最初の方に紹介されたCNNの2値化の話。精度を犠牲にして速度を上げる2値化、3値化はあまり意味がないという内容。
2値化、3値化前のモデルを速度と精度の二軸でプロットするとパレート最適解のラインができる。2値化、3値化のモデルはこのラインを超えることができない、つまり2値化、3値化のモデルより性能が良い2値化していないモデルが存在するとのこと。

他にはハード関連の論文紹介などがあったが全く話についていけなかった....

SysMLのサイト
www.sysml.cc

2019/05/15 第21回ステアラボ人工知能セミナー

stair.connpass.com

DeNAの内田さんによる「畳み込みニューラルネットワークの高精度化と高速化」の講演。

スライドが133枚あって約2時間ノンストップの講演だった。

内容は、

という感じ。知らない手法が多かったので参加できて良かった。また疑問に思ったことを質問したときに、基本的な質問にも関わらず的確で丁寧に回答をいただけて勉強になった。
当日の動画とスライドは以下のサイトで閲覧可能 stair.center

2019/06/08 DLLAB 2 周年イベント: ディープラーニングの社会実装を阻むものは何か?

dllab.connpass.com

DLLAB主催のイベント。DeepLearning流行っているけどなんでDeepLearning使ったサービスが増えていかないの?ということについて講演したりハンズオンしたりするイベント。

講演自体はあまり興味がなく、JetBotを作るというハンズオンだけが目的で参加した。

ハンズオンでは、すでに用意されている部品を組み合わせてJetBotを組み立てて、AzureでNNを学習したものをJetBotにデプロイして動かすというもの。
という予定だったがネットワークの問題があってJetBotを走らせるところまでいかなかった。

JetBotの制御は組み込みソフトっぽいのを想像していたがすでに用意されている関数を叩くだけで簡単に制御できた。たぶんPythonちょっと書ける人なら誰でも動かせると思う。
2020年から学校でプログラミングの教育が始まるらしいけど、JetBot作る授業とかあったら面白そう。

2019年上半期に参加した勉強会まとめ1

2019年上半期に参加した勉強会まとめ
長いので2つに分けてまとめる。

目次

2019/02/02 fpgax #11 + TFUG ハード部:DNN専用ハードについて語る会

fpgax.connpass.com
六本木Googleオフィスで開催。大きいスクリーンがあってそこにスライドを映していて見やすかった。

DNN向けのハードウェアについて発表者が話す会でTPU、AIチップ、FPGAによるDNN、DNNコンパイラ、DNN高速化など多岐にわたる内容で非常に勉強なった。

特にDNNコンパイラの話はなぜDNNコンパイラとは何かという話から始まり最近のコンパイラの動向まで分かりやすく解説されていてコンパイラに詳しくなくても楽しく話が聞けた。

当日の発表内容はYouTubeにアップされている。
www.youtube.com

2019/02/27 Edge Deep Learning Summit

leapmind.connpass.com

LeapMind主催のイベント。渋谷ストリームホールが会場。
組み込みディープラーニングを実践している企業が事例を紹介したり、LeapMindの方がLeapMindの製品の話したりするイベントで技術的な話より事例紹介が中心。企業がの事例を聞く限り組み込みディープラーニングやってみましたという例が多く、使い方を模索しているようだった。もう少し幅広い業種の例が聞きたかった。

LeapMindはクラウド側ではなく、エッジ側でモデルを動かすことに特化したサービスを提供している。クラウド側での推論には通信コストやプライバシーの問題があることを指摘していた。

TensorFlowなどのフレームワークを使った量子化ではビット数を8bitまでしかサポートしていないが、LeapMindのBulueoilを使えば1 or 2 bitに量子化できるとのこと。Bulueoilではユーザーが学習データを用意するだけで、量子化モデルを作ることができる。対応しているタスクはclassification / detection / semantic segmentationなどがある。 現在Buleoilはオープンソース化されている。

blue-oil.org

またこのイベントでエッジAI専用チップを開発することを発表していた。

monoist.atmarkit.co.jp

2019/03/04 SIX2019

six.abejainc.com

Abejaが主催のイベント。品川グランドプリンスホテルが会場。

二日間の開催だったが初日だけ参加した。 EDLSとは違い、多くの企業が機械学習のデータ集め方やアノテーション方法、実問題に対するモデルの適用例など幅広いテーマで講演していた。そのうち以下の4つの講演を聞いた。

  1. DeNAにおける先端AI技術活用のチャレンジ(DeNA 内田祐介)
  2. 機械学習による広告クリエイティブの制作支援と生成(サイバーエージェント 内田光太)
  3. 少数データからの学習法の展開とABEJAの取り組み(ABEJA 藤本敬介)
  4. 徹底討論:AI導入・運用を加速性よ、40分一本勝負!(ABEJA 岡田陽介 マスクドアナライズ)

中でもDeNAサイバーエージェントの話が面白かった。DeNAの話ではAIチームの構成や組織のあり方の説明があって勉強になった。 サイバーエージェント機械学習で広告制作をアシストする事例を紹介していて、人間がやるべきこととAIがやるべきことの線引きがうまくできている印象を持った。

発表資料のいくつかは以下のリンクから参照可能。

six.abejainc.com

2019/03/15 【緊急開催】キカガク&マスクド・アナライズ共催イベント『ここが変だよ、日本のAIプロジェクト』

kikagaku.connpass.com

キカガクの吉崎さんとマスクド・アナライズとの対談イベント。 AI開発で起こるあるあるや失敗例を取り上げ、うまくAIを使うにはどうすればいいかということをテーマとしていた。 以下参考になった話。

  • AIを使う目的が曖昧。AIを使うことが目的になっている。
  • pocは試行錯誤の繰り返しになるので自社でやるべき。本番システムを作る時はAI専門の会社に頼む。
  • 新規事業でAIを使おうとすると、AIでどこまでの精度があればいいか判断しにくい。
  • AIで全てをやろうとすると失敗する。ヒューマンインザループがあるとうまくいく。

「AIを使うことが目的になっている」というのはよく悪い例として出るけど小さな課題に対してとりあえず使ってみるというのは大切だと思う。そもそも使わないと何ができるか想像できないし、使う上での障害も理解できないし。

AI開発を請け負うベンチャーの人がよく「顧客にAIでとにかく何かやりたいって言われて大変だ」みたいな話しているけど、まずはどういうところにAIで解決できる課題があるのか顧客と一緒に探す根気強いコンサルサービスから始めるべきだと思う。

2019/03/20 Recap of TensorFlow Dev Summit 2019

tfug-tokyo.connpass.com

Google六本木オフィスでの開催。 TensorFlow Dev Summit 2019をRecapする会。

バイス上で学習するFederated Learningは興味深かった。勉強会の後、ネットで調べてみたけど情報があまりなくどうやって協調学習していくのか謎だった。

単純に考えるとデバイスから取れた情報を使ってクラウドで学習するというのがありえそうなケースだけど、これの問題点としてよくプライバシーの問題が挙げられる。だからデバイス上で学習しようという話なのだけども、今どきの人はネットに情報をアップロードすることに抵抗があまりないのではないかとも思う。

2018年に参加した勉強会まとめ

2018年8月22日にconnpassに登録してから定期的に勉強会に参加しているので、(まずは)2018年に参加した勉強会をまとめてみた。

勉強会に参加するまで分からないことがあれば自分でネットで調べたり本を買ったりして勉強していたけど、

  • 勉強したいことの幅と深さに限界があると思った 。
  • 自分の会社以外のエンジニアってどんな人がいるのか知りたかった 。

という思いがあったので色々参加してみることにした。

目次

2018/09/22 組込みDL体験コース

connpass.com
東京駅近くのビルの一室で行われたイベント。場所がわかりにくかった。

内容は、前半はディープラーニングの簡単な講習と後半はtiny-YOLOをラズベリーパイ上で動作させる実習があった。オリジナルtiny-YOLOをパソナテックのフレームワーク「コキュートス」に変換してそれをC言語でラズパイ上に実装した。
パソナテックの研修のお試し版のようで、これをもとに実践コースというものを開発しているとのこと。

講習はneural neworkの種類やconvolutionの概要、あとYOLO階層構造について触れていた。convolutionなのに一部separable convolutionかのように説明されていたのが気になった。

実習はデフォルトのエディタしかないのでviとか使えないと厳しいかも。C言語使えてちょっとディープラーニング触ってみたいという人にはちょうどいいイベントかも。

2018/12/01 Chainer Beginner's Hands-on Course #01

chainer.connpass.com
会場は六本木のGoogleオフィス。いろはすが無料だった。このイベントで初めてDefine by runを使って使いやすさに感動した。

Chainer入門のイベントで、Chainer使ってアプリケーション開発しようという内容。全4回で構成されていて、初回に参加した。
Google Colaboratory上で実行できる説明資料が公開されていて、基本的にそれを順番に実行していく形式。初回はFashion-MNISTの学習だった。

chainer-colab-notebook.readthedocs.io

また当日の様子が中継されており、YouTubeで視聴することもできる。 www.youtube.com

資料が分かりやすい+YouTubeでの説明付きなので、現地参加していかなくてもある程度自習できるけど、現地参加ならチューターがいるので分からない箇所はその場ですぐ質問できるというメリットもある。

2018/12/27 Neural Network Console ハンズオンセミナー in ソニー

nnc.connpass.com 大崎のソニーで開催されたNeural Network Consoleのセミナー。講師はソニーの人ではなかった。

Neural Network Consoleで学習したモデルをお絵描きWebアプリに組み込むハンズオン。MNISTを学習させて、ブラウザ上で数字を書くとモデルが予測した数字をプリントするみたいなやつ。最初に資料を渡されてそれを見ながら各自進めていき、分からないところがあれば質問するというスタイル。自分のペースで進めていけるので良かった。

GUIでパズルみたいにモデルを作るのが楽しかったのと、モデルの作成から学習、評価までブラウザ上で完結してできるのが開発しやすいと感じた。
個人的には各レイヤーの入出力が可視化できたり、エラーの分析機能だったり、学習/評価データの分布が見れたりできたらさらに使いやすいと思った。

GWでやったこと

10連休中にやったことまとめたみた。

目次

FCNの論文まとめた

論文は昔に読んだことあったけど、読んで実装しただけで終わっていたので内容をまとめてみた。古い論文だけど、全結合層なしのモデルをsemantic segmentationに使うとかskip architectureで低層の特徴マップを高層にバイパスするとか最近のモデルで標準的に使われている手法をいち早く使っている論文になっている。色々重要な試みをされている論文なのでオススメです。
takuroooooo.hatenablog.com

U-Netの論文まとめた

U-NetはQiitaの記事で読んだ程度だったが、色々な記事でよく見かけるので論文を読んでみた。医療画像系のタスクで使われたモデルで、医療画像の学習データが少ない中どうやって精度を出すかという課題に対する取り組みも書かれている。モデルはFCNの改良版という印象。 takuroooooo.hatenablog.com

DeepLabv3+の論文まとめた

Papers With Code : Semantic SegmentationでBestMethodになっていたので読んでみた。この論文以前にDeepLabv1,DeepLabv2,DeepLabv3と3つの論文があるようで、それらを全て読まずにDeepLabv3+の論文を読んだので消化不良になっている箇所がいくつかあるのでv1から読んでまとめてみようと思っています。

takuroooooo.hatenablog.com

U-Net実装した

論文読むだけでは物足りないのでPyTorchで実装してみた。 github.com

Optuna使ってみた

ハイパーパラメータ自動探索ツールは使ったことがなく、Optunaは前々から気になっていたので触ってみた。自動で探索してくれるのですごく楽だけど、探索方法の概要とか知らないとなんとなく気持ち悪いのでOptunaの探索アルゴリズムも勉強していきたい。 optuna.org

Quiver使ってみた

Kerasの層の出力特徴マップを可視化できるツール。GUIで入力画像と層を指定するとその入力画像をいれたときの特徴マップが見れる。UIがシンプル。 github.com

A Recipe for Training Neural Networksを読んだ

これはただ記事を読んだだけだけど内容が良かったので書いておく。OpenAIのエンジニアのブログでニューラルネットワークの学習で気をつけることが書かれている。特に共感したのは以下の部分。

What we try to prevent very hard is the introduction of a lot of “unverified” complexity at once, which is bound to introduce bugs/misconfigurations that will take forever to find (if ever).

ニューラルネットワークを学習するとき、バグのなどの原因になるから未検証なことを一気に突っ込むなという意味だと思っているけど、この通りだと思う。色々な変更入れた結果、動作がおかしくなると何が原因なのかが特定しにくいのはニューラルネットワークの学習に限らない話なのであらゆる仕事に共通する決まりごとだと思う。

また以下の箇所はニューラルネットワークの学習ではなく、コードの書き方のアドバイスだけどすごく勉強になった。

I like to write a very specific function to what I’m doing right now, get that to work, and then generalize it later making sure that I get the same result.

いきなり汎用的な関数書くと難しくてバグりやすいから特定のことしかできない関数を書いてからそれを徐々に汎用的な関数に修正していくのが好きとのこと。

他にもためになるTipsがまとまっているのでニューラルネットワークを勉強している人は一読をオススメします。

karpathy.github.io

今後やっていきたいこと

  • 論文読んでPyTorchで実装するというのは今後も続けていきたい。
  • 物体検出系の論文読んで実装したい。
  • もうすぐTensorFlow2.0が正式版になるようなので使ってみたい。
  • Keras Tuner使ってみたい。
  • Optunaの探索アルゴリズム勉強したい。
  • QuiverのPyTorch版作りたい。(フロントエンド、Flask、Reactあたり勉強する必要がありそう。)

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation(ECCV2018)

SemanticSegmention関連の論文メモ
図は論文からの引用

GoogleのDeepLabv3の進化版であるDeepLabv3の論文。

目次

概要

オブジェクト境界のセグメンテーション結果を強化するためにDeepLabv3にシンプルなデコーダモジュールを追加したDeepLabv3+を提案。

論文リンク

https://arxiv.org/pdf/1802.02611v3.pdf

著者

  • Google Inc
    • Liang-Chieh Chen
    • Yukun Zhu
    • George Papandreou
    • Florian Schroff
    • Hartwig Adam

提案手法

f:id:takuroooooo:20190504210142p:plain

DeepLabv3からの変更点

  • DeepLabv3のベースネットワークをResNetからベースのネットワーックを改良版Xceptionに変更。
  • より鮮明なセグメンテーションを得るためにDeepLabv3にデコーダモジュール追加。
  • 計算量とパラメータ数を削減するためにDepthwise separable convolution をASPP(Atrous Spatial Pyramid Pooling)とデコーダに適用。

Atrous Spatial Pyramid Pooling

初代DeepLabからあるモジュールだけど少し補足。
f:id:takuroooooo:20190504213140p:plain

  • SPPNetSpatial pyramid poolingをAtrous convolutionで実行
  • 異なるrateでAtrous convolutionを実行することでマルチスケールのコンテキスト情報をキャプチャ。
  • PSPNetではこれをAtrous convolutionではなくPooling(Max/Avg)で処理していた。
  • Atrous convolutionのrateを大きくしていくとフィルタの有効な重みが小さくなる問題がある。(下記Figure4参照 図はDeepLabv3の論文から引用。
  • この問題に対応するためにImage PoolingをDeepLabv3で導入。Image Poolingではグローバルなコンテキスト情報をキャプチャするために、Global Average Pooling + 1x1 convを使う。
  • DeepLabv3+ではAtrous Spatial Pyramid PoolingにDepthwise separable convolutionを導入した。

f:id:takuroooooo:20190504214730p:plain

改良版Xception

f:id:takuroooooo:20190504215442p:plain

改良点
1. レイヤー数を増加
2. max pooling をDepthwise separable convolutionに置き換え。
3. batch normalizationを追加。

結果

f:id:takuroooooo:20190504220029p:plain
PSPNetよりもmIOUが高い。

実装

github.com

参考リンク

developers-jp.googleblog.com