Morpho Tech Blog 2023-09-12T10:00:00+09:00 morphoinc Hatena::Blog hatenablog://blog/26006613530354298 A Brief Survey of Schrödinger Bridge (Part I) hatenablog://entry/820878482963476150 2023-09-12T10:00:00+09:00 2023-09-12T11:38:55+09:00 こんにちは、CTO室リサーチャーの長山と申します。 モルフォでは毎週金曜日に持ち回りで論文紹介等を行うJournal Clubという取り組みを行っています。 今回は、私がその場で発表したSchrödinger Bridge(シュレーディンガー橋; SB)という確率論的生成モデルスキームの解説スライドを公開いたします。 Stable DiffusionやMidjourneyに代表されるような画像生成AI手法は、ここ一年間で目覚ましい発展を遂げたことは記憶に新しいと思います。 その原動力となった基礎技術の一つが拡散モデル(Diffusion Models)です。 拡散モデルとは、データからノイズへ… <p>こんにちは、CTO室リサーチャーの長山と申します。</p> <p>モルフォでは毎週金曜日に持ち回りで論文紹介等を行う<em>Journal Club</em>という取り組みを行っています。 今回は、私がその場で発表した<strong>Schrödinger Bridge(シュレーディンガー橋; SB)</strong>という確率論的生成モデルスキームの解説スライドを公開いたします。</p> <p>Stable DiffusionやMidjourneyに代表されるような画像生成AI手法は、ここ一年間で目覚ましい発展を遂げたことは記憶に新しいと思います。 その原動力となった基礎技術の一つが<strong>拡散モデル(Diffusion Models)</strong>です。 拡散モデルとは、データからノイズへと徐々に崩壊するような過程を学習し、その逆過程(すなわちノイズ除去)をシミュレーションすることで目標のデータを創り出すような手法と説明することができます(図1)。 高い生成品質かつ安定した学習を実現できることから、拡散モデルは画像生成AIにおける以前の主流であった<strong>敵対的生成ネットワーク(Generative Adversarial Networks; GANs)</strong>を現在進行系で置き換えつつあります。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="図1: 拡散モデルの崩壊・生成過程(引用: arXiv:2006.11239)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230901/20230901000957.png" width="1200" height="183" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1: 拡散モデルの崩壊・生成過程(引用: <a href="https://arxiv.org/abs/2006.11239">arXiv:2006.11239</a>)</figcaption></figure></p></blockquote> <p>画像生成AIという名称を聞くと、入力したお題に沿った絵をAIが生み出す「お絵描きAI」を一番に想像される方が多いと思いますが、それ以外に<strong>Image-to-Image(画像から画像への変換)</strong>へも応用されています。 Image-to-Imageの例としては、画像中の不要な対象を違和感なく消すようなタスクであるインペインティングが特に印象的です。 他にも、画像サイズの拡大(超解像)や画像をくっきりさせる処理(ボケ除去)などもImage-to-Imageの一種といえます。 もちろん、拡散モデルを応用したImage-to-Image手法も数多く提案されていて、様々なタスクにおいてSOTAに匹敵する性能が報告されています。</p> <p>しかしながら、拡散モデルを使ったImage-to-Imageと謳うほぼ全ての手法は、実は厳密には<u>画像から画像へと直接的に変換しているわけではありません</u>。 ノイズから画像を生成するモデルにプロンプト(お題のテキスト)で条件付けした手法がお絵描きAIであるのと同様に、入力画像で条件付けしたときのモデルのことを、拡散モデルの文脈では一般にImage-to-Imageと呼んでいます(図2左)。</p> <p><figure class="figure-image figure-image-fotolife" title="図2: 拡散モデルと&quot;真の&quot;Image-to-Image手法の比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230901/20230901005553.png" width="1200" height="348" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2: 拡散モデルと&quot;真の&quot;Image-to-Image手法の比較</figcaption></figure></p> <p>ここで、"原画像"と"ノイズ"の2要素を使って生成するのは一見すると無駄が多そうなので、「"原画像"だけで拡散モデルと同じようなことはできないのか?」という素朴な疑問が湧くのは自然なことでしょう。 ですが、拡散モデルという枠組みの上ではノイズを利用することが本質的なので、これを変更することは容易ではありません。</p> <p>このような問いに対する答えの一つが<strong>Schrödinger Bridge(SB)</strong>と呼ばれる生成モデルスキームです。 結論から述べると、SBはノイズの制約を取り払った拡散モデルとみなすことができ、直接的なImage-to-Imageを構成することができます(図3)。</p> <p><figure class="figure-image figure-image-fotolife" title="図3: 密度関数の時間発展の比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230831/20230831215619.png" width="1200" height="563" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3: 密度関数の時間発展の比較</figcaption></figure></p> <p>SBの詳細については以下のスライドをご覧ください。 このスライドの前半では、いわゆる "拡散モデル" の時間連続化に相当する<strong>スコアベース生成モデル(Score-based Generative Models; SGMs)</strong>の基礎事項について簡潔に述べています。 そしてスライドの後半では、SGMの一般化を動機としてSBモデルを導入し、<strong>最適輸送(Optimal Transport; OT)</strong>との関係性ならびに機械学習分野で最近よく用いられる形式の定式化について解説しています。</p> <p>なお、今回はSBの基本的な性質に絞って説明を行ったため、具体的な学習方法(損失関数の設計方法など)や応用手法については触れていません。 これらにつきましては、今後公開する Part II 以降にて解説する予定です。</p> <iframe src="https://www.slideshare.net/slideshow/embed_code/key/1gEBJd3OP5KYWg?startSlide=1" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px;max-width: 100%;" allowfullscreen></iframe> <div style="margin-bottom:5px"><a href="https://www.slideshare.net/MorphoIncPR/a-brief-survey-of-schrdinger-bridge-part-i" title="A Brief Survey of Schrödinger Bridge (Part I)" target="_blank">A Brief Survey of Schrödinger Bridge (Part I)</a> from<a href="https://www.slideshare.net/MorphoIncPR" target="_blank">Morpho, Inc.</a></div> morphotech OJT 2023: ジェスチャー認識とRealSenseを活用したARアプリ hatenablog://entry/820878482951109638 2023-08-17T10:00:00+09:00 2023-08-17T10:02:58+09:00 こんにちは。23年度入社のリサーチャーの三冨です。入社後2か月間にわたったグループ研修の内容と結果について報告します。テーマは「深度情報を利用したアプリケーション」です。 ​ はじめに 私たちはECサイトで用いられる商品紹介のためのARアプリを題材として研修を行いました。このようなアプリの例として家具の配置をシミュレートするARアプリが挙げられます。カメラ映像に3Dモデルをリアルタイムに重ねて表示できるものです。部屋を映せば家具のコーディネートが購入前に確認できます。 このようなアプリに、3Dハンドジェスチャー認識機能を搭載して機能拡張することを考えました。通常の2Dジェスチャー認識に加えてカ… <p>こんにちは。23年度入社のリサーチャーの三冨です。入社後2か月間にわたったグループ研修の内容と結果について報告します。テーマは「深度情報を利用したアプリケーション」です。 ​</p> <h2 id="はじめに">はじめに</h2> <p>私たちはECサイトで用いられる商品紹介のためのARアプリを題材として研修を行いました。このようなアプリの例として家具の配置をシミュレートするARアプリが挙げられます。カメラ映像に3Dモデルをリアルタイムに重ねて表示できるものです。部屋を映せば家具のコーディネートが購入前に確認できます。</p> <p>このようなアプリに、3Dハンドジェスチャー認識機能を搭載して機能拡張することを考えました。通常の2Dジェスチャー認識に加えてカメラと手の距離が分かることで、より正確な認識とより直感的な操作ができます。それを活かせれば、ゆくゆくは3Dモデルを実物のように運んだり動かしたりできそうです。</p> <p><a href="https://www.intelrealsense.com/">RealSense</a>はこのようなアプリの実装に適しています。RealSenseは深度(カメラと映った物との距離)センサとRGBセンサを合体させたデバイスであり、深度イメージ処理用のプロセッサや豊富なライブラリも用意されています。そのためリアルタイムに3Dジェスチャー認識するアプリを短期間で作成するのにうってつけでした。</p> <h2 id="システム構成">システム構成</h2> <p>私たちが作成したARアプリは、RealSenseに映した机の上に仮想的な商品(ARオブジェクト)を描画するものです。さらに3Dジェスチャー認識により商品を移動・回転・拡大縮小することが可能です。これにより例えば文房具のような机上で用いられる商品を、実際の利用環境に近い形で詳細に見ることができます。</p> <p>ARアプリで行っている処理のおおまかな流れについて図1に示します。推論を行うPythonプログラムとARの描画を行う<a href="https://unity.com/">Unity</a>アプリの2つから構成されています。推論結果の通信はソケット通信、RealSenseから取得したRGBフレームの通信はOBS Studioの仮想カメラ機能を用いました。 <figure class="figure-image figure-image-fotolife" title="図1: システム概要図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230719/20230719205411.png" width="1154" height="426" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1: システム概要図</figcaption></figure></p> <h2 id="机平面の3D情報の取得">机平面の3D情報の取得</h2> <p>ARアプリを作成する上で机平面の3D情報を取得する必要があります。なぜならARオブジェクトの3D空間上の初期位置を定義し、①ジェスチャーで移動・回転させるときのオブジェクトの見え方を正しく描画する、 ②カメラだけ移動した場合あたかも3D空間上で静止しているように描画する 必要があるからです。</p> <p>この2つの要求をクリアするため、毎フレームおきに机平面がx-z平面となるような三次元座標系(ワールド座標系)を定義し、その座標系におけるカメラの姿勢を求めることにしました。具体的には、机平面にマーカーを3つ配置して、2D画像上のマーカーの位置とRealSenseの深度情報を合わせてカメラ座標(カメラ位置を原点とする3D座標)を取得します。3つのマーカーのカメラ座標が分かれば机平面を張る2本の3次元ベクトルが得られるため、外積などを利用して正規直交基底を計算します。これによりワールド座標系とカメラ座標系との座標変換が分かり、カメラ姿勢を求めることが出来ます。 <figure class="figure-image figure-image-fotolife" title="図2"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230801/20230801181649.png" width="1200" height="345" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2: 机平面の3D情報取得</figcaption></figure></p> <h2 id="3Dジェスチャー認識">3Dジェスチャー認識</h2> <p>3Dジェスチャー認識は ①2D画像のジェスチャー認識と ②手のキーポイントの3D座標取得 の2つで構成されます。まず ①2D画像のジェスチャー認識 は以下のような流れで行われます。</p> <ol> <li>入力画像の中の手を検出する</li> <li>検出した手の部分を切り抜いた画像から手のキーポイントを検出する</li> <li>キーポイントの画像座標からジェスチャーの種類を判定する</li> </ol> <p><figure class="figure-image figure-image-fotolife" title="図3"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230808/20230808140822.png" width="1118" height="222" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3: 2D画像のジェスチャー認識</figcaption></figure> キーポイント検出までを<a href="https://developers.google.com/mediapipe">MediaPipe</a>のHand landmarks detectionで行い、ジェスチャー判定は<a href="https://github.com/Kazuhito00/hand-gesture-recognition-using-mediapipe">個人開発モデル</a>を利用させていただきました。</p> <p>次に ②手のキーポイントの3D座標取得 は、前節の方法で得た「ワールド座標系とカメラ座標系との座標変換」を用いて行います。すなわち、キーポイントの2D画像中の位置とRealSenceの深度情報の2つからカメラ座標が求まるので、座標変換によりワールド座標も求まります。</p> <h2 id="Unityアプリの実装">Unityアプリの実装</h2> <p>UnityアプリではRGBフレームを背景画像として、手前に3Dモデルを描画します。今回はハサミの3Dモデルを作成して3つのジェスチャーを用いて動かすことにしました。</p> <ol> <li>人差し指​を指しているジェスチャーで、3Dモデルの位置を移動させることができます。</li> <li>親指と人差し指で挟むようなジェスチャーで、3Dモデルの大きさを変更することと、ハサミの刃を開閉することができます。</li> <li>手のひらを開いたジェスチャーで、その回転と同じ様に3Dモデルを回転することができます。</li> </ol> <p>これら3つの動作は、指先の座標や手のひら平面の姿勢を計算し、その結果に基づいた3Dモデルの動きをUnity上で実装することで実現しています。それぞれ実際にアプリの様子をご覧ください。</p> <p>​<figure class="figure-image figure-image-fotolife" title="図4"><iframe src="https://drive.google.com/file/d/1QConJKH0aT5Cwm-_OzJYtCEam29gFaWy/preview" width="640" height="400" allow="autoplay"></iframe><figcaption>図4: 3Dモデルの移動</figcaption></figure> ​<figure class="figure-image figure-image-fotolife" title="図5"><iframe src="https://drive.google.com/file/d/1U8qJLcVlnQ3aDjoOb7iekx9Hw5wDKbSB/preview" width="640" height="400" allow="autoplay"></iframe><figcaption>図5: 3Dモデルの大きさの変更とハサミの刃の開閉</figcaption></figure> ​<figure class="figure-image figure-image-fotolife" title="図6"><iframe src="https://drive.google.com/file/d/19yY00t0walELn8OkDoSylQUg6iAK0a3y/preview" width="640" height="400" allow="autoplay"></iframe><figcaption>図6: 3Dモデルの回転</figcaption></figure></p> <h2 id="まとめ">まとめ</h2> <p>本グループ研修ではジェスチャー認識とRealSenseを活用したARアプリの開発に取り組みました。その中でARアプリにおける3D座標の扱い方やジェスチャー認識のディープラーニングに触れることができました。また研修を通じて、アイデア出し・タスク切り出し・開発・評価という一連の流れを経験することができました。</p> <p>作成したARアプリはジェスチャー認識精度やフレームレート、カメラ座標の振動抑制といった課題が残っています。そのような問題に少しでも対処するため、RealSenseの深度データへのフィルタのような工夫や、軽量な認識器を調査するといった取り組みができました。この経験を今後の業務に活かせればと思います。</p> <p>以上、本記事を読んでくださりありがとうございます。</p> morphotech JDLA主催「CVPR2023技術報告会」発表資料 hatenablog://entry/820878482956507923 2023-08-10T10:00:30+09:00 2023-08-16T12:49:01+09:00 先日、日本ディープラーニング協会主催(JDLA)の「CVPR2023技術報告会」にてモルフォの技術者が登壇いたしました。 www.morphoinc.com CVPRという国際学会の重要性や、今年のトレンドの分析、モルフォの技術者が注目した分野や論文について紹介しました。 資料を見たいという声を多数いただいたので発表資料を共有させていただきます。 JDLA主催「CVPR2023技術報告会」発表資料 fromMorpho, Inc. 発表動画については以下のリンクから是非ご視聴ください。 https://www.youtube.com/watch?v=XVgUvFig-_M <p>先日、日本ディープラーニング協会主催(JDLA)の「CVPR2023技術報告会」にてモルフォの技術者が登壇いたしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.morphoinc.com%2Fnews%2F20230801-jpr-jdla" title="日本ディープラーニング協会主催「CVPR2023技術報告会」にて登壇 | ニュース一覧 | 株式会社モルフォ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.morphoinc.com/news/20230801-jpr-jdla">www.morphoinc.com</a></cite></p> <p>CVPRという国際学会の重要性や、今年のトレンドの分析、モルフォの技術者が注目した分野や論文について紹介しました。 資料を見たいという声を多数いただいたので発表資料を共有させていただきます。</p> <iframe src="https://www.slideshare.net/slideshow/embed_code/key/ETIGutToRehBOD?startSlide=1" width="597" height="486" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px;max-width: 100%;" allowfullscreen></iframe> <div style="margin-bottom:5px"><a href="https://www.slideshare.net/MorphoIncPR/jdlacvpr2023" title="JDLA主催「CVPR2023技術報告会」発表資料" target="_blank">JDLA主催「CVPR2023技術報告会」発表資料</a> from<a href="https://www.slideshare.net/MorphoIncPR" target="_blank">Morpho, Inc.</a></div> <p><br /></p> <p>発表動画については以下のリンクから是非ご視聴ください。 <a href="https://www.youtube.com/watch?v=XVgUvFig-_M">https://www.youtube.com/watch?v=XVgUvFig-_M</a></p> morphotech Contrastive Learningの最新動向のレビュー hatenablog://entry/4207112889975619602 2023-05-08T11:30:00+09:00 2023-08-16T12:52:25+09:00 こんにちは。CTO室リサーチャーの鈴木です。今回は、深層学習の分野でここ数年盛り上がっているContrastive Learning系の手法について、主だった論文を系統的にまとめて紹介したいと思います。 はじめに 近年発展した自己教師あり学習(Self-Supervised Learning:SSL)は、アノテーション情報を人の手ではなく機械的に付与することで、データセットの構築にかかる時間やコストを軽減し、深層学習モデルの精度向上を目指した手法です。自然言語処理分野におけるSSLは大きな成功を収め、ChatGPT等の超高性能なチャットボットの出現にも影響を与えました。 SSLは主に深層学習モ… <p> こんにちは。CTO室リサーチャーの鈴木です。今回は、深層学習の分野でここ数年盛り上がっているContrastive Learning系の手法について、主だった論文を系統的にまとめて紹介したいと思います。</p> <h1 id="はじめに">はじめに</h1> <p> 近年発展した自己教師あり学習(Self-Supervised Learning:SSL)は、アノテーション情報を人の手ではなく機械的に付与することで、データセットの構築にかかる時間やコストを軽減し、深層学習モデルの精度向上を目指した手法です。自然言語処理分野におけるSSLは大きな成功を収め、ChatGPT等の超高性能なチャットボットの出現にも影響を与えました。</p> <p> SSLは主に深層学習モデルの「事前」学習として用いられます。SSLによって、文章や画像に含まれる一般的な特徴を大量のデータから学習することができます。これにより、文章生成や画像認識などの本学習の効率が向上し、最終的な性能向上にもつながります。したがって、SSLは、深層学習において広く使用される重要な技術の1つであると言えます。</p> <p> 今回紹介するContrastive Learning(CL)は、画像処理における代表的なSSLの手法です。データ内で似たもの(正例)と似ていないもの(負例)をグループ化し区別するように学習することで、モデルがより質の高い特徴量を抽出できるようにする手法です。</p> <p> 本記事ではまずCL手法の基本について説明し、その後近年のCL論文28本について、各手法がCLのどの部分を改善したのかに着目して分類し、それぞれの概要を説明いたします。</p> <h1 id="Contrastive-LearningCL">Contrastive Learning(CL)</h1> <p> 多くのCL手法では、ある画像(自身)に2つの異なるオーグメンテーションを加えたもの同士のペアを正例、自身と異なる画像とのペアを負例として学習をします。</p> <p> 初期のCL手法であるNPID(InsDisとも呼ばれます)<a href=#[1]>[1]</a>の概略図を示します(図1)。深層学習モデルを前段の特徴抽出器(backbone)と後段の推論部(head)に分けて考えた時、CLで学習を行うのは主に特徴抽出器の部分(例えばResNet)となります。InsDisでは画像毎に特徴抽出器から得られる128次元の特徴量を用いてCLを行います。また、計算量を増やさず負例の数を増やすために、過去のバッチ内の出力をMemory bankとして記憶しておき、負例として用います。</p> <div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230329/20230329002709.png" width="1200" height="322" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div> <div align="center">図1:NPIDの学習パイプラインの模式図。<a href=#[1]>[1]</a>より引用</div> <p><br>  CLにおける基本の損失関数(InfoNCE損失)は、以下のように表されます(表記は幾つかありますが、ここでは理解しやすいMoCo v2<a href=#[8]>[8]</a>のものを記します)。</p> <div align="center"><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cmathcal%7BL%7D_%7Bq%2Ck%5E%2B%2C%5C%7Bk%5E-%5C%7D%7D%20%3D%20-%5Clog%20%5Cfrac%7Bexp%28q%20%5Ccdot%20k%5E%2B%2F%5Ctau%29%7D%7Bexp%28q%20%5Ccdot%20k%5E%2B%2F%5Ctau%29%2B%5Csum_%7Bk%5E-%7D%20exp%28q%20%5Ccdot%20k%5E-%2F%5Ctau%29%7D" alt="\mathcal{L}_{q,k^+,\{k^-\}} = -\log \frac{exp(q \cdot k^+/\tau)}{exp(q \cdot k^+/\tau)+\sum_{k^-} exp(q \cdot k^-/\tau)}"/></div> <p><br>  式中の <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%2C%20k%5E%2B%2C%20k%5E-" alt=" q, k^+, k^-"/>はそれぞれ自身・正例・負例の出力特徴量を表します(役割を踏まえ、query、keyと呼ぶこともあります)。内積(cosine類似度)を、正例に対しては大きくし(近づける)、負例に対しては小さくする(遠ざける)損失となっています。正例は自身のオーグメンテーション1つであるのに対し、負例は多数使用するため和をとります。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctau" alt="\tau"/>は学習を制御する温度係数です。</p> <p> この損失はtriplet lossの拡張として開発されたN-pair loss<a href=#[2]>[2]</a>がベースとなっています。triplet lossでは、自身に似た正例と異なる負例を1つずつ用意し、前者に近づき後者から遠ざかるように学習を行います。CLは負例の数を増やしたtriplet lossとも考えられます。</p> <p> CLの学習機構は、”Siamese(双子の) Network”と呼ばれることもあります。図2に示すように、正例ペアを作る際に同じ構造を持つ(手法によっては完全に同一の)ネットワークを並列にした構造を用いるためです。</p> <div align="center"><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/morphotech/20230330110427" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230330/20230330110427.png" width="847" height="699" loading="lazy" title="" class="hatena-fotolife" style="width:420px;height:350px" itemprop="image"></a></span></div> <div align="center">図2:Siamese Networkを用いたCL手法の比較。<a href=#[12]>[12]</a>より引用</div> <h1 id="CLの現状">CLの現状</h1> <p> 画像処理分野のトップカンファレンスであるCVPR(Computer Vision and Pattern Recognition)から、論文タイトル中に"Self-Supervised"や"Contrastive"といった単語を含む論文数を数え上げてみました(図3)。ここ数年でこの2つのキーワードが頻出するようになっており、やはり注目を集めていることが分かります。</p> <div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230328/20230328231329.png" width="480" height="289" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div> <div align="center">図3:CVPR2018~2022で該当単語をタイトルに1つ以上含む論文数の推移(弊社調べ)</div> <p><br>  下に示すのは、Ce Zhou et al.による”A Comprehensive Survey on Pretrained Foundation Models: A History from BERT to ChatGPT”<a href=#[3]>[3]</a>という、自然言語処理を含む様々なタスクにおける自己教師あり事前学習に関するレビュー論文から引用した、画像における事前学習の主要論文のまとめです(図4)。</p> <div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230330/20230330094355.png" width="959" height="853" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div> <div align="center">図4:画像における自己教師あり学習の主要論文のまとめ。<a href=#[3]>[3]</a>より引用</div> <p><br>  CLが流行する以前の自己教師あり学習は、画像を等分し並べ替えるようなタスクや、出力特徴量のクラスタリングとクラスタへの分類を交互に解くようなタスク等、様々な手法が模索されていました。CLは既存の他の手法に大きく勝る精度を残した事で、2020年から大流行しました("Pretext Task"の列が"discrimination"の手法)。2022年はTransformer専用のマスク部分再構成の手法("Pretext Task"の列が"reconstruction"の手法、MAE<a href=#[4]>[4]</a>等)が開発され、発展をしています。</p> <p> 最近ではTransformer専用のCLも開発され、マスク部分再構成の手法と比較しても優れた性能を残しています(Mugs<a href=#[5]>[5]</a>等、<a href="https://paperswithcode.com/sota/self-supervised-image-classification-on">Papers With Code</a><a href=#[6]>[6]</a>にて2023年4月現在Rank 2)。本稿では、CNNかTransformerかという特徴抽出器のアーキテクチャに依存しないCLに焦点を当てて紹介をします。</p> <h1 id="CLの分類">CLの分類</h1> <p> CLが流行するきっかけになったのは、2020年に発表されたMoCo v1<a href=#[7]>[7]</a>およびSimCLR<a href=#[10]>[10]</a>の論文です。これらの手法は単純な機構で、条件によっては教師あり学習にかなり近い精度を達成したため、一躍話題になりました。その後、これらの手法をベースに、理論的裏付けを検証しつつ精度を向上させる工夫を取り入れた論文が流行し始めたという流れが見られます。</p> <p> 複数の論文を調査する中で、その改善や工夫の方向性に傾向が見えてきましたので、4つのカテゴリに分類して論文をまとめてみました。手法名と、それぞれについての大まかな説明を列挙しています。</p> <h3 id="1Collapse崩壊せず学習に成功する機構の提案">1.Collapse(崩壊)せず学習に成功する機構の提案</h3> <p> CLの学習を成功させるための基本的な機構を提案している論文です。後発の論文でもこれらの論文をベースに改善が行われることが多いです。</p> <p> ところで、CLの学習には全データに対し全く同じ特徴量を出力させるようになる局所解があり、これに陥ると学習が上手くいかなくなります。Collapse(崩壊)と呼ばれるこの現象は各論文でも良く取り上げられ、SimSiam<a href=#[12]>[12]</a>の論文では主題として論じられています。このカテゴリの手法たちは、単なる精度向上だけでなくCollapseを避けるための機構を提案する側面も強いと考えられます。</p> <ul> <li>MoCo v1<a href=#[7]>[7]</a>(2020, CVPR) <ul> <li>Memory bankに追加される負例の一貫性を高めるため、Momentum encoderというメインの特徴抽出器の重みを徐々にコピーする機構を導入した教師生徒機構を提案。 <details><summary> MoCo v2<a href=#[8]>[8]</a>(2020)、MoCo v3<a href=#[9]>[9]</a>(2021, ICCV)の更新点</summary><div> <ul> <li>v2はSimCLRの工夫(投影用全結合層、オーグメンテーションの組み合わせ)を導入。v3は主にTransformerに対する性能を調査した論文で、Memory bankを廃止、教師のみpredictorを持つ非対称構造を導入。</li> </ul> <p></div></details></p></li> </ul> </li> <li>SimCLR<a href=#[10]>[10]</a>(2020, ICML) <ul> <li>Memory bankやアーキテクチャ変更が不要のシンプルな機構で高精度なCLを実現すべく、バッチサイズの増大による負例数の増加、最終段に投影用全結合層の導入、最適なオーグメンテーションの組み合わせを検討。</li> </ul> </li> <li>BYOL<a href=#[11]>[11]</a>(2020, NeurIPS) <ul> <li>生徒モデルを勾配計算に用いないstop-gradient、教師のみpredictorを持つ非対称な構造を提案し、負例を使わず正例のみで学習可能なCLの機構を提案。</li> </ul> </li> <li>SimSiam<a href=#[12]>[12]</a>(2021, CVPR) <ul> <li>CLにおけるCollapseの条件について調査し、BYOLでMomentum Encoderを使わずともstop-gradientのみ残せばCLの学習に成功することを確認。</li> </ul> </li> <li>DINO<a href=#[13]>[13]</a>(2021, ICCV) <ul> <li>Momentum encoder、stop-gradientに、出力特徴量のシャープニングと中央寄せ(それまでの平均値で減算)の処理を加えた構造のCLでCollapseを回避でき、ResNetやVision Transformer(ViT)で高性能であることを確認。</li> </ul> </li> <li>Barlow Twins<a href=#[14]>[14]</a>(2021, ICML) <ul> <li>負例、Memory bank、教師生徒機構、stop-gradientを使用しないシンプルな機構で、正例のバッチ方向に対する相互相関行列を単位行列に近づけるような損失関数で学習するCLを提案。</li> </ul> </li> <li>Self-Classifier<a href=#[15]>[15]</a>(2022, ECCV) <ul> <li>Barlow Twinsと同じくシンプルな機構を目指し、正例ペアの特徴量がの各次元がソフトクラスを表すとみなし、分類問題としてクロスエントロピー損失で学習。Collapseを避けるために一様事前分布で制約した形に損失を修正。</li> </ul> </li> </ul> <p><details><summary> ※ 負例を用いないCLにおけるMomentum Encoderの意義</summary><div>  BYOL等の負例を使用しないCLでのMomentum Encoderは、MoCoの開発時点での目的である一貫性の確保には不要です。しかしながら、DINO論文<a href=#[13]>[13]</a>では、モデルの過去の状態を用いたPolyak-Ruppert平均によるアンサンブルにより教師側の性能を上げることができるため、Momentum EncoderがCLの性能向上に寄与しているのだと考察しています。</p> <p></div></details></p> <h3 id="2正例負例の改善">2.正例・負例の改善</h3> <p> これより下は、主に精度改善や汎化を目的とした論文になります。このカテゴリでは、正例や負例に改善を加えることで到達精度を向上を図った論文について、改善の方向性ごとに分けて列挙します。</p> <h4 id="オーグメンテーションの改善">オーグメンテーションの改善</h4> <p> SimCLRでもCLに対するより良いオーグメンテーションの組み合わせが考察されていますが、定性的な考察によってさらに良いオーグメンテーションを提案した論文です。</p> <ul> <li>InfoMin<a href=#[16]>[16]</a>(2020, NeurIPS) <ul> <li><p>CLはオーグメンテーション前後の画像間の相互情報量が高過ぎず低すぎない丁度いい時に精度が上がると仮説を立て、それを満たすようなオーグメンテーション戦略を提案。 <details><summary> 図5:InfoMinの仮説を説明した図(<a href="https://ai.googleblog.com/2020/08/understanding-view-selection-for.html">著者のHP</a><a href=#[17]>[17]</a>より引用)</summary><div> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20230330/20230330115846.jpg" width="640" height="172" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>(注釈)2枚の正例ペアの情報が似すぎても(左)違い過ぎても(右)効果は低く、中間が一番良い学習になるとしている。</p> <p></div></details></p></li> </ul> </li> <li>C-Crop<a href=#[18]>[18]</a>(2022, CVPR) <ul> <li>オーグメンテーションにおけるクロップの工夫。物体を大きく映すため最終出力ヒートマップの値の高い範囲に限定し、ペアの領域が被らないようにクロップ中心位置が画像端になりやすくする工夫を取り入れたContrastive-Cropを開発。CLでRandom Cropよりも高精度。</li> </ul> </li> </ul> <h4 id="正例負例の特徴量を改善">正例負例の特徴量を改善</h4> <p> 特徴抽出器から出力された正例と負例の特徴量を改善し、精度向上を図る工夫です。一般的なCLは入力画像をオーグメンテーションして比較し学習しますが、それに加え、以下の手法は出力の特徴量もわずかに変化させてから比較して学習するため、「特徴量空間上でのオーグメンテーション」と捉えることもできます。</p> <ul> <li>AdCo<a href=#[19]>[19]</a>(CVPR, 2021) <ul> <li>損失の勾配を用いた敵対性学習により、Memory bank内の負例を難しくする方向に更新。</li> </ul> </li> <li>CaCo<a href=#[20]>[20]</a>(2022) <ul> <li>AdCoに加え、正例については損失の勾配を用いて簡単にする方向に更新することで精度改善。</li> </ul> </li> <li>FT(Feature Transformation)<a href=#[21]>[21]</a>(2021, ICCV) <ul> <li>正例はペアとの外挿で更新し離す。負例はMemory bank内でランダムなペアと内挿して更新して多様化させる。</li> </ul> <p>※ CaCoとFTそれぞれの論文で、正例について難しくする(離す)方向、簡単にする(近づける)方向の両方を検証し、逆の結果になっているのが興味深い点です。</p></li> </ul> <h4 id="自身以外全て負例によるFalse-Positiveの問題に対処">「自身以外全て負例」によるFalse Positiveの問題に対処</h4> <p> 一般的なCLでは自身のオーグメンテーションのみを正例と扱うため、例えば同じクラスの別の画像は負例として遠ざける方向の学習を行ってしまいます。この部分に問題意識を持ち、正例の選び方を修正した論文です。</p> <ul> <li>NNCLR<a href=#[22]>[22]</a>(2021, ICCV) <ul> <li>正例として、自身のオーグメンテーションの代わりにMemory bankで一番近いものを使用。</li> </ul> </li> <li>ReSSL<a href=#[23]>[23]</a>(2021, NeurIPS) <ul> <li>正例はMemory bannkから類似したものを選ぶ。学習途中から負例の使用を辞める。Memory bankに追加する正例の一貫性を確保するため、弱いオーグメンテーションを用いる。</li> </ul> </li> <li>ASCL<a href=#[24]>[24]</a>(2022, ICPR) <ul> <li>Memory bank内のうちcosine類似度の高いものを、類似度を重みとしたソフトな正例として使用。</li> </ul> </li> </ul> <h4 id="出力特徴量をクラスタリングしてから利用">出力特徴量をクラスタリングしてから利用</h4> <p> 一般的なCLでは、個々の画像を負例として使用するため、より汎用的な特徴を学習するには、バッチサイズを増大するかMemory bankを使用するなどの工夫が必要になります。また、上述したように正例のFalse Positiveの問題があります。</p> <p> この問題を解決するために、出力特徴量をクラスタリングし、学習が進むごとにクラスタの代表値を徐々に更新することで、それをデータ全体の代表値と見なして正例・負例に用いるCLが提唱されています。</p> <ul> <li>SwAV<a href=#[25]>[25]</a>(2020, NeurIPS) <ul> <li>ランダムな初期値の「プロトタイプ」(出力特徴量と同じ次元のベクトル)を任意の数用意しておき、各出力特徴量をそれぞれ近いプロトタイプに割り振り(クラスタリング)、そのプロトタイプでCLの損失を計算。割り振りの際には特定のクラスへの集中を防ぐため、一様事前分布を仮定。</li> </ul> </li> <li>PCL<a href=#[26]>[26]</a>(2021, ICLR) <ul> <li>出力特徴量をK-meansでクラスタリングし、重心に近づく(or離れる)ような損失を設定。複数のKの値を用いて平均の重心を使用。</li> </ul> </li> <li>SMOG<a href=#[27]>[27]</a>(2022, ECCV) <ul> <li>グループの重心同士ではなく、グループ代表値と個々の値で損失を計算。グループの代表値はmomentumで徐々に更新する。</li> </ul> </li> </ul> <h3 id="3損失項の改善">3.損失項の改善</h3> <p> 損失関数に変更を加え精度改善を図った論文です。</p> <ul> <li>C-BYOL、C-SimCLR<a href=#[28]>[28]</a>(2021, NeurIPS) <ul> <li>冗長な情報の圧縮を目的とする条件付エントロピーボトルネック(Conditional Entropy Bottleneck; CEB<a href=#[37]>[37]</a>)に基づき、出力特徴量そのものではなく、そこから生成したvon Mises-Fisher分布からサンプリングして損失を計算。</li> </ul> </li> <li>ReLIC v2<a href=#[29]>[29]</a>(2022) <ul> <li>因果論的解釈に起因する正例のオーグメンテーション前後のKL距離の損失項を加え、先行研究で精度の高かったオーグメンテーションの工夫を取り入れた結果、ImageNetの線形分類で教師あり学習を超えた性能を達成。</li> </ul> </li> </ul> <h3 id="4領域に注目したCL">4.領域に注目したCL</h3> <p> 多くのCLの論文では、ImageNetに対する線形分類で先行研究と性能比較されることが多いです。しかしその性能は、異なるデータセットや下流タスクへの性能の良し悪しとは必ずしも一致しないことが知られています(論文<a href=#[30]>[30]</a>と<a href="https://ai-scholar.tech/articles/self-supervised-learning/SSLModels">その解説記事</a><a href=#[31]>[31]</a>を参照)。特に物体検出や領域分類といった「密な(Dense)」タスクに対する性能との乖離は大きくなっています。また、物体中心(ImageNet, COCO等)ではなくシーン中心(CityScapes等)なデータに対し、画像1枚ずつを比較するというCLのコンセプトが有効であるかは直観的にも懸念があります。</p> <p> 上記の問題を解決するため、画像1枚単位ではなく、画像中の領域単位(特徴抽出器の最終段の画素単位)の特徴量同士でCLを行う手法が開発されています。DenseCLの論文がその出発点です。</p> <ul> <li>DenseCL<a href=#[32]>[32]</a>(2021, CVPR) <ul> <li>最終段の投影用の全結合層を1x1畳み込み層に置き換えることで、空間情報を残した領域ごとの出力特徴量によるCLを提案。</li> </ul> </li> <li>PixPro<a href=#[33]>[33]</a>(2021, CVPR) <ul> <li>近くの似た画素との滑らかさも学習すべく、他の画素の特徴量とcosine類似度で重みづけ平均したCL。</li> </ul> </li> <li>SlotCon<a href=#[34]>[34]</a>(2022, NeurIPS) <ul> <li>画素の特徴量をランダムな初期値で用意されたプロトタイプに割り振り、プロトタイプごとのCL(教師と生徒で同じ番号のプロトタイプは近づけ、それ以外は離す)と、プロトタイプへの分類(教師と生徒で同じ番号のプロトタイプに分類)の2種類の損失で学習。</li> </ul> </li> <li>RegionCL<a href=#[35]>[35]</a>(2022, ECCV) <ul> <li>クロップした画像を他の画像に貼り付け、元画像領域と貼り付け領域で区別してCL損失に組み込み。</li> </ul> </li> <li>DenseSiam<a href=#[36]>[36]</a>(2022, ECCV) <ul> <li>SimSiamの構造で領域単位・画素単位のCL損失を計算。</li> </ul> </li> </ul> <h1 id="おわりに">おわりに</h1> <p> 近年流行の自己教師あり学習の一つの潮流であるContrastive Learningについて、主だった論文をその概要から系統的にまとめてみました。本稿では個々の論文の詳細については省略しておりますので、気になった点についてはソース元をご覧いただけると幸いです。</p> <h1 id="出展">出展</h1> <p><a id=[1]>[1]</a> Wu, Z., Xiong, Y., Yu, S. X., &amp; Lin, D. (2018). Unsupervised feature learning via non-parametric instance discrimination. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 3733-3742). Available: <a href="https://openaccess.thecvf.com/content_cvpr_2018/papers/Wu_Unsupervised_Feature_Learning_CVPR_2018_paper.pdf">https://openaccess.thecvf.com/content_cvpr_2018/papers/Wu_Unsupervised_Feature_Learning_CVPR_2018_paper.pdf</a></p> <p><a id=[2]>[2]</a> Sohn, K. (2016). Improved deep metric learning with multi-class N-pair loss objective. Advances in neural information processing systems, 29. Available: <a href="https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf">https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf</a></p> <p><a id=[3]>[3]</a> Zhou, C., Li, Q., Li, C., Yu, J., Liu, Y., Wang, G., Zhang L., Ji, C., Yan, Q., He, L., Peng, H., Li, J., Wu, J., Liu, Z., Xie, P., Xiong, C., Pei, J., Yu, P. &amp; Sun, L. (2023). A comprehensive survey on pretrained foundation models: A history from BERT to ChatGPT. arXiv preprint arXiv:2302.09419. Available: <a href="https://arxiv.org/pdf/2302.09419.pdf">https://arxiv.org/pdf/2302.09419.pdf</a></p> <p><a id=[4]>[4]</a> He, K., Chen, X., Xie, S., Li, Y., Dollár, P., &amp; Girshick, R. (2022). Masked autoencoders are scalable vision learners. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 16000-16009). Available: <a href="https://openaccess.thecvf.com/content/CVPR2022/papers/He_Masked_Autoencoders_Are_Scalable_Vision_Learners_CVPR_2022_paper.pdf">https://openaccess.thecvf.com/content/CVPR2022/papers/He_Masked_Autoencoders_Are_Scalable_Vision_Learners_CVPR_2022_paper.pdf</a></p> <p><a id=[5]>[5]</a> Zhou, P., Zhou, Y., Si, C., Yu, W., Ng, T. K., &amp; Yan, S. (2022). Mugs: A multi-granular self-supervised learning framework. arXiv preprint arXiv:2203.14415. Available: <a href="https://arxiv.org/pdf/2203.14415.pdf">https://arxiv.org/pdf/2203.14415.pdf</a></p> <p><a id=[6]>[6]</a> "Self-Supervised Image Classification on ImageNet" in Paper With Code. Available: <a href="https://paperswithcode.com/sota/self-supervised-image-classification-on">https://paperswithcode.com/sota/self-supervised-image-classification-on</a></p> <p><a id=[7]>[7]</a> He, K., Fan, H., Wu, Y., Xie, S., &amp; Girshick, R. (2020). Momentum contrast for unsupervised visual representation learning. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition (pp. 9729-9738). Available: <a href="https://openaccess.thecvf.com/content_CVPR_2020/papers/He_Momentum_Contrast_for_Unsupervised_Visual_Representation_Learning_CVPR_2020_paper.pdf">https://openaccess.thecvf.com/content_CVPR_2020/papers/He_Momentum_Contrast_for_Unsupervised_Visual_Representation_Learning_CVPR_2020_paper.pdf</a></p> <p><a id=[8]>[8]</a> Chen, X., Fan, H., Girshick, R., &amp; He, K. (2020). Improved baselines with momentum contrastive learning. arXiv preprint arXiv:2003.04297. Available: <a href="https://arxiv.org/pdf/2003.04297.pdf">https://arxiv.org/pdf/2003.04297.pdf</a></p> <p><a id=[9]>[9]</a> Chen, X., Xie, S., &amp; He, K. (2021). An empirical study of training self-supervised vision transformers. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 9640-9649). Available: <a href="https://openaccess.thecvf.com/content/ICCV2021/papers/Chen_An_Empirical_Study_of_Training_Self-Supervised_Vision_Transformers_ICCV_2021_paper.pdf">https://openaccess.thecvf.com/content/ICCV2021/papers/Chen_An_Empirical_Study_of_Training_Self-Supervised_Vision_Transformers_ICCV_2021_paper.pdf</a></p> <p><a id=[10]>[10]</a> Chen, T., Kornblith, S., Norouzi, M., &amp; Hinton, G. (2020, November). A simple framework for contrastive learning of visual representations. In International conference on machine learning (pp. 1597-1607). PMLR. Available: <a href="http://proceedings.mlr.press/v119/chen20j/chen20j.pdf">http://proceedings.mlr.press/v119/chen20j/chen20j.pdf</a></p> <p><a id=[11]>[11]</a> Grill, J. B., Strub, F., Altché, F., Tallec, C., Richemond, P., Buchatskaya, E., Doersch, C., Pires, B. A., Guo, Z. D., Azar, M. G., Piot, B., Kavukcuoglu, K., Munos, R. &amp; Valko, M. (2020). Bootstrap your own latent-a new approach to self-supervised learning. Advances in neural information processing systems, 33, 21271-21284. Available: <a href="https://proceedings.neurips.cc/paper/2020/file/f3ada80d5c4ee70142b17b8192b2958e-Paper.pdf">https://proceedings.neurips.cc/paper/2020/file/f3ada80d5c4ee70142b17b8192b2958e-Paper.pdf</a></p> <p><a id=[12]>[12]</a> Chen, X., &amp; He, K. (2021). Exploring simple siamese representation learning. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition (pp. 15750-15758). Available: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Chen_Exploring_Simple_Siamese_Representation_Learning_CVPR_2021_paper.pdf">https://openaccess.thecvf.com/content/CVPR2021/papers/Chen_Exploring_Simple_Siamese_Representation_Learning_CVPR_2021_paper.pdf</a></p> <p><a id=[13]>[13]</a> Caron, M., Touvron, H., Misra, I., Jégou, H., Mairal, J., Bojanowski, P., &amp; Joulin, A. (2021). Emerging properties in self-supervised vision transformers. In Proceedings of the IEEE/CVF international conference on computer vision (pp. 9650-9660). Available: <a href="https://openaccess.thecvf.com/content/ICCV2021/papers/Caron_Emerging_Properties_in_Self-Supervised_Vision_Transformers_ICCV_2021_paper.pdf">https://openaccess.thecvf.com/content/ICCV2021/papers/Caron_Emerging_Properties_in_Self-Supervised_Vision_Transformers_ICCV_2021_paper.pdf</a></p> <p><a id=[14]>[14]</a> Zbontar, J., Jing, L., Misra, I., LeCun, Y., &amp; Deny, S. (2021, July). Barlow twins: Self-supervised learning via redundancy reduction. In International Conference on Machine Learning (pp. 12310-12320). PMLR. Available: <a href="http://proceedings.mlr.press/v139/zbontar21a/zbontar21a.pdf">http://proceedings.mlr.press/v139/zbontar21a/zbontar21a.pdf</a></p> <p><a id=[15]>[15]</a> Amrani, E., Karlinsky, L., &amp; Bronstein, A. (2022, October). Self-supervised classification network. In Computer Vision–ECCV 2022: 17th European Conference, Tel Aviv, Israel, October 23–27, 2022, Proceedings, Part XXXI (pp. 116-132). Cham: Springer Nature Switzerland. Available: <a href="https://arxiv.org/pdf/2103.10994.pdf">https://arxiv.org/pdf/2103.10994.pdf</a></p> <p><a id=[16]>[16]</a> Tian, Y., Sun, C., Poole, B., Krishnan, D., Schmid, C., &amp; Isola, P. (2020). What makes for good views for contrastive learning?. Advances in neural information processing systems, 33, 6827-6839. Available: <a href="https://proceedings.neurips.cc/paper/2020/file/4c2e5eaae9152079b9e95845750bb9ab-Paper.pdf">https://proceedings.neurips.cc/paper/2020/file/4c2e5eaae9152079b9e95845750bb9ab-Paper.pdf</a></p> <p><a id=[17]>[17]</a> Google Research Blog, Posted by Yonglong Tian, Student Researcher and Chen Sun, Staff Research Scientist, Google Research, on FRIDAY, AUGUST 21, 2020. Available: <a href="https://ai.googleblog.com/2020/08/understanding-view-selection-for.html">https://ai.googleblog.com/2020/08/understanding-view-selection-for.html</a></p> <p><a id=[18]>[18]</a> Peng, X., Wang, K., Zhu, Z., Wang, M., &amp; You, Y. (2022). Crafting better contrastive views for siamese representation learning. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 16031-16040). Available: <a href="https://openaccess.thecvf.com/content/CVPR2022/papers/Peng_Crafting_Better_Contrastive_Views_for_Siamese_Representation_Learning_CVPR_2022_paper.pdf">https://openaccess.thecvf.com/content/CVPR2022/papers/Peng_Crafting_Better_Contrastive_Views_for_Siamese_Representation_Learning_CVPR_2022_paper.pdf</a></p> <p><a id=[19]>[19]</a> Hu, Q., Wang, X., Hu, W., &amp; Qi, G. J. (2021). Adco: Adversarial contrast for efficient learning of unsupervised representations from self-trained negative adversaries. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 1074-1083). Available: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Hu_AdCo_Adversarial_Contrast_for_Efficient_Learning_of_Unsupervised_Representations_From_CVPR_2021_paper.pdf">https://openaccess.thecvf.com/content/CVPR2021/papers/Hu_AdCo_Adversarial_Contrast_for_Efficient_Learning_of_Unsupervised_Representations_From_CVPR_2021_paper.pdf</a></p> <p><a id=[20]>[20]</a> Wang, X., Huang, Y., Zeng, D., &amp; Qi, G. J. (2022). Caco: Both positive and negative samples are directly learnable via cooperative-adversarial contrastive learning. arXiv preprint arXiv:2203.14370. Available: <a href="https://arxiv.org/pdf/2203.14370">https://arxiv.org/pdf/2203.14370</a></p> <p><a id=[21]>[21]</a> Zhu, R., Zhao, B., Liu, J., Sun, Z., &amp; Chen, C. W. (2021). Improving contrastive learning by visualizing feature transformation. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 10306-10315). Available: <a href="https://openaccess.thecvf.com/content/ICCV2021/papers/Zhu_Improving_Contrastive_Learning_by_Visualizing_Feature_Transformation_ICCV_2021_paper.pdf">https://openaccess.thecvf.com/content/ICCV2021/papers/Zhu_Improving_Contrastive_Learning_by_Visualizing_Feature_Transformation_ICCV_2021_paper.pdf</a></p> <p><a id=[22]>[22]</a> Dwibedi, D., Aytar, Y., Tompson, J., Sermanet, P., &amp; Zisserman, A. (2021). With a little help from my friends: Nearest-neighbor contrastive learning of visual representations. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 9588-9597). Available: <a href="https://openaccess.thecvf.com/content/ICCV2021/papers/Dwibedi_With_a_Little_Help_From_My_Friends_Nearest-Neighbor_Contrastive_Learning_ICCV_2021_paper.pdf">https://openaccess.thecvf.com/content/ICCV2021/papers/Dwibedi_With_a_Little_Help_From_My_Friends_Nearest-Neighbor_Contrastive_Learning_ICCV_2021_paper.pdf</a></p> <p><a id=[23]>[23]</a> Zheng, M., You, S., Wang, F., Qian, C., Zhang, C., Wang, X., &amp; Xu, C. (2021). Ressl: Relational self-supervised learning with weak augmentation. Advances in Neural Information Processing Systems, 34, 2543-2555. Available: <a href="https://proceedings.neurips.cc/paper/2021/file/14c4f36143b4b09cbc320d7c95a50ee7-Paper.pdf">https://proceedings.neurips.cc/paper/2021/file/14c4f36143b4b09cbc320d7c95a50ee7-Paper.pdf</a></p> <p><a id=[24]>[24]</a> Feng, C., &amp; Patras, I. (2022, August). Adaptive Soft Contrastive Learning. In 2022 26th International Conference on Pattern Recognition (ICPR) (pp. 2721-2727). IEEE. Available: <a href="https://arxiv.org/pdf/2207.11163.pdf">https://arxiv.org/pdf/2207.11163.pdf</a></p> <p><a id=[25]>[25]</a> Caron, M., Misra, I., Mairal, J., Goyal, P., Bojanowski, P., &amp; Joulin, A. (2020). Unsupervised learning of visual features by contrasting cluster assignments. Advances in neural information processing systems, 33, 9912-9924. Available: <a href="https://proceedings.neurips.cc/paper/2020/file/70feb62b69f16e0238f741fab228fec2-Paper.pdf">https://proceedings.neurips.cc/paper/2020/file/70feb62b69f16e0238f741fab228fec2-Paper.pdf</a></p> <p><a id=[26]>[26]</a> Li, J., Zhou, P., Xiong, C., &amp; Hoi, S. C. (2020). Prototypical contrastive learning of unsupervised representations. arXiv preprint arXiv:2005.04966. Available: <a href="https://arxiv.org/pdf/2005.04966.pdf">https://arxiv.org/pdf/2005.04966.pdf</a></p> <p><a id=[27]>[27]</a> Pang, B., Zhang, Y., Li, Y., Cai, J., &amp; Lu, C. (2022, November). Unsupervised Visual Representation Learning by Synchronous Momentum Grouping. In Computer Vision–ECCV 2022: 17th European Conference, Tel Aviv, Israel, October 23–27, 2022, Proceedings, Part XXX (pp. 265-282). Cham: Springer Nature Switzerland. Available: <a href="https://arxiv.org/pdf/2207.06167.pdf">https://arxiv.org/pdf/2207.06167.pdf</a></p> <p><a id=[28]>[28]</a> Lee, K. H., Arnab, A., Guadarrama, S., Canny, J., &amp; Fischer, I. (2021). Compressive visual representations. Advances in Neural Information Processing Systems, 34, 19538-19552. Available: <a href="https://proceedings.neurips.cc/paper/2021/file/a29a5ba2cb7bdeabba22de8c83321b46-Paper.pdf">https://proceedings.neurips.cc/paper/2021/file/a29a5ba2cb7bdeabba22de8c83321b46-Paper.pdf</a></p> <p><a id=[29]>[29]</a> Tomasev, N., Bica, I., McWilliams, B., Buesing, L., Pascanu, R., Blundell, C., &amp; Mitrovic, J. (2022). Pushing the limits of self-supervised ResNets: Can we outperform supervised learning without labels on ImageNet?. arXiv preprint arXiv:2201.05119. Available: <a href="https://arxiv.org/pdf/2201.05119">https://arxiv.org/pdf/2201.05119</a></p> <p><a id=[30]>[30]</a> Ericsson, L., Gouk, H., &amp; Hospedales, T. M. (2021). How well do self-supervised models transfer?. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 5414-5423). Available: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Ericsson_How_Well_Do_Self-Supervised_Models_Transfer_CVPR_2021_paper.pdf">https://openaccess.thecvf.com/content/CVPR2021/papers/Ericsson_How_Well_Do_Self-Supervised_Models_Transfer_CVPR_2021_paper.pdf</a></p> <p><a id=[31]>[31]</a> AI-SCHOLAR, 2021年11月09日, "Self-Supervisedモデルは下流タスクでどれだけ成功するか?" Available: <a href="https://ai-scholar.tech/articles/self-supervised-learning/SSLModels">https://ai-scholar.tech/articles/self-supervised-learning/SSLModels</a></p> <p><a id=[32]>[32]</a> Wang, X., Zhang, R., Shen, C., Kong, T., &amp; Li, L. (2021). Dense contrastive learning for self-supervised visual pre-training. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 3024-3033). Available: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Wang_Dense_Contrastive_Learning_for_Self-Supervised_Visual_Pre-Training_CVPR_2021_paper.pdf">https://openaccess.thecvf.com/content/CVPR2021/papers/Wang_Dense_Contrastive_Learning_for_Self-Supervised_Visual_Pre-Training_CVPR_2021_paper.pdf</a></p> <p><a id=[33]>[33]</a> Xie, Z., Lin, Y., Zhang, Z., Cao, Y., Lin, S., &amp; Hu, H. (2021). Propagate yourself: Exploring pixel-level consistency for unsupervised visual representation learning. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 16684-16693). Available: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Xie_Propagate_Yourself_Exploring_Pixel-Level_Consistency_for_Unsupervised_Visual_Representation_Learning_CVPR_2021_paper.pdf">https://openaccess.thecvf.com/content/CVPR2021/papers/Xie_Propagate_Yourself_Exploring_Pixel-Level_Consistency_for_Unsupervised_Visual_Representation_Learning_CVPR_2021_paper.pdf</a></p> <p><a id=[34]>[34]</a> Wen, X., Zhao, B., Zheng, A., Zhang, X., &amp; Qi, X. (2022). Self-supervised visual representation learning with semantic grouping. arXiv preprint arXiv:2205.15288. Available: <a href="https://arxiv.org/pdf/2205.15288.pdf">https://arxiv.org/pdf/2205.15288.pdf</a></p> <p><a id=[35]>[35]</a> Xu, Y., Zhang, Q., Zhang, J., &amp; Tao, D. (2022, November). RegionCL: Exploring Contrastive Region Pairs for Self-supervised Representation Learning. In Computer Vision–ECCV 2022: 17th European Conference, Tel Aviv, Israel, October 23–27, 2022, Proceedings, Part XXXIII (pp. 477-494). Cham: Springer Nature Switzerland. Available: <a href="https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136930468.pdf">https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136930468.pdf</a></p> <p><a id=[36]>[36]</a> Zhang, W., Pang, J., Chen, K., &amp; Loy, C. C. (2022, November). Dense Siamese Network for Dense Unsupervised Learning. In Computer Vision–ECCV 2022: 17th European Conference, Tel Aviv, Israel, October 23–27, 2022, Proceedings, Part XXX (pp. 464-480). Cham: Springer Nature Switzerland. Available: <a href="https://arxiv.org/pdf/2203.11075.pdf">https://arxiv.org/pdf/2203.11075.pdf</a></p> <p><a id=[37]>[37]</a> Fischer, I. (2020). The conditional entropy bottleneck. Entropy, 22(9), 999. Available: <a href="https://www.mdpi.com/1099-4300/22/9/999">https://www.mdpi.com/1099-4300/22/9/999</a></p> morphotech 実務訓練 2022:ネイル画像生成アプリケーションの作成 hatenablog://entry/4207112889971948071 2023-04-24T11:00:07+09:00 2023-08-16T12:55:20+09:00 本記事は、2022年度の実務訓練で勤務した高橋快斗さんによる寄稿です。 はじめに はじめまして。2023年の1月から2月にかけて株式会社モルフォで実務訓練を行っていた豊橋技術科学大学の高橋です。 本実務訓練では、昨今話題のText-to-Image技術を応用したネイル画像生成アプリケーションを作成しました。このアプリケーションでは、ユーザーがネイルデザインを指定することで、自動的に画像を生成することができます。 生成画像 早速ですが、生成されたネイル画像は図1になります。 図1 生成画像例 <p> 本記事は、2022年度の実務訓練で勤務した高橋快斗さんによる寄稿です。</p> <hr/> <h4 id="はじめに">はじめに</h4> <p> はじめまして。2023年の1月から2月にかけて株式会社モルフォで実務訓練を行っていた豊橋技術科学大学の高橋です。 本実務訓練では、昨今話題のText-to-Image技術を応用したネイル画像生成アプリケーションを作成しました。このアプリケーションでは、ユーザーがネイルデザインを指定することで、自動的に画像を生成することができます。</p> <h4 id="生成画像">生成画像</h4> <p> 早速ですが、生成されたネイル画像は図1になります。 <figure class="figure-image figure-image-fotolife" title="生成画像例"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230316/20230316160911.png" alt="&#x751F;&#x6210;&#x753B;&#x50CF;&#x306E;&#x4F8B;" width="1200" height="482" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1 生成画像例</figcaption></figure></p> <p> 流行のデザインのネイル画像が生成できていることが確認できます。 更に、複数のデザインの特徴を併せ持った<strong>世界初のデザイン</strong>のネイル画像も生成することができます。 <figure class="figure-image figure-image-fotolife" title="複数のデザインを内包した生成画像の例"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230316/20230316161358.png" alt="&#x8907;&#x6570;&#x306E;&#x30C7;&#x30B6;&#x30A4;&#x30F3;&#x3092;&#x5185;&#x5305;&#x3057;&#x305F;&#x751F;&#x6210;&#x753B;&#x50CF;&#x306E;&#x4F8B;" width="1200" height="537" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2 複数のデザインを内包した生成画像の例</figcaption></figure></p> <p> 下記では実務訓練で取り組んだ、このような画像を生成するアプリケーションの作成の過程を記載します。 是非ご覧ください。</p> <h4 id="テーマ決め">テーマ決め</h4> <p> 昨今、深層学習を利用した画像生成が流行しております。 具体的には、アニメ風の画像生成<a href="#f-833a2d53" name="fn-833a2d53" title="徳力基彦 2023 動画生成AIやアニメ背景生成AIも登場。過熱する生成系AI開発競争の中で考えるべきこと。 https://news.yahoo.co.jp/byline/tokurikimotohiko/20230212-00336730">*1</a>やパッケージデザイン<a href="#f-bfdcb0b8" name="fn-bfdcb0b8" title="株式会社プラグ 2022 商品デザインを評価・生成する「パッケージデザインAI」が「第4回 日本サービス大賞」総務大臣賞を受賞 https://prtimes.jp/main/html/rd/p/000000032.000062916.html">*2</a>やホイールデザインの画像生成<a href="#f-69e7c0dc" name="fn-69e7c0dc" title="GENROQweb編集部 2022「AIがホイールをデザイン?」アウディのデザイン部門が積極的に推し進めるAIによる開発の狙い https://motor-fan.jp/genroq/article/58334/">*3</a>などが実用化に至っております。 今回は、他に需要が見込まれる分野について調査した結果、まだ実用化されていないおしゃれなネイル画像の生成にテーマを設定しました。</p> <p><figure class="figure-image figure-image-fotolife" title="テーマ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230316/20230316170650.png" alt="&#x30C6;&#x30FC;&#x30DE;" width="1200" height="636" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3 テーマ</figcaption></figure></p> <h4 id="Stable-Diffusion">Stable Diffusion</h4> <p> 今回は学習済Stable Diffusion<a href="#f-c323ede2" name="fn-c323ede2" title="Rombach, Robin and Blattmann, Andreas and Lorenz, Dominik and Esser, Patrick and Ommer, BjörnHigh-Resolution Image Synthesis with Latent Diffusion Models CVPR 2022 [https://arxiv.org/abs/2112.10752:title] ">*4</a>を画像生成モデルのベースとして用い、ネイル画像データによるファインチューニングを行いました。 このモデルを端的に言いますと、テキスト(プロンプト、文章)から画像を生成するモデルです。 ここではモデルの詳細な説明は割愛します。</p> <h4 id="データセット作成">データセット作成</h4> <p> ファインチューニングには、画像とキャプションのペアのデータセットが必要です。 そこで今回は、画像収集、テキスト認識、テキスト削除、キャプション付与の過程を経てデータセットを作成しました。</p> <p><strong>1. 画像収集</strong></p> <p> 今回は、googleのCustom Search APIを用いて画像を収集しました。 このAPIを用いると、任意の用語を指定することでグーグル検索結果で得られる数百枚の画像を得ることができます。 検索したデザインの種類数は113枚、総画像枚数は4842枚です。 検索用語としては、「クリスマスネイル」「フレンチネイル」のように流行のネイルデザインの名前を入れました。 その後、低解像度の画像の除去をしました。</p> <p><strong>2. テキスト認識</strong></p> <p> 画像内に文字が含まれているデータセットでファインチューニングを行うと、生成画像内に文字が生成されるという不都合が生じた為、テキスト削除を行いました。 テキストを削除するために、テキストをEasyOCR<a href="#f-dd49f42d" name="fn-dd49f42d" title="Liao, Minghui and Zou, Zhisheng and Wan, Zhaoyi and Yao, Cong and Bai, XiangReal-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion [https://arxiv.org/abs/2202.10304:title] ">*5</a>で認識しました。</p> <p><strong>3. テキスト削除</strong></p> <p> テキスト認識結果を元に、マスク画像を生成し、MAT<a href="#f-7b26d48e" name="fn-7b26d48e" title="Li, Wenbo and Lin, Zhe and Zhou, Kun and Qi, Lu and Wang, Yi and Jia, JiayaMAT: Mask-Aware Transformer for Large Hole Image Inpainting CVPR 2022 [https://arxiv.org/abs/2203.15270:title] ">*6</a>を用いてテキストを削除しました。</p> <p><strong>4. キャプション付与</strong></p> <p> BLIP<a href="#f-cafac929" name="fn-cafac929" title="Li, Junnan and Li, Dongxu and Xiong, Caiming and Hoi, StevenBLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation [https://arxiv.org/abs/2201.12086v2:title] ">*7</a>を用いて全ての画像それぞれに対して、キャプションを生成しました。 さらに、新たなネイルデザインの概念を学習させる意図で、キャプションの末尾に検索クエリを追記しました。 <figure class="figure-image figure-image-fotolife" title="図4 キャプション付与の例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230405/20230405010948.png" alt="&#x30AD;&#x30E3;&#x30D7;&#x30B7;&#x30E7;&#x30F3;&#x4ED8;&#x4E0E;" width="1200" height="475" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4 キャプション付与の例</figcaption></figure></p> <h4 id="学習結果">学習結果</h4> <p> 上記で作成したデータセットでファインチューニングを行ったモデルにて生成した画像例が図5になります。</p> <p><figure class="figure-image figure-image-fotolife" title="図5 生成画像によるファインチューニングの効果比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230407/20230407144304.png" alt="&#x751F;&#x6210;&#x753B;&#x50CF;&#x306B;&#x3088;&#x308B;&#x30D5;&#x30A1;&#x30A4;&#x30F3;&#x30C1;&#x30E5;&#x30FC;&#x30CB;&#x30F3;&#x30B0;&#x306E;&#x52B9;&#x679C;&#x6BD4;&#x8F03;" width="1200" height="543" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図5 生成画像によるファインチューニングの効果比較</figcaption></figure></p> <p> 複数のデザインの特徴を併せ持つネイルの画像も生成することが可能となっております。 <figure class="figure-image figure-image-fotolife" title="図6 複数のデザインの特徴を併せ持つネイルの生成画像の例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230405/20230405005752.png" alt="&#x8907;&#x6570;&#x306E;&#x30C7;&#x30B6;&#x30A4;&#x30F3;&#x306E;&#x7279;&#x5FB4;&#x3092;&#x4F75;&#x305B;&#x6301;&#x3064;&#x30CD;&#x30A4;&#x30EB;&#x306E;&#x751F;&#x6210;&#x753B;&#x50CF;&#x306E;&#x4F8B;" width="1200" height="803" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図6 複数のデザインの特徴を併せ持つネイルの生成画像の例</figcaption></figure></p> <p> 想定通り、学習画像内からテキストを削除することで、生成画像から余分な文字の出現を抑制することができました。 <figure class="figure-image figure-image-fotolife" title="図7 テキスト削除の結果比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230325/20230325213816.png" alt="&#x30C6;&#x30AD;&#x30B9;&#x30C8;&#x524A;&#x9664;&#x306E;&#x7D50;&#x679C;&#x6BD4;&#x8F03;" width="1200" height="702" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図7 テキスト削除の結果比較</figcaption></figure></p> <h4 id="GUI">GUI</h4> <p> Streamlitを用いてGUIの作成を行いました。 チェックボックスにより、デザインの提案及び複数のデザインの選択ができ、テキストボックスによりユーザー独自のデザインの指定ができます。 社内での動作試験にあたり、セマフォを用いて生成できるセッション数を制限することでOOM対策をしました。 <figure class="figure-image figure-image-fotolife" title="作成したGUI"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech_is/20230316/20230316164909.jpg" alt="GUI" width="578" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図8 作成したGUI</figcaption></figure></p> <h4 id="まとめ">まとめ</h4> <p> 2ヶ月という短い期間でしたが、ネイル画像生成アプリケーションの作成ができました。 既存のデザインだけでなく、複数のデザインの特徴を併せ持つ世界初のデザインのネイル画像を生成できることができました。</p> <p> 今後の展望として、生成したネイルデザインの自分の爪への仮想試着や、ControlNet<a href="#f-88ca5648" name="fn-88ca5648" title="Lvmin Zhang, Maneesh Agrawala Adding Conditional Control to Text-to-Image Diffusion Models [https://arxiv.org/abs/2302.05543:title] ">*8</a>などを用いた手や指の生成などがあります。</p> <p> 最後に、実務訓練を受け入れていただいた株式会社モルフォ及び、ご指導をくださった社員一同に感謝申し上げるとともに、更なる機械学習の発展を望み締め括ります。</p> <p> 最後までお読みいただき誠にありがとうございます。</p> <h4 id="参考文献">参考文献</h4> <div class="footnote"> <p class="footnote"><a href="#fn-833a2d53" name="f-833a2d53" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">徳力基彦 2023 動画生成AIやアニメ背景生成AIも登場。過熱する生成系AI開発競争の中で考えるべきこと。 <a href="https://news.yahoo.co.jp/byline/tokurikimotohiko/20230212-00336730">https://news.yahoo.co.jp/byline/tokurikimotohiko/20230212-00336730</a></span></p> <p class="footnote"><a href="#fn-bfdcb0b8" name="f-bfdcb0b8" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">株式会社プラグ 2022 商品デザインを評価・生成する「パッケージデザインAI」が「第4回 日本サービス大賞」総務大臣賞を受賞 <a href="https://prtimes.jp/main/html/rd/p/000000032.000062916.html">https://prtimes.jp/main/html/rd/p/000000032.000062916.html</a></span></p> <p class="footnote"><a href="#fn-69e7c0dc" name="f-69e7c0dc" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">GENROQweb編集部 2022「AIがホイールをデザイン?」アウディのデザイン部門が積極的に推し進めるAIによる開発の狙い <a href="https://motor-fan.jp/genroq/article/58334/">https://motor-fan.jp/genroq/article/58334/</a></span></p> <p class="footnote"><a href="#fn-c323ede2" name="f-c323ede2" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">Rombach, Robin and Blattmann, Andreas and Lorenz, Dominik and Esser, Patrick and Ommer, BjörnHigh-Resolution Image Synthesis with Latent Diffusion Models CVPR 2022</p> <p><a href="https://arxiv.org/abs/2112.10752">[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models</a></p> <p></span></p> <p class="footnote"><a href="#fn-dd49f42d" name="f-dd49f42d" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">Liao, Minghui and Zou, Zhisheng and Wan, Zhaoyi and Yao, Cong and Bai, XiangReal-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion</p> <p><a href="https://arxiv.org/abs/2202.10304">[2202.10304] Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion</a></p> <p></span></p> <p class="footnote"><a href="#fn-7b26d48e" name="f-7b26d48e" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">Li, Wenbo and Lin, Zhe and Zhou, Kun and Qi, Lu and Wang, Yi and Jia, JiayaMAT: Mask-Aware Transformer for Large Hole Image Inpainting CVPR 2022</p> <p><a href="https://arxiv.org/abs/2203.15270">[2203.15270] MAT: Mask-Aware Transformer for Large Hole Image Inpainting</a></p> <p></span></p> <p class="footnote"><a href="#fn-cafac929" name="f-cafac929" class="footnote-number">*7</a><span class="footnote-delimiter">:</span><span class="footnote-text">Li, Junnan and Li, Dongxu and Xiong, Caiming and Hoi, StevenBLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation</p> <p><a href="https://arxiv.org/abs/2201.12086v2">[2201.12086v2] BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation</a></p> <p></span></p> <p class="footnote"><a href="#fn-88ca5648" name="f-88ca5648" class="footnote-number">*8</a><span class="footnote-delimiter">:</span><span class="footnote-text">Lvmin Zhang, Maneesh Agrawala Adding Conditional Control to Text-to-Image Diffusion Models</p> <p><a href="https://arxiv.org/abs/2302.05543">[2302.05543] Adding Conditional Control to Text-to-Image Diffusion Models</a> </span></p> </div> morphotech_is インターンシップ 2022:手と物体のInteractionを検出するWebアプリの開発 hatenablog://entry/4207112889934536802 2023-01-11T10:02:19+09:00 2023-08-16T12:55:32+09:00 はじめまして。2022年夏季に株式会社モルフォでインターンをしていた山本です。現在は情報系の大学院でVision-Languageに関する研究を行っています。私のインターンシップでは、画像中の手と物体を検出し、それらの状態を文として出力するWebアプリケーションの開発に取り組みました。 <p>はじめまして。2022年夏季に株式会社モルフォでインターンをしていた山本です。現在は情報系の大学院でVision-Languageに関する研究を行っています。私のインターンシップでは、画像中の手と物体を検出し、それらの状態を文として出力するWebアプリケーションの開発に取り組みました。</p> <h3 id="開発のモチベーション">開発のモチベーション</h3> <p>近年の機械学習における学習手法として、大規模なデータセットで学習した学習済みモデルをfine-tuningして使うという方法が挙げられます。fine-tuingの際にはタスクに応じたデータセットを用意する必要がありますが、例えば料理動画からレシピを生成するといったような、ドメインに特化したタスクである場合、データセットにもより詳細なアノテーションを与えなければならない場合があります。そこで、画像または動画像中の手と物体の状態を自動で検出することができれば、人の動作を伴うデータセットに対するrichなアノテーションを自動で行うことができるのではないかと考え、今回の開発に取り組みました。</p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/qnvSfBplDjlcUc" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/MorphoIncPR/interaction-255252538" title="手と物体とのInteractionを検出するアプリケーションの開発" target="_blank">手と物体とのInteractionを検出するアプリケーションの開発</a> </strong> from <strong><a href="//www.slideshare.net/MorphoIncPR" target="_blank">Morpho, Inc.</a></strong> </div></p> <h3 id="インターンシップを終えて">インターンシップを終えて</h3> <p>今回のインターンシップではメンターの方をはじめとする社員の方々にサポートを頂きながら、多くの学びを得ることができました。その中でも私が特に重要だと感じたものを2つ共有したいと思います。</p> <p>一つは、課題定義・手法の検討を疎かにしないことです。私は今回のインターンシップを通して、小規模ながら「課題定義→手法の検討→開発→公開」というサイクルを体験することができました。この一連の流れの中でも、「課題定義→手法の検討」の部分が重要だと感じました。解決すべき課題をしっかりと定義すること、使おうとしている手法が課題に対して必要/十分なのか検討することで、開発以降のサイクルで無駄な工程を産まずに済みます。実際のインターン中でも、手の認識と物体の認識を別々に行うのではなく、両方を一つのモデルで行った方が良いということに気づき、開発を効率的に進めることができました。定義した課題・手法に関するサーベイを念入りに行うことの重要さを再認識することができました。</p> <p>そしてもう一つは機械学習以外の知識を身につけることです。インターンシップで実際に開発を行う際、使うモデルに必要なライブラリやコンパイラの依存関係に関するエラーでハマってしまうことがあり、それらを解決する際にコンピュータサイエンス(CS)の基礎知識の不足を強く感じました。このようなライブラリ関連の他、速度向上のためにメモリ効率を意識したコードを書く等、CSの基礎知識が必要となる場面は多くあると思います。これから研究・開発を続けるにあたり、機械学習に関する知識だけでなく、CSの知識も拡充していかなければならないと強く感じました。</p> <p>最後に、今回のインターンシップ参加にあたって、開発の方針やアプリケーションの中身に関して多くのアドバイスやサポートを頂いたモルフォの社員の方々に感謝申し上げます。そして本記事が、これから機械学習に関する研究・開発を行う方々の一助になれば幸いです。</p> morphotech_is OJT 2022:depth mapを用いた画像のレイヤー分割+エフェクト hatenablog://entry/4207112889903626184 2022-08-09T09:46:19+09:00 2023-08-16T12:55:58+09:00 こんにちは。プロダクト開発部の中屋敷です。当社では毎年、新入社員でグループ研修を行います。今年度、私達が研修で作成したのが「画像のレイヤー分割」と「水彩画効果を用いた動画化」システムです。本記事では、このシステムの開発の目的や原理、実現したことについてご紹介いたします。 概要 皆さんはデジタルで絵を書いたことはありますか?デジタルではアナログと違い、元に戻したりコピーしたりと便利な機能がありますが、その中でも特に重要なのがレイヤー機能です。風景・人・犬といった描写物を別々の透明フィルムに書き込み、それらを重ね合わせることで一枚の絵とするものです。このレイヤー機能により、人のポーズを変えたり位置… <p> こんにちは。プロダクト開発部の中屋敷です。当社では毎年、新入社員でグループ研修を行います。今年度、私達が研修で作成したのが「画像のレイヤー分割」と「水彩画効果を用いた動画化」システムです。本記事では、このシステムの開発の目的や原理、実現したことについてご紹介いたします。</p> <h3 id="概要">概要</h3> <p> 皆さんはデジタルで絵を書いたことはありますか?デジタルではアナログと違い、元に戻したりコピーしたりと便利な機能がありますが、その中でも特に重要なのがレイヤー機能です。風景・人・犬といった描写物を別々の透明フィルムに書き込み、それらを重ね合わせることで一枚の絵とするものです。このレイヤー機能により、人のポーズを変えたり位置を動かしたりしても背景を書き換える必要がないため、非常に便利なものとなっています。</p> <p> そしてもう一つ、撮った写真を加工することも身近になってきました。文字やスタンプでデコるだけでなく、写りこんだ人を消したり、逆に人を増やしたり。ですが、単に写真の上に追加するだけならともかく、加工をしようとすると途端に難しくなります。(柵の奥に人を追加しようとすると切り抜きが大変ですし、中にはスタイルを良くしようと加工したら背景の人が歪んでしまったなんてケースも・・・)</p> <p> そこで私達は、写真を複数のレイヤーに分割できれば様々な加工処理が楽になるのではと考え、これを実現するシステムを開発しました。 加えて、この分割結果を用いることで面白いエフェクトも実現しましたのでご紹介します。</p> <h3 id="レイヤー分割アルゴリズム">レイヤー分割アルゴリズム</h3> <p> まずレイヤーを分けるための情報として、depth map(写真内の相対距離を表した画像)を用いました。 <figure class="figure-image figure-image-fotolife" title="図1. depth map"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728185804.png" width="1096" height="524" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1. depth map</figcaption></figure></p> <p> depth mapは当社の<a href="https://www.morphoinc.com/technology/dsensor">Morpho Single Camera Bokeh™</a>を使用することで、1枚の画像から取得することができます。また、これから撮る写真であれば、<a href="https://www.morphoinc.com/technology/dcs">Morpho Dual Camera Solutions™</a>を使用することで視差情報を用いたより精度の高いdepth mapを取得することもできます。</p> <p><figure class="figure-image figure-image-fotolife" title="図2. depth mapを用いたレイヤー分割の流れ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728190030.png" width="1150" height="293" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2. depth mapを用いたレイヤー分割の流れ</figcaption></figure></p> <p> depth mapを用いたレイヤー分割で最も単純なのは、指定した距離(depth値)より手前か奥かで分割する方法です。ですが、どの値なら適切に分割できるのか、何個に分けるのかを指定するのは手間がかかります。そこで私達は、複数の手法を用いて適切な分割値や分割数を推定する処理を実装しました。</p> <h4 id="クラスター分析による分割">クラスター分析による分割</h4> <p> まず、depth mapを適切な値で分割するためにクラスター分析を用いました。depth値を1次元データとして扱い、クラスターに分けることで分割depth値を算出しました。また、クラスター分析には様々な手法があるため、複数の手法を実装しました。</p> <ul> <li>クラスター数(レイヤー分割数)を指定して分割する手法 <ul> <li><a href="https://scikit-learn.org/stable/modules/clustering.html#k-means">k-means法(scikit-learn)</a></li> <li><a href="https://pypi.org/project/fuzzy-c-means/">Fuzzy C means法(PyPI)</a></li> </ul> </li> <li>クラスター数を推定する手法(推定結果をk-means法などに使用) <ul> <li><a href="https://pyclustering.github.io/docs/0.10.1/html/dd/dba/namespacepyclustering_1_1cluster_1_1elbow.html">elbow法(pyclustering)</a></li> </ul> </li> <li>クラスター数を推定しつつ分割する手法 <ul> <li><a href="https://pyclustering.github.io/docs/0.10.1/html/d2/d8b/namespacepyclustering_1_1cluster_1_1xmeans.html">x-means法(pyclustering)</a></li> <li><a href="https://scikit-learn.org/stable/modules/clustering.html#mean-shift">mean shift法(scikit-learn)</a></li> </ul> </li> </ul> <p><figure class="figure-image figure-image-fotolife" title="図3. クラスター分析による分割例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728191340.png" width="1137" height="526" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3. クラスター分析による分割例</figcaption></figure></p> <h4 id="多項式回帰を用いたレイヤー分割提案手法多項式回帰">多項式回帰を用いたレイヤー分割提案手法(多項式回帰+)</h4> <p> クラスター分析とは異なる手法のアルゴリズムも一つ実装しました。基本理論として、depth mapをヒストグラムにすると物体がある付近の値は高く山のようになり、何もない距離は0(谷)に近くなります。そのため谷の位置で分割すれば、きれいな分割結果になるはずです。ですがヒストグラムは非常に凸凹しているため、単に移動平均+増減チェックでは谷の位置を判定するのは困難です。そこで、このヒストグラムの近似曲線を用いることで、細かな凸凹をなくしつつ、もとのヒストグラムに近い山・谷を表現できると考えました。 手法としては、depthマップをヒストグラムにかけ、その結果を<a href="https://scikit-learn.org/stable/modules/linear_model.html#polynomial-regression-extending-linear-models-with-basis-functions">多項式回帰分析(scikit-learn)</a>を用いて近似曲線を計算します。その曲線の山となる頂点を算出し、山同士の間で最も値が小さい点を谷として分割点に設定するようにしました。 <figure class="figure-image figure-image-fotolife" title="図4. 多項式回帰を用いたレイヤー分割手法"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728191551.png" width="1057" height="433" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4. 多項式回帰を用いたレイヤー分割手法</figcaption></figure></p> <h3 id="1次元のレイヤー分割の問題点と解決策">1次元のレイヤー分割の問題点と解決策</h3> <p> これまでの手法は1次元データとしてdepth値の分割点を見つけようとしましたが、1次元のみだといくつか課題点がでてきました。</p> <ol> <li>depth値が同じくらいの複数の物体は、同じレイヤーになる</li> <li>depth値が広い物体は途中で分割されてしまう</li> <li>中間レイヤーに境界線が表示される <figure class="figure-image figure-image-fotolife" title="図5. depth値のみの1次元分割の課題点"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220803/20220803184912.png" width="903" height="378" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図5. depth値のみの1次元分割の課題点</figcaption></figure>  これらの課題点を解決するため、3次元クラスター分析および境界線ノイズ除去アルゴリズムを実装しました。</li> </ol> <h4 id="3次元クラスター分析">3次元クラスター分析</h4> <p> 3つの課題すべてに対処するため、depth mapの座標も用いた3次元データでのクラスター分析を実装しました。座標による距離情報も用いることで、離れている物体の分割、depth値が多少変わっても物体は分割されない、境界線は周辺のクラスターにまとめられる、という3つの効果を期待しました。</p> <p><figure class="figure-image figure-image-fotolife" title="図6. 1・3次元クラスター分割の比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728191749.png" width="1083" height="478" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図6. 1・3次元クラスター分割の比較</figcaption></figure>  分割結果をみますと、1次元ではいくつに分割しても被写体の二人は同じレイヤーになりましたが、3次元分割を用いると見事一人一人別のレイヤーに分離することができました。ただ一方で、3次元分割では背景のような広い範囲が写っている領域はパズルのピースのように分割されてしまうという欠点も見られ、有効的なケースが限られることが判明しました。</p> <h4 id="境界線のノイズ除去">境界線のノイズ除去</h4> <p> 続いて1次元分析で生じる境界線ノイズを除去する処理を追加しました。図7に示すように、中間となるレイヤーから境界線ノイズと思われるピクセルを抽出し、それらのピクセルを近いレイヤー(周辺で最も大きい領域のレイヤー)に移動させました。そのように補正した分割結果を使い写真をレイヤー分割することで、図5で見られた境界線ノイズを削減しました。 <figure class="figure-image figure-image-fotolife" title="図7. 境界線ノイズ除去"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220804/20220804110832.png" width="1168" height="606" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図7. 境界線ノイズ除去</figcaption></figure></p> <h3 id="レイヤー分割の評価">レイヤー分割の評価</h3> <p> 今回のシステムではいくつもの分割手法を実装したため、各手法について「処理時間・再現性・分割結果」の3項目で性能評価を行いました。評価対象は紹介した各手法(1次元分析)と、3次元クラスター分析をk-means法に適応したものを比較しました。</p> <ol> <li><p>処理時間</p> <p>各アルゴリズムの処理時間を評価しました。処理時間は、CPUのシングルスレッドで動作させ、14回実行したうちの上位7回を平均して算出しました。 <figure class="figure-image figure-image-fotolife" title="グラフ1. 各アルゴリズムの処理時間"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220804/20220804111139.png" width="1120" height="586" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>グラフ1. 各アルゴリズムの処理時間</figcaption></figure> グラフは横軸が速度評価に用いたdepth mapで、縦軸が処理時間(ms)を対数表記しています。</p> <p>まず一番目につく結果として、多項式回帰+が他の手法の100〜1000倍速い結果となりました。理由としては、どれだけ大きなdepth mapであってもヒストグラム化して256個のデータ(depth値の幅)にしたものを解析に用いるため、高速化が実現できています。次に早いのはk-means法で、3次元にするとデータ量は3倍に増えるものの、大幅な増加は見られませんでした。mean shiftやx-means法は探索が必要なため、k-means法の10倍ほどの時間がかかってしまっています。Fuzzy C means法は分割数を指定する手法ですが、k-means法よりも10倍ほどの時間がかかっています。</p> <p>処理時間の全体の傾向としては、分割数や画像によらずサイズに比例するような傾向がみられますが、Fuzzy C means法のみ画像の内容により処理時間が大きく変わることが確認できました。</p> <p>なお、elbow法についてはk-means法を指定回数繰り返して最も良い分割数を探す手法であり、処理時間≒k-means法の時間×指定回数という単純な計算となるため、グラフから除外しています。</p></li> <li><p>再現性</p> <p>続いて再現性の評価です。クラスター分析手法では開始時のクラスター中心点などをランダムに設定するため、同じ画像であっても最適化によるクラスタリング結果が異なる可能性があります。そのため、画像ごとに複数回実行した結果(分割数・分割depth値・最適化後のクラスターの中心点)の一致率を算出し、それらから高中低の3段階で評価しました。基本的には再現性は高いほうが良いですが、一方で適切ではない分割結果だった場合それに固定されてしまうという意味でもあるため、再現性は低くても悪いとは言い切れないと考えています。</p> <p>評価の結果、Fuzzy C means法とmean shift法は平均的に90%以上の一致率であり、クラスター分析の中では再現性が高くなっていました。一方、三次元のk-means法は次元数が多いためか、特に背景などの広い範囲の分割が実行毎に変わることが多く、再現性は低い評価となりました。それ以外のクラスター分析は、画像によりますが80~90%程度の一致率であり、大きな違いは見られませんでした。なお、多項式回帰+は計算による算出のため、一致率は100%でした。</p></li> <li><p>分割結果</p> <p>最後に分割結果の評価になります。分割結果は、人・物体・背景が分離できているかを評価しました。本来なら理想的な分割結果を用意してその差分から判定したいところなのですが、時間的な制約もあり、今回は目視・主観による評価を行いました。 <figure class="figure-image figure-image-fotolife" title="図8. 分割結果の評価例(類似結果のものはまとめて記載)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728192051.png" width="1015" height="520" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図8. 分割結果の評価例(類似結果のものはまとめて記載)</figcaption></figure></p> <p> 図8のように同じ画像の分割結果を見比べて判定を行いました。この画像結果ですと、k-means法とFuzzy C means法がきれいな結果となっていますが、それ以外の手法は悪い結果となっています。ただし、画像によっては逆の評価になることもありますので、総合的な判断を後述の表1に記載しました。</p></li> </ol> <h4 id="分割評価の結論">分割評価の結論</h4> <p><figure class="figure-image figure-image-fotolife" title="表1. レイヤー分割アルゴリズム評価"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220804/20220804112133.png" width="991" height="546" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>表1. レイヤー分割アルゴリズム評価</figcaption></figure>  速度については多項式回帰+が非常に速く、次点でk-means法となりました。再現性は多項式回帰+, Fuzzy C means法, mean shift法が安定して同じ結果が出力されています。そして最も画像の分割結果がきれいなものはFuzzy C means法で、次点でk-means法となりました。これらの結論から、用途ごとのおすすめは下記になります。</p> <ul> <li>速度重視:多項式回帰+</li> <li>性能重視:Fuzzy C means法</li> <li>バランス(指定):k-means法</li> <li>バランス(推定):mean shift法</li> </ul> <h3 id="レイヤー分割を応用したエフェクト">レイヤー分割を応用したエフェクト</h3> <p> ここからは、レイヤー分割を応用したエフェクトについてご説明します。まず、レイヤー分割結果を活用する最も分かりやすい用途が画像合成です。分割したレイヤーは透過画像で出力できるため、ペイントツールなどを使って分割したレイヤー間に画像を挿入したり、サイズなどを変えて他の画像に合成したりすることができます。 <figure class="figure-image figure-image-fotolife" title="図9. レイヤー分割の結果を組み合わせた画像合成"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728192317.png" width="1153" height="367" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図9. レイヤー分割の結果を組み合わせた画像合成</figcaption></figure></p> <p> ただ、この画像も柵が一部途切れているなどdepth値による分割は課題点も多く、残念ながら合成となると違和感を覚えてしまうケースが少なからずありました。そこで純粋に分割した画像を使うのではなく、さらにここから加工を加えることで、違和感を軽減しつつ面白いエフェクトを実装しました。</p> <h4 id="エフェクトのための基盤機能">エフェクトのための基盤機能</h4> <p> 実装したエフェクトの紹介の前に、エフェクトを実現するにあたって必要となる機能を2つご説明します。 <figure class="figure-image figure-image-fotolife" title="図10. エフェクトの基盤機能"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220728/20220728192354.png" width="841" height="523" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図10. エフェクトの基盤機能</figcaption></figure></p> <ul> <li>Inpainting</li> </ul> <p> <a href="http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_photo/py_inpainting/py_inpainting.html">OpenCVのinpainting機能</a>を使って、レイヤー分割で生じた空白領域を埋めることができます。基本は近郊の画素値を使用するため、広い範囲を埋めたり分割が綺麗にできていないと不自然になってしまいますが、そのままの空白状態よりは目立ちにくくなります。</p> <ul> <li>水彩フィルター</li> </ul> <p> 近郊ピクセルの中で最も色の数値が高いピクセルの色にすることで、写真を水彩画で描いたような画像に変換するフィルターを作成しました。このとき、範囲や強度を変化させることで、水彩効果の強弱を変えることができます。この水彩フィルターをかけることで、レイヤー分割やinpaintingの違和感を軽減できます。</p> <p> この二つの機能と、レイヤー分割、レイヤーのリサイズなどを組み合わせることで、いくつかの動画エフェクトを作成いたしました。</p> <h4 id="水彩画効果を用いた動画エフェクト">水彩画効果を用いた動画エフェクト</h4> <ol> <li><p>背景水彩化動画</p> <p>まず一つ目、背景が少しずつ水彩風になっていく動画です。 <figure class="figure-image figure-image-fotolife" title="図11. 背景水彩化動画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220729/20220729112637.gif" width="830" height="622" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図11. 背景水彩化動画 (使用写真:”<a href="http://gahag.net/000756-mountain-lake/">GAHAG</a>”より)</figcaption></figure> こちらは2分割した画像のうち、背景のレイヤーに対して水彩効果をかけ、フレームごとに水彩効果を強めていくことで実現しています。背景がボケていく画像とはまた違った雰囲気の動画になりますが、予想外の効果として波が動いているようにも見えますので、水彩効果の強度を前後させると疑似的なgif動画にできるかもしれません。</p></li> <li><p>水彩画作成動画</p> <p>続いて写真の風景を水彩画で描いていく風の動画です。 <figure class="figure-image figure-image-fotolife" title="図12. 水彩画作成動画"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220729/20220729112746.gif" width="600" height="448" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図12. 水彩画作成動画</figcaption></figure> こちらは最初に空白領域にinpaintingをかけ水彩効果を強めに加えた遠景レイヤーを表示し、だんだんと近景レイヤーを重ね、かつ水彩効果を弱めていくことで実現しました。背景だけの絵から、少しずつ物が書き込まれていくように見えます。レイヤー分割数を増やすほど、一回の書き込み量が少なくなるので、より丁寧な動画になります。</p></li> <li><p>背景Drifting</p> <p>最後に、人は動いていないのに背景が進んでいるかのような不思議な感覚になる動画です。通常は動画から作成される、ドリーズームと呼ばれる演出を写真から実現しました。 <table> <tr> <td><figure class="figure-image figure-image-fotolife"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220729/20220729112934.gif" width="600" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></td> <td><figure class="figure-image figure-image-fotolife"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20220729/20220729112953.gif" width="600" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></td> </tr> </table> <div style="text-align: center;"><span style="color: gray">図13. 背景Drifting(左:水彩効果なし、右:あり)</span></div></p> <p>原理としては、inpaintingで補完した背景レイヤーを中心を基準に拡大させることで実現しています。こちらは境界線がどうしても目立ちやすいのとズームにより背景のinpainting部分が見えて違和感を覚えやすいのですが、水彩効果を加えることでこれらを目立たなくすることができます。</p></li> </ol> <h3 id="まとめ">まとめ</h3> <p> 本グループ研修では、depth mapを用いることで写真を複数のレイヤーに分割し、またその分割結果を元に一風変わったエフェクトの開発に取り組みました。この開発では、アイディア出しから要件定義、開発、テスト、評価までの一連の経験をつむことができました。レイヤー分割自体は比較的直ぐにできましたが、やはり理想通りに分けるとなると難しく、まだまだ課題点が残っています。一方で、その精度でも違和感を覚えないように水彩フィルターを加えるという発想が出てくるなど、とても刺激になる開発経験となりました。この開発経験を今後の業務に活かしていきたいと思います。</p> <p> また、アルゴリズムの改善、別のクラスターアルゴリズムを試す、マルチスレッドやGPUを使った高速化、そして新しいエフェクトの追加など、まだまだ改善の余地はありますので、業務を通じて得たスキルで少しずつ改良し、自信をもって人に勧められるシステムにできたらなと思ってます。</p> <p> 以上、本記事を読んでくださりありがとうございました。</p> morphotech HiPPO/S4解説 hatenablog://entry/13574176438085346973 2022-05-24T10:26:48+09:00 2023-08-16T12:56:33+09:00 こんにちは、CTO室リサーチャーの角田です。 社内では毎週金曜日に持ち回りで論文紹介を行うjournal clubという活動を行っております。そちらで私が発表した以下3本の論文 HiPPO: Recurrent Memory with Optimal Polynomial Projections (NeurIPS 2020 Spotlight) Combining Recurrent, Convolutional, and Continuous-time Models with the Linear State Space Layer (NeurIPS 2021) Efficiently Mo… <p>こんにちは、CTO室リサーチャーの角田です。</p> <p>社内では毎週金曜日に持ち回りで論文紹介を行うjournal clubという活動を行っております。そちらで私が発表した以下3本の論文</p> <ul> <li>HiPPO: Recurrent Memory with Optimal Polynomial Projections (NeurIPS 2020 Spotlight)</li> <li>Combining Recurrent, Convolutional, and Continuous-time Models with the Linear State Space Layer (NeurIPS 2021)</li> <li>Efficiently Modeling Long Sequences with Structured State Spaces (ICLR 2022 Oral)</li> </ul> <p>について、内容が非常に優れていると判断した&詳細な日本語解説がほとんど存在しないことから、このブログにて外部公開することを決めました。</p> <p>内容としては時系列モデリングについてですが、LSTMやTransformerとは全く切り口の異なる手法で、厳密な理論展開を踏まえてモデルを構成しSOTA性能をたたき出した素晴らしい論文です。</p> <p>近年のディープラーニング系論文においては、ふんわりとした気持ちでモデルを作ってとにかく精度向上が見られたことでアイデアを正当化するケースが多いですが、ボトムアップに理論構成して狙った通りに圧倒的精度を出している点で、この論文群は非常に稀有な存在だと認識しています。</p> <p>もし同様の論文を読もうとされている方がいらっしゃれば、このスライドが助けになれば幸いです。また識者の方におきましては内容の誤り等ありましたら指摘いただけますと大変参考になります。</p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/pVIGWCIx4bGC9k" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/MorphoIncPR/hippos4" title="HiPPO/S4解説" target="_blank">HiPPO/S4解説</a> </strong> from <strong><a href="//www.slideshare.net/MorphoIncPR" target="_blank">Morpho, Inc.</a></strong> </div></p> morphotech CVPR 2021 参加報告 hatenablog://entry/13574176438038366320 2022-02-02T09:59:51+09:00 2023-08-16T12:56:54+09:00 こんにちは、2021年4月に入社したCTO室リサーチャーの名古屋です。 私たちが働く株式会社モルフォでは毎年、国内外を問わず画像処理・機械学習の学会や国際会議に積極的に参加しています。今回は私ともう2名の社内リサーチャーとで、6月19~25日に開催した「CVPR 2021」に参加してきました。 この記事では、CVPRの概要と、個人的に気になった研究を3つピックアップして紹介します。 <p> こんにちは、2021年4月に入社したCTO室リサーチャーの名古屋です。</p> <p> 私たちが働く株式会社モルフォでは毎年、国内外を問わず画像処理・機械学習の学会や国際会議に積極的に参加しています。今回は私ともう2名の社内リサーチャーとで、6月19~25日に開催した「CVPR 2021」に参加してきました。</p> <p> この記事では、CVPRの概要と、個人的に気になった研究を3つピックアップして紹介します。</p> <h3 id="目次">目次</h3> <ul class="table-of-contents"> <li><a href="#目次">目次</a></li> <li><a href="#CVPR-2021-の概要">CVPR 2021 の概要</a><ul> <li><a href="#CVPR-2021-の様子">CVPR 2021 の様子</a></li> </ul> </li> <li><a href="#論文紹介">論文紹介</a><ul> <li><a href="#1-Learning-Continuous-Image-Representation-with-Local-Implicit-Image-Function">1. Learning Continuous Image Representation with Local Implicit Image Function</a><ul> <li><a href="#一言で">一言で</a></li> <li><a href="#背景">背景</a></li> <li><a href="#手法">手法</a></li> <li><a href="#実験結果">実験・結果</a></li> <li><a href="#感想">感想</a></li> <li><a href="#リンク">リンク</a></li> </ul> </li> <li><a href="#2-GLEAN-Generative-Latent-Bank-for-Large-Factor-Image-Super-Resolution">2. GLEAN: Generative Latent Bank for Large-Factor Image Super-Resolution</a><ul> <li><a href="#一言で-1">一言で</a></li> <li><a href="#背景-1">背景</a></li> <li><a href="#手法GLEAN">手法:GLEAN</a></li> <li><a href="#実験結果-1">実験・結果</a></li> <li><a href="#ちなみに">ちなみに</a></li> <li><a href="#感想-1">感想</a></li> <li><a href="#リンク-1">リンク</a></li> </ul> </li> <li><a href="#3-Closed-Form-Factorization-of-Latent-Semantics-in-GANs">3. Closed-Form Factorization of Latent Semantics in GANs</a><ul> <li><a href="#一言で-2">一言で</a></li> <li><a href="#背景-2">背景</a></li> <li><a href="#手法Semantic-Factorization-SeFa">手法:Semantic Factorization (SeFa)</a></li> <li><a href="#実験結果-2">実験・結果</a></li> <li><a href="#感想-2">感想</a></li> <li><a href="#リンク-2">リンク</a></li> </ul> </li> </ul> </li> <li><a href="#おわりに">おわりに</a></li> <li><a href="#参考文献">参考文献</a></li> </ul> <h3 id="CVPR-2021-の概要">CVPR 2021 の概要</h3> <p> CVPR (Computer Vision and Pattern Recognition) とは、コンピュータビジョンとパターン認識の分野における世界トップレベルの学会です。毎年非常に多くの論文が集まっており、その数は毎年のように増え続けています。今年は7000本の論文の中から1700本が採択されました (採択率23%) [1]。通常はアメリカ国内で開催されていますが、新型コロナウイルスの影響で去年からリモート参加によるバーチャル開催となっています。</p> <h4 id="CVPR-2021-の様子">CVPR 2021 の様子</h4> <p> 参加者 (聴講者) は開催前日から特設サイトにログインすることができ、そこでは各論文のポスターや事前に録画された講演動画を見ることができます。ポスターは非常に簡潔にまとまっているものが多く、論文の概要を把握するのに便利です。特設サイトは大会終了後3ヶ月間は入ることができます。</p> <p> 開催期間中はセッション時間が設けられていて、その時間内で発表者に質疑応答をします。質疑応答はリアルタイムなビデオ通話形式とテキストチャット形式があります。ビデオ通話形式では1論文に1部屋用意されているためか、参加者が分散して1部屋1部屋が過疎り気味です。周囲を気にせず訊ける反面、通常の学会のノリで他人の議論を聴きに行こうと参加者の多い部屋に入ると、沈黙に殺されることになります。テキストチャット形式はセッション時間外でも質問する事ができます (セッション時間を過ぎてしまえば回答は返ってきませんが) 。テキストベースであるため、話すのが苦手な方にとっては非常に便利な機能です。セッションが終わってもログが見れる利点もあります。</p> <p> その他チュートリアルやワークショップも同時に開催されており、身一つではとても回りきれないほど充実しています。</p> <h3 id="論文紹介">論文紹介</h3> <p> ここからは、私が個人的に興味を持った (主に画像生成についての) 論文を紹介します。</p> <p style="display: none;"><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20" alt=" "/></p> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ TeX: { equationNumbers: { autoNumber: "AMS" } } }); </script> <h4 id="1-Learning-Continuous-Image-Representation-with-Local-Implicit-Image-Function">1. Learning Continuous Image Representation with Local Implicit Image Function</h4> <p>著者:Yinbo Chen, Sifei Liu, Xiaolong Wang. (CVRP 2021)</p> <p>論文:Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021. pp. 8628-8638.</p> <h5 id="一言で">一言で</h5> <p> 画像の局所表現を学習することで、拡大縮小画像の任意の座標における連続的な画素値を回帰する手法</p> <h5 id="背景">背景</h5> <p> コンピュータ上では、画像データは離散信号で保存されるため、標本化によって一部の信号情報が切り捨てられます。これらの画像を拡大する際は、この切り捨てられた信号を補間する必要があります。</p> <p> 従来法では、切り捨てられた信号の値自体を予測するように学習しますが、提案手法では画像特徴から連続値座標における画素値を回帰するデコーダを学習します。</p> <p> これにより、モデルの出力のサイズにとらわれない任意の解像度での拡大・縮小が可能となります。</p> <h5 id="手法">手法</h5> <p>【Local Implicit Image Function (LIIF) の連続画像表現方法】</p> <p> 論文では、連続画像 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20I" alt=" I"/> の予測したい座標 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_q" alt=" x_q"/> とその周辺の2次元特徴量 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z%5E%2A_t" alt=" z^*_t"/> を入力とし、座標 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_q" alt=" x_q"/> のRGB値を予測し出力する「Local Implicit Image Function (LIIF) 」と呼ぶ表現方法を提案しています。</p> <p> すべての画像で共有されるデコーディング関数 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f_%7B%5Ctheta%7D" alt=" f_{\theta}"/> ( <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/> をパラメータとするMLP) で特徴量をデコードします。</p> <p><figure class="figure-image figure-image-fotolife" title="LIIFの表現方法 - [2] Fig.2より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222154432.png" width="283" height="286" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>LIIFの表現方法 - [2] Fig.2より引用</figcaption></figure></p> <p> 式にすると (1) のようになります。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%0A%20I%28x_q%29%3D%5Csum_%7Bt%5Cin%20%5C%7B%2000%2C%2001%2C%2010%2C%2011%5C%7D%20%7D%20%5Cfrac%7BS_t%7D%7BS%7D%20%5Ccdot%20f_%7B%5Ctheta%7D%28z%5E%5Cast_t%2C%20x_q%20-%20v%5E%5Cast_t%29%0A%5Ctag%7B1%7D%0A" alt=" \displaystyle I(x_q)=\sum_{t\in \{ 00, 01, 10, 11\} } \frac{S_t}{S} \cdot f_{\theta}(z^\ast_t, x_q - v^\ast_t) \tag{1} "/></p> <p>  <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20v%5E%5Cast_t" alt=" v^\ast_t"/> は <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z%5E%5Cast_t" alt=" z^\ast_t"/> の座標、 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20S_t" alt=" S_t"/> は <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_q" alt=" x_q"/> と <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20v%5E%5Cast_t" alt=" v^\ast_t"/> 間の長方形の面積で <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20S%20%28S%3D%5Csum_%7Bt%7D%20S_t%29" alt=" S (S=\sum_{t} S_t)"/> で正規化されます。</p> <p> 式 (1) は、特徴量のデコードを バイリニア補間しているといえます。</p> <p></br></p> <p>【LIIFの学習方法】</p> <p> 入力画像をLIIF表現として2D特徴マップにマッピングするエンコーダ <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20E_%7B%5Cvarphi%7D" alt=" E_{\varphi}"/> (パラメータとして <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cvarphi" alt=" \varphi"/> を使用) と、すべての画像で共有されるデコーディング関数 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f_%7B%5Ctheta%7D" alt=" f_{\theta}"/> を学習します。</p> <p> まず、学習用のデータの作成を行います。入力画像として、トレーニング画像からランダムなスケールでダウンサンプリングした画像を使用します。またLIIFで参照する座標 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_%7B%5Cmathrm%7Bhr%7D%7D" alt=" x_{\mathrm{hr}}"/> と、そのRGB値 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20s_%7B%5Cmathrm%7Bhr%7D%7D" alt=" s_{\mathrm{hr}}"/>を作成します。</p> <p><figure class="figure-image figure-image-fotolife" title="学習用データの作成方法 - [2] Fig.4より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222154719.png" width="472" height="185" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>学習用データの作成方法 - [2] Fig.4より引用</figcaption></figure></p> <p> 次に学習の流れについて説明します。エンコーダ <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20E_%7B%5Cvarphi%7D" alt=" E_{\varphi}"/> は、入力画像をそのLIIF表現として2次元特徴マップにマッピングします。 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f_%7B%5Ctheta%7D" alt=" f_{\theta}"/> はLIIF表現に基づいて座標 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_%7B%5Cmathrm%7Bhr%7D%7D" alt=" x_{\mathrm{hr}}"/> に対するRGB値を予測します。予測された信号 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20s_%7Bpred%7D" alt=" s_{pred}"/> と教師用の信号 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20s_%7B%5Cmathrm%7Bhr%7D%7D" alt=" s_{\mathrm{hr}}"/> との間で学習損失 (論文ではL1Loss) を計算します。</p> <p><figure class="figure-image figure-image-fotolife" title="学習の流れ - [2] Fig.4より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222154758.png" width="469" height="139" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>学習の流れ - [2] Fig.4より引用</figcaption></figure></p> <h5 id="実験結果">実験・結果</h5> <p> 実験では、PSNRを用いて画質を評価します。</p> <p> LIIFは既存の超解像手法に比べて、学習セットに含まれないような極端な倍率 (30倍など) で高い精度を出しています。</p> <p><figure class="figure-image figure-image-fotolife" title="PSNRによる比較 - [2] Table 1より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222154929.png" width="837" height="205" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>PSNRによる比較 - [2] Table 1より引用</figcaption></figure></p> <p> また、LIIFでは画像のエッジ部分のぼけが抑制され、クリアに拡大できている事がわかります。</p> <p><figure class="figure-image figure-image-fotolife" title="左から、ピクセルで拡大、バイリニア補間、LIIF (提案手法) - [3]より引用"> <video controls><source src="https://yinboc.github.io/liif/assets/window.mp4"> </video><video controls><source src="https://yinboc.github.io/liif/assets/umb.mp4"></video><figcaption>左から、ピクセルで拡大、バイリニア補間、LIIF (提案手法) - [3]より引用</figcaption></figure></p> <h5 id="感想">感想</h5> <p> フィルムカメラみたいに画像を連続的な表現にするという発想が非常に面白いと感じました。</p> <p> ただ、拡大していくと画像がイラストのようなのっぺりとした感じになってしまうのが気になります。デコーディング関数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20f_%7B%5Ctheta%7D" alt=" f_{\theta}"/> の重みを座標 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z%5E%5Cast_t" alt=" z^\ast_t"/> と <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_q" alt=" x_q"/> からなる面積という線形的な値ではなく深層学習で求めれば、もっと詳細なテクスチャやディティールを復元できそうです。</p> <h5 id="リンク">リンク</h5> <ul> <li><a href="https://yinboc.github.io/liif/">ホームページ (GitHub)</a></li> <li><a href="https://openaccess.thecvf.com/content/CVPR2021/html/Chen_Learning_Continuous_Image_Representation_With_Local_Implicit_Image_Function_CVPR_2021_paper.html">概要 (CVPR 2021 open access)</a></li> <li><a href="https://arxiv.org/abs/2012.09161">論文 (arXiv.org)</a></li> <li><a href="https://github.com/yinboc/liif">ソースコード (GitHub)</a></li> </ul> <h4 id="2-GLEAN-Generative-Latent-Bank-for-Large-Factor-Image-Super-Resolution">2. GLEAN: Generative Latent Bank for Large-Factor Image Super-Resolution</h4> <p>著者:Kelvin C.K. Chan, Xintao Wang, Xiangyu Xu, Jinwei Gu, Chen Change Loy. (CVRP 2021)</p> <p>論文:Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021. pp. 14245-14254.</p> <h5 id="一言で-1">一言で</h5> <p> 学習済みGAN生成器をLatent Bankとして使用することにより、超解像の品質を向上させる手法</p> <h5 id="背景-1">背景</h5> <p> ここ数年でBigGANやStyleGANなど、高精度の高解像画像を生成できる深層学習モデルが登場しています。BigGANなどは複数カテゴリーの画像を生成できるため、多様な自然画像に対する潜在空間・特徴空間を持っています。</p> <p> これらの既存のGAN生成器が詳細なテクスチャやディティールを生成することに着目し、超解像技術に応用したのがこの研究です。</p> <h5 id="手法GLEAN">手法:GLEAN</h5> <p> この論文では、学習済みのGAN生成器をLatent Bankとして従来のEncoder-Decoder構造に組み込んだ、新しいEncoder-Bank-Decoder 構造を提案しています。</p> <p> Latent Bankは、GANによって事前に獲得された多種多用な画像表現を持っています。そのため、このLatent Bankが細かい部分 (ディテールやテクスチャ) の復元を支援することで、Encoderは構造の復元に集中することができます。これにより、EncoderとDecoderが「入力画像に対する忠実度 (以下、忠実度) 」と「フォトリアリズム」の両方を同時に学習する負担が軽減され、学習時間を短くしながら高い品質の超解像画像の生成を期待できます。</p> <p><figure class="figure-image figure-image-fotolife" title="Encoder - Bank - Decoder 構造 - [4] Fig.2より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222165232.png" width="1011" height="375" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Encoder-Bank-Decoder 構造 - [4] Fig.2より引用</figcaption></figure></p> <p> 各モデルの役割は以下のようになっています。</p> <ul> <li>Encoder:入力画像の構造を復元し、空間特徴を生成</li> <li>Latent Bank:自然な画像の事前情報を提供し、詳細特徴を生成</li> <li>Decoder:空間特徴と詳細特徴を融合</li> </ul> <h5 id="実験結果-1">実験・結果</h5> <p> GLEANでは、学習済みのStyleGANまたはStyleGAN2をLatent bankとして使用しています。</p> <p> GLEANでは、他の超解像手法に比べて忠実性や細部のディティールを自然に再現していることがわかります。論文では、64倍の拡大でもリアリティの高い復元に成功しています。</p> <p><figure class="figure-image figure-image-fotolife" title="16倍の超解像での比較 - [4] Fig.3より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222165305.png" width="994" height="298" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>16倍の超解像での比較 - [4] Fig.3より引用</figcaption></figure></p> <p> 更に、GLEANの興味深いところは、人の顔のデータセットで学習したにもかかわらず、人の顔ではない画像や、顔の角度が極端に変化するポーズにも対応できる点です。PULSEは低解像度 (下図、各顔画像の左下の小さな図) では正解画像 (GT) に似ているように見えますが、高解像度になるとGTとは大きく異なり正面の顔画像を生成してしまっているのが分かります。</p> <p><figure class="figure-image figure-image-fotolife" title="多様なポーズや内容の入力画像に対する出力 - [4] Fig.6より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222165340.png" width="505" height="345" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>多様なポーズや内容の入力画像に対する出力 - [4] Fig.6より引用</figcaption></figure></p> <h5 id="ちなみに">ちなみに</h5> <p> このEncoder-Bank-Decoder 構造を見て、「BankはGANのGeneratorだから、Encoder-Bankだけで画像は生成できるはず。Decoderは本当に必要なのだろうか?」と疑問に思いました。が、論文ではそのような疑問についてのアンサーもしっかり用意されていました。</p> <p><figure class="figure-image figure-image-fotolife" title="Decoderあり/なしの比較 (上段がDecoderあり、下段がなし) - [4] Fig9より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211222/20211222165403.png" width="498" height="273" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Decoderあり/なしの比較 (上段がDecoderあり、下段がなし) - [4] Fig9より引用</figcaption></figure></p> <p> Decoderありの方は、テクスチャ部分の細かいアーティファクトが減っており、より自然な画像になっていることがわかります。DecoderがEncoderからの構造的な特徴量とLatent Bankからの細部の特徴量を融合させる働きをしていることがよくわかります。</p> <h5 id="感想-1">感想</h5> <p> EncoderとDecoderの間に学習済みのGAN生成器を挟む、シンプルながら非常に有用性の高い発想が面白いと感じました。インペインティングや反射面の映り込み除去などのタスクに応用できそうです。</p> <h5 id="リンク-1">リンク</h5> <ul> <li><a href="https://www.mmlab-ntu.com/project/glean/">ホームページ (MMLab@NT)</a></li> <li><a href="https://ckkelvinchan.github.io/projects/GLEAN/">ホームページ (GitHub)</a></li> <li><a href="https://openaccess.thecvf.com/content/CVPR2021/html/Chan_GLEAN_Generative_Latent_Bank_for_Large-Factor_Image_Super-Resolution_CVPR_2021_paper.html">概要 (CVPR 2021 open access)</a></li> <li><a href="https://arxiv.org/abs/2012.00739">論文 (arXiv.org)</a></li> <li><a href="https://github.com/ckkelvinchan/GLEAN">ソースコード (GitHub)</a></li> </ul> <h4 id="3-Closed-Form-Factorization-of-Latent-Semantics-in-GANs">3. Closed-Form Factorization of Latent Semantics in GANs</h4> <p>著者:Yujun Shen, Bolei Zhou. (CVRP 2021)</p> <p>論文:Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021. pp. 1532-1540.</p> <h5 id="一言で-2">一言で</h5> <p> GANの潜在空間内の意味のある変動 (意味ベクトル) を教師なし学習で発見する</p> <h5 id="背景-2">背景</h5> <p> 近年、GANの潜在空間を用いて画像内のオブジェクトの角度や色などを変えるなどの「意味のある変動 (以下、意味ベクトル) 」を操作する試みが多数なされています。</p> <p> この論文もその1つです。論文では学習済みのGANの潜在空間から意味ベクトルを見つける手法を提案しています。潜在空間の次元軸に沿って意味を学習させたり、意味ラベルの付いたデータセットを用意したりする必要がありません。</p> <h5 id="手法Semantic-Factorization-SeFa">手法:Semantic Factorization (SeFa)</h5> <p> 提案手法では、ほとんどのGANが、ある入力潜在ベクトル<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z" alt=" z"/> を一番最初に全結合層でProjection (投影) することに着目します。</p> <p><figure class="figure-image figure-image-fotolife" title="GANの構造 - CVPR2021講義動画より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211223/20211223145322.png" width="950" height="416" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>GANの構造 - CVPR2021講義動画より引用</figcaption></figure></p> <p> 「潜在空間上の意味のある方向 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20n" alt=" n"/> は生成画像を明らかに変化させる」と仮定します。</p> <p> GANの1ステップ目 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20G_1%28%5Ccdot%29" alt=" G_1(\cdot)"/> のProjectionのパラメータをアフィン変換行列 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20A" alt=" A"/> 、バイアスを <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20b" alt=" b"/> とします。潜在コード <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z" alt=" z"/> を1段階上の特徴空間へマッピングすることは式 (2) で表せます。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20G_1%28z%29%20%3D%20Az%20%2B%20b%20%20%5Ctag%7B2%7D" alt=" G_1(z) = Az + b \tag{2}"/></p> <p> 式 (2) から、任意の潜在コード <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z" alt=" z"/> を単位ベクトル <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20n" alt=" n"/> に沿ってスカラー値 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha" alt=" \alpha"/> だけ移動させる潜在空間内の操作は式 (3) と表せます。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20G_1%28z%20%2B%20%5Calpha%20n%29%20%3D%20Az%20%2B%20b%20%2B%5Calpha%20A%20n%20%20%5Ctag%7B3%7D" alt=" G_1(z + \alpha n) = Az + b +\alpha A n \tag{3}"/></p> <p> ここから <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20Az" alt=" Az"/> を大きく変化させる単位ベクトル <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20n" alt=" n"/> を見つけることを目的とします。そのためには、式 (4) の最適化問題を解く必要があります。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cnewcommand%7B%5Cargmax%7D%7B%5Cmathop%7B%5Crm%20arg~max%7D%5Climits%7D%0An%5E%7B%5Cast%7D%20%3D%20%5Cargmax_%7B%5C%7Bn%20%5Cin%20%5Cmathbb%7BR%7D%5Ed%20%3A%20n%5E%5Cmathsf%7BT%7D%20n%3D1%5C%7D%7D%20%5CVert%20An%20%5CVert%20%5E2_2%20%20%5Ctag%7B4%7D%0A" alt=" \newcommand{\argmax}{\mathop{\rm arg~max}\limits} n^{\ast} = \argmax_{\{n \in \mathbb{R}^d : n^\mathsf{T} n=1\}} \Vert An \Vert ^2_2 \tag{4} "/></p> <p> この問題を解くためにラグランジュ未定乗数法を導入すると、 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20A%5E%5Cmathsf%7BT%7D%20A" alt=" A^\mathsf{T} A"/> の最大固有値に対応する固有ベクトルとして単位ベクトル <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20n" alt=" n"/> が求まることになります。</p> <h5 id="実験結果-2">実験・結果</h5> <p> 上記の手法によって得られた意味ベクトルを徐々に変化していった結果です。</p> <p><figure class="figure-image figure-image-fotolife" title="意味ベクトルによる出力画像の変化 (左:角度、右:形) - [5]より引用"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211223/20211223145424.gif" width="261" height="261" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211223/20211223145454.gif" width="261" height="261" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>意味ベクトルによる出力画像の変化 (左:角度、右:形) - [5]より引用</figcaption></figure></p> <p><a href="https://genforce.github.io/sefa/">プロジェクトのホームページ</a>ではデモの様子が見られます。</p> <h5 id="感想-2">感想</h5> <p> GAN生成器が必ず潜在ベクトルから画像としてアップサンプリングできる形にする際に全結合層を通すという部分への着目が非常に面白いと感じました。</p> <p> この手法の一つ残念に感じたところは、抽出した意味ベクトルがどんな「意味」を持つかが生成画像を見ない限りわからない点です。Vision &amp; Language系のモデルと融合させることで、抜き出された意味ベクトルに人が理解可能な名前を自動でつけたり、人が指定した言葉に近い意味ベクトルを探索したりできそうですね。</p> <h5 id="リンク-2">リンク</h5> <ul> <li><a href="https://genforce.github.io/sefa/">ホームページ (GitHub)</a></li> <li><a href="https://openaccess.thecvf.com/content/CVPR2021/html/Shen_Closed-Form_Factorization_of_Latent_Semantics_in_GANs_CVPR_2021_paper.html">概要 (CVPR 2021 open access)</a></li> <li><a href="https://arxiv.org/abs/2007.06600">論文 (arXiv.org)</a></li> <li><a href="https://github.com/genforce/sefa">ソースコード (GitHub)</a></li> </ul> <h3 id="おわりに">おわりに</h3> <p> 記事中では画像生成に関する論文を紹介しましたが、CVPR2021全体では3D系の論文が多い印象でした (実際に3Dコンピュータビジョンに関する論文は200以上ありました[6])。特に、2D画像から3Dを復元・生成する深層学習や、3D姿勢推定についての論文が多かったです。</p> <p> バーチャル開催についてですが、実際に参加してみて以下の点について良い点、残念な点を感じました。</p> <ul> <li>良い点 <ul> <li>発表会場に行く手間・時間が省ける。</li> <li>講演動画を後から見返せる。</li> <li>テキストチャットで質疑応答ができるため、チャットログが残る。</li> <li>要点よくまとめられたポスター資料でななめ読みが捗りそう。</li> </ul> </li> <li>残念な点 <ul> <li>会議の雰囲気を十分に味わえない。</li> <li>タイトルごとに部屋が用意されているため、発表者はセッション時間中 (2時間ほど) 質疑応答する羽目になる。ポスターセッションに近い。</li> <li>部屋が過疎りがち。そのため、参加者の建設的な意見交換が難しそう。また、他人が質問しているのを横から聞くことが中々できない。</li> <li>ビデオ会議のログが残らない。</li> <li>観光できない。</li> </ul> </li> </ul> <p> 聴講するにはバーチャルのほうがありがたいですが、発表するには現地で行いたいといった感じです。</p> <p> モルフォでは引き続き最新技術のキャッチアップを行い、価値ある製品の開発に取り組んで参ります。</p> <h3 id="参考文献">参考文献</h3> <ol> <li><a href="https://github.com/hoya012/CVPR-2021-Paper-Statistics">CVPR-2021 Paper-Statistics</a></li> <li>Yinbo Chen, Sifei Liu, Xiaolong Wang; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2021, pp. 8628-8638</li> <li><a href="https://yinboc.github.io/liif/">Learning Continuous Image Representation with Local Implicit Image Function - GitHub</a></li> <li>Kelvin C.K. Chan, Xintao Wang, Xiangyu Xu, Jinwei Gu, Chen Change Loy; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2021, pp. 14245-14254</li> <li><a href="https://genforce.github.io/sefa/">Closed-Form Factorization of Latent Semantics in GANs - GitHub</a></li> <li><a href="https://public.tableau.com/views/CVPR2021/Dashboard1?:language=en-US&amp;:display_count=n&amp;:origin=viz_share_link:showVizHome=no">CVPR 2021 public tableau gallery</a></li> </ol> morphotech インターンシップ 2021:エッジを用いた Inpainting hatenablog://entry/13574176438017830938 2021-11-30T10:00:00+09:00 2023-08-16T13:01:42+09:00 本記事は、2021年のインターンシップで勤務した高橋直暉さんによる寄稿です。 はじめまして。株式会社モルフォでインターンをしていた高橋です。私のインターンシップでは、画像生成タスクの一つであるImage Inpaintingに取り組みました。このタスクは、毎年新しい手法が提案されており、近年では深層学習を導入した手法が主流です。今回は、シンプルで軽量なエッジ情報を用いたImage Inpainting手法[1]の改良に取り組みました。この記事では、インターンシップを通して得られた成果を紹介していきたいと思います。 <p> 本記事は、2021年のインターンシップで勤務した高橋直暉さんによる寄稿です。</p> <hr /> <p>はじめまして。株式会社モルフォでインターンをしていた高橋です。私のインターンシップでは、画像生成タスクの一つであるImage Inpaintingに取り組みました。このタスクは、毎年新しい手法が提案されており、近年では深層学習を導入した手法が主流です。今回は、シンプルで軽量なエッジ情報を用いたImage Inpainting手法[<a href="https://arxiv.org/abs/1901.00212">1</a>]の改良に取り組みました。この記事では、インターンシップを通して得られた成果を紹介していきたいと思います。</p> <h3 id="Image-Inpaintingとは">Image Inpaintingとは</h3> <p>Image Inpainitngとは、図1のような白いマスク領域をもっともらしく埋め込むタスクです。この技術は、望まないオブジェクトの削除や欠損画像の復元を目的としたアプリケーションに利用されます。近年の手法では、マスク領域が大きくても多様な出力(multi-modal)や実写(photo-realistic)のような画像を生成します。さらに、漫画[<a href="https://www.cse.cuhk.edu.hk/~ttwong/papers/mangainpaint/mangainpaint.html">2</a>]、ユーザーガイド[<a href="https://arxiv.org/abs/1902.06838">3</a>]、動画[<a href="https://sites.google.com/view/sibozhang/dvi">4</a>]など多様なドメインにも応用されています。しかし、複雑な構造でマスク領域が大きい画像では、生成結果にアーティファクトやボヤけが現れます。よって、さらなる精度の向上が望まれるタスクとなっています。</p> <p><figure class="figure-image figure-image-fotolife" title="Image Inpaintingの使用例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161844.png" width="817" height="281" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1Inpaintingの使用例(スマホで撮影した画像を使用)</figcaption></figure></p> <h1 id="既存手法">既存手法</h1> <p>近年の画像生成タスクでは、深層学習を用いた手法が多く提案されています。Image Inpaintingでも、深層学習を用いることで学習データの分布からマスク領域内部を推測します。このタスクの課題は、画像全体の構造を保ちながら、詳細なテクスチャを生成することです。そのため、近年の手法では、構造を理解するネットワークと詳細なテクスチャを生成する複数ネットワークで構成されるend-to-endな手法が多いです。ここでは、本インターンシップでベースモデルとして使用した手法を説明したいと思います。</p> <h3 id="EdgeConnect-Generative-Image-Inpainting-with-Adversarial-Edge-Learning-CVPR2019-Nazari">EdgeConnect: Generative Image Inpainting with Adversarial Edge Learning [CVPR2019 Nazari+]</h3> <p>この手法は、図2のように2つのGANs(Generative Adversarial Network)ネットワーク[<a href="https://arxiv.org/abs/1406.2661">5</a>]から構成されます。一つ目のネットワーク<img src="https://chart.apis.google.com/chart?cht=tx&chl=G_1" alt="G_1"/>では、マスク化されたエッジ画像に対してInpaintingを行います。このネットワークでは、高周波成分であるエッジの学習に注力することで、画像全体の構造を保っています。2つ目のGANネットワーク<img src="https://chart.apis.google.com/chart?cht=tx&chl=G_2" alt="G_2"/>では、復元されたエッジ画像から最終的な画像を生成します。このネットワークで詳細なテクスチャの生成を試みています。このように、2つのネットワークを使用することで構造を保ったまま、詳細なテクスチャの生成を実現しています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="EdgeConnectのネットワーク全体図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001153913.png" width="1200" height="270" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2EdgeConnectのネットワーク全体図 - [1] Figure 2より引用</figcaption></figure></p></blockquote> <h1 id="提案手法">提案手法</h1> <p>既存手法では、マスクが大きい場合にエッジのInpaintingを失敗する傾向があり、最終的な出力画像はボヤけたりアーティファクトが目立ちました。そこで、本インターンシップでは、1つ目のエッジInpaintingの改良に取り組みました。ここでは、インターンシップ中に提案した手法をいくつか説明します。</p> <h3 id="エッジマップの検討">エッジマップの検討</h3> <p>既存手法では、1つ目のネットワークでCannyエッジをInpaintingすることで画像の構造を保持しています。しかし、図3(b) のCannyエッジでは、顎や目 のエッジが抽出できていないことが確認されます。そこで、私はDoG(Difference of Gaussians)とXDoG(eXtended Difference of Gaussians)[<a href="https://www.sciencedirect.com/science/article/pii/S009784931200043X">6</a>]を使用しました。DoGは、カーネルサイズが異なるフィルタで差分を取ることで、ノイズに強いエッジ抽出を可能としています。XDoGでは、DoGにシャープ化と閾値処理をかけることでインクイラストのような画像を生成します。下図 (c, d) の例では、Cannyでは抽出できなかった顎や目のエッジがDoGとXDoGでは抽出できていることが確認できます。また、XDoGでは閾値により減色化された連続的な値を持っているため、影の抽出もできていることが確認できます。</p> <p><figure class="figure-image figure-image-fotolife" title="エッジマップの比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161812.png" width="1135" height="345" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3エッジマップの比較(公開可能なFFHQ[<a href="https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html">7</a>]の画像を使用)</figcaption></figure></p> <h3 id="ガンマ補正の検討">ガンマ補正の検討</h3> <p>今回の実験で使用するParis street view[<a href="https://arxiv.org/abs/1604.07379">8</a>]では、コントラストの低い画像が多く含まれています。そのため、図4(a)のようなコントラストの低い画像では、DoGのエッジ抽出がうまく働かないことがあります。そこで、エッジ抽出時にガンマ補正を掛けることで、低コントラスト画像でもエッジが抽出できるようにしました。図4(b, c)より、ガンマ補正によってDoGのエッジ抽出が改善され、XDoG (d, e)でも変化が確認できます。</p> <p><figure class="figure-image figure-image-fotolife" title="ガンマ補正"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161828.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4ガンマ補正(スマホで撮影した画像を使用)</figcaption></figure></p> <h3 id="ロスの検討">ロスの検討</h3> <p>マスクが大きい場合、Inpaintingされたエッジでは鱗模様やボヤけが生成されます。これを改善するためにBinarization lossとTotal variation lossを追加しました。Binarization lossは、0か1の画素値を高く評価する損失関数であり、エッジ付近の学習を効率化させます。Total variation lossは、スタイル変換[<a href="https://arxiv.org/abs/1412.0035">9</a>]などで使用されている画像の滑らかさを評価する損失関数です。以上の2つの損失関数を既存手法に加えてモデルを学習させました。</p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0AL_%7Bbi%7D%3D%5Csum%7B%5CArrowvert%20%7CI_%7Bout%7D%20-%200.5%7C%20-%200.5%20%5CArrowvert_2%7D%0A" alt=" L_{bi}=\sum{\Arrowvert |I_{out} - 0.5| - 0.5 \Arrowvert_2} "/></div> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0AL_%7Btv%7D%3D%5Csum_%7B%28i%2Cj%29%5Cin%20R%2C%28i%2Cj%2B1%29%5Cin%20R%7D%7B%5Cfrac%7B%5CArrowvert%20I%5E%7Bi%2Cj%2B1%7D_%7Bout%7D%20-%20I%5E%7Bi%2Cj%7D_%7Bout%7D%20%5CArrowvert_1%7D%7BN%7D%7D%20%2B%20%5Csum_%7B%28i%2Cj%29%5Cin%20R%2C%28i%2B1%2Cj%29%5Cin%20R%7D%7B%5Cfrac%7B%5CArrowvert%20I%5E%7Bi%2B1%2Cj%7D_%7Bout%7D%20-%20I%5E%7Bi%2Cj%7D_%7Bout%7D%20%5CArrowvert_1%7D%7BN%7D%7D%0A" alt=" L_{tv}=\sum_{(i,j)\in R,(i,j+1)\in R}{\frac{\Arrowvert I^{i,j+1}_{out} - I^{i,j}_{out} \Arrowvert_1}{N}} + \sum_{(i,j)\in R,(i+1,j)\in R}{\frac{\Arrowvert I^{i+1,j}_{out} - I^{i,j}_{out} \Arrowvert_1}{N}} "/></div> <h1 id="実験">実験</h1> <p>実験では、CelebA[<a href="https://arxiv.org/abs/1411.7766">10</a>]とParis street view[<a href="https://arxiv.org/abs/1604.07379">8</a>]のデータセットを用いてモデルを学習させました。CelebAは、著名人の顔画像を集めたデータセットです。Paris street viewは、Google Street Viewから取得したパリの街並みを集めたデータセットです。それぞれからランダムに取得した1万枚の画像を40エポックで学習させました。<br> 精度評価では、PSNR、SSIM、FID、LPIPSの4つを用いました。PSNRは、画素値の変化を評価する古典的な評価手法の一つですが、一つの画素値が大きく異なるだけで全体の評価が悪く判定されます。そのため、ウィンドウごとに画素値やコントラストを評価するSSIMも使用しています。また、近年の深層学習の発展に伴い、深層学習の大規模ネットワークを用いた評価手法であるFIDとSSIMも使用しています。FIDではInceptionモデルの中間ベクトルから画像集合の分布間距離によって評価され、LPIPSではImageNetの中間特徴量から画像間の視覚的類似度を評価します。<br> 本セクションでは、モデルの出力画像と評価結果を元に、提案手法の有効性を検証していきたいと思います。</p> <h3 id="エッジの推定精度の比較">エッジの推定精度の比較</h3> <h4 id="人物の顔画像">人物の顔画像</h4> <p>表1は、各エッジを用いて生成した結果の評価値を示しています。ここで、青色は最も悪い結果を示し、赤色は最も良い結果を示しています。表より、全てのマスクサイズにおいて、提案手法のDoGとXDoGが既存手法のCannyを上回っていることが確認できます。</p> <p><figure class="figure-image figure-image-fotolife" title="各エッジマップの精度(CelebA)"><figcaption>表1各エッジマップの精度(CelebA)</figcaption><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001154008.png" width="981" height="238" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>図5のグラフは、マスクサイズにおけるFIDとLPIPSの変化を示しています。図より、マスクサイズが大きくなると、XDoGと他のエッジの精度差が広がっていることが確認できます。これは、XDoGでは中間特徴の類似性が優れていることを示しているため、画像の構造保持として、より機能していると考えられます。</p> <p><figure class="figure-image figure-image-fotolife" title="大規模ネットワークを用いた評価手法の精度変化"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001153940.png" width="1200" height="721" loading="lazy" title="" class="hatena-fotolife" style="width:330px" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001153949.png" width="1200" height="721" loading="lazy" title="" class="hatena-fotolife" style="width:330px" itemprop="image"></span><figcaption>図5大規模ネットワークを用いた評価手法の精度変化</figcaption></figure></p> <p>図6は各エッジマップにおけるマスクサイズが30-50%の生成結果を示しています。既存手法のCannyでは、目の崩れが確認されます が、DoGとXDoGではエッジが効いた画像が生成されています。また、マスクサイズが50%の時は、CannyとDoGでは顔の輪郭が崩れていますが、 XDoGでは保たれています。</p> <p><figure class="figure-image figure-image-fotolife" title="各エッジマップにおける結果画像(CelebA)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161900.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図6各エッジマップにおける結果画像(公開可能なFFHQ[<a href="https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html">7</a>]の画像を使用)</figcaption></figure></p> <h4 id="風景画像">風景画像</h4> <p>表2の結果より、XDoGが最も優れたエッジマップであることが確認できます。ただし、データセットの性質上、CelebAに比べて全体的に精度が悪いことが確認されます。これは画像対象物が多様で複雑であることが要因として考えられます。</p> <p><figure class="figure-image figure-image-fotolife" title="各エッジマップの精度(Paris Street View)"><figcaption>表2各エッジマップの精度(Paris street view)</figcaption><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001154014.png" width="977" height="238" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>図7は、マスクサイズが10-30%の生成結果を示しています。他のエッジマップに比べてXDoGでは、エッジ がよりはっきりと生成されていることが確認されます。</p> <p><figure class="figure-image figure-image-fotolife" title="各エッジマップにおける結果画像(Paris Street View)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161852.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図7各エッジマップにおける結果画像(スマホで撮影した画像を使用)</figcaption></figure></p> <p>以上より、複数のデータセットにおいて、XDoGを使うことで精度の向上を確認できました。</p> <h3 id="ガンマ補正の検証">ガンマ補正の検証</h3> <p>表3は、ガンマ補正有無のDoGとXDoGの精度結果を示しています。ここで、表の赤文字は勝っている結果を示しています。表3より、DoGにはガンマ補正が有効に作用し、XDoGには逆効果だったと確認できます。これは、ガンマ補正によってDoGのエッジ抽出が明らかに向上していましたが、XDoGのエッジ抽出は元から機能していたため良い影響を与えなかったと考えられます。</p> <p><figure class="figure-image figure-image-fotolife" title="ガンマ補正の精度評価(Paris Street View)"><figcaption>表3ガンマ補正の精度評価(Paris street view)</figcaption><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001154002.png" width="1200" height="222" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>図8は、ガンマ補正有無のDoGを用いた結果です。通常のDoGでは建物や窓のエッジが抽出できず復元結果がボヤけていますが、ガンマ補正をかけることでエッジが効いてマスク跡が目立たない画像が生成できています。</p> <p><figure class="figure-image figure-image-fotolife" title="ガンマ補正の結果画像(左から入力画像、マスク化画像、DoG、ガンマ補正DoG)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211116/20211116161837.png" width="1200" height="315" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図8ガンマ補正の結果画像(スマホで撮影した画像を使用)</figcaption></figure></p> <h3 id="ロスの追加">ロスの追加</h3> <p>表4は、XDoGを用いた既存手法(Vanila)に、Binarization Loss(+Bi)、Total Variation Loss(+TV)、その両方(+TV+Bi)を加えた4手法を比較しています。ここで、表の赤文字は最も良い結果を示しています。表より、精度差は少なく、精度の向上は確認できませんでした。学習曲線が収束していなかったので、学習時に損失関数がうまく働かなかったと考えられます。</p> <p><figure class="figure-image figure-image-fotolife" title="ロス追加による精度評価"><figcaption>表4ロス追加による精度評価</figcaption><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211001/20211001154005.png" width="1200" height="227" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>以上より、上手く行った手法と上手くいかなかった手法がありました。今後は、ヒストグラム平滑化によるコントラスト補正やロスの重みを変えて精度が向上するか確認してみたいと思います。</p> <h1 id="デモ動画">デモ動画</h1> <p><a href="https://github.com/Kohey1480/inpaint-app">GitHub - Kohey1480/inpaint-app</a>を参考にデモ用アプリケーション上で実験を行いました。選択タブでエッジの種類とデータセットを選択できるようになっています。動画の前半は、FFHQ[<a href="https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html">7</a>]の画像とXDoGを用いて、目のInpaintingをしています。後半部分は、スマホで撮影した写真の一部をマスクしています。</p> <iframe src="https://drive.google.com/file/d/1xbkKVQgxmbrJbHzSNhsRMk7B4dHaqnHm/preview" width="640" height="480" allow="autoplay"></iframe> <p>続いてのデモ動画では、街の風景をスマホで撮影した画像を用いています。マスク境界付近にボヤけが確認されますが、オブジェクトの削除に成功しています。このモデルは少ない画像枚数で学習されたため、ImageNetなどの大規模データセットで事前学習をすることで精度の向上が期待できます。</p> <iframe src="https://drive.google.com/file/d/1IjzaSbjFoGJA3tRLjRG0zvRo5NqkET-v/preview" width="640" height="480" allow="autoplay"></iframe> <h1 id="感想">感想</h1> <p>今回のインターンシップは、東京で緊急事態宣言が発令されたため、大部分をオンライン上で行いました。幸運なことに1週目は出社が出来たので、メンター以外の社員さんと交流して、モルフォでの働き方の話を聞くことができました。また、社内の報告会や勉強会にも参加させて頂けたので、具体的な事業内容や最新の論文などを知れて勉強になりました。最初は成果が出るか不安でしたが、メンターの献身的なサポートのおかげで既存手法よりも精度が向上したので、非常に充実したインターンが送れたと思います。 最後に、本インターンを行うにあたって、研究のアドバイスやオンラインの環境構築をしてくださった株式会社モルフォの社員さんに感謝申し上げます。</p> <h1 id="参考文献">参考文献</h1> <p>[1] <a href="https://arxiv.org/abs/1901.00212">Nazeri, Kamyar and Ng, Eric and Joseph, Tony and Qureshi, Faisal Z and Ebrahimi, Mehran. EdgeConnect: Structure Guided Image Inpainting using Edge Prediction. ICCV2019</a> <br> [2] <a href="https://www.cse.cuhk.edu.hk/~ttwong/papers/mangainpaint/mangainpaint.html">Minshan Xie and Menghan Xia and Xueting Liu and Chengze Li and Tien-Tsin Wong. Seamless Manga Inpainting with Semantics Awareness. SIGGRAPH 2021</a><br> [3] <a href="https://arxiv.org/abs/1902.06838">Jo, Youngjoo and Park, Jongyoul. SC-FEGAN: Face Editing Generative Adversarial Network With User's Sketch and Color. ICCV2019</a> <br> [4] <a href="https://sites.google.com/view/sibozhang/dvi">Liao, Miao and Lu, Feixiang and Zhou, Dingfu and Zhang, Sibo and Li, Wei and Yang, Ruigang. DVI: Depth Guided Video Inpainting for Autonomous Driving. ECCV2020</a> <br> [5] <a href="https://arxiv.org/abs/1406.2661">Goodfellow, Ian and Pouget-Abadie, Jean and Mirza, Mehdi and Xu, Bing and Warde-Farley, David and Ozair, Sherjil and Courville, Aaron and Bengio, Yoshua, Generative adversarial nets. In Advances in neural information processing systems. 2014</a> <br> [6] <a href="https://www.sciencedirect.com/science/article/pii/S009784931200043X">Winnemöller, Holger and Kyprianidis, Jan Eric and Olsen, Sven C. Xdog: an extended difference-of-gaussians compendium including advanced image stylization. Computers &amp; Graphics, 36(6). 740--753. 2012</a> <br> [7] <a href="https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html">Karras, Tero, Samuli Laine, and Timo Aila. A style-based generator architecture for generative adversarial networks. CVPR2019</a> <br> [8] <a href="https://arxiv.org/abs/1604.07379">Pathak, Deepak and Krahenbuhl, Philipp and Donahue, Jeff and Darrell, Trevor and Efros, Alexei. Context Encoders: Feature Learning by Inpainting. CVPR2016</a> <br> [9] <a href="https://arxiv.org/abs/1412.0035">Mahendran, Aravindh and Vedaldi, Andrea. Understanding deep image representations by inverting them. CVPR2015</a> <br> [10] <a href="https://arxiv.org/abs/1411.7766">Liu, Ziwei and Luo, Ping and Wang, Xiaogang and Tang, Xiaoou. Deep Learning Face Attributes in the Wild. ICCV2015</a> <br></p> morphotech ICML 2021 参加報告 hatenablog://entry/26006613804241501 2021-11-05T10:01:27+09:00 2023-08-16T13:02:07+09:00 こんにちは、CTO室リサーチャーの長山と申します。 モルフォでは最先端の画像処理・機械学習に関する研究のキャッチアップのため、国内外問わず毎年各種学会に技術系の社員を派遣しています。今回は機械学習の国際会議「International Conference on Machine Learning 2021(ICML 2021)」に長山と、同じくCTO室リサーチャーの鈴木・中川で参加しました。本投稿では、はじめに学会の概要について説明し、次に私が注目した論文3本を紹介します。 <p>こんにちは、CTO室リサーチャーの長山と申します。</p> <p>モルフォでは最先端の画像処理・機械学習に関する研究のキャッチアップのため、国内外問わず毎年各種学会に技術系の社員を派遣しています。今回は機械学習の国際会議「International Conference on Machine Learning 2021(ICML 2021)」に長山と、同じくCTO室リサーチャーの鈴木・中川で参加しました。本投稿では、はじめに学会の概要について説明し、次に私が注目した論文3本を紹介します。</p> <h1 id="ICML-2021-概要">ICML 2021 概要</h1> <p>ICML(International Conference on Machine Learning)は機械学習に関する総合的な国際会議であり、トップカンファレンスの一つとして認知されています。毎年7月頃に開催され、世界各国の研究機関や企業から、学術研究者やエンジニア、起業家などの様々なバックグラウンドを持つ参加者が一堂に会し、機械学習のあらゆる側面における最先端の研究成果を発表しています。第38回となる今年度はオーストリアのウィーンで開催予定でしたが、世界的なCOVID-19の流行の影響により完全バーチャル開催となりました。</p> <h2 id="統計">統計</h2> <p>投稿論文数5,513本に対して採択論文数は1,184本(うちLong talks 166本、Short talks 1,018本)、採択率は21.5%でした。直近5年の投稿論文数は年1,000本程度のハイペースで増加しており、今後もこの傾向は続くものと思われます。また、採択率は例年通りの2割程度の狭き門で、やや低下傾向にあるものの大きな変化はありません。 <figure class="figure-image figure-image-fotolife" title="採択率の推移"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014111553.png" width="600" height="371" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1. 投稿論文数/採択率の推移。'16年度の投稿論文数はデータなし。統計データの引用: [1]</figcaption></figure></p> <h2 id="プログラム">プログラム</h2> <p>今年度は2021/7/18(日)から7/24(土)の7日間<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>で開催され、以下のようなスケジュールでした。</p> <ul> <li>7/18: Expo day</li> <li>7/19: Tutorial</li> <li>7/20-7/22: Main Conference and Invited Talks</li> <li>7/23-7/24: Workshop</li> </ul> <p>「Main Conference」は、採択論文の各著者が研究内容をの発表を行うプログラムです。発表形式は大きくオーラルとポスターに分かれていて、重要度の高い論文が主にオーラルとして発表されています。今年度のオーラルはLong talksとShort talksの二種類があり、Long talkではプレゼン+質疑応答の計20分、Short talkはプレゼンのみで計5分の発表スケジュールでした。ポスターセッションはオンラインビデオ通話サービス「<a href="https://www.gather.town/">Gather.Town</a>」を用いて、レトロRPG風の仮想空間上で質疑応答を行う仕組みとなっていました。</p> <h1 id="論文紹介">論文紹介</h1> <h2 id="Globally-Robust-Neural-Networks">Globally-Robust Neural Networks</h2> <p>Authors: Klas Leino, Zifan Wang, Matt Fredrikson</p> <ul> <li><a href="https://proceedings.mlr.press/v139/leino21a.html">paper (PMLR)</a></li> <li><a href="https://github.com/klasleino/gloro">project (GitHub)</a></li> </ul> <p>はじめに、敵対的摂動に対してロバストなクラス分類器の設計手法に関する論文を紹介します。</p> <p>近年の高性能なクラス分類モデルは深層ニューラルネットワーク(DNN)ベースの手法が主流で、優秀な人間が分類したときの精度を超えていると言われています。しかしながら、正解データに加えることで分類モデルを"騙す"ような微小なノイズ(図2.)の存在が知られていて、敵対的摂動(adversarial perturbation)と呼ばれています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="敵対的摂動の実例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014113807.png" width="810" height="311" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2. 敵対的摂動の実例、GoogLeNet[2]によるImageNetデータセットの分類結果。"パンダ"クラスに分類される画像(左)に敵対的摂動(中央)を加え"テナガザル"への誤分類を引き起こす(右)。引用: [3]</figcaption></figure></p></blockquote> <p>このような敵対的摂動の存在は、自動運転や顔認証システムなどで悪用されると脅威をもたらすおそれがあります。そのため、敵対的摂動を加えられても誤分類を起こしにくい(=<strong>ロバスト性</strong>を持つ)モデルが求められていますが、既存のDNNベースのロバスト分類手法は小さいモデルでも学習時間およびメモリのコストが高い問題があります。</p> <p>本論文では、既存のクラス分類モデルに組み込むことで<strong>大域的ロバスト性</strong>を保証可能にする手法(<strong>GloRo Nets</strong>)を提案しています。少し不正確な表現になりますが、クラス分類問題における大域的ロバスト性とは有限な幅の決定境界を持つ性質です(図3. 左)。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="大域的ロバスト性と⊥クラスのロジット"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014114056.png" width="705" height="423" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014114227.png" width="711" height="377" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>図3.(左)大域的ロバスト性、(右)⊥クラスのロジット。引用: [4]</figcaption></figure></p></blockquote> <p>本手法の基本的なアイディアはとても単純で、ベースとなるモデルに「ロバスト性の悪さ」を表すクラス(⊥)を新しく追加して学習を行います。このときのモデルをGloRo Netと呼びます。GloRo Netの⊥クラスのロジット出力<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20y_%7B%5Cperp%7D%20" alt=" y_{\perp} "/>は、定数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon%20" alt=" \epsilon "/>と各クラスのロジット出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7By_i%7D" alt=" {y_i}"/>とリプシッツ定数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%7BK_i%7D%20" alt=" {K_i} "/>を用いて</p> <div align='center' class='scroll'> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%0A%20%20%20%20y_%7B%5Cperp%7D%20%3D%20%5Cmax_%7Bi%5Cneq%20j%7D%5Cleft%5C%7By_i%2B%20%28K_i%2BK_j%29%5Cepsilon%5Cright%5C%7D%0A" alt=" \displaystyle y_{\perp} = \max_{i\neq j}\left\{y_i+ (K_i+K_j)\epsilon\right\} "/> </div> <p>と定めます。直感的には、入力点を少しだけ(距離 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon" alt=" \epsilon"/>)動かしたときに取りうる競合クラスの相対的な最大ロジットを表します(図3. 右)。訓練ステップでは、ベースモデルのロジットに⊥クラスを加えたベクトルのソフトマックス出力と、教師データの one-hot ベクトル表現との損失関数を用いてモデルの重みを更新します。このように定めたGloRo Netは大域的ロバスト性が保証されます。そしてクラス分類結果は、⊥クラスに分類される場合を除き、元の分類モデルと同じ結果を返します。</p> <p>著者らは摂動を加えたデータセット(MNIST/CIFAR-10/Tiny-ImageNet)で画像分類実験を行い、既存のロバスト分類手法と同等以上の精度(VRA<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>)を達成することを確認しました。また、べき乗法による効率的なリプシッツ定数の上界推定アルゴリズムを用いることで、既存手法と比べて非常に高速かつ低メモリ使用量の学習を実現しました。</p> <h2 id="Understanding-Self-Supervised-Learning-Dynamics-without-Contrastive-Pairs">Understanding Self-Supervised Learning Dynamics without Contrastive Pairs</h2> <p>Authors: Yuandong Tian, Xinlei Chen, Surya Ganguli</p> <ul> <li><a href="https://proceedings.mlr.press/v139/tian21a.html">paper (PMLR)</a></li> <li><a href="https://github.com/facebookresearch/luckmatters/tree/master/ssl">project (GitHub)</a></li> </ul> <p>次に、最優秀論文選外佳作(outstanding paper honorable mention)の一つを紹介します。</p> <p>負例を必要としない自己教師あり学習(Self-Supervised Learning; SSL)において表現の崩壊<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup>が発生しない理由を理論的に解析した論文です。SSLとは、訓練データ自身から教師を作り出すような学習手法であり、代表的な手法として対照学習(Contrastive Learning; CL)が知られています。典型的なCLでは元となる訓練データ(=アンカー)から正例と負例を作り出し、正例には近づけ負例からは遠ざけるようにアンカーの表現を学習します。一方で、近年では負例を使わずに正例のペアだけを使って表現を獲得する手法が提案されていて、非対照学習(Non-Contrastive Learning; NCL)と呼ばれています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="非対照学習"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014114620.png" width="1200" height="435" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4. 非対照学習のモデル図。引用: [5]</figcaption></figure></p></blockquote> <p>本論文では、図4. で示されるような<em>Online</em>・<em>Target</em>・<em>Predictor</em>の3つのコンポーネントからなる非対称な双子ネットワーク<sup id="fnref:5"><a href="#fn:5" rel="footnote">5</a></sup>のNCLモデル(BYOL[6]/SimSiam[7])を対象として解析を行いました。<em>Online</em>と<em>Target</em>は異なる重みを持つ同一アーキテクチャの表現エンコーダであり、<em>Predictor</em>は<em>Online</em>から<em>Target</em>へ表現の変換を行います。訓練ステップでは、1枚の入力画像からサンプルした2枚のデータ拡張画像をそれぞれのネットワークに渡し、<em>Predictor</em>の出力を<em>Target</em>に近づけるように<em>Predictor</em>と<em>Online</em>を更新します。<em>Target</em>については、出力にstop gradientを挿入し重みの更新を行いません。</p> <p>著者らは問題設定の単純化のために、各コンポーネントはバイアス項のない線形モデルの条件で解析を行いました。この設定の上で、各コンポーネントの固有値に関する勾配流<sup id="fnref:6"><a href="#fn:6" rel="footnote">6</a></sup>を考えることで以下の事実を示しました。</p> <ul> <li>stop gradientを使わない場合、<em>Online</em>の固有値は0に収束 → <strong>学習は確実に失敗する</strong></li> <li>あるしきい値が存在し、学習率がしきい値以下ならば<em>Online</em>と<em>Predictor</em>の固有値はそれぞれ非0の値に収束 → <strong>表現の崩壊は発生しない</strong></li> </ul> <p>また、著者らはこれらの議論をもとに、<em>Online</em>の重みから直接<em>Predictor</em>を更新するアルゴリズム(<strong>DirectPred</strong>)を提案しました。画像クラス分類タスク(STL-10/CIFAR-10、ImageNet)で実験を行い、確率的勾配降下法(SGD)で学習する従来手法より高い精度を達成したことを示しました。</p> <h2 id="Unbiased-Gradient-Estimation-in-Unrolled-Computation-Graphs-with-Persistent-Evolution-Strategies">Unbiased Gradient Estimation in Unrolled Computation Graphs with Persistent Evolution Strategies</h2> <p>Authors: Paul Vicol, Luke Metz, Jascha Sohl-Dickstein</p> <ul> <li><a href="https://proceedings.mlr.press/v139/vicol21a.html">paper (PMLR)</a></li> </ul> <p>最後に最優秀論文(outstanding paper)を紹介いたします。</p> <p>再帰型ニューラルネットワーク(RNN)やハイパーパラメータ探索などのアルゴリズムは、一般にループ構造を持つ計算グラフとしてモデル化できます。これらのモデルのパラメータ最適化タスクにおいて誤差逆伝播法を用いると、勾配消失・爆発などの問題を生じやすいことが知られています。進化戦略(Evolution Strategy; ES)は有限差分法に基づく確率論的な勾配推定を用いた最適化手法であり、このような計算グラフのケースでもうまく動作する一方で、ループ展開した計算グラフの全系列を用いるので計算コストが高い欠点があります。本論文では、計算グラフの短く打ち切った部分系列から勾配を高精度で推定し、パラメータ更新を高速化した最適化アルゴリズムを提案しています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="ループ展開された計算グラフ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20211014/20211014130843.png" width="1200" height="282" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図5. ループ展開された計算グラフのモデル図。引用: [8]</figcaption></figure></p></blockquote> <p>ループ展開した計算グラフのモデル図を図5.に示します。パラメータを <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Ctheta%7D%20" alt=" \boldsymbol{\theta} "/>、時刻 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20t" alt=" t"/> における状態を <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7Bs%7D_%7Bt%7D%20" alt=" \boldsymbol{s}_{t} "/>、パラメータ最適化の目的関数を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20L_%7Bt%7D%28%5Cboldsymbol%7Bs%7D_%7Bt%7D%3B%20%5Cboldsymbol%7B%5Ctheta%7D%29%20" alt=" L_{t}(\boldsymbol{s}_{t}; \boldsymbol{\theta}) "/> で表しています。既存手法の ES アルゴリズムでは目的関数の勾配を、正規分布に従うランダム変数 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Cepsilon%7D%5E%7B%28i%29%7D%20%5Csim%20N%280%2C%20%5Csigma%5E2%20%5Cboldsymbol%7BI%7D%29" alt=" \boldsymbol{\epsilon}^{(i)} \sim N(0, \sigma^2 \boldsymbol{I})"/> を用いた有限差分近似</p> <div align='center' class='scroll'> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%0A%20%20%20%20%20%5Chat%7B%5Cboldsymbol%7Bg%7D%7D%5E%7B%5Cmathrm%7BES%7D%7D%20%3D%20%5Cfrac%7B1%7D%7B%5Csigma%5E2%20N%7D%20%5Csum_%7Bi%3D1%7D%5EN%20%5Cboldsymbol%7B%5Cepsilon%7D%5E%7B%28i%29%7DL%28%5Cboldsymbol%7B%5Ctheta%7D%20%2B%20%5Cboldsymbol%7B%5Cepsilon%7D%5E%7B%28i%29%7D%29%0A" alt=" \displaystyle \hat{\boldsymbol{g}}^{\mathrm{ES}} = \frac{1}{\sigma^2 N} \sum_{i=1}^N \boldsymbol{\epsilon}^{(i)}L(\boldsymbol{\theta} + \boldsymbol{\epsilon}^{(i)}) "/> </div> <p>によって推定します。ES アルゴリズムは勾配が陽に計算できないブラックボックス関数に対しても適用可能な利点がありますが、計算グラフの全系列を使用するため高い計算コストがかかります。途中で打ち切った計算グラフを用いると計算コストは削減できますが、推定量に無視のできないバイアスが残ることが知られています。</p> <p>本論文で提案された<strong>持続的進化戦略(Persistent Evolution Strategy; PES)</strong>アルゴリズムでは、パラメータ <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Ctheta%7D" alt=" \boldsymbol{\theta}"/> に加えるランダム変数 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Cepsilon%7D" alt=" \boldsymbol{\epsilon}"/> を時刻 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20t" alt=" t"/> ごとに独立化した勾配推定量</p> <div align='center' class='scroll'> <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%0A%20%20%20%20%5Chat%7B%5Cboldsymbol%7Bg%7D%7D%5E%7B%5Cmathrm%7BPES%7D%7D%20%3D%20%5Cfrac%7B1%7D%7B%5Csigma%5E2%20N%7D%5Csum_%7Bi%3D1%7D%5EN%5Csum_%7Bt%3D1%7D%5ET%5Cboldsymbol%7B%5Cxi%7D_%7Bt%7D%5E%7B%28i%29%7DL_%7Bt%7D%28%5Cboldsymbol%7B%5Ctheta%7D_1%20%2B%20%5Cboldsymbol%7B%5Cepsilon%7D_%7B1%7D%5E%7B%28i%29%7D%2C%5Cldots%2C%5Cboldsymbol%7B%5Ctheta%7D_t%20%2B%20%5Cboldsymbol%7B%5Cepsilon%7D_%7Bt%7D%5E%7B%28i%29%7D%29%0A" alt=" \displaystyle \hat{\boldsymbol{g}}^{\mathrm{PES}} = \frac{1}{\sigma^2 N}\sum_{i=1}^N\sum_{t=1}^T\boldsymbol{\xi}_{t}^{(i)}L_{t}(\boldsymbol{\theta}_1 + \boldsymbol{\epsilon}_{1}^{(i)},\ldots,\boldsymbol{\theta}_t + \boldsymbol{\epsilon}_{t}^{(i)}) "/> </div> <p>によって最適化を行うようにESを改良しました<sup id="fnref:7"><a href="#fn:7" rel="footnote">7</a></sup>。ここで、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Cxi%7D_t%20%20%3D%20%5Csum_%7Bt%3D1%7D%5ET%20%5Cboldsymbol%7B%5Cepsilon%7D_t%20" alt=" \boldsymbol{\xi}_t = \sum_{t=1}^T \boldsymbol{\epsilon}_t "/>はランダム変数の累積値です。推定量 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Chat%7B%5Cboldsymbol%7Bg%7D%7D%5E%7B%5Cmathrm%7BPES%7D%7D" alt=" \hat{\boldsymbol{g}}^{\mathrm{PES}}"/> は、打ち切った計算グラフを使った場合でも勾配 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cnabla_%7B%5Cboldsymbol%7B%5Ctheta%7D%7D%20L%28%5Cboldsymbol%7B%5Ctheta%7D%29" alt=" \nabla_{\boldsymbol{\theta}} L(\boldsymbol{\theta})"/>の不偏推定量となることが示されています(詳細は論文をご覧ください)。</p> <p>著者らはいくつかのシナリオで実験を行い本手法の有効性を示しました。そのうちの一つが多層パーセプトロン(MLP)を用いた MNIST 分類器のハイパーパラメータ最適化です。このシナリオでは、打ち切った計算グラフを用いて4層MLPの学習率のメタ学習<sup id="fnref:8"><a href="#fn:8" rel="footnote">8</a></sup> とハイパーパラメータチューニングを同時に行い、PESは既存手法(ES)より良いメタ損失に収束することを示しています。</p> <h2 id="全体の感想">全体の感想</h2> <p>昨今の機械学習のトレンドを学ぶ上でとても役立つ貴重な機会となりました。バーチャル開催の国際会議への参加は今回が初めてでしたが、オーラルセッションを好きなタイミングで見返すことができるシステムは便利だと感じました。</p> <h2 id="参考文献">参考文献</h2> <p>[1] <em>Statistics of acceptance rate for the main AI conferences</em>, <a href="https://github.com/lixin4ever/Conference-Acceptance-Rate">https://github.com/lixin4ever/Conference-Acceptance-Rate</a></p> <p>[2] C. Szegedy, W. Liu, Y. Jia, and P. Sermanet, "Going deeper with convolutions," in IEEE conference on computer vision and pattern recognition (CVPR), 2015, [Online]. Available: <a href="https://www.cv-foundation.org/openaccess/content_cvpr_2015/html/Szegedy_Going_Deeper_With_2015_CVPR_paper.html">https://www.cv-foundation.org/openaccess/content_cvpr_2015/html/Szegedy_Going_Deeper_With_2015_CVPR_paper.html</a></p> <p>[3] I. J. Goodfellow, J. Shlens, and C. Szegedy, “Explaining and harnessing adversarial examples,” in International Conference on Learning Representations (ICLR), 2015, [Online]. Available: <a href="https://arxiv.org/abs/1412.6572">https://arxiv.org/abs/1412.6572</a></p> <p>[4] K. Leino, Z. Wang, and M. Fredrikson, "Globally-Robust Neural Networks," in International Conference on Machine Learning (ICML), 2021, pp. 6212–6222 [Online]. Available: <a href="https://proceedings.mlr.press/v139/leino21a.html">https://proceedings.mlr.press/v139/leino21a.html</a></p> <p>[5] Y. Tian, X. Chen, and S. Ganguli, “[Presentation] Understanding self-supervised learning dynamics without contrastive pairs,” in International Conference on Machine Learning (ICML), 2021, [Online]. Available: <a href="https://icml.cc/media/icml-2021/Slides/10403.pdf">https://icml.cc/media/icml-2021/Slides/10403.pdf</a></p> <p>[6] J.-B. Grill, F. Strub, F. Altché, C. Tallec, P. H. Richemond, E. Buchatskaya, C. Doersch, B. A. Pires, Z. D. Guo, M. G. Azar, B. Piot, K. Kavukcuoglu, R. Munos, and M. Valko, "Bootstrap your own latent: A new approach to self-supervised Learning," in 34th Conference on Neural Information Processing Systems (NeurIPS 2020), 2020, [Online]. Available: <a href="https://arxiv.org/abs/2006.07733">https://arxiv.org/abs/2006.07733</a></p> <p>[7] X. Chen, and K. He, "Exploring Simple Siamese Representation Learning," in IEEE conference on computer vision and pattern recognition (CVPR), 2021, [Online]. Available: <a href="https://arxiv.org/abs/2011.10566">https://arxiv.org/abs/2011.10566</a></p> <p>[8] P. Vicol, L. Metz, and J. Sohl-Dickstein, “Unbiased Gradient Estimation in Unrolled Computation Graphs with Persistent Evolution Strategies,” in International Conference on Machine Learning (ICML), 2021, pp. 10553–10563 [Online]. Available: <a href="http://proceedings.mlr.press/v139/vicol21a.html">http://proceedings.mlr.press/v139/vicol21a.html</a></p> <div class="footnotes"> <hr/> <ol> <li id="fn:1"> 米国太平洋標準時(PST)を基準とした場合。日本標準時(JST)では7/18(日)の夜から7/25(日)の朝にかけての時間帯となります。<a href="#fnref:1" rev="footnote">&#8617;</a></li> <li id="fn:2"> 出力層の活性化関数(ロジスティック関数やソフトマックスなど)の直前における値。<a href="#fnref:2" rev="footnote">&#8617;</a></li> <li id="fn:3"> Verified-Robust Accuracy。 ロバスト(<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Capprox%20y_%7B%5Cperp%7D" alt=" \approx y_{\perp}"/>が小さい)かつ正しく分類されたデータの割合。<a href="#fnref:3" rev="footnote">&#8617;</a></li> <li id="fn:4"> 入力画像の種類に関わらず、常に似通った表現を推論するような"退化"したモデルの状態を表します。<a href="#fnref:4" rev="footnote">&#8617;</a></li> <li id="fn:5"> 一般的にはシャムネットワーク(Siamese Network)と呼ばれています。"Siamese" は差別的な意味合いを含むことから、本稿ではあえて異なる名称を用いています。<a href="#fnref:5" rev="footnote">&#8617;</a></li> <li id="fn:6"> 勾配降下法による最適化の手続きは、学習率+0の極限においてパラメータに関する時間発展の微分方程式として扱うことができます。これを勾配流(gradient flow)と呼びます。<a href="#fnref:6" rev="footnote">&#8617;</a></li> <li id="fn:7"> 表記の変更(notation shift)を行っています。新しい表記では、時刻 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20t" alt=" t"/> におけるパラメータを <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Ctheta%7D_%7Bt%7D" alt=" \boldsymbol{\theta}_{t}"/>、目的関数を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20L_%7Bt%7D%28%5Cboldsymbol%7B%5Ctheta%7D_1%2C%5Cldots%20%2C%5Cboldsymbol%7B%5Ctheta%7D_t%29" alt=" L_{t}(\boldsymbol{\theta}_1,\ldots ,\boldsymbol{\theta}_t)"/>としています。ここで <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7B%5Ctheta%7D_t%20%3D%20%5Cboldsymbol%7B%5Ctheta%7D%2C%20%5Cforall%20t" alt=" \boldsymbol{\theta}_t = \boldsymbol{\theta}, \forall t"/> です。状態変数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cboldsymbol%7Bs%7D_t" alt=" \boldsymbol{s}_t"/>は表記を省略しています。<a href="#fnref:7" rev="footnote">&#8617;</a></li> <li id="fn:8"> 適切な解に早く到達するような学習率自体を機械学習によって求めるタスク。<a href="#fnref:8" rev="footnote">&#8617;</a></li> </ol> </div> morphotech 【無料トライアル公開中(~2021/12/31)】世界最速級推論エンジンSoftNeuroにおける高速化手法 hatenablog://entry/13574176438009862990 2021-10-19T09:03:45+09:00 2023-08-16T13:03:22+09:00 こんにちは、プロダクト開発部の平﨑です。 今回は、弊社製品SoftNeuro®における推論処理の高速化手法についてご紹介します。 なお、現在SoftNeuroの無料トライアル版が配布中です。 SoftNeuro概要 詳細は後程解説しますが、まずは、SoftNeuroの特徴をまとめた紹介動画をご覧下さい。 紹介動画の利用シーンからイメージいただけるかと思いますが、SoftNeuroはニューラルネットワークの推論を行うソフトウェアです。 ディープラーニング技術を使って、コンピュータに何らかのタスクを実行させる場合、大きく分けて2つの工程が必要になります。 それが「学習」と「推論」です。 「学習」と… <p>こんにちは、プロダクト開発部の平﨑です。</p> <p>今回は、弊社製品SoftNeuro®における推論処理の高速化手法についてご紹介します。 なお、現在SoftNeuroの<a href="https://softneuro.morphoinc.com/">無料トライアル版</a>が配布中です。</p> <h3 id="SoftNeuro概要">SoftNeuro概要</h3> <p>詳細は後程解説しますが、まずは、SoftNeuroの特徴をまとめた紹介動画をご覧下さい。</p> <iframe src="https://www.youtube.com/embed/O1dfTTnQHrI?enablejsapi=1" width="560" height="315" frameborder="0" allowfullscreen></iframe> <p>紹介動画の利用シーンからイメージいただけるかと思いますが、<strong>SoftNeuroはニューラルネットワークの推論を行うソフトウェアです。</strong></p> <p>ディープラーニング技術を使って、コンピュータに何らかのタスクを実行させる場合、大きく分けて2つの工程が必要になります。 それが「学習」と「推論」です。</p> <p><strong>「学習」とは目的とする推論を行うためのニューラルネットワークを作る工程です。</strong></p> <p>目的となるタスクに応じて適当な構造のネットワークモデルを選び、学習用のデータを大量に与えることで、適切な推論が行えるようなニューラルネットワークを作成します。</p> <p><strong>「推論」は「学習」の工程で作ったニューラルネットワークを実際に使う工程です。</strong></p> <p>利用したい環境に学習済みネットワークと推論処理を行うプログラムを導入し、入力された未知のデータが何であるか等の判断をさせます。 この推論処理を高速に行うためのソフトウェアがSoftNeuroです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113120.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><strong>SoftNeuroの特徴は「あらゆる場所で高速に」動作することです。</strong></p> <p>SoftNeuroは、ネットワークモデルを保存する独自のファイル形式を採用していますが、様々な学習フレームワークからこの形式に変換するための機能が用意されています。</p> <p><strong>この形式に一度変換すれば、SoftNeuroが動作するどの環境でも即座に学習済みネットワークを利用した推論処理を実行することが可能となります。</strong></p> <p><strong>さらにSoftNeuroは独自の高速化手法であるチューニングという機能を使うことで、あらゆる環境での高速な推論処理を実現しています。</strong></p> <p>今回の記事では、このチューニング機能についてご紹介していきます。</p> <h3 id="チューニングとは">チューニングとは</h3> <p>SoftNeuroはチューニングという機能によって、多種多様な環境に対応した高速推論実行を実現しています。 なお、モルフォはこのチューニング機能に関する特許<a href="#f-7fe3979f" name="fn-7fe3979f" title="日本特許 第6574004号他、各 国で権利化中。">*1</a>を取得しています。</p> <p><strong>チューニングとは、あるモデルの推論を行う際に、実行環境に合わせた適切な実装を選択するための機能です。</strong></p> <p>ニューラルネットワークは基本的に、多数のレイヤー処理によって構成されています。 一般的な学習・推論フレームワーク同様、SoftNeuroもレイヤー単位で処理を実装しています。</p> <p><strong>そして各レイヤーに対して、単一ではなく複数種類の実装を用意しています。</strong></p> <p><strong>弊社ではこれらの各実装をルーチンと呼んでいます。</strong></p> <p>(具体的にどのようなルーチンの種類があるかは後述します)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113157.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ルーチンはハードウェア資源や導入されているフレームワークなど、推論を実行する際の様々な条件に合わせて高速な処理ができるよう様々な実装が用意されています。</p> <p><strong>この複数のルーチンの中から、実行条件下で最も高速なルーチンを選択して各レイヤーに設定することで、様々な実行環境における高速な推論処理が可能となっています。</strong></p> <p>例えば以下の表のように、三種類のルーチンがそれぞれ実装されているレイヤー1、2からなるモデルがあったとします。</p> <p><strong>SoftNeuroでは、これらのレイヤーにおいてどのルーチンを採用すれば最速で処理できるか、実行環境での速度測定結果をもとに判断します。</strong></p> <p><strong>そして各レイヤーに適切なルーチンを設定することで、その後の推論処理において常に最速のルーチン設定を利用した推論処理を行うことができるようになるのです。</strong></p> <p>こちらの例のような速度測定の結果が得られた場合、環境AではAVX実装とOpenCL実装、環境BではCUDA実装がそれぞれのレイヤー処理で採用されることになります。</p> <p>(より正確には、自動的に挿入される型変換等も考慮してモデル全体の推論処理が最も高速になるような設定の組み合わせの探索を行っています)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113226.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h3 id="ルーチンの実装例">ルーチンの実装例</h3> <p>チューニング機能は各レイヤーに対して様々なルーチンを用意することで、より多くの選択肢から実行環境で高速に動作する実装を選ぶことができるようになっています。</p> <p>ここからは、実際にどのような方法で高速な処理を行うルーチンを実装しているかをご紹介していきます。</p> <h4 id="SIMD実装">SIMD実装</h4> <p>SIMD(Single Instruction/Multiple Data)とは、一つの命令を複数のデータに対して並列に実行する仕組みのことを指します。</p> <p>SIMDにはx64のAVX, ARMのNEONなど、アーキテクチャに独自の命令セットが用意されており、SoftNeuroではそれらの命令を利用したルーチンも用意しています。</p> <p>具体的にはAVX2, AVX512, NEONなどの独自命令を利用したルーチンの実装があり、これらは対応しているアーキテクチャの環境でしか利用できないルーチンですが、通常の命令で実行した場合よりも処理が高速になります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113257.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><strong>SIMD命令が有効な理由として、ニューラルネットワーク推論ではfloatの並列演算が非常に多いという点が挙げられます。</strong></p> <p>例えばAdd(加算処理)レイヤーなどは上図のように、複数の値に対して並列に加算命令を実行するものです。</p> <p>このような演算処理がニューラルネットワーク推論では頻繁に行われるため、SIMD命令を利用することで推論の高速化が見込めます。</p> <h4 id="各種プロセッサの利用">各種プロセッサの利用</h4> <p>推論処理を行う環境には、CPU以外にもGPUやチップセットに組み込まれたAI Acceleratorなどの様々なプロセッサが存在する場合があります。</p> <p><strong>これらのハードウェア資源を有効利用するために、SoftNeuroではCUDAやOpenCL、HNNなどを利用したルーチン実装も用意されています。</strong></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113311.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これらのルーチンも先程のSIMD実装と同様、対応するハードウェアで処理が行える環境でなければ利用することができませんが、高速な場合が多いです。</p> <p><strong>特にAI Acceleratorを利用した場合は同環境のCPU処理と比較すると非常に高速で、推論処理が10倍以上高速化した例もあります。</strong></p> <h4 id="量子化">量子化</h4> <p>ニューラルネットワークには学習によって設定された重み値というものがあります。 推論処理を実行する際には、入力データに対してこの重み値を利用した様々な演算を行うことになります。 この重み値が適切な組み合わせになっていると、より精度の高い推論を行うことが可能となります。</p> <p>重み値は通常float32形式で保存されている場合が多く、推論処理を行う時もそのままの型で演算を行います。</p> <p><strong>量子化はその重み値や入力データを、よりデータサイズの小さい型(float16やqint8)に変換して推論処理を実行する技術です。</strong></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210914/20210914113338.png" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><strong>量子化推論では、演算を実行する際のデータ量が減るので計算が軽くなるため、推論処理全体の高速化が期待できます。</strong></p> <p>しかし、もともとの推論処理に比べて情報量が減っているため、推論結果の精度が劣化する可能性があります。</p> <p>SoftNeuroでは、この機能は利用条件に応じて使い分けることができるようになっており、精度と速度のバランスを取ることができるようになっています。</p> <h4 id="アルゴリズム">アルゴリズム</h4> <p>これらの他にも<strong>「同じ結果が得られるがアルゴリズムが違う」というルーチンもあります。</strong></p> <p>具体例としてはconv2レイヤーにおけるwinogradルーチンが挙げられます。 また、他にも社内で開発した「キャッシュ効率化版」の実装などもこちらにあてはまります。</p> <p>これらのアルゴリズムは通常の実装と比べると高速ですが、フィルターサイズ等のレイヤー設定に実行のための条件があります。</p> <p>こういった複数のアルゴリズムの中から実行可能かつ高速なものを選択するということも、チューニングによって可能となっています。</p> <h3 id="まとめ">まとめ</h3> <p>今回は、弊社製品である世界最速級推論エンジンSoftNeuroで採用されている推論処理の高速化手法についてご紹介しました。</p> <p>この他にもLayer Fusionによるモデルの最適化など、SoftNeuroには様々な高速化の工夫が施されています。</p> <p><strong>ご興味の湧いた方は、現在配布されている<a href="https://softneuro.morphoinc.com/">無料トライアル版</a>をダウンロードいただくと、実際にチューニング処理などをご自分の環境でお試しいただけます。</strong></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsoftneuro.morphoinc.com%2F" title="Overview - SoftNeuro® SDK v5.2.0 Document" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://softneuro.morphoinc.com/">softneuro.morphoinc.com</a></cite></p> <p>こちらは2021年12月末までとなっていますので、この機会にぜひご利用いただければと思います。</p> <p>最後までお読みいただき、ありがとうございました。</p> <div class="footnote"> <p class="footnote"><a href="#fn-7fe3979f" name="f-7fe3979f" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">日本特許 第6574004号他、各 国で権利化中。</span></p> </div> morphotech モルフォ35時間ルール hatenablog://entry/26006613796439786 2021-09-22T10:04:49+09:00 2023-08-16T13:03:59+09:00 ※この記事は、2021年5月25日に投稿した「Morpho's 35-hour Projects」の日本語版です。 こんにちは。CTO室のシニアリサーチャーの茶民と申します。今回の記事では、各社員が業務時間中に自身の好きなプロジェクトを行えるモルフォの取り組みについてご紹介します。 モルフォでの就業時間は一日平均7時間であり、月の合計で約161時間となります。モルフォでは、このうち20%の時間を各々の好きなプロジェクトの進行に割くことができます。プロジェクトの内容は、モルフォの業務に関係することであればなんでも構いません。月35時間の範囲内なら何をしても良いため、「35時間ルール」と呼ばれてい… <p>※この記事は、2021年5月25日に投稿した「<a href="https://techblog.morphoinc.com/entry/2021/05/25/100005">Morpho's 35-hour Projects</a>」の日本語版です。</p> <p> こんにちは。CTO室のシニアリサーチャーの茶民と申します。今回の記事では、各社員が業務時間中に自身の好きなプロジェクトを行えるモルフォの取り組みについてご紹介します。</p> <p> モルフォでの就業時間は一日平均7時間であり、月の合計で約161時間となります。モルフォでは、このうち20%の時間を各々の好きなプロジェクトの進行に割くことができます。プロジェクトの内容は、モルフォの業務に関係することであればなんでも構いません。月35時間の範囲内なら何をしても良いため、「35時間ルール」と呼ばれています。本業に影響しなければ会社のリソースを利用することもできます。弊社では2018年からこのルールを開始し、初めはエンジニアとリサーチャーのみのルールでしたが、今では全社員がこの35時間ルールで自分のプロジェクトを行うことができます。</p> <p> 読者のみなさんは、「あれ、これってGoogleの20%ルールと同じじゃない?」と思ったかもしれません。そうです。Googleも社員に労働時間の20%までを各々のプロジェクトに割けるようルールを設けました。しかし元々は、あのポストイットの発明で有名な3Mが始めたものでした。1948年から、3Mは労働時間の15%を独立したプロジェクトに割くよう従業員に強いています。他の会社でも似たようなルールを設けているところもあります。マイクロソフトの「Garage」、ヤフーの「Hack Day」、アトラシアンの「20%プロジェクト」、アップルの「Blue Sky」などです。</p> <p> なんだか似たようなものがたくさんありそうですね。このような企業の取り組みについて書かれた<a href="https://www.barnesandnoble.com/w/the-20-doctrine-ryan-tate/1110856886?ean=9780062003232">本</a>もありますので、もっと知りたい方はぜひ読んでみてください。</p> <h2 id="35時間ルールの目的">35時間ルールの目的</h2> <p> 上述した企業はそれぞれの目的がありこのような独自性のあるルールを設けました。これから、35時間ルールの目的、そして、モルフォとその従業員の取り組みによって、どんな成果が得られたか説明していきたいと思います。</p> <p> 第一の目的は、イノベーションの推進です。我々はソフトウェアベンダーとしてモバイル端末向けのソフトウェアの開発に注力しているため、ソフトウェアだけを独立して売ることができません。常に新しく作られたハードウェアに合わせて製品を改修し、また長期にわたりサポートしなければなりませんので、顧客に合わせたソフトウェアを作ることに多くの時間を割いています。これでは独創性のある新しいアイデアで大きなプロジェクトを始めにくいですよね。一方、個人で行うプロジェクトならば、斬新なアイデアを最初は小さいスケールの「proof-of-concept」型で始められます。そして各々の社員が作ったプロトタイプを他の社員に見せます。このようにすれば、どんな新製品を開発すべきか、幅広い選択肢から決めることができます。企業は個々人のアイデアを引き上げ(=pull)、それに基づいて製品を作ることができるため、この35時間ルールは「Pull型プロジェクト」とも呼ばれています。</p> <p> 第二の目的は、社員にスキルアップの機会を与えることです。例えばモルフォのあるエンジニアが、AI製品を作っているとしましょう。もちろんそのエンジニアは機械学習などについて詳しく、そのスキルを製品開発に役立てています。しかしそのエンジニアがCGのスキルを磨きたいと思っていても、そのまま製品開発を続けているだけでは機会がありません。ですが労働時間内で個人的なプロジェクトとしてCGを始めれば、望みは叶います。たとえ本業とは無関係でも、モルフォが損失を被るわけではありません。技術のトレンドの変化は激しく、この先に顧客からどんな要望が来るのか予測ができません。顧客から「これ作れますか?」「この問題解決できますか?」といきなり聞かれることがよくあります。もしこんなことが起きても、幅広い知識を持った社員がいれば、顧客の要望に素早く応えることができます。</p> <p> 第三の目的は、面白味は無いかもしれませんが、重要なことです。労働環境や生産性をほんのちょっと改善するためにプロジェクトが行われることがあります。弊社の管理部門はより良い労働環境を提供できるよう最善を尽くしていますが、そのために購入したツールが弊社に完全にマッチしているとは限りません。たとえば、一枚の写真をアノテーションするツールがあったとして、現在使っているモノよりも数秒速くアノテーションできるツールを開発できたら、長期的に見れば数時間の節約に繋がるのです。</p> <h2 id="社内発表">社内発表</h2> <p> 昨年、モルフォでは各自のプロジェクトの発表会を開催しました。プロジェクトを終えた社員も、まだ終わってないけれどもアドバイスやフィードバックが欲しい社員も、プレゼンテーションを行います。この発表会は社員の誰でも聴講できます。2~15分で自由なスタイルで発表できます。</p> <h2 id="今後の展望">今後の展望</h2> <p> 弊社の事業部や、事業開発部では、製品にできそうなものをピックアップして吟味しています。実際、2つのプロジェクトがすでに開発フェーズへと移っています。このルールを運用してから、同僚がどんなスキルを持っているのか皆知るようになりました。プロジェクトが面白ければ、複数人で遂行することもできます。AI系のプロジェクトではデータ収集が必須であるため、そのお願いをすることもできます。</p> <h2 id="プロジェクトの紹介">プロジェクトの紹介</h2> <p> 発表会でプレゼンテーションされたプロジェクトをいくつか紹介したいと思います。これらの成果をご覧になって、読者のみなさまに新しい発想やモチベーションをご提供できれば幸いです。技術の詳細について紹介できないのは申し訳ないのですが、読んでいただければ新しい着想を得ることができるかと思います。</p> <h3 id="AIによるUSBデプスカメラ">AIによるUSBデプスカメラ</h3> <p> これは筆者のプロジェクトです。以前私は、移動中に障害物をカメラで検知して避ける小さなロボットを作ったことがあります。ロボットのコンピュータにはRasberry Pi 3 Model Bを使用しました。その時は、カメラから奥行推定をして、障害物検知を行い、ロボットにそれを避けるよう移動経路を計算させていました。現代では、数多くの単眼カメラデプス推定の研究がなされているため、Githubからすぐに動くコードを用いることができます。しかし、実際にロボットに適用してみると、全く別の問題につきあたりました。Rasberry Piがナビゲーションやデプス推定などの重いタスクにすでに計算資源を占有されていたのです。周りを見渡せば、これは私だけが直面する問題ではないでしょう。ロボットやドローンなどの小さなデバイスでは、コンピュータビジョンのタスクを処理するのに十分な計算資源がないのです。</p> <p> このような問題を解決するには2つの常套手段があります。単純な方法としては、ロボットに計算資源を増設するやり方です。しかし実際は、例えばロボットが既成製品である場合は必ずしも上手くいきません。もしくは、画像を送ってデプス推定だけ別のコンピュータにやらせることも可能です。が、ネットワークを設定する必要があり、遅くて使い物になりません。</p> <p> そこでは私は第三の方法をとりました。USBカメラからロボットに直接デプス画像を送れば、デプス推定に計算資源を割く必要がなくなるのです。USBポートとUSBカメラはたいていの小さなコンピュータでもサポートされています。そのため、カメラを様々な用途で用いることができるのです。私は、これを個人のプロジェクトとしてやってみることにしました。</p> <p> 技術的な詳細は別途ブログに書く必要があるため、ここでは割愛します。端的に言うと、Rasberry Pi Zero、Rasberry Pi カメラモジュール、疑似的な監視カメラのプロトタイプを作りました。画像やデプス、またはその両方をたった一つのUSBポートを介してロボットに送信するカメラのプロトタイプを、電子部品をいくつか装着させることで製作しました。図1にハードウェアの構成を示します。図2に実際のカメラとサンプル画像を示します。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="図1"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154257.png" width="1200" height="838" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1</figcaption></figure> </div> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="図2"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154323.png" width="1200" height="665" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2</figcaption></figure> </div> <h3 id="VRヘッドセット向け3D空間ビューワー">VRヘッドセット向け3D空間ビューワー</h3> <p> これもCTO室社員によるプロジェクトです。コンピュータビジョンと動作検知の技術を統合し、Oculus Quest 2®を用いて仮想空間を作るというアイデアです。とある屋内の三次元空間をモデル化するために、約100枚の写真を撮影します。ヘッドセットに装着された向き・動きセンサーをVR空間をレンダリングするために用います。図3に、レンダリングされた3次元空間モデルを示します。3枚の写真は 撮影された写真例です。あくまでプロトタイプなので、粗く表示されているかと思います。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="図3"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154352.png" width="1200" height="583" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3</figcaption></figure> </div> <h3 id="消毒当番ボット">消毒当番ボット</h3> <p> この記事を書いている現在、新型コロナウイルスの感染が広がっています。これを受けて、当オフィスでも感染を予防する対策をとりました。社員がよく触れるような場所、例えばドアノブといった場所を定期的に消毒しています。通常ならば、このような作業は単純な当番制で済ませればいいように思われますが、リモートで働く社員もいれば出社している社員もおり、スケジュールがごちゃごちゃしています。おまけに、人間は忘れっぽい生き物です。そこで、このような問題を解決すべく、当番が消毒を行ったか確認するツールが必要となりました。</p> <p> 社員の一人が、当番に消毒を促すようリマインドを通知する社内用リマインダーを作りました(図4)。ただの通知ボットですが、多くの社員に重宝されています。このプロジェクトの良いところは、似たような通知ボットを作成するときに、車輪の再発明のようなことをせずに済むということです。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="図4"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154411.png" width="1200" height="380" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4</figcaption></figure> </div> <h2 id="最後に">最後に</h2> <p> モルフォの様々な35時間ルールのプロジェクトを紹介してきました。我々の取り組みについて少しでもご理解が進めば幸いです。</p> <p> 35時間ルールはつい3年前から始まりました。会社としても、社員がプロジェクトを始めやすくしたり遂行しやすくしたりできるよう、常にルールを見直して改正しています。この取り組みにより多くのリソースを割けるよう計画中であります。</p> <p> 最後に一つだけ。会社が大きくなるにつれ、独立したプロジェクトの遂行が難しくなります。Googleは、20%プロジェクトで数えきれないほど多くの製品を世に送り出し成功したにも関わらず、数年前に中止しました。言ってしまえば、大企業ほどこのような取り組みでプロジェクトが成功してもインパクトが小さいのです。もし読者のみなさまが仕事中に自分のアイデアを試してみたり、スキルを磨いたり、変わったことがやりたいなら、モルフォへの入社を検討されてはいかがでしょうか。我々は通年採用を行っております!</p> <p>参考文献</p> <p>[1] Ryan Tate. The 20% Doctrine: How Tinkering, Goofing Off, and Breaking the Rules at Work Drive Success in Business. Harper Business, ISBN 978-0-06-200323-2</p> morphotech OJT2021:Vieureka を用いた三密判定と性格行動診断の同時推論「密カッター」 hatenablog://entry/26006613791718463 2021-08-17T11:04:46+09:00 2023-08-16T13:04:14+09:00 こんにちは、リサーチャーの鈴木です。今年度の新人研修で、私達のグループは「密カッター」というシステムを開発しました。本記事では、このシステムの開発の目的、および、本システムで実装されている要素技術についてご紹介いたします。 本研修ではPanasonic様の提供するIoTカメラ「Vieureka*1」を使用しました。 「密カッター」による三密判定+性格行動診断 新型コロナウイルスの感染防止対策として「三密防止」が重要であることは言うまでもありません。「人が多数集まる密集状態」「換気が悪い密閉空間」「間近で会話や発声をする密接場面」を常時監視することは、店舗運営等において望ましい環境作りとなります… <p>こんにちは、リサーチャーの鈴木です。今年度の新人研修で、私達のグループは「密カッター」というシステムを開発しました。本記事では、このシステムの開発の目的、および、本システムで実装されている要素技術についてご紹介いたします。</p> <p>本研修ではPanasonic様の提供するIoTカメラ「Vieureka<a href="#f-8715663f" name="fn-8715663f" title="「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。">*1</a>」を使用しました。</p> <h3 id="密カッターによる三密判定性格行動診断">「密カッター」による三密判定+性格行動診断</h3> <p>新型コロナウイルスの感染防止対策として「三密防止」が重要であることは言うまでもありません。「人が多数集まる密集状態」「換気が悪い密閉空間」「間近で会話や発声をする密接場面」を常時監視することは、店舗運営等において望ましい環境作りとなります。さらに、今後はワクチン接種後に戻ってくる顧客の傾向をいち早く掴んでマーケティングに活用するチャンスと考えることもできます。心理学の分野では人の行動傾向が姿勢に表れるという示唆があります。このような心理学的研究をうまく活用することで、カメラの映像から適切なマーケティングにつなげられる可能性があります。</p> <p>私達は、これらの課題に対して、「密集検知」「密閉検知」「密接検知」「性格行動診断」の4つの機能を、AI搭載の監視カメラVieureka上に実装しました。そして、新人研修の成果物として、これら4つの機能を備える監視システム「密カッター」を開発しました。</p> <p>密カッターは、カメラ視野における人の密集度、会話ペア数、ドアの開閉時間、人々の性格傾向を可視化します。さらに、AIによる自動監視システムという特徴を活用して、密カッターは音や光による三密の危険度の注意喚起や、性格傾向に合致した電子広告提示を、人の手を介さずに実行することができます。</p> <h3 id="密集検知">密集検知</h3> <p>「画像中のどこに何があるか」を出力する物体検出は、深層学習が得意とするタスクの一つです。特に人間の検出に関しては研究が進んでおり、駅や商業施設など日常的な場面で実用化されるほど高性能なモデルが次々と登場しています。</p> <p>狭い領域に人が多く位置する「密集」を検知するためには、分割した画像中の位置毎に人数をカウントするタスクを物体検出に追加することで実現可能となります。セキュアとモルフォが共同開発した<a href="https://www.morphoinc.com/news/20201102-jpr-morpho_secure_ccs">SECURE群衆カウントソリューション</a>は、画像中の領域ごとの人数をカウントし、混雑度を表示するソリューションを提供しています。</p> <p>今回のプロジェクトでは、カメラと被写体がより近くに位置するシーンを想定しているため、エッジデバイスVieurekaで高速推論を行わせることを重視し、YOLOv3モデルによる物体検出に簡便な後処理を施すことで「密集」の検知を実現しました。さらに、Vieurekaカメラ上でのYOLOv3モデルの推論処理の高速化には当社製品である高速ディープラーニング推論エンジン<a href="https://www.morphoinc.com/technology/sie">SoftNeuro®</a>を利用しました。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="密カッターによる密集検知"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210728/20210728124141.gif" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1.密カッターによる密集検知</figcaption></figure> </div> <p>図1は、密カッターが密集検知を行っている様子を示す画面例です。図1のgif動画のように画面中の人を検出し、8分割した各領域に位置する人数が数値として表示されています。カメラと被写体の距離がこの程度(2~10メートル)の場合YOLOv3モデルは誤検出や取り逃しのほとんどない推論が可能です。画像の分割数は実シーンに合わせた調整が可能です。</p> <h3 id="密閉検知">密閉検知</h3> <p>密閉回避による感染リスク低減のためには1時間あたり5分程度の換気が望ましいとされています。一般的に、小規模な店舗ではドアが換気経路であることから、本プロジェクトではドアの開閉による換気頻度をモニタリングする機能を開発しました。</p> <p>具体的には、物体検知の深層学習モデルに「開いたドア」「閉まったドア」「半開きのドア」を区別して学習させ、未知の開閉状態を区別して検知させます。この深層学習モデルには密集検知と同じくYOLOv3を用いました。開閉状態を分類してドアを取り扱った研究は数少なく、学習済みのモデルもほとんど公開されておりません。今回はその数少ないドアのデータセットの一つである<a href="https://github.com/gasparramoa/DeepDoors2">DeepDoors2</a>を用いて「開いたドア」「半開きのドア」「閉まったドア」の特徴をYOLOv3に一から学習させました。</p> <p>学習後、当社オフィスのドア画像を用いてモデルの精度確認を行いました。結果としては、開いたドアの検出がよくできており、画像中24枚の開いたドアに対して、正しい検出(True Positive)が16枚、見落とし(False Negative)が8枚、誤検出(False Positive)が2枚でした。</p> <p>しかし閉まったドアの検出の精度は悪く、画像中12枚の閉まったドアに対して、正しい検出は0枚、見落としが12枚、誤検出が43枚でした。</p> <p>原因として、データセットと違い、オフィスのドアは周囲の壁と色が同じ(真っ白)であり、閉じた状態での検出が困難であったことが考えられます。閉じたドアを正確に検出するためには、それに見合ったデータセットでの学習が必須であることが分かりました。</p> <p>反面、学習データセットと違う性質のドアであっても「開いたドア」の検出は十分な精度で行えることを実証しました。密カッターではこれを活用し、ドアが開いている時間を累積して換気時間を提供することで「密閉」検知を実現します。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="密カッターによる密閉検知"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210729/20210729144939.gif" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2.密カッターによる密閉検知</figcaption></figure> </div> <p>図2は、密カッターが密閉検知を行っている様子を示す画面例です。図2のgif動画のように開いたドアを検出した場合に換気が行われていると判断し、画像下部に1時間あたりの換気時間が表示されています。</p> <h3 id="密接検知">密接検知</h3> <p>「間近で会話や発声をする密接場面」を判定するために、人と人が至近距離で向かい合う「向き合い検知」と、特定の方向からの音声を検知する「音源定位」の二つの処理を組み合わせました。</p> <h5 id="向き合い検知">向き合い検知</h5> <p>剛体である顔の6自由度(3次元位置と3次元向き)推定によって顔の向きを検知する手法が提案されています。今回は見ている方向や目線の厳密な推定は不要なため、その中でも高速かつ高性能な<a href="https://github.com/vitoralbiero/img2pose#license">img2pose</a>を採用しました。img2poseを用いて画像中の全ての顔について6自由度推定を行い、その後任意の2人ペアに対して向き合い判定を行います。</p> <p>「向き合っている」というのは、「距離が近く、顔ベクトルが逆向きで対面している(背を向け合っていない)」という状況で定義できます。まず、両者の顔の大きさの比が±50%以下(奥行き方向で近接)かつ、顔6個以内の距離に位置していれば、「距離が近い」と定義しました。さらに、両者の顔の向きのベクトルの内積が負であれば、「逆向き」と定義し、最後に顔の向き方向に相手の顔が存在する場合を「対面」と定義しました。これら3つ全てを満たしたペアについて「向き合っている」と判定させています。</p> <p>図3はこれらの状況を模式的に示しており、A、B、Cの場合は、いずれかの条件を満たしていないため向き合いと判定しません。Dの場合のみ、向き合いと判定しています。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="図中のAは顔ベクトルが同じ向き、図中のBは距離が遠く、図中のCは背を向けあっている"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210728/20210728165900.png" width="800" height="305" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3.図中のAは顔ベクトルが同じ向き、図中のBは距離が遠く、図中のCは背を向けあっている</figcaption></figure> </div> <h5 id="音源定位">音源定位</h5> <p>単一のマイクではなく、複数のマイクロフォンで集音して到達する音の時間差を用いることで音源の位置を推定することが可能です。音源定位と呼ばれるこの技術は20世紀から開発が進む汎用的な技術であり、Web会議用の指向性マイクやロボット開発などに活用されています<sup>参考[1]</sup>。</p> <p>今回はマイクが単一のVieurekaカメラに安価かつ簡便に音源定位を実装するため、<a href="https://elchika.com/article/af968c98-a6d0-41fa-8e09-291c43eddd40/#h_%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0">こちらの記事</a>を参考に、Sipeed社製のマイクロコンピュータ<a href="https://maixduino.sipeed.com/en/hardware/bit.html">Maix bit</a>とそのアタッチメントである6+1マイクロフォンアレイを増設しました。</p> <p>Sipeed社の公式ページからMaix bitに音源定位を実行させるプログラムをダウンロードすることができます。マイクロフォンアレイとVieurekaでは画角も分解能も全く違うため、両者の出力を合成するための校正実験を行いました。</p> <div style="text-align: center"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210728/20210728172502.png" width="800" height="383" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> </div> <p>VieurekaカメラとMaix bitで得られた向き合い検知と音源定位の両方の出力を用いることで、「密接な会話」を自動検知し、そのペア数を提示するシステムの開発に成功しました。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="密カッターによる会話検知"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210728/20210728172753.gif" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4.密カッターによる会話検知</figcaption></figure> </div> <h3 id="性格行動診断">性格行動診断</h3> <p>「性格行動診断」は、姿勢と心理状態の関連性を利用し、カメラ画像に映る被写体の心理的傾向を計測する機能です。</p> <p>心理学的研究として、姿勢は身体の状態だけでなく精神状態をも表し、性格の一指標になりうるものとする説があります。先行研究<sup>[2]</sup>では、被験者の映った画像から客観的に評価した姿勢とストレスに対する8つの対処傾向(肯定的解釈、カタルシス、回避的思考、気晴らし、計画立案、情報収集、放棄・諦め、責任転嫁)を示すTAC-24尺度との相関を調査し、首の角度と心理学的傾向が関連することを示しました。</p> <p>今回はこの研究から着想を得て、深層学習を用いてカメラに映る人物の姿勢情報を取得し、心理学的知見から人々の消費行動傾向を提示する「性格行動診断」の機能を開発し、密カッターに実装しました。</p> <p>当社社員を対象として写真一枚とアンケートの収集を行い、性格を示す尺度である<a href="https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%96_(%E5%BF%83%E7%90%86%E5%AD%A6">Big Five</a>、ストレス対処法を示すTAC-24、さらに消費習慣や生活習慣のデータと姿勢の相関を調査しました。</p> <p>結果として、首を右に傾ける人ほど調和性(思いやりがあり協力的)が高くなるという有意な相関結果が得られました。さらに首を左に傾ける人ほど外向性が高く、衝動的な購買に対する抑制傾向が強く、毎月の運動回数は少ないという結果が得られました。なお、左右は被写体本人から見た向きを基準としています。</p> <div style="text-align: center"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210729/20210729141510.png" width="800" height="422" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> </div> <p>姿勢推定には当社製品の<a href="https://www.morphoinc.com/technology/poes">Morpho Pose Estimator™</a>をVieurekaカメラに組み込みました。Morpho Pose Estimator™は深層学習を利用した人体姿勢の推定技術であり、18か所(鼻・眼・耳・首・肩・肘・手首・腰・膝・足首)の特徴点の検出を可能とします。 当社の高速推論エンジンSoftNeuro®の技術も利用することで、エッジデバイスであるVieureka上での推論を可能としました。 今回は検出された特徴点のうち、両肩と鼻の位置を利用することで先行研究[2]において用いられた首の角度を計算します。</p> <p>「密カッター」では画像中の人物の首の角度を計算し、右に傾ける人が多ければ「調和性が高い」、左に傾ける人が多ければ「消費抑制傾向が高い」と表示します。下処理として、動き回っている人や横を向いている人は首の角度が安定しないため判定からは除外しています。</p> <p>下の画像ではテストのため首の傾きを意図的に変え、密カッターが正しく性格行動傾向を出力することを確認しました。</p> <div style="text-align: center"> <figure class="figure-image figure-image-fotolife" title="密カッターによる性格行動分析"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210728/20210728162910.gif" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図5.密カッターによる性格行動分析</figcaption></figure> </div> <p>将来的には駅や大型施設にいる人の性格行動傾向を診断し、最も多い顧客層を把握することで最適な電子広告のリアルタイム表示を行うことを想定しています。</p> <h3 id="まとめ">まとめ</h3> <p>今年の新人研修において、「密集」「密閉」「密接」の検知、および、「性格行動診断」の4機能を盛り込んだ「密カッター」の開発を行いました。これらの機能に必要な、混雑検知、ドア開閉検知、向き合い検知、音源定位、首の角度判定、心理学的特徴の判定といった要素技術をVieureka上に実装しました。</p> <p>本プロジェクトでは、緊急事態宣言が発令されていたため、リモートワークでシステム開発を進めたという経緯があります。そのため、実機での試験がなかなかできないという苦労がありました。出社時にまとめて実機の性能試験を行ったところ、カメラの設定等で想定外のエラーが何度も発生してしまい、実験撮影開始までに想定を大きく超える時間を要してしまいました。</p> <p>一方、うまくいったところもありました。チームメンバーのほとんどが初めてGitHubを利用したのですが、Issuesの管理などの機能を活用することで、効率的なチーム開発につなげることができました。その他、音源定位に用いる機器の選定、購入、初期設定、校正、実装までの一通りを2か月という短期間で達成できたことは誇れる成果であると自負しています。</p> <p>本プロジェクトでは「人の役に立つものを作りたい」という思いを形にするべく、要件定義から技術調査、開発までを新人チームで完遂し、「新しい製品を作る喜び」を強く体験することができました。 この喜びを胸に、本プロジェクトを通して得られた経験・スキルを今後の業務に活かしていきます。</p> <p>[1] 浅野太 ”音のアレイ信号処理 -音源の定位・追跡と分離-" 音響テクノロジーシリーズ コロナ社</p> <p>[2] 内田, 森川 "姿勢とストレスコーピングとの関係 : TAC-24との比較から"  九州産業大学国際文化学部紀要 九州産業大学国際文化学部紀要 (57), 127-140, 2014-03 九州産業大学国際文化学会 <a href="http://54.64.211.208/dspace/bitstream/11178/102/1/kokubun57-6.pdf">http://54.64.211.208/dspace/bitstream/11178/102/1/kokubun57-6.pdf</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-8715663f" name="f-8715663f" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。</span></p> </div> morphotech OJT 2021 : Vieurekaを用いた駐車可能位置案内システム hatenablog://entry/26006613785912521 2021-08-04T12:06:25+09:00 2023-08-16T13:04:26+09:00 はじめまして、リサーチャーの木村と申します。私は本年4月に新卒としてモルフォに入社しました。 今年の新人研修(OJT)において、私たちのチームは2ヶ月にわたってPanasonic様が提供するVieureka[^*1]というエッジデバイスを用いたアプリケーション開発を行いました。私たちのチームは、Vieureka を使った駐車可能位置案内システム ( Camera based Parking Guidance System ) を開発しました。この駐車可能位置案内システムは、Vieureka で撮影した駐車場の画像から車両検出により駐車場の空き状況を分析してWeb 上に簡易駐車場マップを表示し、… <p> はじめまして、リサーチャーの木村と申します。私は本年4月に新卒としてモルフォに入社しました。</p> <p> 今年の新人研修(OJT)において、私たちのチームは2ヶ月にわたってPanasonic様が提供するVieureka<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>というエッジデバイスを用いたアプリケーション開発を行いました。私たちのチームは、Vieureka を使った駐車可能位置案内システム ( Camera based Parking Guidance System ) を開発しました。この駐車可能位置案内システムは、Vieureka で撮影した駐車場の画像から車両検出により駐車場の空き状況を分析してWeb 上に簡易駐車場マップを表示し、駐車可能な位置の情報を提供するというものです。</p> <p> この記事では、このシステムを開発するに至った動機やシステムに使用している技術などについて紹介します。</p> <h1 id="駐車場での混雑を解消できないか">駐車場での混雑を解消できないか?</h1> <p> 車で大型施設に訪れた際に駐車場が混雑して、中々駐車できる場所が見つからないことは誰しもが経験したことがあると思います。このような場合に駐車場を回ってタイミングよく空いている場所を探す必要があり、時間もかかってしまい、環境にも良くないため、本OJTではよりスムーズな駐車を促す事ができないか検討しました。</p> <h1 id="既存の駐車案内システム">既存の駐車案内システム</h1> <p> 現在でも既にスムーズな駐車を促す取り組みは行われていて、一般的なものにはバリアゲートによる駐車場内の管理があります。しかし、これは駐車場内の車の数は管理できますが、空いている駐車位置までは把握する事ができません。空いている駐車場を把握する方法として、駐車位置ごとにセンサーを配置するという方法も考えられますが、導入コストが高額になってしまいます。そこで私たちのチームは監視カメラで駐車場を撮影して、駐車場の状況を把握することでより導入コストの低い駐車案内システムを構築することを目標に開発に取り組みました。</p> <h1 id="開発に使用した機材">開発に使用した機材</h1> <p> VieurekaはPanasonic様が提供するエッジAIカメラデバイスです。カメラで撮影した映像をAI技術を用いて解析し、来客の分析や商品棚のモニタリングを行うことで必要な情報を提供することができます。今回のOJTではVieureka(VRK-C301)を用いて駐車場内の車を検出することで、駐車状況を分析します。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.panasonic.com%2Fjp%2Fbi%2Fvieureka%2F" title="Vieureka(ビューレカ)プラットフォーム - 商品情報[法人] - Panasonic" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://tech.panasonic.com/jp/bi/vieureka/">tech.panasonic.com</a></cite></p> <p><figure class="figure-image figure-image-fotolife" title="Vieureka VRK-C301(https://tech.panasonic.com/jp/bi/vieureka/camera.html)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210713/20210713112133.png" width="548" height="437" loading="lazy" title="" class="hatena-fotolife" style="width:320px;height:240px" itemprop="image"></span><figcaption>Vieureka (<a href="https://tech.panasonic.com/jp/bi/vieureka/camera.html">https://tech.panasonic.com/jp/bi/vieureka/camera.html</a>)</figcaption></figure></p> <p> また実際の駐車場を利用して開発を行う事は難しかったため、駐車場を模したシートとミニカーを用いてシステム開発と動作テストを行いました。</p> <p><figure class="figure-image figure-image-fotolife" title="簡易駐車場"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210713/20210713104219.png" width="501" height="297" loading="lazy" title="" class="hatena-fotolife" style="width:640px;height:360px" itemprop="image"></span><figcaption>簡易駐車場</figcaption></figure></p> <h1 id="システム構成">システム構成</h1> <p><figure class="figure-image figure-image-fotolife" title="システム構成"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210712/20210712124705.png" width="599" height="143" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>システム構成図</figcaption></figure></p> <p> 本システムは以上のような構成となっています。事前準備として、設置したVieurekaで撮影した画像から駐車枠の座標とIDの記録し、簡易駐車マップとの対応付けを行います。こちらの作業を簡単に行えるように、駐車枠選択用のGUIを作成しました。設置した場所から撮影した駐車場画像を読み込み、駐車場のIDと任意の四点の座標を選択することで、駐車枠とIDを記録したファイルを生成します。</p> <p><figure class="figure-image figure-image-fotolife" title="駐車枠選択GUI"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210712/20210712125643.png" width="602" height="460" loading="lazy" title="" class="hatena-fotolife" style="width:640px;height:490px" itemprop="image"></span><figcaption>駐車枠選択GUI</figcaption></figure></p> <p> 次にWeb上で表示するための簡易マップの作成を行います。ここでは簡易マップ作成用のサイトを用意して、先ほど記録した駐車場に合うように行と列を追加し、当てはまる場所にIDを入力することで簡単に駐車枠とIDを対応付けたマップファイルを作成可能です。また、駐車場の出入口も指定可能なため、どの向きのマップであるかを分かりやすく表示することも可能です。</p> <p><figure class="figure-image figure-image-fotolife" title="簡易マップの作成"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210713/20210713113127.gif" width="1158" height="866" loading="lazy" title="" class="hatena-fotolife" style="width:640px;height:480px" itemprop="image"></span><figcaption>簡易マップの作成</figcaption></figure></p> <p> 最後に先ほど作成したマップファイルを読み込み、リアルタイムでのマップ更新を行います。以下の画面が今回表示する簡易駐車場マップの例です。赤が駐車中のスペース、緑が空いているスペースを示しており、対応するIDの駐車スペースの駐車状況が変化した時に、こちらの画面に反映されるようになっています。</p> <p><figure class="figure-image figure-image-fotolife" title="簡易駐車場マップ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210713/20210713104348.png" width="496" height="327" loading="lazy" title="" class="hatena-fotolife" style="width:640px;height:420px" itemprop="image"></span><figcaption>簡易駐車場マップ</figcaption></figure></p> <p> メイン動作ではVieurekaを用いて撮影した駐車場の映像から車両検出を行います。その後、予め記録しておいた駐車枠と検出された車との重なり具合で駐車判定を行い、結果をWeb上に送信することで簡易駐車場マップを更新します。</p> <p> 車両検出の方法として、昨今では深層学習による推論が高い精度を持つこと知られています。しかし、深層学習による推論には重い処理が要求されるため、VieurekaのようなIoT機器で一般的なフレームワークを動作させると処理時間が長くなってしまうのが現状です。そこで、今回はエッジデバイスやモバイル端末での深層学習モデルの推論を可能とする当社製品SoftNeuro<sup>Ⓡ</sup>を使用しました。これにより、Vieurekaに搭載されたCPU上でも実用的なフレームレートでの深層学習による推論が可能です。車両検出には高速な物体検出を可能とする物体検出モデルとして2018年に提案されたYOLOv3 [1] を採用しました。データセットは駐車場視点に適したデータセットを用意する事が難しかったため、今回は車を含め様々な物体が検出可能な公開データセットCOCOを使用して学習を行いました。以下の画像が今回用いたYOLOv3モデルでの車検出結果です。少し誤検出が生じてしまっていますが、このようにbounding boxで画像中の車を検出することが可能です。</p> <p><figure class="figure-image figure-image-fotolife" title="車検出結果"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210712/20210712123933.jpg" width="1200" height="838" loading="lazy" title="" class="hatena-fotolife" style="width:640px;height:447px" itemprop="image"></span><figcaption>車検出結果</figcaption></figure></p> <p> 今回は、時間の都合上検出モデルの性能向上を断念しましたが現在はYOLOv3よりも性能が良い物体検出モデルも登場していますので、使用モデルや学習データセットを吟味する事で車両検出の速度、精度ともに改善が可能です。 </p> <p> 車両検出を行った後は、検出されたbounding boxの中心がどの駐車枠の内側に含まれているのかを判定することで駐車されているかどうかを判定します。</p> <h1 id="システムの動作デモ">システムの動作デモ</h1> <p> こちらがシステムのデモ動画になります。駐車状況と合わせてマップが変化していることが分かります。今回は1920×1080のFHD画質で撮影しているため、推論時間を考慮して更新に数秒の間隔を空けていますが、実際の駐車場では秒単位での変化は大きくないため、現在の処理速度でも十分実用的です。処理速度が必要な場合は、検出モデルや入力画像の解像度を変更することでよりリアルタイムなマップ更新が可能です。</p> <iframe src="https://drive.google.com/file/d/1WP-JCd1pTvODNfw38NqqN7-YZuEGshjN/preview" width="640" height="480" allow="autoplay"></iframe> <h1 id="まとめ">まとめ</h1> <p> 本OJTでは、Vieurekaを用いた駐車場可能位置案内システムの開発に取り組みました。本システムの課題としては、実際の駐車場を用いた動作テストを行う必要があること、複数のデバイスを連携してより広い駐車場でも駐車状況を把握できる機能を実装すること等が必要です。また、性能向上として検出精度改善のためのモデルや学習データの見直し、追加機能で車体番号や車種の識別機能の実装などが考えられます。</p> <p> 最後に本システムの将来の展望として、現在は運転手に視覚的に空いている駐車位置を提供することが目的ですが、車のデジタル化が進むと自動運転技術との連携にも応用が可能で、マップを車に受け渡すことで運転手が何もせずとも最短で駐車が可能になることも期待できます。</p> <h1 id="参考文献">参考文献</h1> <p>[1] <a href="https://arxiv.org/abs/1804.02767">Redmon, Joseph, and Ali Farhadi. "YOLOv3: An Incremental Improvement." arXiv:2804.02767 [cs.CV], Apr. 2018.</a></p> <div class="footnotes"> <hr/> <ol> <li id="fn:1"> 「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です<a href="#fnref:1" rev="footnote">&#8617;</a></li> </ol> </div> morphotech (文献紹介) Google の COVID-19 感染予測 hatenablog://entry/26006613696956369 2021-07-06T12:41:07+09:00 2023-08-16T13:04:57+09:00 こんにちは、CTO室リサーチャーの富田です。 モルフォでは論文紹介を持ち回りで行うジャーナルクラブという活動がありますが、画像処理に関する論文に限らず、担当者が興味を持ったテーマについて紹介することもあります。Google Cloudが昨年公開した COVID-19 感染予測(US版、日本版) は大きな話題になりました。そのホワイトペーパーである "Interpretable Sequence Learning for COVID-19 Forecasting" についてこのジャーナルクラブで発表したので、こちらでもご紹介します。感染者などの時系列推移を学習するだけでなく、疫学の専門家や意思決… <p>こんにちは、CTO室リサーチャーの富田です。 モルフォでは論文紹介を持ち回りで行うジャーナルクラブという活動がありますが、画像処理に関する論文に限らず、担当者が興味を持ったテーマについて紹介することもあります。Google Cloudが昨年公開した COVID-19 感染予測(<a href="https://cloud.google.com/blog/products/ai-machine-learning/google-and-harvard-improve-covid-19-forecasts">US版</a>、<a href="https://cloud.google.com/blog/ja/products/ai-machine-learning/google-and-harvard-improve-covid-19-forecasts">日本版</a>) は大きな話題になりました。そのホワイトペーパーである "Interpretable Sequence Learning for COVID-19 Forecasting" についてこのジャーナルクラブで発表したので、こちらでもご紹介します。感染者などの時系列推移を学習するだけでなく、疫学の専門家や意思決定者による学習結果の解釈のしやすさを重視した手法となっています。</p> <p>このホワイトペーパーは機械学習のトップカンファレンスとして知られる NeurIPS 2020 にacceptされていますが、疫学における感染症の数理モデルを大枠としており、意外にも?機械学習的な部分は非常に簡素な作りです。そのため本記事・スライドの前半はその疫学の数理モデルの紹介<a href="#f-0b2c4d52" name="fn-0b2c4d52" title="この部分についてはなるべく元の文献に沿う形にした上で他の文献にもいくつか当たるなどして正確を期す努力はしていますが、私は疫学のバックグラウンドはない(物理が専門でした)ことをお断りしておきます。">*1</a>、後半が本論文の手法の紹介となっています。</p> <h4 id="感染症の数理モデル">感染症の数理モデル</h4> <p>感染症は生活習慣病などと違い、病原体への曝露がないと感染しないのが大きな特徴です。人から人へ感染するような感染症では人と完全に接触を断てば感染しないわけですが、現実的にはそれはなかなか難しいものです。そのため感染症の流行はいくつかの仮定を置くことによって、数理モデルによるモデル化が行いやすいという特徴があります。</p> <p>代表格と言えるのが<b>SIRモデル</b>です。これはあるコミュニティの全人口Nを、</p> <ul> <li>感受性人口 <img src="https://chart.apis.google.com/chart?cht=tx&chl=S" alt="S"/> (susceptible): 感染症にかかりうる人数</li> <li>感染性人口 <img src="https://chart.apis.google.com/chart?cht=tx&chl=I" alt="I"/> (infected): 感染しており、他人に伝染させうる人数</li> <li>治癒人口 <img src="https://chart.apis.google.com/chart?cht=tx&chl=R" alt="R"/> (recoverd): 感染から治癒して免疫を獲得した人数</li> </ul> <p>の3つの区画に分け、それらの人数の時間変化を微分方程式でモデル化するものです。IがSへ感染させる割合を表す<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cbeta" alt="\beta"/> (感染率)、また感染した人がどれくらいの速さで治癒するかを表す<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cgamma" alt="\gamma"/> (治癒率) の2つのパラメータを持ちます。非常に単純なモデルながら、局地的で短期的な流行の様子をよく再現することが知られています[5 §1.1]。</p> <p><figure class="figure-image figure-image-fotolife" title="SIRコンパートメントモデル"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210513/20210513232019.png" width="744" height="176" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>SIRコンパートメントモデル</figcaption></figure></p> <p>(実際の式などの詳細はスライドや[4,5]などを参照ください。) これを数値的に解いた例が以下のグラフで、感染者数Iが流行初期には指数関数的に増加し、免疫を持たない人の割合が減るにつれてやがて勢いを落とし、最終的にある割合の未感染人口を残して終息するという挙動を見ることができます。</p> <p><figure class="figure-image figure-image-fotolife" title="SIRモデルの数値計算結果例"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210514/20210514003658.png" width="400" height="300" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>SIRモデルの数値計算結果例</figcaption></figure></p> <p>このような感染流行がそもそも発生するかどうかの条件を与える基本再生産数 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20R%20_%200" alt=" R _ 0"/> という量、またどれだけの割合の人がワクチンなどで免疫をもてばこのような流行が発生しないか(集団免疫閾値)、などの量をモデルのパラメータから計算することができます。</p> <p>このモデルに潜伏期間に対応するEを付け加えた<b>SEIRモデル</b>というものも基本的なモデルとなっており、潜伏期間Eの間は他者へ感染させないという効果を織り込んだものとなっています。現実のデータを解析する際、最近では少なくともSEIR型へ改良したタイプのモデルを用いることが必須となっているようです[5 §2.4]。</p> <p><figure class="figure-image figure-image-fotolife" title="SEIRコンパートメントモデル"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210513/20210513232846.png" width="946" height="140" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>SEIRコンパートメントモデル</figcaption></figure></p> <p>SIRモデル、SEIRモデルのような人口を区画に区切った感染症数理モデルはコンパートメントモデルと呼ばれ、感染症数理モデルの基本とも言えるものです[4]。</p> <h4 id="Googleの感染者数予測モデル">Googleの感染者数予測モデル</h4> <p>Googleの感染者数予測モデル[1]はSEIRモデルをさらに拡張したものです。例えば感染者<img src="https://chart.apis.google.com/chart?cht=tx&chl=S" alt="S"/>のうちでも診断で発見されているかどうかで区分したり、入院状態などを含んだり、再感染の可能性を持つなどしたコンパートメントモデルとなっています。 ただしその内部のパラメータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cbeta" alt="\beta"/>などが固定値ではなく、共変量(人の移動量や地域人口など)の関数として表されるようになっています。</p> <p><figure class="figure-image figure-image-fotolife" title="Google感染者数予測のコンパートメントモデル ([1] Fig.2 より引用)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210513/20210513232332.png" width="1094" height="414" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Google感染者数予測のコンパートメントモデル ([1] Fig.2 より引用)</figcaption></figure></p> <p>本手法の機械学習部分は、この</p> <ul> <li>共変量の時系列予測</li> <li>共変量からパラメータを求める関数の関数形</li> </ul> <p>の2箇所に絞られており、またそれらも非常にシンプルな作りとなっています。 これによって政策決定者や疫学の専門家が学習結果のパラメータなどを調べ、何が感染拡大に寄与しているのかを検討することができるようになっています。</p> <p>しかしモデルを少しでも柔軟にすると容易にオーバーフィットするなど、様々な苦労があるようです。</p> <p>詳細は以下のスライドや[1]をご覧ください。</p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/Bay1OlYZileIFV" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/MorphoIncPR/interpretable-sequence-learning-for-covid19-forecasting" title="Interpretable sequence learning for covid-19 forecasting" target="_blank">Interpretable sequence learning for covid-19 forecasting</a> </strong> from <strong><a href="https://www.slideshare.net/MorphoIncPR" target="_blank">Morpho, Inc.</a></strong> </div></p> <p>スライド前半で触れている数学セミナー2020年9月号の特集「新型コロナウイルスと闘うために数学にできること」([4])ですが、この特集部分を抜粋したKindle版も販売されているようなので、興味のある方はこの特集タイトルで検索していただくと良いかと思います。また「感染症の数理モデル 増補版」([5])についても最近は在庫が復活したようですので、特集を読んでさらに興味を持った方は見てみるといいのではないでしょうか。</p> <h4 id="参考文献">参考文献</h4> <ul> <li>[1] S. O. Arik et al., “Interpretable Sequence Learning for COVID-19 Forecasting,” arXiv:2008.00646 [cs, stat], Aug. 2020. <a href="http://arxiv.org/abs/2008.00646">http://arxiv.org/abs/2008.00646</a></li> <li>[2] Z. Qian, A. M. Alaa, and M. van der Schaar, “When and How to Lift the Lockdown? Global COVID- 19 Scenario Analysis and Policy Assessment using Compartmental Gaussian Processes,” arXiv:2005.08837 [physics, stat], Jun. 2020. <a href="http://arxiv.org/abs/2005.08837">http://arxiv.org/abs/2005.08837</a></li> <li>[3] E. Drysdale, D. Singh, and A. Goldenberg, “Forecasting Emergency Department Capacity Constraints for COVID Isolation Beds,” arXiv:2011.06058 [cs], Nov. 2020. <a href="http://arxiv.org/abs/2011.06058">http://arxiv.org/abs/2011.06058</a></li> <li>[4] 数学セミナー2020年9月号. 日本評論社, 2020.</li> <li>[5] 稲葉寿, 感染症の数理モデル, 増補版. 東京: 培風館, 2020.</li> </ul> <div class="footnote"> <p class="footnote"><a href="#fn-0b2c4d52" name="f-0b2c4d52" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">この部分についてはなるべく元の文献に沿う形にした上で他の文献にもいくつか当たるなどして正確を期す努力はしていますが、私は疫学のバックグラウンドはない(物理が専門でした)ことをお断りしておきます。</span></p> </div> morphotech Morpho's 35-hour Projects hatenablog://entry/26006613741112710 2021-05-25T10:00:05+09:00 2023-08-16T13:05:11+09:00 Hi everyone! I am Chamin, a senior boffin research engineer from Morpho's CTO Office. In this post, I will introduce Morpho's way of letting its members do their own fun projects during work time. At Morpho, our designated work time is seven hours a day (averaged over the month). Depending on the nu… <p>Hi everyone! I am Chamin, a senior <del>boffin</del> research engineer from Morpho's CTO Office. In this post, I will introduce Morpho's way of letting its members do their own fun projects during work time.</p> <p>At Morpho, our designated work time is seven hours a day (averaged over the month). Depending on the number of working days in a month, this can result in up to 161 hours a month. Any full-time worker at Morpho is allowed to use up to 20% of this time on a personal project. So long as the project is somehow related to Morpho's business scope, any project idea is fine. If the project needs a bit more time, additional time can be used so long as the total does not exceed 35 hours a month (hence the name, <em>the 35-hour project</em>). Using company resources is fine, as long as it does not delay actual business work. We launched this initiative in 2018 for only the technical staff, and later expanded it to include all regular staff.</p> <p>This is not exactly a new idea. I am sure most of you are going to say "Oh, like Google's <em>20% Project</em>". At the turn of the century, Google allowed its workers to pursue personal projects using up to 20% of their paid work time. However, the concept has its origins at 3M, the company that is well-known for inventing the post-it note. Since 1948, 3M has made it mandatory for employees to use 15% of their work time for independent projects. Several other companies ran, or still have similar projects. Microsoft's <em>Garage</em>, Yahoo's <em>Hack Day</em>, Atlassian's 20% projects, and Apple's <em>Blue Sky</em> are some examples.</p> <p>This is getting crowded, isn't it? There is even a <a href="https://www.barnesandnoble.com/w/the-20-doctrine-ryan-tate/1110856886?ean=9780062003232">book</a> written about this kind of initiatives, if you want to read more about them.</p> <h2 id="Motivation">Motivation</h2> <p>Now, each company above has (or had) its own reasons for launching such initiatives. Let me describe our objectives in launching the 35-hour rule, and how it has benefitted us (Morpho and its workforce).</p> <p>The first reason for launching this initiative is to promote innovation. As a software vendor focusing on software for mobile devices, we can't just sell software and wipe our hands off. Long term support of products, and improvements to match advances in hardware, are critical. We spend a considerable amount of time and effort to support our customers so that our software works the same or better on their newer products. The downside of focusing on support is that there is less motivation to pursue large projects based on new ideas. Personal projects allow workers with innovative ideas to start small, create proof-of-concept prototypes and share them with others. This gives us a wider range to choose from, when deciding on new products to develop. Since the company can pull up a personal project and base a product on it, the 35-hour projects are also called <em>pull projects</em>.</p> <p>The second reason is to provide our members with an opportunity to enhance their skillsets. Assume that you are an engineer at Morpho and you work on our AI products. No doubt, you are already good at machine learning and related skills, and you get a chance to apply and improve them on the job. However, if you want to add computer graphics to your skillset, your work is unlikely to provide that opportunity. Starting a personal project that involves computer graphics will allow you to do that, during company time. And Morpho does not lose anything when employees acquire skills that are less related to their current work. Both technology and technical trends change rapidly, and it's hard to predict what the next product or feature requested by a client is going to be. It's quite common to have some company contact us and ask whether we can develop something to solve a particular problem. When that happens, having well-rounded workers is going to make it easier for us to accept a new challenge and develop a product quickly.</p> <p>There is one more reason that sounds less fancy, but is equally important. Personal projects are a great way to solve small problems in the work environment, thereby improving everyone's productivity. While our management does its best to provide us a good work environment, not all tools that we can buy are perfect. To take an example, if one of us creates a tool that can annotate a single photo a few seconds quicker than what we have now, that's going to translate to hours of time saved for more important work in the long run.</p> <h2 id="Show-and-tell">Show and tell</h2> <p>Alright, so what happens after everyone starts his/her project? About once a year, Morpho organizes a presentation session for these projects. Those who completed their projects, and also those who want to get feedback or help, present their projects in this session. The session is open to everyone in the company, so everybody gets to see the projects. The presentations are free format, and can take anything between two to fifteen minutes.</p> <h2 id="Whats-next">What's next?</h2> <p>The business divisions, and the business development division, take a good look at the projects and pick up projects that can be converted to products. We already have a couple of such products under development. We also get to know more about the skills of our colleagues. If a project is interesting, others may join it.</p> <p>You might have guessed this. Given that we do a lot of AI projects, it is common to use the presentations to get help for collecting data.</p> <h2 id="Examples">Examples</h2> <p>Here are a few projects from past presentation sessions. These will give you an idea of the choices, motivation and also the outcomes of these projects. Sorry that I can't include details of projects that got picked up for further development, but these examples are sufficient to give you an idea.</p> <h3 id="1-USB-depth-camera-with-AI">1. USB depth camera with AI</h3> <p>This is one of my own projects. In a previous project, I designed a small robot that used a camera to detect obstacles and avoid them as it moves. The robot's computer was a Rasberry Pi 3 Model B. My approach to obstacle detection was to use the camera to capture images, estimate scene depth, and adjust the robot's path to avoid nearby objects. Now, there already is a lot of research on Single Image Depth Estimation, and I could easily get working code from Github. However, I ran into a different problem while deploying that on the robot. The Raspberry Pi was already occupied with other tasks -including robot navigation- and depth estimation was too much work. Looking at it more broadly, this problem is not unique to my project. There are many small devices (robots, drones etc.) that do not have enough processing power for computer vision tasks.</p> <p>There are two common approaches to solve this problem. A brute force solution for this problem is to add more processing power to your robot. But in practice, this is not always possible, especially if the robot is an off-the-shelf device. It is also possible to send the images out and get depth estimation done in another computer. But that requires networking, which might be unavailable or slow.</p> <p>I wanted to investigate a third approach. If I could make a USB camera that sends depth images to the robot, it does not have to use computing power to estimate depth. USB ports and support for USB cameras is available on many small computers, so such a camera can be used in many applications. I thought of doing this as an independent project.</p> <p>The technical details of the project needs its own blog post, so I will skip that. To summarize, I made my first prototype with a Raspberry Pi Zero, Raspberry Pi Camera Module, and a dummy surveillance camera. With a few additional electronic components, I could prototype a camera that can send either photos or Depth, or even both to the robot while connecting it with just one USB port. Figure 1 shows the schematic of the hardware design. You can see the actual camera with sample images, in Figure 2.</p> <p><figure class="figure-image figure-image-fotolife" title="Figure 1"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154257.png" width="1200" height="838" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Figure 1</figcaption></figure></p> <p><figure class="figure-image figure-image-fotolife" title="Figure 2"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154323.png" width="1200" height="665" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Figure 2</figcaption></figure></p> <h3 id="2-A-3D-space-viewer-for-a-VR-headset">2. A 3D space viewer for a VR headset</h3> <p>This project was carried out by a member of Morpho's CTO Office. The idea was to integrate computer vision and motion sensing technologies to create a virtual space that can be experienced using an <em>Oculus Quest 2<sup>®</sup></em> VR headset. About 100 still images from an indoor scene were used to create a 3D model of the scene. Orientation and motion sensors of the headset were used to render the VR experience. Figure 3 shows a view rendered from the model of the 3D scene, with three of the photos. You will note that it is somewhat sparse; but hey, this is a prototype.</p> <p><figure class="figure-image figure-image-fotolife" title="Figure 3"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154352.png" width="1200" height="583" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Figure 3</figcaption></figure></p> <h3 id="3-Reminder-bot-for-disinfecting-activities">3. Reminder bot for disinfecting activities</h3> <p>With the COVID-19 pandemic (ongoing at the time of writing), we took several steps to reduce the possibilities of infection within our premises. One such step was to regularly disinfect objects that people touch often (for example, door handles). In an ordinary situation, it is easy to create a round-robin schedule to do something like this. However, some of us were working remotely for a certain number of days, and that could also change at short notice. And there is that human element; we sometimes forget. So, we needed to make sure that disinfecting gets done despite all these limitations.</p> <p>One of our colleagues created a reminder bot that integrates information from several in-house tools, to pick and remind members when it is their turn to do the disinfecting (Figure 4). Right, that's not rocket science. But then, it is a small project that helped a lot of people. And the best thing is that now we do not have to re-invent the wheel when we need to automate something; we have a good template to begin with.</p> <p><figure class="figure-image figure-image-fotolife" title="Figure 4"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210510/20210510154411.png" width="1200" height="380" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Figure 4</figcaption></figure></p> <h2 id="Finally">Finally...</h2> <p>So, that was my attempt to introduce Morpho's 35-hour projects. I hope you now have a rough idea of how we do it.</p> <p>The 35-hour rule has been there for only about three years. Morpho has been continuously monitoring and updating the rules, to ensure that the employees are comfortable with starting and carrying out new projects. We are also planning to provide more resources for such projects.</p> <p>One last thing before I wind up. When companies grow bigger, it gets harder to keep independent project initiatives. Google officially ended the 20% project initiative a few years back, despite the large number of successful products that came out of it. Further, the impact of a successful project gets much lower when it comes to a larger company. If you want to take some time to try your own idea while working, improve your skills, and make a difference, may be you should consider that as one more motivating factor to join Morpho (yes, we are hiring!).</p> <h2 id="Reference">Reference</h2> <p>[1] Ryan Tate. The 20% Doctrine: How Tinkering, Goofing Off, and Breaking the Rules at Work Drive Success in Business. Harper Business, ISBN 978-0-06-200323-2</p> morphotech (文献紹介)デブラー手法の紹介 hatenablog://entry/26006613707135849 2021-04-05T11:10:04+09:00 2023-08-16T13:05:25+09:00 こんにちは、CTO 室リサーチャーの三宅と申します。 モルフォでは、学術論文の輪講を行う「ジャーナルクラブ」という有志による活動があります。今回は、このジャーナルクラブで発表した内容をご紹介いたします。 イメージセンサーの露光中にカメラが動くことで、写真がボケてしまうことをモーションブラーといいます。モーションブラーは、スマホを手持ち撮影すると日常的に生じてしまう現象です。光学的な解決策のひとつとして、シャッタースピードを速くして露光時間を短くするというのがありますが、露光量が減るため今度はノイズが目立ってしまうというトレードオフがあります。したがって、画像処理によってモーションブラーを除去(… <p>こんにちは、CTO 室リサーチャーの三宅と申します。 モルフォでは、学術論文の輪講を行う「ジャーナルクラブ」という有志による活動があります。今回は、このジャーナルクラブで発表した内容をご紹介いたします。</p> <p>イメージセンサーの露光中にカメラが動くことで、写真がボケてしまうことをモーションブラーといいます。モーションブラーは、スマホを手持ち撮影すると日常的に生じてしまう現象です。光学的な解決策のひとつとして、シャッタースピードを速くして露光時間を短くするというのがありますが、露光量が減るため今度はノイズが目立ってしまうというトレードオフがあります。したがって、画像処理によってモーションブラーを除去(デブラー)し、写真をきれいにする手法が必要になります。今回紹介するのは、古典的なモーションブラーモデルを変分ベイズによって解くことで、1枚の入力画像からデブラーを実現する手法 [1] 、そして、複数フレーム画像(動画)を入力として、より精度よくデブラーする深層学習モデルを使った手法 [2] です。</p> <p>[1] <a href="https://dl.acm.org/doi/abs/10.1145/1179352.1141956">Fergus, Rob, et al. "Removing camera shake from a single photograph." ACM SIGGRAPH 2006 Papers. 2006. 787-794.</a></p> <p>[2] <a href="https://link.springer.com/chapter/10.1007/978-3-030-58539-6_12">Zhong, Zhihang, et al. "Efficient spatio-temporal recurrent neural network for video deblurring." European Conference on Computer Vision. Springer, Cham, 2020.</a></p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/KbdNor9tciJeHH" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/YokoOno6/ss-245693082" title="(文献紹介)デブラー手法の紹介" target="_blank">(文献紹介)デブラー手法の紹介</a> </strong> from <strong><a href="//www.slideshare.net/YokoOno6" target="_blank">Morpho, Inc.</a></strong> </div></p> <h3 id="Removing-camera-shake-from-a-single-photograph">Removing camera shake from a single photograph</h3> <p>モーションブラーの古典的なモデルは、観測画像、潜在画像(ボケのない未観測画像)、ブラーカーネルによって記述されます。ブラーカーネルが未知の場合、観測画像という”情報が失われた”入力から、潜在画像とブラーカーネルの両方を推定するという、一見無茶な問題を解かなくてはなりません。本論文では、潜在画像とブラーカーネルに適切な(そして強い)事前分布をおき、ベイズ的に問題を解決しています。しかし、古典的なモデルの限界として、モデルの仮定にそぐわない設定では、アーティファクトが生じることで潜在画像の復元に失敗してしまう点が課題です。この課題は、以降の研究でモデルを拡張する(例えば、ブラーカーネルをセグメントごと・ピクセルごとに求めるなど)ことで解決が試みられています。</p> <h3 id="Efficient-spatio-temporal-recurrent-neural-network-for-video-deblurring">Efficient spatio-temporal recurrent neural network for video deblurring</h3> <p>こちらは設定が変わり、入力が複数フレームになります。デブラーしたい画像の前後の画像を使えるので、推定問題はより易しくなったといえます。この手法では深層学習モデルを用いており、古典的なデブラーで見られるアーティファクトを生じさせないという点で、実用的な手法です。SOTA 精度を達成しながら、アテンションモジュールのアイデアを効果的に用いたことで従来手法よりも軽量化されています。また、提案されたモデルそのものだけでなく、ビームスプリッターという装置を用いて独自にリアルデータセットを取得している点も、面白い内容となっています。</p> morphotech 画像分類タスクにおける半教師有り学習 第2回 hatenablog://entry/26006613686385807 2021-02-15T09:59:57+09:00 2023-08-16T13:06:01+09:00 こんにちは、モルフォリサーチャーの芳賀です。 1回目の記事では半教師有り学習の概要に始まり、ラベル有りデータとラベル無しデータを一度に学習に組み込むone-stage学習に焦点を当て、基本コンセプトである「consistency regularization」「entropy minimization」について具体的な手法を交えて紹介しました。 techblog.morphoinc.com 2回目の記事では最近に至るまでの数々の手法について紹介します。 <p>こんにちは、モルフォリサーチャーの芳賀です。</p> <p>1回目の記事では半教師有り学習の概要に始まり、ラベル有りデータとラベル無しデータを一度に学習に組み込むone-stage学習に焦点を当て、基本コンセプトである「consistency regularization」「entropy minimization」について具体的な手法を交えて紹介しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftechblog.morphoinc.com%2Fentry%2F2020%2F12%2F25%2F113050" title="画像分類タスクにおける半教師有り学習 第1回 - Morpho Tech Blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://techblog.morphoinc.com/entry/2020/12/25/113050">techblog.morphoinc.com</a></cite></p> <p>2回目の記事では最近に至るまでの数々の手法について紹介します。</p> <ul class="table-of-contents"> <li><a href="#Temporal-Ensembling">Temporal Ensembling</a><ul> <li><a href="#手法の説明">手法の説明</a></li> <li><a href="#実験結果">実験結果</a></li> </ul> </li> <li><a href="#Mean-Teacher">Mean Teacher</a><ul> <li><a href="#手法の説明-1">手法の説明</a></li> <li><a href="#実験結果-1">実験結果</a></li> </ul> </li> <li><a href="#Virtual-Adversarial-Training-VAT">Virtual Adversarial Training (VAT)</a><ul> <li><a href="#Adversarial-Training">Adversarial Training</a></li> <li><a href="#Virtual-Adversarial-Training">Virtual Adversarial Training</a></li> <li><a href="#実験結果-2">実験結果</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#参考文献">参考文献</a></li> </ul> <h2 id="Temporal-Ensembling">Temporal Ensembling</h2> <p>前回の記事ではconsistency regularizationの例としてΠ-modelを紹介しました。 Π-modelでは同じ入力画像を2回ネットワークに流して得られた出力同士のMSE(平均二乗誤差)をunsupervised lossとして学習に組み込んでいました。</p> <p>Temporal Ensembling[1]はΠ-modelを処理速度とノイズ耐性に関して改良した手法です。 処理速度に関しては、2回ネットワークに流すうちの片方を1つ前のエポックで出力された結果を活用するということで約2倍高速化させています。 ノイズ耐性に関しては、上記の1つ前のエポックで出力された結果を指数移動平均で更新するというやり方を用いています。</p> <h3 id="手法の説明">手法の説明</h3> <p>以下のΠ-modelとTemporal Ensemblingのフローの比較図を踏まえて、もう少し具体的に見ていきたいと思います。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[1]Figure.1より引用。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202195212.png" width="989" height="389" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[1]Figure.1より引用。</figcaption></figure></p></blockquote> <p>インデックス<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20i" alt=" i"/>の入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_i" alt=" x_i"/>に対しネットワークに流して得られた出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20z_i" alt=" z_i"/>まではΠ-modelと同様ですが、MSEを取るもう片方の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctilde%7Bz%7D_i" alt=" \tilde{z}_i"/>は1つ前のエポックにおける同じ入力に対応する出力から以下のように更新されます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210203/20210203112017.png" width="299" height="81" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20Z" alt=" Z"/>は中間変数で、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha" alt=" \alpha"/>は指数移動平均の係数になります。 2行目の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%201-%5Calpha%5Et" alt=" 1-\alpha^t"/>で割っているものは<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20Z" alt=" Z"/>の初期値のバイアス補正によるものです。 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20Z" alt=" Z"/>はゼロベクトルで初期化しますが、最初の更新(<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20t%20%3D%201" alt=" t = 1"/>)では式を見ると初期値の影響を無視するように<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctilde%7Bz%7D%20%3D%20z" alt=" \tilde{z} = z"/>となっていることがわかります。学習が進むと<img src="https://chart.apis.google.com/chart?cht=tx&chl=%201-%5Calpha%5Et" alt=" 1-\alpha^t"/>は1に近くなっていって指数移動平均の効果が支配的になっていきます。 この補正はOptimizerで有名なAdamでも使われています。</p> <p>以上の変更によりΠ-modelと比較し高速かつノイズに強い学習ができますが、以下のようなデメリットも挙げられています。</p> <ul> <li>入力画像ごとにネットワークの出力を保持するメモリが必要</li> <li>指数移動平均のハイパーパラメータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha" alt=" \alpha"/>が追加</li> </ul> <p>1つ目に関して例えばデータ数10万、分類クラス100の設定の時、出力を64ビットfloatで保持するとして、100000 * 100 * 8 ~ O(100MB)程度のメモリが必要となることから、学習の規模が大きいと厳しい制約になることがわかります。</p> <h3 id="実験結果">実験結果</h3> <p>実験ではCIFAR-10, CIFAR-100, SVHN<a href="#f-9a988f37" name="fn-9a988f37" title="street view house numbers。住居看板の数字データセット。画像中央の数字を当てるタスク等に使われる。">*1</a>のデータセットを用いています。</p> <p>ここではCIFAR-10の結果を紹介します。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[1]Table.1より引用。CIFAR-10による誤分類率の結果。各列は50000個のデータのうちラベル有りデータの数を変えて学習させた結果。誤分類率のばらつきは乱数シードを変えて10回学習させたときの標準偏差で求めている。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202195642.png" width="1028" height="307" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[1]Table.1より引用。CIFAR-10による誤分類率の結果。各列は50000個のデータのうちラベル有りデータの数を変えて学習させた結果。誤分類率のばらつきは乱数シードを変えて10回学習させたときの標準偏差で求めている。</figcaption></figure></p></blockquote> <p>CIFAR-10では50000個のデータのうち4000個のラベル有りデータを用いた学習に対し、今回の手法では誤分類率12.16%を達成しており、既存手法の結果と比較してもその有効性が確認できます。 また、データ拡張を入れたことで4%程度誤分類率が下がっており、改めてデータ拡張の重要性がわかります。 一番右列は全てのデータにラベルを入れて学習させた結果ですが、既存の教師有り学習の結果と比べて良い精度が出ており、教師有り学習においてもconsistency regularizationの考え方は有効であることがわかります。</p> <h2 id="Mean-Teacher">Mean Teacher</h2> <p>Temporal Ensemblingは入力に対する出力を過去のエポックにわたり指数移動平均させたもの<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctilde%7Bz%7D_i" alt=" \tilde{z}_i"/>をunsupervised lossに組み込む手法でした。 しかし<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctilde%7Bz%7D_i" alt=" \tilde{z}_i"/>の更新間隔は1エポックであるため、大きいデータセットの学習では非効率であるという問題点が上げられています。</p> <p>ここで紹介するMean Teacher[2]はこの問題点を克服すべく、ネットワークの重み自体を指数移動平均で1イテレーションごとに更新するという思い切った手法を提案しています。</p> <h3 id="手法の説明-1">手法の説明</h3> <p>以下のMean Teacherの概略図をもとに説明したいと思います。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[2]FIgure.2より引用。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202195921.png" width="1053" height="459" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[2]FIgure.2より引用。</figcaption></figure></p></blockquote> <p>Mean Teacherではstudent modelとteacher modelというものを用意しています。 以下の手順に沿ってイテレーションを回します。</p> <ol> <li>入力データをstudent, teacher両方のモデルに流す</li> <li>入力がラベル有りの場合は出力と教師ラベルとのロスを計算する</li> <li>student modelの出力とteacher modelの出力のconsistency cost(consistency regularizationと同義)を計算する</li> <li>2と3のロスにより誤差逆伝搬でstudent modelの重みを更新する</li> <li>teacher modelの重みを指数移動平均を用いてstudent modelの重みで更新する</li> </ol> <p>Temporal Ensembling同様かなりシンプルな手法であることがわかります。 最終的に推論に使うネットワークはteacher modelを使います。</p> <p>これにより、既存手法と比較し以下の恩恵が得られます。</p> <ul> <li>1イテレーションごとに学習のフィードバックがかかるため<a href="#f-df4dd401" name="fn-df4dd401" title="Temporal Ensemblingも重みの更新は1イテレーションごとでしたが、1エポック前の出力でロスを計算していたため遅いフィードバックとなっていました。">*2</a>、teacher modelの推論結果の精度が高くなる</li> <li>大きなデータセットに対してもオンラインで学習できる</li> </ul> <h3 id="実験結果-1">実験結果</h3> <p>CIFAR-10のデータセットを用いた実験結果は以下になります。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[2]Table.2より引用。表の見方は前節の表と同様。上段4つは既存提案手法の論文からの参照値、下段は著者環境で再構築したモデルで学習させたときの結果を表している。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200026.png" width="965" height="291" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[2]Table.2より引用。表の見方は前節の表と同様。上段4つは既存提案手法の論文からの参照値、下段は著者環境で再構築したモデルで学習させたときの結果を表している。</figcaption></figure></p></blockquote> <p>CIFAR-10において、ラベル有りデータが50000個中1000個というより少ないラベル数の設定での学習で、既存手法より6%程度低い誤分類率を達成しています。</p> <p>ハイパーパラメータである指数移動平均の係数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Calpha" alt=" \alpha"/>(0~1)ですが、実験では学習初期は0.99に設定し、学習が進むにつれて0.999まで徐々に上げていく戦略がうまくいくと報告されています。 これは、学習初期はstudentの精度がどんどん改良していく段階でなるべく新しく学習した重みを重視するようteacherに更新するようにし、学習が成熟した段階で長いスパンでの平均的な重みをteacherに保持させるためという理由から納得できます。</p> <h2 id="Virtual-Adversarial-Training-VAT">Virtual Adversarial Training (VAT)</h2> <p>今回最後に紹介する手法は正則化に焦点を当てたVirtual Adversarial Trainingというものになります。 端的に言うと、入力画像に対し分類器としてのネットワークの出力がもっとも揺らぎやすい方向のノイズを付与しても分類結果が変わらないように制御する学習手法です。 つまり、半教師有り学習の設定でいうと上記のノイズを加えた入力と加えない生の入力との間でconsistency regularizationを考える手法になります。</p> <p>この「出力がもっとも揺らぎやすい方向」をどう考えるかを含めて、まずはAdversarial Trainingから説明したいと思います。</p> <h3 id="Adversarial-Training">Adversarial Training</h3> <p>入力画像にガウシアンノイズを付与するデータ拡張において分類ネットワークの汎化性能は向上しますが、ある特定の方向に対する弱いノイズに対しては予測結果が揺らぎやすいという性質が報告されています。[4] いわゆるadversarial attackというもので、以下のように汎化性能の高いモデルであっても人間の目には検知できない特定の方向(adversarial direction)の弱いノイズが付与された入力に対しては異なる推論結果を出してしまうという例で有名です。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[4]のFigure.1より引用。パンダの入力画像に対し57.7%の信頼度で当てるモデルでも、ロス関数[tex: J]の(入力[tex: x]に関する)勾配方向の符号で決めたノイズを微小に同じパンダ画像に加えると、人間には見分けがつかなくても先ほどのモデルでは99.3%の信頼度でテナガザルだと誤って推論してしまう例。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200432.png" width="883" height="349" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[4]のFigure.1より引用。パンダの入力画像に対し57.7%の信頼度で当てるモデルでも、ロス関数<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20J" alt=" J"/>の(入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x" alt=" x"/>に関する)勾配方向の符号で決めたノイズを微小に同じパンダ画像に加えると、人間には見分けがつかなくても先ほどのモデルでは99.3%の信頼度でテナガザルだと誤って推論してしまう例。</figcaption></figure></p></blockquote> <p>Adversarial Trainingはこのadversarial attackに対する処方として考案されたもので、adversarial directionのノイズを付与させても出力が教師ラベルのそれと近くなるように学習させる手法になります。</p> <p>adversarial trainingでのロスは以下で定義されます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200512.png" width="622" height="100" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_l" alt=" x_l"/>がラベル有りデータ、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20y" alt=" y"/>が教師ラベル、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>がネットワークの重み、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>は分布間の距離でここではcross entropyを想定、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon" alt=" \epsilon"/>が考えうるノイズの絶対値、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Badv%7D" alt=" r_{adv}"/>がadversarial directionのノイズとなります。 また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%28y%7Cx%29" alt=" p(y|x)"/>が入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x" alt=" x"/>に対するネットワークの出力(ベクトル)で、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28y%7Cx%29" alt=" q(y|x)"/>が教師ラベルのベクトルになります。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Badv%7D" alt=" r_{adv}"/>を求める必要がありますが、そのままでは解析的に書けないので以下の近似を施します。</p> <ul> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28y%7Cx_l%29" alt=" q(y|x_l)"/>を教師ラベルのone-hotベクトル<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20h%28y%3By_l%29" alt=" h(y;y_l)"/>とみなす</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r" alt=" r"/>を変数として<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>の一次近似を施す</li> </ul> <p>以上によりcross entropyの勾配を用いて<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Badv%7D" alt=" r_{adv}"/>を計算することができます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200606.png" width="630" height="66" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h3 id="Virtual-Adversarial-Training">Virtual Adversarial Training</h3> <p>virtual adversarial training[3]は先ほどのadversarial trainingを半教師有り学習に応用させた手法になります。</p> <p>consistency regularizationの考えを踏まえて、(1)式(2)式に対し</p> <ul> <li>ラベル有りデータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_l" alt=" x_l"/> → ラベルの有無に関係しない入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x_%2A" alt=" x_*"/></li> <li>真のラベル分布<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20q%28y%7Cx%29" alt=" q(y|x)"/> → 現在のネットワークの出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20p%28y%7Cx%2C%20%5Chat%7B%5Ctheta%7D%29" alt=" p(y|x, \hat{\theta})"/></li> </ul> <p>のように置き換えると以下のようになります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210203/20210203143630.png" width="609" height="117" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Chat%7B%5Ctheta%7D" alt=" \hat{\theta}"/>は現時点でのパラメータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>をfixしたものを表します。 この<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Bvadv%7D" alt=" r_{vadv}"/>がvirtual adversarial perturbationの定義です。 virtualという名前はラベル無しデータの真のラベル分布を仮定するという意味合いで名づけられているそうです。 LDSと書いたロスを下げることは各データ点周辺のラベル分布を滑らかにする効果があり、consistency regularizationに対応するものとなっています。</p> <p>そして、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Bvadv%7D" alt=" r_{vadv}"/>の求め方ですが様々な近似を適用することで以下の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r" alt=" r"/>方向の勾配を用いて表すことができます。 ここでは近似の詳細は省略しますが、論文には数学的に議論されているので気になる方はそちらを参照してください。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200704.png" width="600" height="124" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20d" alt=" d"/>はランダムな初期値ベクトル<a href="#f-cf0fe450" name="fn-cf0fe450" title="ランダムな単位ベクトルで問題ないかと疑問を持たれる方がいると思います。近似の中で本来は[tex: d \leftarrow \nabla_r D(r, x, \hat{\theta})|_{r = \xi d}]で反復的に[tex: d]を[tex: r_{vadv}]方向に調整していくのですが、実験では1回の反復で十分な精度が得られるためこの形式になっています。">*3</a>、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cxi" alt=" \xi"/>は微小な係数です。</p> <p>学習ではLDSのネットワークの重み<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>に関する勾配を知りたいので、アルゴリズムとしては以下のように求めることができます。</p> <ul> <li>入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x" alt=" x"/>を選ぶ</li> <li>ランダムな単位ベクトル<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20d" alt=" d"/>をi.i.d.ガウシアンからサンプリング</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>の<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r" alt=" r"/>に関する<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r%3D%5Cxi%20d" alt=" r=\xi d"/>における勾配<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20g" alt=" g"/>を求める</li> <li>方向<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20g" alt=" g"/>の大きさ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon" alt=" \epsilon"/>のベクトルとして<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Bvadv%7D" alt=" r_{vadv}"/>を計算する</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D" alt=" D"/>に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r%3Dr_%7Bvadv%7D" alt=" r=r_{vadv}"/>を代入しパラメータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Ctheta" alt=" \theta"/>に関する勾配を求める</li> </ul> <p>最終的なロスとしては、上記をミニバッチで平均したものと教師有りロスを足したものになります。</p> <p>以上がvirtual adversarial trainingの手法になります。</p> <h3 id="実験結果-2">実験結果</h3> <p>ここでも概要のみになりますが、CIFAR-10とSHVNでの結果を見てみます。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[3]Table.5より引用。SVHNとCIFAR-10においてデータ拡張を入れて学習させた誤分類率の結果。[tex: N_l]はラベル有りデータの数を表す。下から二行目が今回の手法VATの結果、最下行はVATにEntMinという別の手法を組み合わせた結果。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200728.png" width="588" height="261" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[3]Table.5より引用。SVHNとCIFAR-10においてデータ拡張を入れて学習させた誤分類率の結果。<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20N_l" alt=" N_l"/>はラベル有りデータの数を表す。下から二行目が今回の手法VATの結果、最下行はVATにEntMinという別の手法を組み合わせた結果。</figcaption></figure></p></blockquote> <p>既存手法(Temporal Ensembling)と比較して精度が改善もしくは同程度であることがわかります。</p> <p>以下は実際に入力から計算されたノイズ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Bvadv%7D" alt=" r_{vadv}"/>を入力に施したサンプルになります。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[3]Fig.5の一部より引用。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210202/20210202200755.png" width="992" height="633" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[3]Fig.5の一部より引用。</figcaption></figure></p></blockquote> <p>パラメータである<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon" alt=" \epsilon"/>を増やすとノイズの強度や範囲が画像の重要な部分を中心に大きくなっていくことがわかります。 大きなノイズをかけすぎると不自然な入力になってしまうため、論文ではそれぞれのデータセットで真ん中の列の程度の強度を採用しているようです。</p> <h2 id="まとめ">まとめ</h2> <p>今回はTemporal Ensembling, Mean teacher, VATという半教師有り学習に関する手法を紹介しました。指数移動平均をうまく使ったりadversarial trainingの知見を生かしたりと、個人的に調べていて興味深かったです。</p> <p>次回はMixMatch, ReMixMatch, FixMatchという2019年以降に発表された一連の手法について紹介したいと思います。</p> <h2 id="参考文献">参考文献</h2> <p>[1] <a href="https://arxiv.org/abs/1610.02242">Laine, Samuli, and Timo Aila. "Temporal Ensembling for semi-supervised learning." arXiv preprint arXiv:1610.02242 (2016).</a></p> <p>[2] <a href="https://arxiv.org/abs/1703.01780">Tarvainen, Antti, and Harri Valpola. "Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results." arXiv preprint arXiv:1703.01780 (2017).</a></p> <p>[3] <a href="https://arxiv.org/abs/1704.03976">Miyato, Takeru, et al. "Virtual Adversarial Training: A Regularization Method for Supervised and Semi-Supervised Learning." arXiv preprint arXiv:1704.03976 (2017).</a></p> <p>[4] <a href="https://arxiv.org/abs/1412.6572">Goodfellow, Ian J., Jonathon Shlens, and Christian Szegedy. "Explaining and harnessing adversarial examples." arXiv preprint arXiv:1412.6572 (2014).</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-9a988f37" name="f-9a988f37" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">street view house numbers。住居看板の数字データセット。画像中央の数字を当てるタスク等に使われる。</span></p> <p class="footnote"><a href="#fn-df4dd401" name="f-df4dd401" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">Temporal Ensemblingも重みの更新は1イテレーションごとでしたが、1エポック前の出力でロスを計算していたため遅いフィードバックとなっていました。</span></p> <p class="footnote"><a href="#fn-cf0fe450" name="f-cf0fe450" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">ランダムな単位ベクトルで問題ないかと疑問を持たれる方がいると思います。近似の中で本来は<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20d%20%5Cleftarrow%20%5Cnabla_r%20D%28r%2C%20x%2C%20%5Chat%7B%5Ctheta%7D%29%7C_%7Br%20%3D%20%5Cxi%20d%7D" alt=" d \leftarrow \nabla_r D(r, x, \hat{\theta})|_{r = \xi d}"/>で反復的に<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20d" alt=" d"/>を<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20r_%7Bvadv%7D" alt=" r_{vadv}"/>方向に調整していくのですが、実験では1回の反復で十分な精度が得られるためこの形式になっています。</span></p> </div> morphotech Oculus Quest の Passthrough+ (疑似視点合成) の仕組み hatenablog://entry/26006613677778048 2021-01-18T10:01:50+09:00 2023-08-16T13:06:18+09:00 CTO室で研究開発を担当している松尾と申します。 今回はいつもと若干毛色を変えて Virtual Reality (VR) 関係のトピックを紹介します。 撮影された画像から復元された弊社の休憩スペース <p>CTO室で研究開発を担当している松尾と申します。 今回はいつもと若干毛色を変えて Virtual Reality (VR) 関係のトピックを紹介します。</p> <p><figure class="figure-image figure-image-fotolife" title="撮影された画像から復元された弊社の休憩スペース"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113152834.png" width="1118" height="580" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>撮影された画像から復元された弊社の休憩スペース</figcaption></figure></p> <h2 id="Oculus-Quest-2">Oculus Quest 2</h2> <p>昨年 Oculus Quest 2 が発売されたこともあり、VR関係のトピックが大変盛り上がってきています。</p> <p>Oculus Quest 2 はスタンドアロン型のVRヘッドマウント・ディスプレイであり、 スマートフォンの SoC として定評がある Qualcomm 社の SoC Snapdragon XR2 が採用されています。 特徴としてはリアルタイムで動作する SLAM を搭載していて 数m x 数m のスペースを動き回ってプレイすることが可能です。 またディスプレイサイズは片目 2K と十分な解像度を備えています。 ハードウェア・機能的にも高機能にもかかわらず安価で提供されているため大変魅力的な製品になっています。 (同等性能の携帯 (SoC Snapdragon 865) と比べても半額程度に安価)</p> <p>弊社でもこのデバイスに注目していてプル型開発プロジェクト(社員が自発的に研究活動するプロジェクト)でもデバイスを購入して色々な技術を開発したり試したりしています。(とうとう個人でも買ってしまいました。。)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113144320.jpg" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>デバイス上で開発する以外にも内部システムとして興味深い物が含まれています。</p> <p>一つは Oculus Insight の機能です。これは外部センサの類を一切置く必要がない SLAM (自己位置推定とマップの更新を同時に実行する) システムです。 実際に試してみた感想としてはVRの利用に耐えうる90Hzでの推定が可能、同じ場所を再度認識する能力が高いなどの点で素晴らしいと思いました。 Oculus のホームページによると複数のIMU+カメラと運動予測で対応しているとありその動作原理は大変気になります。</p> <p>他に興味深い機能として Passthrough+ [1] があります。これは設定した移動可能エリアの外に出るとカメラ映像が表示されて周囲の状況が分かる機能です。 一見外部カメラの映像をそのままディスプレイに出しているだけだと思われるのですが、実際には違う場所にあるカメラ映像を合成してヘッドマウントディスプレイに表示する機能になっています。 今回の記事ではこの機能の動作原理について論文を踏まえて紹介します。</p> <h2 id="視点合成">視点合成</h2> <p>近年視点合成(複数のカメラから撮影された画像の合成)はホットなトピックになりつつあります。 NeRF [2] は昨年発表された論文で Radiance Field を CNN で表現してそれを最適化するアプローチであり、生成される画像のリアルさから評判になり後続の研究も次々発表されています。 Free View Synthesis [3] は同じく昨年の論文で事前に SfM でカメラ位置と大まかな三次元構造を復元してから、目標のカメラ位置にワープ(転写)した情報を使って CNN で画像を直接生成するアプローチになります。 このように色々なアプローチが提案されているものの多大な計算量を必要とするアプローチが主流であるため、実アプリケーションまで至っている物はほとんどありません。</p> <p>Oculus Quest 2 にも搭載されている Passthrough+ [1] はカメラの位置関係が固定されていて、 そこまで品質が問われない状況で高速に視点合成を達成する方法を採用しています。</p> <h2 id="Passthrough">Passthrough+</h2> <h3 id="概要">概要</h3> <p>この手法はVRゴーグルの下付きカメラx2から両目位置での視点位置映像を 72 Hz @ CPU 1 core + GPU (Snapdragon 835 (Oculus Quest)) で合成可能な物になっています。 この合成では、他のアプリケーションの動作を阻害しないように、計算リソースをほぼ使っていません。にもかかわらずこの速度を出せるのは驚異的です。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[1] Fig.2 より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113155100.png" width="810" height="330" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption> [1] Fig.2 より引用</figcaption></figure></p></blockquote> <p>上の図からも分かるように両眼(橙)とカメラ(青)の位置・方向が一致していません。</p> <p>全体的な構成としては</p> <ol> <li>ステレオカメラによる Depth 推定 &amp; 時系列的なフィルタリング @ CPU</li> <li>半球上での Depth 補間 @ CPU</li> <li>ステレオレンダリング @ GPU</li> </ol> <p>になっていて、 前方を覆う程度の半球上のメッシュを三次元構成してそれを別位置から見ることで視点合成を達成しています。 高速な動作を達成するために 1-2 は 70 x 70 程度の解像度で実行されます。</p> <h3 id="1-ステレオカメラによる-Depth-推定--時系列的なフィルタリング">1. ステレオカメラによる Depth 推定 &amp; 時系列的なフィルタリング</h3> <p>ステレオカメラ(2眼カメラ)ではそのカメラの位置関係が予め分かっていれば2枚での対応点を検索して、 その画像中での位置の違いを見ることでその点の三次元位置を計算することができます。(三角測量の原理)</p> <p>一般に 2 枚の画像の対応点検索を CPU で処理すると時間がかかりがちなのですが、ここでは SoC に搭載されている H.264 Encoder を利用することで消費電力の削減と処理時間の削減を達成しています。</p> <p>動画の圧縮規格である H.264 では基準となる I フレーム以外は動きと残差を記録することで全体のデータサイズを抑えています。 したがって H.264 の Encoder は 8 x 8 のブロック(マクロブロック)のブロックマッチングを高速に求める H/W ブロックが搭載されており、その結果を利用することで2枚画像の対応点検索を高速に行なうことが可能です。</p> <p><figure class="figure-image figure-image-fotolife" title="H.264 のフレーム間予測のイメージ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113155655.png" width="453" height="186" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>H.264 のフレーム間予測のイメージ</figcaption></figure></p> <p>この対応点検索を行なう2枚画像については歪み補正と平行化と呼ばれる処理を実施した物を入力します。 この前処理を行なうことで1枚の画像の特定の対応点は違う画像での同じ高さの線上に位置することになります。 したがってブロックマッチによって検出された対応点組から同じ高さにあるものだけを抽出する必要があります。</p> <p>他に注意すべき点としては H.264 でのブロックマッチには画像の差分だけではなく動きの大きさも考慮されていることがあります。</p> <p>これらの点を踏まえて以下のような画像が入力されます。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[1] Fig.4 より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113155954.png" width="715" height="723" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[1] Fig.4 より引用</figcaption></figure></p></blockquote> <p>半マクロブロックシフトの組み合わせ4通りが埋め込まれていることが分かります。 ( ( 0, 0 ), ( 0, shift ), ( shift, 0 ), ( shift, shift) )</p> <p>また動きベクトルの妥当性を検証するために逆順でも計算します。(P (左側) -> I (右側) -> I (左側) の順)</p> <p>得られた動きベクトルは1ブロックについて 4 x 2 で 8 通り取得されますが、これらを</p> <ul> <li>L ↔ R で動きベクトルが一致していること</li> <li>動きベクトルの垂直成分が小さいこと</li> </ul> <p>を基準にして選択します。この対応点情報を使うことで物体点の Depth 値の推定をすることが可能になります。</p> <p>ただしこの対応点情報も時系列的にフィルタリングすることで安定性を改善しています。 観測点を使って以下のように点候補を更新します。(各点候補は重みを持っています)</p> <div style="background:#fff; padding:10px; border:2px solid #fc4a1a;"> <ul> <li>各ステップ、点候補に存在する観測点だけを最終的な対応点として使用</li> <li>各ステップ終了時に観測点は以下のアルゴリズムに則り点候補に追加 <ul> <li>観測点で点候補に近い物は重みを増加 </li> <li>点候補に近い物がない場合は重み0で追加</li> <li>観測点が存在しない点候補の重みを削減</li> <li>重みが0より小さくなったものを点候補から削除</li> </ul> </ul> </div> <p>このような手法を取ることで対応点の時系列的な外れ値除去が可能になります。</p> <h3 id="2-半球上での-Depth-の補間">2. 半球上での Depth の補間</h3> <p>前の節で対応点を求めることが可能になりましたが、そのままではスパースな対応点でしかないためメッシュとして三次元表現するためにそれを Dense にします。</p> <p>Depth の補間については様々なアプローチが知られていて最適化による方法の他に CNN によるアプローチも最近は取られています。 <a href="https://techblog.morphoinc.com/entry/2020/11/24/102829">&#xFF08;&#x6587;&#x732E;&#x7D39;&#x4ECB;&#xFF09;Depth Completion&#x306E;&#x6700;&#x65B0;&#x52D5;&#x5411; - Morpho Tech Blog</a></p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="[1] Fig.6 より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113161516.png" width="1074" height="334" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>[1] Fig.6 より引用</figcaption></figure> ここでは前方の半球上のグリッド (70 x 70) で Depth 値を補間します。 実際には、手前側を重要視するようにグリッド上の値を Inverse Depth で計算します。 画像合成の Poisson Matting などと同様に Poisson 方程式を解くことで滑らかな三次元曲面を推定します。 <img src="https://chart.apis.google.com/chart?cht=tx&chl=x" alt="x"/> : グリッド上の Inverse Depth, <img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cbar%7Bx%7D" alt="\bar{x}"/> : 観測点の Inverse Depth, <img src="https://chart.apis.google.com/chart?cht=tx&chl=S" alt="S"/> : 観測点の集合として以下の2次形式の最小化に対応します。 これは停留条件の線形方式を解くことで計算することができ、ここでは SOR 法を採用して計算しています。 (共役勾配法の方が収束性能はよいが計算の都合上 SOR 法の方が結果として高速だったようです)</p></blockquote> <p><figure class="figure-image figure-image-fotolife" title="二次形式の最小化と線形方程式"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20210113/20210113161807.png" width="915" height="73" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>二次形式の最小化と線形方程式</figcaption></figure></p> <p>この最適化問題に対する観測点を</p> <ul> <li>時系列的フィルタリングで得られた点候補 (重みw=1/6)</li> <li>前フレームで得られたポイントを現在位置に射影した点 (重みw=5)</li> </ul> <p>とすることで時間的にさらに平滑化しています。</p> <h3 id="3-ステレオレンダリング">3. ステレオレンダリング</h3> <p>GPU 上で Depth Map の情報からメッシュを生成する部分です。 ヘッドマウントディスプレイなので両眼を設定する必要があり、左目・右目でそれぞれ左カメラ画像・右カメラ画像をテクスチャに設定します。 単一テクスチャの場合に比べて (1) ワープする量が小さくて済むので自然な絵になりやすい (2) 視野の大半をカバーしやすい などの利点がある一方で物体が近距離にあると視覚的に違和感がでやすい欠点があります。</p> <p>その他 CPU と GPU を適切に連携させることで遅延を意識させないような工夫がなされています。 CPU はカメラ映像を即時に GPU に転送、幾何的情報は計算後に転送し、 GPU は情報の更新がない限りは自己位置の情報とテクスチャとメッシュで常にレンダリングを実行し続けます。</p> <h3 id="4-結果">4. 結果</h3> <p>ステレオの計算部分については Rectification (0.6 ms), Motion vectors (2.8 ms), Decoding (1.7 ms), Spatial checks (0.5 ms), Temporal filtering (1.0 ms) と 6.6 ms 程、 Depth 補間については System matrix setup (0.8 ms), Solver (0.7 ms) と 1.5 ms 程でトータルで見ても 9 ms 以下で動作が完結していることが分かります。</p> <p>実際のカメラで撮影されてからディスプレイに表示される時間(photon-to-texture latency)は 49 ms 程度であり、 実体験としても特に違和感がない動画が描画できています。 筆者によるとこの時間が視覚的な違和感につながりやすく、100 ms 程度の場合はかなり遅延があるように見えるそうです。 一方で三次元構造がディスプレイに反映される時間(photon-to-geometry)は 62 ms 程度ですが、この遅延は 100 ms でも特に顕著ではないとのことで興味深い知見になっています。</p> <p>絶対的な精度に関しても 1m 程度の Depth の誤差が 0.02m 程度であり、 それなりの精度が達成できています。</p> <h3 id="5-まとめ">5. まとめ</h3> <p>論文ではリアルタイムかつ低消費電力な視点合成について提案されていて、実際に市販の端末で体験できるものになっています。 視差推定のあたりの H/W の利用方法などかなりエンジニアリング的な方法ですが、実際携帯端末での低消費電力かつ高速な実行を考えると H/W の活用は避けて通れない道です。 論文中でも述べられていますが Optical Flow 計算などについては SoC 側での H/W での機能拡張が進んでいる領域になっておりこれからも活用が進んでいくと思われます。 視点合成の端末での実現もホットなトピックになっていてこれからもキャッチアップしていきたい分野になります。</p> <h3 id="6-引用文献">6. 引用文献</h3> <p>[1] Chaurasia, Gaurav and Nieuwoudt, Arthur and Ichim, Alexandru-Eugen and Szeliski, Richard and Sorkine-Hornung, Alexander, Passthrough+: Real-Time Stereoscopic View Synthesis for Mobile Mixed Reality, in Proceedings of the ACM on Computer Graphics and Interactive Techniques (2020).</p> <p>[2] Ben Mildenhall and Pratul P. Srinivasan and Matthew Tancik and Jonathan T. Barron and Ravi Ramamoorthi and Ren Ng, NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis, ECCV (2020).</p> <p>[3] Gernot Riegler and Vladlen Koltun, Free View Synthesis, ECCV (2020).</p> morphotech 画像分類タスクにおける半教師有り学習 第1回 hatenablog://entry/26006613666849613 2020-12-25T11:30:50+09:00 2023-08-16T13:06:38+09:00 こんにちは、モルフォリサーチャーの芳賀です。 一般に機械学習で精度の高いモデルを作るためにはドメインに応じたたくさんの学習データが必要となります。 しかし実際の業務においては、入力データは容易に集められてもアノテーションコストが問題になる場合があります。 「手元にたくさんデータはあるけどアノテーションが大変。」そういうときにアノテーションラベルが付いていなくても学習データとして使う手法の一つに半教師有り学習(Semi-Supervised Learning)というものがあります。 今回から3回に渡って、画像分類タスクにおいて半教師有り学習がどのように発展を遂げてきたかについて紹介します。 <p>こんにちは、モルフォリサーチャーの芳賀です。</p> <p>一般に機械学習で精度の高いモデルを作るためにはドメインに応じたたくさんの学習データが必要となります。 しかし実際の業務においては、入力データは容易に集められてもアノテーションコストが問題になる場合があります。 「手元にたくさんデータはあるけどアノテーションが大変。」そういうときにアノテーションラベルが付いていなくても学習データとして使う手法の一つに半教師有り学習(Semi-Supervised Learning)というものがあります。</p> <p>今回から3回に渡って、画像分類タスクにおいて半教師有り学習がどのように発展を遂げてきたかについて紹介します。</p> <p>1回目のテーマは、半教師有り学習の概要についてです。 その中でも、ラベル有りデータとラベル無しデータを一度に学習に組み込むone-stage学習に焦点を当てて、基本コンセプトである「consistency regularization」「entropy minimization」について具体的な手法を交えながら解説したいと思います。</p> <ul class="table-of-contents"> <li><a href="#半教師有り学習">半教師有り学習</a></li> <li><a href="#半教師有り学習の分類">半教師有り学習の分類</a><ul> <li><a href="#one-stage">one-stage</a></li> <li><a href="#multi-stage">multi-stage</a></li> </ul> </li> <li><a href="#半教師有り学習の基本コンセプト">半教師有り学習の基本コンセプト</a><ul> <li><a href="#準備">準備</a><ul> <li><a href="#cross-entropy">cross entropy</a></li> <li><a href="#mean-squared-error-MSE">mean squared error (MSE)</a></li> </ul> </li> <li><a href="#entropy-minimization">entropy minimization</a><ul> <li><a href="#Pseudo-label">Pseudo-label</a></li> </ul> </li> <li><a href="#consistency-regularization">consistency regularization</a><ul> <li><a href="#Π-model">Π-model</a></li> </ul> </li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#参考文献">参考文献</a></li> </ul> <h2 id="半教師有り学習">半教師有り学習</h2> <p>半教師有り学習とは、機械学習の分類の一つで、名前の通り教師有り学習と教師無し学習の間となる設定における学習手法になります。 具体的には与えられたデータセットの中で答えとなる教師ラべルが付与されてる一部のラベル有りデータと、通常多数のラベル無しデータを用いてうまく学習を進めていく仕組みのことを指します。</p> <p><figure class="figure-image figure-image-fotolife" title="各学習手法の違い。半教師有り学習では一部のデータのみラベルにアクセスできる状況で学習を行う。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201218/20201218165152.png" width="897" height="358" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>各学習手法の違い。半教師有り学習では一部のデータのみラベルにアクセスできる状況で学習を行う。</figcaption></figure></p> <p>このような設定の需要として例として以下の3点が上げられます。</p> <ul> <li>アノテーションコストの低減</li> <li>アノテーションの属人性の排除</li> <li>ビッグデータの活用</li> </ul> <p>やはり効果として大きいのは1つめのアノテーションコストの低減なのではないでしょうか。学習の入力となるデータを集めることは比較的コストが低いですが、人の手で数千数万ものデータに分類クラスやBoundingBoxなどラベルを付与する作業は非常にコストが高いのでなるだけ避けたい作業ではあります。 かといってラベルのついてないデータをみすみす使わないのはもったいないので、ラベルのついてないデータもなんとか学習に組み込めないかというモチベーションで半教師有り学習の研究が進んでいます。</p> <p>では、手元に十分なラベル有りデータがある場合は半教師有り学習について考える意義は無いのでしょうか? 答えはNoで、実は半教師有り学習の知見を入れた教師有り学習を行うと精度が上がるという報告もあるため、知識として知っていて損はないと思います。</p> <h2 id="半教師有り学習の分類">半教師有り学習の分類</h2> <p>以降では、画像認識タスクに焦点を当てて解説していきます。 文献[1]では半教師有り学習を学習戦略の観点から主に2種類に分類しています。</p> <ul> <li>one-stage</li> <li>multi-stage</li> </ul> <h3 id="one-stage">one-stage</h3> <p>one-stageは1回の学習プロセスで分類器を作ります。 具体的には、ラベル有りデータとラベル無しデータをまとめて扱ってそれぞれうまくロスを設計することで一度に学習を進めるアプローチです。</p> <h3 id="multi-stage">multi-stage</h3> <p>multi-stageは少なくとも2段階の学習プロセスを経て最終的な分類器を作ります。 1段階目ではラベル情報を用いずに自己教師有り学習(self-supervised)によるデータの潜在的な表現を学習させます。 この段階で行う学習タスクをpretext taskと呼んだりもします<a href="#f-f7249141" name="fn-f7249141" title="pretext taskは例えば入力画像の回転(0°, 90°, 180°, 270°)を推定するものやジグソーパズルを解かせるタスクなどが提案されています。">*1</a>。</p> <p>そして最終段階では前段階でのモデルと教師ラベルを用いてfine tuningを行い最終的な分類器を学習させます。</p> <hr /> <p>本記事は手法としてシンプルなone-stageの学習戦略を採用した手法に絞って解説したいと思います。 しかしone-stageとmulti-stageを明確に分ける意味はなく、単なる一つの分類として捉えていただければと思います。</p> <h2 id="半教師有り学習の基本コンセプト">半教師有り学習の基本コンセプト</h2> <p>ラベル無しデータをどのように学習に組み込むかが気になるところだと思います。 基本的にはラベル無しデータのラベルをなんらかの手法で推定してロスに組み込んだり、ラベル無しデータの出力に正則化による制約をかけたりします。 半教師有り学習では、以下に挙げる2種類のコンセプトを用いてラベル無しデータを学習に組み込んでいます。</p> <ul> <li>entropy minimization</li> <li>consistency regularization</li> </ul> <p>上記の概念をベースとなる具体的な手法と交えて解説したいと思います。</p> <h3 id="準備">準備</h3> <p>まずは準備としておなじみの損失関数として使われる計算式を定義しておきます。</p> <h4 id="cross-entropy">cross entropy</h4> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%0ACE%28y%2C%20%5Chat%7By%7D%29%20%3D%20-y%20%5Clog%20%5Chat%7By%7D%20-%20%281%20-%20y%29%20%5Clog%20%281%20-%20%5Chat%7By%7D%29%0A" alt="\displaystyle CE(y, \hat{y}) = -y \log \hat{y} - (1 - y) \log (1 - \hat{y}) "/></p> <p>状況に応じて変数の解釈は異なりますが、基本的には<img src="https://chart.apis.google.com/chart?cht=tx&chl=y" alt="y"/>が教師ラベルとなるone-hotベクトルで<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Chat%7By%7D" alt="\hat{y}"/>がモデルの出力ベクトルを想定しています。</p> <h4 id="mean-squared-error-MSE">mean squared error (MSE)</h4> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%0AMSE%28z%2C%20%5Ctilde%7Bz%7D%29%20%3D%20%7C%7C%20z%20-%20%5Ctilde%7Bz%7D%20%7C%7C_2%5E%7B2%7D%0A" alt="\displaystyle MSE(z, \tilde{z}) = || z - \tilde{z} ||_2^{2} "/></p> <p>こちらも状況に応じて変数の解釈は異なりますが、<img src="https://chart.apis.google.com/chart?cht=tx&chl=z%2C%20%5Ctilde%7Bz%7D" alt="z, \tilde{z}"/>としてモデルの出力ベクトルを想定しています。</p> <h3 id="entropy-minimization">entropy minimization</h3> <p>一つ目のコンセプトとしてentropy minimizationがあります。 これは、モデルから出力される予測の信頼度を高くするように導く考え方のことです。 信頼度の高い予測というのは、分類タスクの場合出力ベクトル<a href="#f-855a6e18" name="fn-855a6e18" title="教師有り学習におけるSoftmaxレイヤーの入力であるロジットを想定">*2</a>のエントロピーが小さい状態と捉えることができます。</p> <p><figure class="figure-image figure-image-fotolife" title="確率分布とエントロピー"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201218/20201218183207.png" width="401" height="171" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>確率分布とエントロピー</figcaption></figure></p> <p>ある確率変数の取りうる離散確率分布が<img src="https://chart.apis.google.com/chart?cht=tx&chl=p%3D%28p_1%2C%20%5Cldots%2C%20p_d%29" alt="p=(p_1, \ldots, p_d)"/>と表されるときのエントロピー<img src="https://chart.apis.google.com/chart?cht=tx&chl=H%28p%29" alt="H(p)"/>は数式では以下のように表されます。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%0AH%28p%29%20%3D%20%5Csum_%7Bi%3D1%7D%5E%7Bd%7D%20-p_i%20%5Clog%20p_i%0A" alt="\displaystyle H(p) = \sum_{i=1}^{d} -p_i \log p_i "/></p> <p>ここでいう確率分布は「入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=x" alt="x"/>が分類クラス<img src="https://chart.apis.google.com/chart?cht=tx&chl=c%5Cin%20C" alt="c\in C"/>である確率<img src="https://chart.apis.google.com/chart?cht=tx&chl=P%28c%7Cx%29" alt="P(c|x)"/>」と解釈できるため、画像<img src="https://chart.apis.google.com/chart?cht=tx&chl=x" alt="x"/>を入力したときのモデルの出力ベクトルに相当します。 ラベル有りデータの教師ラベルは通常one-hotベクトルで表すことができ、<img src="https://chart.apis.google.com/chart?cht=tx&chl=H%28p%29%20%3D%200" alt="H(p) = 0"/>の最もエントロピーが下がった状態と言えます。 一方で<img src="https://chart.apis.google.com/chart?cht=tx&chl=p_i" alt="p_i"/>のどの要素も等確率な状態のエントロピーは、計算すると<img src="https://chart.apis.google.com/chart?cht=tx&chl=H%28p%29%20%3D%20%5Clog%20d" alt="H(p) = \log d"/>となりエントロピー最大値を取ります。</p> <p>したがって、信頼度の高い出力ベクトルになるよう制御するentropy minimiazationのアイデアは、ラベル無しデータの扱いにとって重要になります。</p> <h4 id="Pseudo-label">Pseudo-label</h4> <p>entropy minimiaztionをimplicitに組み込んだ代表的な例としてPseudo-label[2]という手法が2013年の論文で提案されました。<a href="#f-deeaa664" name="fn-deeaa664" title="Pseudo-labelのことを「ラベル無しデータに対する推定ラベル」という意味合いで用いる文献もあるので注意が必要ですが、基本的にはPseudo-labelは本論文の手法のことを指します。">*3</a></p> <p>当時は半教師有り学習といえば、教師無し学習によるpre-trainingフェーズと教師有り学習を用いたfine-tuningフェーズの二段階構成(multi-stage)で行う手法が多く、うまくone-stageでラベル有り無しデータひっくるめて学習できないかというモチベーションで提案されています。</p> <p>具体的には、Pseudo-labelとはモデルからの出力を「最も出力値の高いラベルを1に他を0にするone-hotベクトル」に変換することによりラベル無しデータのラベルを推定する手法で、図示すると以下のように表されます。</p> <p><figure class="figure-image figure-image-fotolife" title="モデルの出力[tex: y]から作られるPseudo-label[tex: \hat{y}]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201218/20201218183440.png" width="411" height="171" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>モデルの出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Chat%7By%7D" alt=" \hat{y}"/>から作られるPseudo-label <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Chat%7By%7D%5E%7B%5Cprime%7D" alt=" \hat{y}^{\prime}"/></figcaption></figure></p> <p>学習に組み込む際のロス<img src="https://chart.apis.google.com/chart?cht=tx&chl=L" alt="L"/>は以下のように計算します。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%0AL%20%3D%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bm%3D1%7D%5En%20%5Csum_%7Bi%3D1%7D%5EC%20CE%28y_i%5Em%2C%20f%28x_i%5Em%29%29%20%2B%20%5Calpha%28t%29%20%5Cfrac%7B1%7D%7Bn%5E%7B%5Cprime%7D%7D%20%5Csum_%7Bm%3D1%7D%5E%7Bn%5E%7B%5Cprime%7D%7D%20%5Csum_%7Bi%3D1%7D%5EC%20CE%28y_i%5E%7B%5Cprime%20m%7D%2C%20f%28x_i%5E%7B%5Cprime%20m%7D%29%29%0A" alt="\displaystyle L = \frac{1}{n} \sum_{m=1}^n \sum_{i=1}^C CE(y_i^m, f(x_i^m)) + \alpha(t) \frac{1}{n^{\prime}} \sum_{m=1}^{n^{\prime}} \sum_{i=1}^C CE(y_i^{\prime m}, f(x_i^{\prime m})) "/></p> <p>分類器<img src="https://chart.apis.google.com/chart?cht=tx&chl=f" alt="f"/>、分類クラス数<img src="https://chart.apis.google.com/chart?cht=tx&chl=C" alt="C"/>として、 ミニバッチ内のラベル有りデータについて</p> <ul> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=n" alt="n"/>:データ数</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i%5Em" alt="x_i^m"/>:入力画像</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=y_i%5Em" alt="y_i^m"/>:教師ラベル</li> </ul> <p>同じくミニバッチ内のラベル無しデータについて</p> <ul> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=n%5E%7B%5Cprime%7D" alt="n^{\prime}"/>:データ数</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i%5E%7B%5Cprime%20m%7D" alt="x_i^{\prime m}"/>:入力画像</li> <li><img src="https://chart.apis.google.com/chart?cht=tx&chl=y_i%5E%7B%5Cprime%20m%7D" alt="y_i^{\prime m}"/>:モデルの出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=f%28x_i%5E%7B%5Cprime%20m%7D%29" alt="f(x_i^{\prime m})"/>に対し作ったPseudo-label</li> </ul> <p>を表します。</p> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Calpha%28t%29" alt="\alpha(t)"/>はエポック数<img src="https://chart.apis.google.com/chart?cht=tx&chl=t" alt="t"/>が進むにつれてラベル無しデータのロスの割合を大きくする効果を与えるパラメータで、他の手法でも同じような仕組みが採用されています。 学習の初期においては信頼度の低い出力しか得られないため、そこからPseudo-labelを作ってしまうことによる悪影響を防ぐためのものと考えると納得できます。</p> <h3 id="consistency-regularization">consistency regularization</h3> <p>二つ目は、consistency regularizationという正則化の手法です。 同じ画像に対し異なる摂動を加えても、モデルに流したときの出力が似たような予測になるべきという仮定のもとの正則化です。 ここでいう摂動とはデータ拡張やDropout正則化、または明示的にガウシアンノイズを加えるといった内容を指します。(この点は論文によって指す内容が異なります)</p> <p>ここではconsistency regularizationを提唱した論文として有名な1つの具体的な手法について紹介したいと思います。</p> <h4 id="Π-model">Π-model</h4> <p>consistency regularizationの考えを半教師有り学習に組み込んだ例としてΠ-model[3, 4]という手法が提案されています。<a href="#f-2389f2cf" name="fn-2389f2cf" title="Π-modelという名前を付けているのは[3]の論文ですが、オリジナルのアイデアは[4]の論文で提案されており、前者は後者の簡易的なケースを考えているものとなっています。 本記事では説明の関係上、前者の提案手法をもとに解説したいと思います。">*4</a></p> <p>Π-modelでは学習の順伝搬時の確率的な挙動、つまりランダムに学習ノードの接続を落とすDropout正則化やランダムに入力を変化させるデータ拡張などの特性を活かし、異なる2回の順伝搬でパスの違いはあるものの出力が同じであるべきという信念で学習を設計しています。</p> <p>Π-modelの具体的な学習のイテレーションについても以下の論文内の図と合わせて見ていきましょう。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="Π-model全体図:[3]より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201218/20201218191230.png" width="1018" height="194" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Π-model全体図:[3]より引用</figcaption></figure></p></blockquote> <p>分類クラス数<img src="https://chart.apis.google.com/chart?cht=tx&chl=C" alt="C"/>、ミニバッチを<img src="https://chart.apis.google.com/chart?cht=tx&chl=B" alt="B"/>、その中のラベル有りデータの集合を<img src="https://chart.apis.google.com/chart?cht=tx&chl=L" alt="L"/>とします。</p> <ol> <li>入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i" alt="x_i"/>に対しデータ拡張<img src="https://chart.apis.google.com/chart?cht=tx&chl=g" alt="g"/>を行いモデル<img src="https://chart.apis.google.com/chart?cht=tx&chl=f_%7B%5Ctheta%7D" alt="f_{\theta}"/>に流し出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=z_i%20%3D%20f_%7B%5Ctheta%7D%28g%28x_i%29%29" alt="z_i = f_{\theta}(g(x_i))"/>を得る。(<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctheta" alt="\theta"/>はモデルのパラメータを指します)</li> <li>同じ入力<img src="https://chart.apis.google.com/chart?cht=tx&chl=x_i" alt="x_i"/>に対し1.と同様の処理を行い出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Ctilde%7Bz%7D_i%20%3D%20f_%7B%5Ctheta%7D%28g%28x_i%29%29" alt="\tilde{z}_i = f_{\theta}(g(x_i))"/>を得る。(データ拡張やDropoutのランダム性から全く同じ出力になるわけではないことに注意)</li> <li>consistency regularizationの項として二乗誤差<img src="https://chart.apis.google.com/chart?cht=tx&chl=MSE%28z_i%2C%20%5Ctilde%7Bz%7D_i%29%20%3D%20%7C%7C%20z_i%20-%20%5Ctilde%7Bz%7D_i%20%7C%7C_2%5E2" alt="MSE(z_i, \tilde{z}_i) = || z_i - \tilde{z}_i ||_2^2"/>を計算する</li> <li>入力がラベル有りのデータならばラベル<img src="https://chart.apis.google.com/chart?cht=tx&chl=y_i" alt="y_i"/>と片方の出力<img src="https://chart.apis.google.com/chart?cht=tx&chl=z_i" alt="z_i"/>に対しcross entropy <img src="https://chart.apis.google.com/chart?cht=tx&chl=CE%28y_i%2C%20z_i%29" alt="CE(y_i, z_i)"/>を計算する</li> <li>ミニバッチごとに以下のロス<img src="https://chart.apis.google.com/chart?cht=tx&chl=loss" alt="loss"/>を計算して誤差逆伝搬を行う。 <img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%0Aloss%20%3D%20-%5Cfrac%7B1%7D%7B%7CB%7C%7D%5Csum_%7Bi%5Cin%20B%5Ccap%20L%7D%20CE%28y_i%2C%20z_i%29%20%2B%20w%28t%29%20%5Cfrac%7B1%7D%7BC%7CB%7C%7D%20%5Csum_%7Bi%5Cin%20B%7D%20MSE%28z_i%2C%20%5Ctilde%7Bz%7D_i%29%0A" alt="\displaystyle loss = -\frac{1}{|B|}\sum_{i\in B\cap L} CE(y_i, z_i) + w(t) \frac{1}{C|B|} \sum_{i\in B} MSE(z_i, \tilde{z}_i) "/></li> </ol> <p>ロスの第二項がconsistency regularizationを表します<a href="#f-5d4b664e" name="fn-5d4b664e" title="3.のconsistency regularizationでなぜCEではなくMSEなのか?と私は疑問に思いました。 論文によるとMSEはCEと比べてやや罰則が弱いが実験結果としてはMSEを用いたほうが良い結果が出たと述べています。">*5</a>が、入力がラベル有りデータならば第一項のcross entropyをロスに寄与させるというような形になります。</p> <p>また、<img src="https://chart.apis.google.com/chart?cht=tx&chl=w%28t%29" alt="w(t)"/>はPseudo-labelでの<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Calpha%28t%29" alt="\alpha(t)"/>と同じような役割で最初0から始めてどんどん大きくしていく関数を採用します。</p> <h2 id="まとめ">まとめ</h2> <p>今回は以上です。</p> <p>半教師有り学習の「consistency regularization」「entropy minimization」の考え方は一般の学習にも応用できそうに感じました。</p> <p>次回は、最近の手法に至るまでの数々の手法について紹介したいと思います!</p> <h2 id="参考文献">参考文献</h2> <p>[1] <a href="https://arxiv.org/abs/2002.08721">Schmarje, Lars et al. “A survey on Semi-, Self- and Unsupervised Learning for Image Classification.” (2020).</a></p> <p>[2] <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.664.3543&amp;rep=rep1&amp;type=pdf">Lee, Dong-Hyun. "Pseudo-Label: The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks."</a></p> <p>[3] <a href="https://arxiv.org/abs/1610.02242">Laine, Samuli, and Timo Aila. "Temporal ensembling for semi-supervised learning." arXiv preprint arXiv:1610.02242 (2016).</a></p> <p>[4] <a href="https://arxiv.org/abs/1606.04586">Sajjadi, Mehdi et al. "Regularization With Stochastic Transformations and Perturbations for Deep Semi-Supervised Learning." arXiv preprint arXiv:1606.04586 (2016).</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-f7249141" name="f-f7249141" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">pretext taskは例えば入力画像の回転(0°, 90°, 180°, 270°)を推定するものやジグソーパズルを解かせるタスクなどが提案されています。</span></p> <p class="footnote"><a href="#fn-855a6e18" name="f-855a6e18" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">教師有り学習におけるSoftmaxレイヤーの入力であるロジットを想定</span></p> <p class="footnote"><a href="#fn-deeaa664" name="f-deeaa664" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">Pseudo-labelのことを「ラベル無しデータに対する推定ラベル」という意味合いで用いる文献もあるので注意が必要ですが、基本的にはPseudo-labelは本論文の手法のことを指します。</span></p> <p class="footnote"><a href="#fn-2389f2cf" name="f-2389f2cf" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">Π-modelという名前を付けているのは[3]の論文ですが、オリジナルのアイデアは[4]の論文で提案されており、前者は後者の簡易的なケースを考えているものとなっています。 本記事では説明の関係上、前者の提案手法をもとに解説したいと思います。</span></p> <p class="footnote"><a href="#fn-5d4b664e" name="f-5d4b664e" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">3.のconsistency regularizationでなぜCEではなくMSEなのか?と私は疑問に思いました。 論文によるとMSEはCEと比べてやや罰則が弱いが実験結果としてはMSEを用いたほうが良い結果が出たと述べています。</span></p> </div> morphotech (文献紹介)Depth Completionの最新動向 hatenablog://entry/26006613641097950 2020-11-24T10:28:29+09:00 2023-08-16T13:07:06+09:00 こんにちは、CTO室リサーチャーの角田です。 私は、今年4月に新卒としてモルフォに入社しました。3ヶ月の OJT が終了し、現在私は測距センサーの情報を用いることで画像処理品質を向上させるための研究開発に取り組んでいます。この分野では “Depth Completion”と呼ばれる手法の研究が行われています。研究の一環として、この“Depth Completion”に関連する論文調査を行いましたので、本エントリにて概要を紹介させて頂きます。 Depth Completion 近年のモバイル端末はカメラの進化が著しいですが、近年ではLiDARやToFといった測距センサーも搭載されており、それらに… <p>こんにちは、CTO室リサーチャーの角田です。</p> <p>私は、今年4月に新卒としてモルフォに入社しました。3ヶ月の OJT が終了し、現在私は測距センサーの情報を用いることで画像処理品質を向上させるための研究開発に取り組んでいます。この分野では “Depth Completion”と呼ばれる手法の研究が行われています。研究の一環として、この“Depth Completion”に関連する論文調査を行いましたので、本エントリにて概要を紹介させて頂きます。</p> <h1 id="Depth-Completion">Depth Completion</h1> <p>近年のモバイル端末はカメラの進化が著しいですが、近年ではLiDARやToFといった測距センサーも搭載されており、それらにより画像に3次元的な情報を付与することができるようになりました。ただし測距センサーの弱点として</p> <ul> <li><p>depthを部分的にしか測定できない</p></li> <li><p>解像度が低い</p></li> </ul> <p>という側面があり、RGB画像と同程度の情報を得るには至っていません。</p> <p><figure class="figure-image figure-image-fotolife" title="RGB画像とそれに対応するToF画像"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104162542.jpg" width="640" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104162628.png" width="640" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>RGB画像とそれに対応するToF画像</figcaption></figure></p> <p>そこで、測距センサーの出力をRGB画像並みに補完する<b>"depth completion"</b>という手法が近年盛んに研究されていまます。以下ではECCV2020に採択された以下の論文の概略と、実装を動かしてみた所感を紹介します。</p> <p><a href="http://www.ecva.net/papers/eccv_2020/papers_ECCV/papers/123580120.pdf">JJ. Park, K. Joo, Z. Hu, C.-K. Liu, and I. S. Kweon.: Nonlocal spatial propagation network for depth completion</a></p> <h1 id="概略">概略</h1> <ul> <li><p>RGB画像とdepth画像からdenseなdepth推定を(UNet的な簡単なネットワークで)素朴に行い、その後に複数回refinementをかける</p></li> <li><p>refinement時に単純に周囲8ピクセルの重み付き平均を取るのではなく、例えば柱なら縦方向のみを近傍と見なして、refinementするのに最適な近傍系をニューラルネットワークで求める</p></li> <li><p>refinementが収束するように逐一重みの正規化をする必要があるが、その正規化の仕方を工夫して表現力が落ちないようにしている</p></li> <li><p>denseなdepth mapと同時に信頼度画像も求めることで、occlusionを回避する</p></li> <li><p>refinement含めてend-to-endに学習させる</p></li> </ul> <h1 id="内容の詳細">内容の詳細</h1> <iframe src="//www.slideshare.net/slideshow/embed_code/key/xiN0VsMFbuwdfQ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/YokoOno6/depth-completion" title="(文献紹介)Depth Completionの最新動向" target="_blank">(文献紹介)Depth Completionの最新動向</a> </strong> from <strong><a href="https://www.slideshare.net/YokoOno6" target="_blank">Morpho, Inc.</a></strong> </div></p> <p>論文のより詳細な概要については上のスライドをご覧ください。とにかく重要なのはdepth completionをrefinementの問題と捉えた点だと思います。従来手法はネットワーク構造を工夫して推論精度を上げる側面が強かったですが、この手法はrefinementにメインが置かれているので、出力が非常に高品質です。実際の結果は以下に掲載しましたのでご覧ください。</p> <h1 id="実装を動かしてみた">実装を動かしてみた</h1> <p>著者による実装が公開されています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fzzangjinsun%2FNLSPN_ECCV20" title="GitHub - zzangjinsun/NLSPN_ECCV20: Park et al., Non-Local Spatial Propagation Network for Depth Completion, ECCV, 2020" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/zzangjinsun/NLSPN_ECCV20">github.com</a></cite></p> <p>特に環境整備は困らなかったので、GPUをお持ちの方はぜひ試してみてください。以下は最初のdepth推定画像からrefinementを数回かけるごとの中間出力です。下画像左から二枚目に見える粒粒がsparse depth mapの入力から来ているものなのですが、それらがうまく拡散されていることがわかります。</p> <p><figure class="figure-image figure-image-fotolife" title="ToF画像(未掲載)のリファインメントを行った結果。左からRGB画像、最初のdepth推定結果、refinement3回目、6回目、18回目"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104202442.png" width="304" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104202340.png" width="304" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104202358.png" width="304" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104202407.png" width="304" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20201104/20201104202410.png" width="304" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>ToF画像(未掲載)のリファインメントを行った結果。左からRGB画像、最初のdepth推定結果、refinement3回目、6回目、18回目</figcaption></figure></p> <p>動かしてみると良い点に加えていくつか課題も見えてきたので、それを共有して本稿を締めくくろうと思います。</p> <ul> <li><p>良い点</p> <ul> <li><p>エッジ保存性は抜群に良く、また細かいテクスチャをしっかり拾ってくれます。</p></li> <li><p>refinementは経験的に18回かけるのが最適と著者が明言しており、メモリアクセス時間がかかることを懸念しましたが、意外と実行時間はかかりませんでした。</p></li> <li><p>ToFはRGB画像とほぼ同時で入力に加えているため、ToFがネットワーク内部でRGB画像と混ざり合ってToFのsparseな情報がぼやけてしまう(すなわちToFの影響が陽に現れてくるのか非自明の)ように思えましたが、不思議とネットワークはToFの結果を有意に用いていることがrefinement前の画像から確認できます。</p></li> </ul> </li> <li><p>問題点</p> <ul> <li><p>sparseな点群はdenseなdepth mapから500点サンプリングして作成しているのですが、サンプリングは画像から一様にされるため、depthの大きな欠損領域がある場合の考慮がされていません。実際そのようなToF画像を入力すると出力がかなりぼやけます。</p></li> <li><p>RGB画像とToF画像を最初のあたりでconcatenateしていますが、ダウンサンプリングしきった段階でconcatenateした方がToF画像のノイズの影響を受けにくく、なおかつ大域的な情報が得やすいように思います。</p></li> </ul> </li> </ul> <p>総じて内容は素晴らしいと思います。本筋とはずれますが<b>特にGitHubの実装が非常に美しく</b>、dataloader, model, loss, metricといった役割ごとにフォルダ整理がきれいにされていて、余分なimportがされないようカプセル化のような仕組みが施されています。さらに学習結果をフォルダに保存する際は日付がフォルダ名に付加されるようになっており、スムーズに研究が行える仕様に感激しました。</p> <p>上述の通り、残念ながらToFの欠損領域が大きいとrefinementが機能しないため、本手法をそのまま実務に応用することはできませんでした。しかしながら構造は簡潔なため応用の幅は広がりそうです。特にrefinementの核であるdeformable convolution(スライド参照)はこの論文の筆頭著者が他の研究にも多用しているようで、探せば色々と有意義な使い方が見つかるのではないでしょうか。</p> morphotech (文献紹介)深層学習による動被写体ロバストなカメラの動き推定 hatenablog://entry/26006613646715251 2020-11-17T11:02:35+09:00 2023-08-16T13:07:22+09:00 こんにちは、CTO 室リサーチャーの三宅と申します。モルフォでは、学術論文の輪講を行う「ジャーナルクラブ」という有志による活動があります。今回は、このジャーナルクラブで発表した内容をご紹介いたします。画像処理では、複数の画像を入力としたときに「それらを映したカメラの動き」を推定する問題がさまざまな用途で重要になります。ある幾何的性質を満たした画像間でカメラの動きを記述するモデルはありますが、実際に我々が推定に用いる画像は、そのようなきれいな性質を満たしているとは限りません。難しい設定の最たる例が「動いている被写体を動いているカメラで映す」場合です。今回ご紹介する論文は、今年の CVPR で発表… <p>こんにちは、CTO 室リサーチャーの三宅と申します。モルフォでは、学術論文の輪講を行う「ジャーナルクラブ」という有志による活動があります。今回は、このジャーナルクラブで発表した内容をご紹介いたします。画像処理では、複数の画像を入力としたときに「それらを映したカメラの動き」を推定する問題がさまざまな用途で重要になります。ある幾何的性質を満たした画像間でカメラの動きを記述するモデルはありますが、実際に我々が推定に用いる画像は、そのようなきれいな性質を満たしているとは限りません。難しい設定の最たる例が「動いている被写体を動いているカメラで映す」場合です。今回ご紹介する論文は、今年の CVPR で発表された、動被写体が映っているシーンでもきれいにカメラの動きを推定する深層学習手法について論じたものです。</p> <p><a href="https://ieeexplore.ieee.org/document/9157755">H. Le, F. Liu, S. Zhang and A. Agarwala, "Deep Homography Estimation for Dynamic Scenes," 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), Seattle, WA, USA, 2020, pp. 7649-7658.</a></p> <h1 id="Deep-Homography-Estimation-for-Dynamic-Scenes">Deep Homography Estimation for Dynamic Scenes</h1> <iframe src="//www.slideshare.net/slideshow/embed_code/key/tvrTH5iH7AG091" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/YokoOno6/ss-239287864" title="(文献紹介)深層学習による動被写体ロバストなカメラの動き推定" target="_blank">(文献紹介)深層学習による動被写体ロバストなカメラの動き推定</a> </strong> from <strong><a href="https://www.slideshare.net/YokoOno6" target="_blank">Morpho, Inc.</a></strong> </div></p> <p>カメラの動きやそれによる画像の変換は、物体が遠くにあってカメラのみが動く場合などでは、ホモグラフィーと呼ばれる 3x3 の行列で記述されます。 本論文では、動被写体ロバストなホモグラフィー推定のための「深層学習モデルのアーキテクチャ」と「データセットの作成方法」が提案されています。深層学習モデルのアーキテクチャは要約すると以下のようになります。</p> <ol> <li>グレースケール画像 2 枚を U-net のようなベースネットワークに入力しホモグラフィーと動被写体領域を出力する。</li> <li>多重解像度化し、各解像度におけるベースネットワークをカスケード処理で接続する。</li> <li>ホモグラフィーと動被写体領域の出力を用いて、マルチタスク学習を行う。</li> </ol> <p>このモデルによって、入力画像に対し動被写体領域を推定すると同時に、背景領域の変換ホモグラフィーを精度よく推定することが可能になりました。また多重解像度化することで、ある程度大きな動きの推定にも対応しました。もうひとつのトピックであるデータセットの作成方法は要約すると以下のようになります。</p> <ol> <li>動画サイトから動画を取得し、カメラは固定されているが被写体は動いているクリップを検出する。</li> <li>クリップをフレームに分割し、それぞれホモグラフィー変換によって疑似的にカメラ位置を変えた画像を生成する。</li> <li>動画から Optical Flow をもとめ、動被写体マスクを生成する。</li> <li>フレーム画像と変換に用いたホモグラフィー、および動被写体マスクをセットで、学習データ・検証データを作成する。</li> </ol> <p>このようにして作ったデータセットで、既存の深層学習系ホモグラフィー推定モデルを学習させた結果、モデルを変更せずとも動被写体を含む画像間のホモグラフィー推定精度が向上しました。また驚くべきことに、データセットはすべて単眼のカメラで撮影されものであるにも関わらず、視差画像についても前景被写体領域を推定することに成功しています。</p> <p>それぞれの詳細と考察については、原著論文や添付のスライドを参照ください。</p> morphotech (文献紹介)Deep Unrolling: Learned ISTA (LISTA) hatenablog://entry/26006613628241838 2020-10-05T10:00:40+09:00 2023-08-16T13:07:42+09:00 こんにちは。リサーチャーの長山です。今回は Deep Unrolling(あるいは Deep Unfolding、Algorithm Unrolling)と呼ばれる解釈可能性の高いディープラーニング手法を紹介します。 昨今のディープラーニング手法の発展はめざましく、コンピュータビジョンやパターン認識などの様々な画像処理応用で高いパフォーマンスを達成し、既存の多くのモデルベース解析手法を置き換えるに至っています。 物理プロセスに基づいてモデルや prior を手作業で設計する典型的なモデルベース手法と対照的に、ニューラルネットワークは現実データのサンプルから内部パラメータを決定することでモデルを… <p>こんにちは。リサーチャーの長山です。今回は Deep Unrolling(あるいは Deep Unfolding、Algorithm Unrolling)と呼ばれる解釈可能性の高いディープラーニング手法を紹介します。</p> <p>昨今のディープラーニング手法の発展はめざましく、コンピュータビジョンやパターン認識などの様々な画像処理応用で高いパフォーマンスを達成し、既存の多くのモデルベース解析手法を置き換えるに至っています。 物理プロセスに基づいてモデルや prior を手作業で設計する典型的なモデルベース手法と対照的に、ニューラルネットワークは現実データのサンプルから内部パラメータを決定することでモデルを推定します。そのため、潜在的なプロセスを正確に特徴づけられない場合でも、十分なパラメータ数と十分な訓練サンプルが揃えば、多くのケースでディープラーニング手法を適用することができます。 加えて、ディープラーニングには推論速度が速い利点もあります。モデルベース手法では反復アルゴリズムが広く利用されていますが、ディープラーニングが要求するレイヤー数は、同推論性能の反復アルゴリズムの反復数よりも格段に少なくて済みます。</p> <p>その高いパフォーマンスの反面、ニューラルネットワークは汎用的なアーキテクチャを利用することが一般的なので、学習したパラメータから潜在的なモデルの構造を解釈することは非常に困難です。つまり、何が学習されていて、それぞれのパラメータは何を意味しているのかを人間が理解しやすい形で説明することは基本的に不可能です。このような解釈可能性の低い手法は、性能の限界や適切に動作する条件などを正確に見積もることが難しいので、高い信頼性が要求されるようなシステムへの応用で障害になりえます。</p> <p>今回紹介する Deep Unrolling は、反復アルゴリズムをループ展開し学習スキームを導入することで、モデルベース手法の解釈可能性の高さとディープラーニング手法のパフォーマンスの高さを両立させたアーキテクチャです。スライドでは、まず辞書学習に基づく画像復元モデルを題材にスパースコーディングと反復アルゴリズムの Iterative Shrinkage/Thresholding Algorithm(ISTA)を説明します。続いて、基本的な Deep Unrolling アーキテクチャの Learned ISTA(LISTA)とその発展的手法(LISTA-CP、ALISTA)を紹介します。</p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/HHeJfdsnoj2Oyf" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/YokoOno6/deep-unrolling-learned-ista-lista" title="(文献紹介)Deep Unrolling: Learned ISTA (LISTA)" target="_blank">(文献紹介)Deep Unrolling: Learned ISTA (LISTA)</a> </strong> from <strong><a href="https://www.slideshare.net/YokoOno6" target="_blank">Morpho, Inc.</a></strong> </div></p> morphotech ICML2020 参加報告 前編 hatenablog://entry/26006613612735283 2020-09-28T09:48:46+09:00 2023-08-16T13:08:06+09:00 初めまして。CTO室リサーチャーの野元です。 モルフォでは最先端の画像処理・機械学習に関する研究のキャッチアップのため、国内外問わず毎年各種学会に技術系の社員を派遣しています。今回は ICML 2020(International Conference on Machine Learning 2020)にCTO室リサーチャーの川邉とともに参加しました。 今回は学会の概要と私が注目した発表3件についてご紹介します。 後編では「Evaluating Machine Accuracy on ImageNet」等について川邉から報告する予定です。 <p>初めまして。CTO室リサーチャーの野元です。</p> <p>モルフォでは最先端の画像処理・機械学習に関する研究のキャッチアップのため、国内外問わず毎年各種学会に技術系の社員を派遣しています。今回は <a href="https://icml.cc/virtual/2020">ICML 2020</a>(International Conference on Machine Learning 2020)にCTO室リサーチャーの川邉とともに参加しました。</p> <p>今回は学会の概要と私が注目した発表3件についてご紹介します。 後編では「Evaluating Machine Accuracy on ImageNet」等について川邉から報告する予定です。</p> <h1 id="ICML-2020-概要">ICML 2020 概要</h1> <p>ICML 2020(International Conference on Machine Learning 2020)は機械学習のトップカンファレンスの一つです。第37回目となる今年はオーストリアのウィーンで開催する予定でしたが、新型コロナウイルス感染症の影響でオンライン上での開催となりました。来年こそはウィーンでの開催を予定しています。</p> <h2 id="プログラム">プログラム</h2> <ul> <li>日程: 2020/7/12(日)から18(土) の7日間で以下のようなスケジュールでした。 <ul> <li>7/12 : Expo Day</li> <li>7/13 : Tutorial and Test-of-Time Award</li> <li>7/14-16 : Main Conference and Invited Talks</li> <li>7/17-18 : Workshops</li> </ul> </li> <li>Test-of-Time Awardとは、"時の試練に耐えた賞"で10年前のICML論文の中から機械学習の分野に大きな影響を与えたものに与えられる賞で、今回は Gan Process Optimization in the Bandit Setting: No Regret and Experimental Design が受賞しました。</li> </ul> <h2 id="Virtual-Conference">Virtual Conference</h2> <p>今回はオンラインでの開催でした。すべての発表は事前録画されており発表ごとに設けれたウェブサイトから好きなタイミングで視聴することができます。質疑応答はウェブサイト上のチャットを利用するか、発表ごとに決められた時間にZoomでリアルタイムにやり取りすることもできます。質疑の時間は、時差を考慮して各発表あたり2回ずつ設定されていました。世界の研究者の方々と直接交流する機会がないのは残念でしたが、その一方で発表の気になるところを繰り返し視聴できる、発表者交代の時間が必要ない、マルチトラックを気にしなくてもよいなどオンライン開催ならではの利点も感じられました。</p> <h2 id="投稿数参加者数">投稿数・参加者数</h2> <ul> <li>今回の投稿数(reviewされたpaper数)は4,490で、採択数が1,086、採択率は21.8%でした。昨年は3,424中774本が採択でした。採択率は昨年とあまり変わりませんが、年々投稿数・採択数が増えています。</li> <li>会議への参加登録者数は全66か国から7,782名(7/10時点)でした。</li> </ul> <blockquote><p><figure class="figure-image figure-image-fotolife" title="ICMLでレビューされたpaper数 - [1]の動画より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901150526.jpg" width="903" height="508" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>ICMLでレビューされたpaper数 - [1]の動画より引用</figcaption> </figure></p></blockquote> <h1 id="論文紹介">論文紹介</h1> <h2 id="TrajectoryNet-A-Dynamic-Optimal-Transport-Network-for-Modeling-Cellular-Dynamics">TrajectoryNet: A Dynamic Optimal Transport Network for Modeling Cellular Dynamics</h2> <p><a href="https://arxiv.org/abs/2002.04461">arXiv link</a></p> <p>TrajectroyNetは、時間的に離散的な細胞データ(細胞状態を表す高次元データ。具体的には各遺伝子の発現強度を表す数千~数万次元データ)から、データ間の細胞動態を推論するネットワークです。下図のように時刻<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20T_0%2C%20T_1%2C%20T_2%2C%20...%20%2CT_N" alt=" T_0, T_1, T_2, ... ,T_N"/>の細胞のデータが取得できているときにその間の、例えば時刻<img src="https://chart.apis.google.com/chart?cht=tx&chl=T_1" alt="T_1"/>と<img src="https://chart.apis.google.com/chart?cht=tx&chl=T_2" alt="T_2"/>の間の細胞動態を推論することが目的です。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="細胞データ分布の時系列変化のイメージ - [2]Figure 1 a)より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901115536.jpg" width="344" height="315" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>細胞データの分布の時系列変化のイメージ - [2]Figure 1 a)より引用</figcaption> </figure></p></blockquote> <p>人口動態などを推論するのに用いられる Continuous Normalizing Flows (CNFs)に、細胞分裂/死滅、cellular manifold、RNA velocityを考慮した正則化を加えることで既存手法より高精度な推論を可能にしました。</p> <ul> <li>細胞分裂/死滅: 個々の輸送経路に分裂率/死滅率を付加</li> <li>Cellular manifold: 細胞が存在できる空間は一部に限定される。細胞の密度に関する正則化項を追加。</li> <li>RNA velocity: mRNAの痕跡から推定されたデータ取得時の細胞のRNA速度[3]。推定された移動方向に沿うように正則化項を追加。</li> </ul> <p>著者らはMouse cortex dataset とEmbryoid body datasetで実験を行い、推定した細胞データの分布と真の分布とをWasserstein metric(EMD)で評価した結果、既存手法より高精度に推定できることを確認しました。下図a), b), c)は時系列順のデータ分布です。a)とc)からその間のb)の分布を推定するというタスクにおいて、e)が既存手法での推定結果、f)が提案手法での推定結果です。両者を比較してみると、e)よりもf)の方が真の分布であるb)に近いことがわかります。なお、 g) h) i) は、神経細胞の分化前期・中期・後期でそれぞれ強発現することが知られているマーカー遺伝子の発現量を図示したもので、提案手法の結果である f) との整合性が高いことを主張しています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="細胞データの分布と推定結果 - [2]Figure 6より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200907/20200907123559.jpg" width="717" height="660" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>細胞データの分布と推定結果 - [2]Figure 6より引用</figcaption></figure></p></blockquote> <p>分野によっては取得できるデータが限定的になりますが、本研究ではドメイン知識をうまくモデルに取り込むことで推定精度を向上させることに成功しています。</p> <h2 id="One-Size-Fits-All-Can-We-Train-One-Denoiser-for-All-Noise-Levels">One Size Fits All: Can We Train One Denoiser for All Noise Levels?</h2> <p><a href="https://arxiv.org/abs/2005.09627">arXiv link</a></p> <p>ノイズ除去機(Denoiser)を、ノイズ強度の分布が一様なデータセット(例えば低ノイズ1,000枚、中ノイズ1,000枚、高ノイズ1,000枚)で学習すると高ノイズ画像に対するノイズ除去性能は高い一方で低ノイズ画像に対してはあまり高くないDenoiserになってしまいます。この論文では、どのノイズ強度の画像にも均一な性能になるようなDenoiserを得る手法を提案しています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="学習データのノイズ強度(Noise level)分布とノイズ除去性能(PSNR)の関係 - [4]Figure 1より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901122959.jpg" width="505" height="513" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>学習データのノイズ強度(Noise level)分布とノイズ除去性能(PSNR)の関係- [4]Figure 1より引用</figcaption> </figure></p></blockquote> <p>上の Figure 1 はこの論文の目的を説明したものです。黒い実線(Individual best at each <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Csigma" alt=" \sigma"/>)はあるノイズ強度のデータのみで学習し同じノイズ強度の画像で評価した時のPSNR(ピーク信号対雑音比、値が高いほど元画像に近い)のグラフです。一方青い破線(Uniform Distribution)は、ノイズ強度の分布が一様なデータで学習した時の各ノイズ強度の画像に対する性能です。黒線と青破線を比べるとノイズ強度が低いほど両者の性能差が大きくなっています。この論文では、オレンジ色破線(Our goal)のように破線がどのノイズ強度でも黒線から同程度の差になるように学習することを目指します。</p> <p>一つ目の手法は、(P1)のような最適化問題を解く手法です。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="最適化問題P1 - [4]より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901123128.jpg" width="496" height="116" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>最適化問題 P1 - [4]より引用</figcaption> </figure></p></blockquote> <p>以下の繰り返しアルゴリズムで解を求めます。解法を端的に説明すると性能が足りていないノイズ強度の画像の割合を増やして再学習することを繰り返す方法です。</p> <p>1.学習データ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Clambda%5E%7Bt%7D%28%5Csigma%29" alt="\lambda^{t}(\sigma)"/>でDenoiserを学習する。</p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0Af%5E%7Bt%2B1%7D%20%3D%20argmin_%7Bf%7D%20%5Cint%20R%28f%7C%5Csigma%29%20%7B%20p%28%5Csigma%29%2B%5Clambda%5E%7Bt%7D%28%5Csigma%29%7D%20d%5Csigma%20%5C%5C%0A" alt=" f^{t+1} = argmin_{f} \int R(f|\sigma) { p(\sigma)+\lambda^{t}(\sigma)} d\sigma \\ "/></div> <p>2.学習したDenoiserを各画像のノイズ強度がわかっているテスト画像セットで評価する。<br> 3.評価の結果、性能が目標から<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cepsilon" alt=" \epsilon"/>より離れているノイズ強度<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Csigma" alt=" \sigma"/>の割合が増えるように学習データを更新する。<br></p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Clambda%5E%7Bt%2B1%7D%20%3D%20%5B%5Clambda%5E%7Bt%7D%20%2B%20%5Cgamma%5E%7Bt%7D%28%5Csigma%29%5C%7BR%28f%5E%7Bt%2B1%7D%7C%5Csigma%29%20-%20%5Cepsilon%20%28%5Csigma%29%20%5C%7D" alt=" \lambda^{t+1} = [\lambda^{t} + \gamma^{t}(\sigma)\{R(f^{t+1}|\sigma) - \epsilon (\sigma) \}"/> ]</div> <p>4.更新した学習データで再学習する。<br> 2~4を収束するまで繰り返す。</p> <p>二つ目の手法は、(P2)のような最適化問題を解く方法です。こちらは(P1)と異なり双対分解して解くことができます。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="最適化問題P2 - [4]より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901123143.jpg" width="619" height="106" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>最適化問題 P2 - [4]より引用</figcaption> </figure></p></blockquote> <p>著者らはDNNのモデルで両手法を比較し、どちらの手法も所望の性能のDenoiserを得られることを確認しました。ただし、一つ目の手法はあらかじめテストデータの画像のノイズ強度を把握しておく必要があり、また繰り返し学習する際の初期分布に依存します。</p> <p>学習データに偏りがあると性能に偏りが出てしまうことは有名ですが、学習データが一様であっても性能が一様とは限らないということを本論文で認識しました。本論文ではDenoiserを例としていましたが、Denoiser以外のモデルでも注意が必要です。</p> <h2 id="Tuning-free-Plug-and-Play-Proximal-Algorithm-for-Inverse-Imaging-Problems">Tuning-free Plug-and-Play Proximal Algorithm for Inverse Imaging Problems</h2> <p><a href="https://arxiv.org/abs/2002.09611">arXiv link</a></p> <p>最後に紹介するのは、ICML 2020でOutstnading Paperに選ばれた論文です。</p> <p>Plug-and-play ADMM (PnP ADMM)という最適化手法があり、経験的に大きな成功を収めていますが、PnPには手動でパラメータを微調整する必要があります。本論文ではパラメータの探索を強化学習のフレームワークに落とし込むことで自動化することに成功しました。</p> <p>PnPについては本ブログでも過去に紹介しています。詳しくは<a href="https://techblog.morphoinc.com/entry/2020/06/08/100057">こちら</a>の記事をご覧ください。(本記事とは文字の定義が異なるのでご注意ください。)</p> <p>一般に画像復元タスクは次のように書けます。</p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0A%5Cunderset%7Bx%20%5Cin%20%5Cmathbb%7BR%7D%5EN%7D%20%7Bminimize%7D%20%28D%28x%29%20%2B%20%5Clambda%20R%28x%29%29%0A" alt=" \underset{x \in \mathbb{R}^N} {minimize} (D(x) + \lambda R(x)) "/></div> <p><img src="https://chart.apis.google.com/chart?cht=tx&chl=%20D%28x%29" alt=" D(x)"/>が損失項で<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Clambda%20R%28x%29" alt=" \lambda R(x)"/>が正則化項です。ADMMは次のように書けます。</p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0AProx_%7B%5Csigma_%7Bk%7D%5E%7B2%7DR%7D%28z_k%20-%20u_k%29%20%3D%20%5Cunderset%7Bx%7D%7Bargmin%7D%28R%28x%29%20%2B%20%5Cfrac%7B1%7D%7B2%5Csigma%5E2%7D%20%7C%7Cx-v%7C%7C_2%5E2%29%20%5C%5C%20%0A" alt=" Prox_{\sigma_{k}^{2}R}(z_k - u_k) = \underset{x}{argmin}(R(x) + \frac{1}{2\sigma^2} ||x-v||_2^2) \\ "/></div> <p>と定義して</p> <div><img src="https://chart.apis.google.com/chart?cht=tx&chl=%0Ax_%7Bk%2B1%7D%20%3D%20Prox_%7B%5Csigma_%7Bk%7D%5E%7B2%7DR%7D%28z_k%20-%20u_k%29%20%5C%5C%0Az_%7Bk%2B1%7D%20%3D%20Prox_%7B%5Cfrac%7B1%7D%7B%5Cmu_%7Bk%7D%7D%20D%7D%28x_%7Bk%2B1%7D%20%2B%20u_k%29%20%5C%5C%0Au_%7Bk%2B1%7D%20%3D%20u_k%20%2B%20x_%7Bk%2B1%7D%20-%20z_%7Bk%2B1%7D%20%5C%5C%0A" alt=" x_{k+1} = Prox_{\sigma_{k}^{2}R}(z_k - u_k) \\ z_{k+1} = Prox_{\frac{1}{\mu_{k}} D}(x_{k+1} + u_k) \\ u_{k+1} = u_k + x_{k+1} - z_{k+1} \\ "/></div> <p>パラメータ<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Csigma%2C%20%5Cmu" alt=" \sigma, \mu"/>の選択をAction、<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20x%2C%20z%2C%20u" alt=" x, z, u"/>をState、(復元結果のPSNR増分-非終了ペナルティ)の減衰累積をRewardとして強化学習のフレームワークに落とし込み、パラメータ探索を自動化しました。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="Tuning-free plug-and-play frameworkの概観 - [5]Figure 2より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901143727.jpg" width="981" height="534" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>Tuning-free plug-and-play frameworkの概観 - [5]Figure 2より引用</figcaption> </figure></p></blockquote> <p>著者らはCompressed Sensing MRIの復元とPhase retrieval の復元タスクで実験を行い、既存手法より優れた結果となることを確認しました。下図は実験結果の一例でCS-MRIの復元結果です。どの画像も既存手法と比べPSNRを0.6以上向上させています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="CS-MRIの復元結果 - [5]Figure 3より引用"> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901143702.jpg" width="1027" height="538" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <figcaption>CS-MRIの復元結果 - [5] Figure 3より引用</figcaption> </figure></p></blockquote> <p>後編では「Evaluating Machine Accuracy on ImageNet」等を紹介予定です。</p> <h2 id="参考文献">参考文献</h2> <p>[1] : <a href="https://icml.cc/virtual/2020/townhall">ICML Town Hall Meeting 動画</a></p> <p>[2] : <a href="http://arxiv.org/abs/2002.04461">Tong, A., Huang, J., Wolf, G., van Dijk, D., &amp; Krishnaswamy, S. (2020). TrajectoryNet: A Dynamic Optimal Transport Network for Modeling Cellular Dynamics.</a></p> <p>[3] : <a href="https://doi.org/10.1101/206052">La Manno, G., Soldatov, R., Hochgerner, H., Zeisel, A., Petukhov, V., Kastriti, M., Lönnerberg, P., Furlan, A., Fan, J., Liu, Z., van Bruggen, D., Guo, J., Sundström, E., Castelo-Branco, G., Adameyko, I., Linnarsson, S., &amp; Kharchenko, P. (2017). RNA velocity in single cells. BioRxiv, 206052. </a></p> <p>[4] : <a href="http://arxiv.org/abs/2005.09627">Gnansambandam, A., &amp; Chan, S. H. (2020). One Size Fits All: Can We Train One Denoiser for All Noise Levels?</a></p> <p>[5] : <a href="http://arxiv.org/abs/2002.09611">Wei, K., Aviles-Rivero, A., Liang, J., Fu, Y., Schnlieb, C.-B., &amp; Huang, H. (2020). Tuning-free Plug-and-Play Proximal Algorithm for Inverse Imaging Problems. 4.</a></p> morphotech OJT2020:Vieureka を用いた 3D 人流モニタリング hatenablog://entry/26006613592730510 2020-09-23T10:00:27+09:00 2023-08-16T13:08:22+09:00 はじめまして、リサーチャーの三宅と申します。 今年度の新人研修(OJT)において、Panasonic 様が提供する Vieureka *1というエッジ AI カメラデバイスを使用したアプリケーション開発を 2 か月間行いました。 tech.panasonic.com この記事では私たちのチームで開発した「Vieureka を用いた 3D 人流モニタリングシステム」の概要について紹介します。 *1:「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。 <p>はじめまして、リサーチャーの三宅と申します。 今年度の新人研修(OJT)において、Panasonic 様が提供する Vieureka <a href="#f-8715663f" name="fn-8715663f" title="「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。">*1</a>というエッジ AI カメラデバイスを使用したアプリケーション開発を 2 か月間行いました。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.panasonic.com%2Fjp%2Fbi%2Fvieureka%2F" title="Vieureka(ビューレカ)プラットフォーム - 商品情報[法人] - Panasonic" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://tech.panasonic.com/jp/bi/vieureka/">tech.panasonic.com</a></cite> この記事では私たちのチームで開発した「Vieureka を用いた 3D 人流モニタリングシステム」の概要について紹介します。</p> <h1 id="本プロジェクトのテーマ">本プロジェクトのテーマ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141435.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> 本プロジェクトでは Vieureka を用いた 3D 人流モニタリングシステムを制作しました。人流モニタリングとは、例えば店舗の天井などに Vieureka を設置して、人の移動を可視化するシステムです。3D 人流モニタリングとは、俯瞰図上での人の移動を可視化し、実際の人物の動きがわかりやすくモニタリング出来るようにするシステムです。このような俯瞰図上の移動データは、購買行動などの人物の行動を解析するために非常に有用であると考えられます。既存の Vieureka アプリとして存在する人流モニタリングは、カメラの視野上に映った人物の動きをモニタリングするものでした。比較した表を以下のようにまとめてみました。既存のものを 2D でのモニタリングとするならば、俯瞰図を作成するという点で、本システムは 3D といえるでしょう。また、モニタリングできる範囲については、2D の場合だと個々のカメラに映った範囲でのモニタリングになっており、たとえば商品棚で死角が生じている場合には、人物が死角に入った段階でモニタリングが途切れてしまいます。一方で 3D モニタリングシステムでは、複数のカメラの情報を俯瞰図上に統合するので、死角に入っても他のカメラの情報を使ってモニタリングを継続させることができます。またこのことは、一つのカメラの視野には収まらない広い空間でのモニタリングが可能であることも意味しています。</p> <h1 id="Vieureka-を用いた-3D-人流モニタリング">Vieureka を用いた 3D 人流モニタリング</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141453.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> このようなシステムを構築するためには、主に以下の 2 つの処理が必要です。一つは、動画から人物を検出すること。もう一つにはカメラと検出した人物の立体的な位置関係、そしてカメラ同士の立体的な位置関係を求めることです。通常このような処理は多くの計算資源を必要とするので、動画をサーバーにストリーミングし、サーバーですべて行います。このとき、以下のようなことが問題になる場合があるかもしれません。一つには、通信データ量の問題です。カメラ映像をストリームするためには、1 台につき 10 Mbps 程度の通信ビットレートを必要とします。数台であれば問題ない程度ですが、大規模なシステムを構築するとネットワークを圧迫します。また、動画には個人情報が多く含まれており、インターネットに載せること自体がリスクとなります。顧客の動画を扱うというだけで、データの管理コストや漏洩による損害リスクが問題になるケースがあるでしょう。Vieureka のようなエッジ AI カメラデバイスを用いることで、上記のような問題点を解決することができます。取得した動画はすべて Vieureka 内で処理したあとすぐに破棄することができ、その後の下流処理に必要なデータだけを抽出してサーバーに送ることができるからです。我々のチームではこのような抽出されたデータをメタビデオと呼び、どこまでの処理を Vieureka で行い、何をメタビデオとして定義しサーバーに送るか、という点を技術的な論点と位置づけました。</p> <h1 id="システムの概要">システムの概要</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141517.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> 本システムの概要は以下の通りです。Vieurekaでは人物の検出を行います。人物検出の方法としては、昨今では深層学習による推論が高い精度を持つことが知られています。しかし、深層学習による推論には重い処理が要求されるため Vieureka のような IoT 機器で、一般的なフレームワークを動作させることは難しい現状です。そこで、エッジデバイスやモバイル端末で深層学習モデルを推論することを可能にする当社製品 SoftNeuro® を使用しました。SoftNeuro® を使用することで、Vieurekaに搭載された CPU 上で深層学習モデルを推論し、実用的なフレームレートで動画を処理することができます。一つ一つの Vieureka で独立に人物を検出し、あとで情報を統合するのに必要な特徴量を計算で求めた後、それらをまとめてサーバーに送ります。サーバーでは複数の Vieureka から送られてきたメタビデオをもとに、カメラと人物の位置関係、およびカメラ同士の位置関係を三次元上で復元します。同時に、俯瞰図を生成し、人物の俯瞰図上での動きのデータを生成します。これより先は未実装で、実際にどのような実装にするかはアプリケーションによって異なると考えています。基本的には 3D 人流モニタリングの結果をリアルタイムで表示するビューワーや、過去のデータを一括でダウンロードし、下流解析を行うポータルなどの開発が考えられます。</p> <h1 id="手法のアイデア">手法のアイデア</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141535.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> つぎに、簡単に手法のアイデアについて模式図を用いてご紹介します。Vieureka では、取得した画像から Softneuro® と深層学習モデルを用いて人物を検出します。その際、人物の大きさや位置、見た目の特徴量を抽出し、メタビデオのフレームとします。サーバーはメタビデオの断片を受信した後、そのデータから深度検出を行い、座標を 3 次元化します。このとき、カメラと人物の位置関係も同時に取得することができます。最後に、俯瞰図を作成し、人物の位置をプロットします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141602.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> 以上の処理を複数台の Vieureka でも同じように行います。サーバーでは別々のメタビデオを統合します。統合する際に、カメラと人物の位置関係を推定するのと同様のフレームワークで、カメラ同士の位置関係も推定することができます。この統合の処理により、モニタリングする範囲を拡張することができるようになります。すなわち、死角を補いあい、一部のカメラから見えていなくても継続してモニタリングを行うことができます。このシステムでは、サーバーで使える情報が少なく、また Vieureka での処理で生じたノイズも含まれています。カメラを増やして情報を統合することで、最終的なモニタリングの精度を向上させることが出来るというメリットもあります。</p> <h1 id="システムによるトラッキングのデモ">システムによるトラッキングのデモ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141551.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> それではシステムによるトラッキングのデモをお見せします。デモの撮影には、対角視野角 124 度のワイドタイプのVieureka 3 台を使用しました。モルフォ本社の会議室の一つを使用しました。だいたい 20 人程度が収容可能な部屋です。そこの壁の隅に、このように Vieureka を設置しました。おおきな三脚で天井付近に固定したり、マグネットで壁に固定することができます。こうしてみると、非常に小型でかわいらしい感じになることがお分かりになると思います。</p> <iframe src="https://drive.google.com/file/d/1HRckgf1gPq_xcFOmBI2IMv0jbTDxtx7V/preview" width="640" height="360"></iframe> <p>先ほど述べた通り、設定としては、カメラ 3 台を使用し、動画取得 FPS は 1 としています。また商品棚のような障害物を想定して、ホワイトボードにより死角を意図的に生み出しています。この部屋で、3 人の人物が歩き回っています。カメラの映像 3 枚が実際にVieurekaで取得した動画です。赤く囲まれた四角形が検出された人物です。今は分かりやすさのためにオーバーレイしていますが、実際にはこれらの情報は切り離され、四角形の情報だけがサーバーに送られます。右下の図が実際にカメラと人物の位置を俯瞰図上にプロットした図です。同じ色の点は同じ人を表しています。障害物があるので、各カメラで検出される人物は2人になってしまう場合でも、だいたい 3 点が表示されていることがわかります。また、一度見失っても、同じ色の点が復活するのがわかると思います。これは、メタビデオに含まれる情報が人物をある程度特定できる特徴量を含んでおり、それを統合しているためです。しかしよく見ると、異なる人物の四角形が重なってしまった後に、色が入れ替わってしまうことがあります。これは ID Switch と呼ばれ、この分野で根源的な問題のひとつです。ID Switch を取り除くことは我々のチームとしても今後の課題ということになります。また、位置のノイズも大きく、改善が求められると考えています。</p> <h1 id="まとめ">まとめ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200901/20200901141615.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> 最後に、今回のシステムで実現したこととメリットをまとめたいと思います。 本システムでは、複数台の Vieureka を用いた俯瞰図上の人流モニタリングを実現しました。このことにより人物の実際の動きがわかりやすいモニタリングが可能になりました。また、複数台のカメラを組み合わせたことにより、視野が拡張されて、一つのカメラには収まらない、広い空間でのモニタリングが可能になりました。また、障害物による死角を補い合うように Vieureka を設置すれば、死角をなくすことが可能になりました。また、カメラの位置を自動的に推定することを実現しました。店舗などの応用ではこの特性は重要ではないかもしれませんが、設営後すぐに稼働させることができ、またカメラの場所をいつでも変更可能なので、たとえば移動式のモニタリングシステムのようなアプリケーションが可能であると考えます。最後に、カメラとして Vieureka を用いたことで、エッジで動画を処理し、その場で破棄するようなシステムを実現しました。このことによって、通信するデータ量を節約することができ、動画等個人情報をインターネットに乗せないような安全なモニタリングが可能になりました。</p> <div class="footnote"> <p class="footnote"><a href="#fn-8715663f" name="f-8715663f" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。</span></p> </div> morphotech OJT2020:Vieureka を用いた混雑状況の配信 hatenablog://entry/26006613593083281 2020-09-14T10:05:24+09:00 2023-08-16T13:08:34+09:00 はじめまして、リサーチャーの植田と申します。 今年の新人研修の一環として、Panasonic 様の提供する IoT カメラ Vieureka (VRK-C301) を使ったアプリケーションを自分たちで発案・設計・実装するという OJT 課題に挑戦しました。 私たちのチームでは Vieureka が設置された場所の混雑状況を可視化して Web 配信するというシステムを開発しました。 最近では COVID-19 の感染拡大防止のため密集・密接・密閉(いわゆる三密)を避けることが推奨されていますが、 ユーザの視点からは目的地が実際にどれほど混雑しているのか事前に把握しづらいという課題があります。 そ… <p>はじめまして、リサーチャーの植田と申します。</p> <p>今年の新人研修の一環として、Panasonic 様の提供する IoT カメラ Vieureka (VRK-C301) を使ったアプリケーションを自分たちで発案・設計・実装するという OJT 課題に挑戦しました。</p> <p>私たちのチームでは Vieureka が設置された場所の混雑状況を可視化して Web 配信するというシステムを開発しました。 最近では COVID-19 の感染拡大防止のため密集・密接・密閉(いわゆる三密)を避けることが推奨されていますが、 ユーザの視点からは目的地が実際にどれほど混雑しているのか事前に把握しづらいという課題があります。 そこで私たちは、混雑状況をリアルタイムかつ視覚的に伝えるための Web 映像配信システムを、店舗など様々な場所で導入しやすい Vieureka を用いて実現することにしました。 このシステムでは単にカメラの映像をそのまま配信するのではなく、写っている人のプライバシーに配慮した形に変換するという工夫を行っています。 さらに、混雑状況を定量的に伝えるため混雑度のグラフ表示も実装しました。</p> <p>こちらはその配信ページを録画したデモ動画です。</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/5aMwK_o4O9U?controls=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p>本稿ではこの Vieureka を用いた混雑状況の配信システムの詳細について紹介しています。</p> <iframe src="//www.slideshare.net/slideshow/embed_code/key/KldFsosFpGdG17" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <p> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/YokoOno6/vieureka-238468574" title="Vieurekaを用いた混雑状況の配信" target="_blank">Vieurekaを用いた混雑状況の配信</a> </strong> from <strong><a href="https://www.slideshare.net/YokoOno6" target="_blank">Morpho, Inc.</a></strong> </div></p> <p>・「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。</p> morphotech OJT2020:Vieurekaを用いた顔検出 hatenablog://entry/26006613593056572 2020-09-07T10:00:40+09:00 2023-08-16T13:08:49+09:00 はじめまして、リサーチャーの中村と申します。 私は本年4月に新卒としてモルフォに入社しました。 今年の新人研修(OJT)において、私達のチームは2ヶ月にわたってVieurekaカメラというエッジデバイスを用いたアプリケーション開発を行いました。 私達のチームでは、Vieurekaカメラ上で得られた顔認識結果をPCやクラウド上で共有することで遠隔でも玄関の状況や来訪者を知ることが出来るスマートインターホンを開発しました。 アプリケーションの構造を下の図に示します。 アプリケーションの構造。Vieurekaカメラ上でリアルタイム顔認識を行い、認識結果や動画をクラウド上で共有することが出来ます。 そ… <p>はじめまして、リサーチャーの中村と申します。 私は本年4月に新卒としてモルフォに入社しました。</p> <p>今年の新人研修(OJT)において、私達のチームは2ヶ月にわたってVieurekaカメラというエッジデバイスを用いたアプリケーション開発を行いました。 私達のチームでは、Vieurekaカメラ上で得られた顔認識結果をPCやクラウド上で共有することで遠隔でも玄関の状況や来訪者を知ることが出来るスマートインターホンを開発しました。 アプリケーションの構造を下の図に示します。</p> <p><figure class="figure-image figure-image-fotolife" title="アプリケーションの概要"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200831/20200831145123.png" width="1200" height="537" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>アプリケーションの構造。Vieurekaカメラ上でリアルタイム顔認識を行い、認識結果や動画をクラウド上で共有することが出来ます。</figcaption></figure></p> <p>そこで本記事では、顔認証機能付きスマートインターホンの要素技術であるリアルタイム顔検出について紹介します。 特に、ここではアルゴリズムの詳細に踏み込むのではなく、エッジデバイス上での実行速度と検出精度のバランスに着目していきます。</p> <h1 id="Vieurekaカメラとは">Vieurekaカメラとは</h1> <p><a href="https://tech.panasonic.com/jp/bi/vieureka/camera.html">Vieurekaカメラ</a>とは、パナソニック株式会社によって提供されるカメラ付きIoT機器です。 複数の高性能CPUを搭載しているため高度な画像解析を行うことができ、さらにクラウド上のウェブアプリと連携させることもできます。 このプロジェクトではVieurekaの高い計算性能を生かして顔認証機能付きスマートインターホンの開発を行いました。 次の章では要素技術である顔検出について紹介します。</p> <h1 id="高精度な顔検出モデルと計算コスト">高精度な顔検出モデルと計算コスト</h1> <p>顔検出とは、入力画像における顔の位置を推定する技術であり、監視カメラ、顔認証、笑顔検出による撮影品質向上など様々な場面に応用されています。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="RetinaFaceによる顔検出結果"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200703/20200703124450.jpg" width="1000" height="543" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 6 in Ref. [1] : RetinaFaceによる顔検出結果。四角い枠は検出された顔を、枠内の点は目や口といった顔のキーポイントを表します。</figcaption></figure></p></blockquote> <p>上の画像は近年発表された高精度な顔検出モデルである<a href="https://arxiv.org/abs/1905.00641">RetinaFace</a>による顔検出結果を表しており、画像内に写り込んでいる小さな顔まで正しく検出できていることがわかります。 このように深層学習を用いることで高精度な顔検出を行うことが可能になりつつありますが、まだ課題も多く残されています。 その課題の一つとして計算コストの大きさが挙げられます。</p> <p>RetinaFace論文[1]によれば、例えばResNet-152をバックボーンとした場合のRetinaFaceの推論時間はGPU上であっても画像一枚あたり75.1 ms(NVIDIA Tesla P40、入力サイズ640x480)必要であると報告されています。 このことから、バックボーンとしてResNet-152を用いることはエッジデバイスのCPUによるリアルタイム推論にはあまり適さないことが予想されます。 一方でRetinaFaceのバックボーンをMobileNet-0.25という軽量なネットワークに置き換えた場合では、エッジデバイス上での推論時間が61.2 ms(RK3399、入力サイズ640x480)となりエッジデバイスにおける推論にも十分耐えうる実行時間になることも報告されています。</p> <h1 id="より高速な顔検出モデル">より高速な顔検出モデル</h1> <blockquote><p><figure class="figure-image figure-image-fotolife" title="Ultra-Light-Fast-Generic-Face-Detector-1MBによる検出結果"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200703/20200703165930.jpg" width="1000" height="561" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Ultra-Light-Fast-Generic-Face-Detector-1MBによる検出結果。画像は<a href="https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB">GitHubレポジトリ</a>より引用。</figcaption></figure></p></blockquote> <p>しかし、本プロジェクトでは顔検出以外のモジュールにも計算時間を割くため、顔検出の計算コストをより削減する必要がありました。 そこで本プロジェクトでは<a href="https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB">Ultra-Light-Fast-Generic-Face-Detector-1MB</a>と呼ばれる軽量な顔検出モデルを採用しました。 エッジデバイス上でMobilenet-0.25をバックボーンとした場合のRetinaFaceでは推論時間が46 msであるのに対して、Ultra-Light-Fast-Generic-Face-Detector-1MBでは35 msである(Raspberry Pi 4B、CPU1コア、入力サイズ320x240)ことがGitHubレポジトリ上で報告されています。</p> <p>検出精度の定性的評価について、Ultra-Light-Fast-Generic-Face-Detector-1MBで顔検出を行った結果を上の画像に示しています。 RetinaFaceでの結果と比較すると、Ultra-Light-Fast-Generic-Face-Detector-1MBは高い計算速度と引き換えに小さい顔を検出することが苦手であることがわかります。 しかし、今回開発するスマートインターホンでは小さい顔まで検出する必要はないため、この程度の精度低下は許容できると考えられます。 したがって、Ultra-Light-Fast-Generic-Face-Detector-1MBは本プロジェクトに適した計算速度と検出精度のバランスを持つことがわかります。</p> <p>サンプル動画に対しPC上でUltra-Light-Fast-Generic-Face-Detector-1MBを適用した結果を下の動画に示します。 映り込む顔が小さかったり隠れている場合には検出に失敗することがありますが、それ以外の場合では顔の向きの変化に対し頑健に検出できることがわかります。</p> <iframe width="560" height="315" frameborder="0" allowfullscreen="" src="//www.youtube.com/embed/YSSlJz0ThdE"></iframe> <p><br><a href="https://youtube.com/watch?v=YSSlJz0ThdE"></a></p> <h1 id="Vieurekaへの組み込み">Vieurekaへの組み込み</h1> <p>本プロジェクトでは当社ソフトウェア製品SoftNeuro®(組み込み機器向けディープラーニング推論エンジン)をVieureka向けにビルドすることで実行環境を構築しました。 顔検出モデルには先程紹介したUltra-Light-Fast-Generic-Face-Detector-1MBを用いました。 Vieureka上で顔検出に要した時間は画像1枚あたり29 ms(入力サイズ320x240)であり、スマートインターホン向けのリアルタイム顔検出に十分な処理速度であることがわかります。</p> <h1 id="最後に">最後に</h1> <p>私達のチームは新人研修でVieurekaを用いた顔認証機能付きスマートインターホンの開発を行い、本記事ではその要素技術であるリアルタイム顔検出について紹介しました。 検出精度と実行速度のバランスに注意を払いながらエッジデバイス向けアプリの開発を進めた経験を、今後の開発にも活かしていきたいと思います。</p> <h1 id="参考文献">参考文献</h1> <p>[1] J. Deng, J. Guo, Y. Zhou, J. Yu, I. Kotsia, and S. Zafeiriou, "Retinaface: Single-stage dense face localisation in the wild," arXiv:1905.00641, 2019.</p> <p><span style="font-size: 80%">・「Vieureka」および「Vieureka」ロゴはパナソニック株式会社の登録商標です。</span></p> morphotech Selected Research Papers from ICCP 2020 hatenablog://entry/26006613599735599 2020-08-11T10:44:55+09:00 2023-08-16T13:09:22+09:00 Hi everyone! I am Chamin, a boffin researcher from Morpho's CTO Office. As members of Morpho's main R&D division, we regularly attend conferences on Computer Vision and Machine Learning. This helps us to keep in touch with the state of the art, and also gain insights to new research topics. So, one … <p>Hi everyone! I am Chamin, a <del>boffin</del> researcher from Morpho's CTO Office. As members of Morpho's main R&amp;D division, we regularly attend conferences on Computer Vision and Machine Learning. This helps us to keep in touch with the state of the art, and also gain insights to new research topics. So, one (sometimes a few) of us would attend a conference, summarize the interesting stuff, and share them with the colleagues.</p> <p>ICIP 2020 - The 2020 International Conference on Computational Photography - was supposed to be held in St. Louis, USA. However, due to COVID-19 concerns, it was conducted as an online event. In this post, I will summarize a few interesting papers from this conference.</p> <p>In <em>Computational Photography</em>, we investigate digital processing techniques that can replace or supplement optical processes that are used in taking pictures. Admittedly, that sounds more like rocket science than photography, so let me give you an example. Suppose you want to have a good <em>bokeh</em> effect in photos that you take with your smartphone. If you rely solely on optics to do this, you will end up with a <strong>thick</strong> phone that has a <strong>HUGE</strong> lens (expensive, hard to carry and maintain, etc.). Instead, the present-day smartphones use a couple of tiny cameras, other sensors, and computational photography techniques to provide a similar effect. Figure 0 is an example for such a photo, taken with an <em>iPhone 11 Pro</em>.</p> <p><figure class="figure-image figure-image-fotolife" title="Figure 0"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200730/20200730113802.jpg" alt="" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Figure 0</figcaption></figure></p> <p>OK, so much for the introduction. The following are four of about a dozen ICCP 2020 papers that I summarized and shared with my colleagues. I hope you'll find them interesting.</p> <h2 id="Deep-Slow-Motion-Video-Reconstruction-with-Hybrid-Imaging-System">Deep Slow Motion Video Reconstruction with Hybrid Imaging System</h2> <h3 id="Paliwal-et-al-PDF">Paliwal et al. (<a href="https://arxiv.org/pdf/2002.12106.pdf">PDF</a>)</h3> <h4 id="Problem">Problem</h4> <p>Slow motion videos are gaining popularity, particularly in social media, with the emergence of new smartphones that can capture video at high frame rates. Typically, a slow motion video is created by capturing video at a frame rate much higher than 30 frames per second (<em>iPhone 11</em>, for example, can capture at 240 fps) then playing it back at 30 frames per second. Not all cameras are capable of recording at such high frame rates, though. In such cases, intermediate frames can be created using software to create slow motion images. However, this requires estimating missing information, and is a challenging task when complex movements are present in the scene. By the way, we have done this at Morpho and you can see a demo <a href="https://www.morphoinc.com/en/technology/frc">here</a>.</p> <h4 id="Approach">Approach</h4> <p>The authors suggest a dual camera-based approach for creating slow motion video with better quality. Dual or multiple camera systems are getting increasingly common in mobile phones. They can be used for a wide variety of purposes, as surveyed <a href="https://www.dxomark.com/multi-camera-smartphones-benefits-and-challenges/">here</a>. The authors suggest using one camera to capture a high resolution video with a low frame rate. The other camera captures a low resolution, high frame rate video. The hypothesis of this paper is that by combining these two videos, a high resolution, high frame rate video can be constructed. The end result is a high resolution slow motion video.</p> <p>Fig. 5 in Ref. [1] presents a functional overview of the proposed approach. All three stages of processing use Deep Neural Networks (I bet you could see that coming). Frames of the high-resolution video are referred to as <em>keyframes</em>, whereas frames of the low-resolution video are called <em>auxiliary frames</em>.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 5 in Ref. [1]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143004.png" width="1200" height="226" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 5 in Ref. [1]</figcaption></figure></p> <p>The first two stages are called "alignment tasks". In the first stage, the auxiliary frames are used to calculate the initial optical flow between the target and neighboring frames. Using the optical flow, a given keyframe can be <em>warped</em> to create intermediate frames. The second stage adds information from the keyframes to improve these intermediate frames. Fig. 6 in Ref. [1] illustrates how the two-stage process improves the video quality when moving objects are present in the scene.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 6 in Ref. [1]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143141.png" width="1200" height="386" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 6 in Ref. [1]</figcaption></figure></p> <p>In the final state named <em>appearance estimation</em> a context and occlusion-aware CNN is used to combine warped frames and target auxiliary frames to produce the final, high resolution frames. Using <em>visibility masks</em> created with the auxiliary frames, the authors manage to remove ghost-like effects in the resulting high resolution frames (Fig. 8 in Ref. [1], around the ball).</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 8 in Ref. [1]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143231.png" width="1200" height="678" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 8 in Ref. [1]</figcaption></figure></p> <p>The authors train this system in an end-to-end fashion by minimizing the loss between the synthesized and ground truth frames on a set of training videos. For training data, they use a set of high frame rate videos with high resolution as the ground truth, and propose an approach to synthetically generate the main and auxiliary input videos, emulating the inputs from two real cameras with a small baseline.</p> <h4 id="Data">Data</h4> <p>For training the DNNs, authors used a dataset of 875 video clips that they synthesized by editing Youtube videos (I suppose they also watched a lot of cat videos during this process :-p). They also used the Adobe-240fps dataset for training.</p> <h4 id="Results">Results</h4> <p>The authors evaluate the performance of this approach by evaluating it on <em>Slow Flow</em>, <em>Middlebury</em> and <em>NfS</em> datasets. They compare the accuracy measures <em>LPIPS</em> and <em>SSIM</em> with those obtained using related approaches (namely <em>DAIN</em>, <em>DUF</em>, <em>EDVR</em> and <em>Super Slo Mo</em>). The proposed approach produces results that are better than all other approaches.</p> <p>The authors do not mention the processing time of their algorithms. While they did test their approach on video captured with a mobile phone, they did not execute the algorithms within the phone. Judging by the network architecture and descriptions, this seems computationally expensive. So, don't rush to make an app with this just yet :o).</p> <h2 id="Unveiling-Optical-Properties-in-Underwater-Images">Unveiling Optical Properties in Underwater Images</h2> <h3 id="Bekerman-et-al-Video-presentation">Bekerman et al. (<a href="https://www.youtube.com/watch?v=QqPmPeiuqtY&amp;feature=youtu.be">Video presentation</a>)</h3> <h4 id="Problem-1">Problem</h4> <p>While underwater photography is a relatively less common photographic activity, it is a challenging task to capture high quality underwater photos even for professional photographers with good equipment. A combination of Low contrast, color cast, blurriness and noise result in photos that are low in clarity. The photo quality also deteriorates with distance, making it harder to make automatic refinements. Fig. A in Ref. [2] is an example underwater photograph from this paper.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. A in Ref. [2]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143409.png" width="1200" height="593" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. A in Ref. [2]</figcaption></figure></p> <h4 id="Approach-1">Approach</h4> <p>With the emphasis on restoring the colors of the image to match those of the scene, the authors take a <em>physics based</em> approach to solve this problem (Fig. B in Ref. [2]).</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. B in Ref. [2]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143548.png" width="1200" height="627" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. B in Ref. [2]</figcaption></figure></p> <p>The main steps in this approach are:</p> <ol> <li>Global white balance/ambient light correction: performed using known optical properties of sea water</li> <li>Attenuation coefficient estimation</li> <li>Veiling light estimation</li> <li>Restore the image using the above parameters and <em>haze lines</em> (previously developed approach)</li> </ol> <p>The authors' main contribution lies in steps 2 and 3. Haze-lines is a technique designed for images captured on land, and cannot be directly used on underwater images. The authors propose a log-projection based approach to estimate <em>haze curves</em> and then convert them to haze lines.</p> <p><em>Veiling light</em> - light that does not originate from the objects themselves but end up reaching the focal plane - are filtered out using an iterative method. Like in many previous works, the authors first estimate veiling light from the background of the scene. However, they further refine it using nearby regions. According to the authors, this improves the accuracy of the estimation.</p> <h4 id="Data-1">Data</h4> <p>The authors use <a href="http://csms.haifa.ac.il/profiles/tTreibitz/datasets/ambient_forwardlooking/index.html">SQUID</a> dataset to evaluate the proposed method and also to compare it with other approaches. The stereo information in the dataset have not been used.</p> <h4 id="Results-1">Results</h4> <p>The results seem much better than the other works in the comparison. The Macbeth-like color charts placed in the scene have been used for quantitative evaluation of color reconstruction error. The proposed approach results in the lowest color reconstruction error, out of the approaches that have been compared.</p> <p>Fig. C in Ref. [2] and Fig. D in Ref. [2] demonstrate how a photo taken at a 20 m depth has been reconstructed. It is evident that details at higher depths have been recovered well, with few artifacts.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. C in Ref. [2]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143627.png" width="1200" height="594" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. C in Ref. [2]</figcaption></figure></p> <p><figure class="figure-image figure-image-fotolife" title="Fig. D in Ref. [2]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143709.png" width="1200" height="599" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. D in Ref. [2]</figcaption></figure></p> <h2 id="NLDNet-A-Physics-Based-Single-Image-Dehazing-Network">NLDNet++: A Physics Based Single Image Dehazing Network</h2> <h3 id="Tal-et-al-video-presentation">Tal et al. <a href="https://www.youtube.com/watch?v=QqPmPeiuqtY&amp;feature=youtu.be">video presentation</a></h3> <h4 id="Problem-2">Problem</h4> <p>Removing haze from a digital photo is a challenging task because the effect of haze varies with distance, and also causes loss of information where fine details are present at large distances from the camera. While several researches have been published, there still is a lot of room for improvement.</p> <h4 id="Approach-2">Approach</h4> <p>The authors propose using a Physics-based model for haze, as shown in Fig. A in Ref. [3] (note the similarity to the model in the previous paper). You can see that the light entering the eye (or camera) is a combination of object irradiance (light actually reflected/emitted by the object) and scattered <em>air-light</em>. Given that many of the related parameters are unknown during image capture, obtaining a haze free image using this model is an ill-posed problem.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. A in Ref. [3]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143747.png" width="659" height="461" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. A in Ref. [3]</figcaption></figure></p> <p>A common approach to image dehazing based on the above model is <em>NLD</em>(Non Local Dehazing). pixels from a small color palette are sampled from different regions of the image, and their variations are used for estimating the model parameters. However, this approach is inherently noisy because of working with non-localized pixels. The authors propose a few modifications to NLD (hence the name <em>NLD++</em>) for improved results.</p> <p>First, the authors apply a technique called BM3D (Block Matching 3D Filtering) to preprocess images before dehazing. Second, they apply lower bound constraints to the transmission mapping (denoted as <strong><em>t(x)</em></strong> in Fig. A in Ref. [3]). Third, they use a least-square optimization algorithm for estimating <strong><em>t(x)</em></strong>.</p> <p>While the above modifications improve the image quality, they have a high computational cost. To solve this problem, the authors resort to (surprise, surprise) DNNs. They use NLD++ to create "Pseudo Ground Truth" from hazy images and then train a Convolutional Deep Neural Network with it. While CNNs, too, are computationally intensive, the ability to use GPUs make them comparatively faster than the NLD++ calculations on CPU.</p> <h4 id="Data-2">Data</h4> <p>The autors use SOTS, HazeRD (two synthesized haze image datasets based on NLD++), and OHazy dataset for training and evaluation. The synthesized datasets are relatively small, with only 4000 images in them. Because of this limitation, the author also try taking a pre-trained dehazing network (<em>GridDehazeNet</em>) and fine-tuning it using the synthesized data.</p> <h4 id="Results-2">Results</h4> <p>The authors compare the proposed approach with Detailed results on the video presentation show that NLD++, and NLD++ together with GridDehazeNet provides the best PSNR among the approaches compared. Upon subjective evaluation, my opinion is that the improvement seems to depend on the image.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. B in Ref. [3]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717143851.png" width="938" height="795" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. B in Ref. [3]</figcaption></figure></p> <h2 id="Photosequencing-of-Motion-Blur-using-Short-and-Long-Exposures">Photosequencing of Motion Blur using Short and Long Exposures</h2> <h3 id="Rengarajan-et-al-PDF">Rengarajan et al. <a href="https://arxiv.org/pdf/1912.06102.pdf">PDF</a></h3> <h4 id="Problem-3">Problem</h4> <p><em>Photosequencing</em> is the process of creating a sequence of sharp photos from one photo that contains motion blur. Fig. 1 in Ref. [4] shows an example blurry photograph. <a href="https://drive.google.com/file/d/1N-WnHy7OHFdI_SPSWvWYcIciV7BPdueM/view?usp=sharing" target="_blank">This video</a> plays the sequence of sharp photos created using this single blurry image (impressive, huh?). The ability to perform accurate photosequencing is very useful, because photos can be captured with long exposures at low light situations and then processed later to create a sharp image sequence.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 1 in Ref. [4]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717144001.png" width="529" height="527" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 1 in Ref. [4]</figcaption></figure></p> <p>However, this is an extremely challenging task, particularly if the movement is non-rigid.</p> <h4 id="Approach-3">Approach</h4> <p>The authors suggest using three photos, instead of one. Two short-exposure photos are captured <em>before</em> and <em>after</em> the blurry, long exposure photo (Fig. 1 in Ref. [4]). While these two photos are noisy, they provide valuable information regarding the initial and final positions of the moving objects. These three images are then fed into a U-Net like DNN that provides three intermediate frames as output (Fig. 3 in Ref. [4]). These frames are sharp, and can be used as part of the photosequence. By recursively feeding these outputs back to the network, a photosequence with a larger number of images can be created.</p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 1 in Ref. [4]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717144142.png" width="1200" height="401" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 1 in Ref. [4]</figcaption></figure></p> <p><figure class="figure-image figure-image-fotolife" title="Fig. 3 in Ref. [4]"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200717/20200717144241.png" width="1200" height="611" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Fig. 3 in Ref. [4]</figcaption></figure></p> <h4 id="Data-3">Data</h4> <p>The authors trained the DNN with images extracted/synthesized from the 240 fps datasets shared by Sony, GoPro and <a href="http://www.cs.ubc.ca/labs/imager/tr/2017/DeepVideoDeblurring/DeepVideoDeblurring_Dataset_Original_High_FPS_Videos.zip">Adobe</a>.</p> <h4 id="Results-3">Results</h4> <p>The video linked above shows an example photosequence created using the proposed method. The results are visually pleasing. Other results on the paper indicate some artifacts with more complicated motions. Comparisons with two related works show that sequences created using the proposed method have higher PSNR.</p> <h4 id="Comments">Comments</h4> <p>I like how the authors approach the problem by breaking it into parts; modifying the capture process by taking two extra photos, and then feeding all three photos to a DNN. The more common approach is to feed a single photo into the DNN to do everything. That is much easier to start with, but also much less likely to produce good results.</p> <h2 id="Concluding-remarks">Concluding remarks</h2> <p>Phew. That was long. But I assume that you skipped or glossed over the papers that did not interest you, and had a closer look at the others. I have provided links to papers that are available online for free, for those who want more details. I also deliberately avoided re-listing references from the original papers, for brevity.</p> <p>Since I attended the conference online and did not purchase the proceedings, I had to use screenshots of the videos for some figures. Pardon me if you have complaints about the quality of figures m(_ _)m.</p> <p>One more thing before I wind up. This is an <em>academic conference</em>, so don't expect that you can pick a paper from here, make stuff using its ideas, sell them and get rich. Research papers show you a direction and give you <em>credible</em> hints on where you can end up. You still have a long way to go, though, before you get there. At Morpho, both researchers and interns take such journeys to contribute to great imaging products. If that sounds interesting to you, we are hiring (^_~) .</p> <h2 id="References">References</h2> <p>[1] A. Paliwal and N. Khademi Kalantari, "Deep Slow Motion Video Reconstruction with Hybrid Imaging System," IEEE Transactions on Pattern Analysis and Machine Intelligence, 2020.</p> <p>[2] Y. Bekerman, S. Avidan and T. Treibitz, "Unveiling Optical Properties in Underwater Images," Video presentation on <a href="https://www.youtube.com/watch?v=QqPmPeiuqtY&feature=youtu.be,">https://www.youtube.com/watch?v=QqPmPeiuqtY&feature=youtu.be,</a> IEEE International Conference on Computational Photography (ICCP), 2020.</p> <p>[3] I. Tal, Y. Bekerman, A. Mor, L. Knafo, J. Alon and S. Avidan, "NLDNet++: A Physics Based Single Image Dehazing Network," Video presentation on <a href="https://www.youtube.com/watch?">https://www.youtube.com/watch?</a> v=QqPmPeiuqtY&amp;feature=youtu.be, IEEE International Conference on Computational Photography (ICCP), 2020.</p> <p>[4] V. Rengarajan, S. Zhao, R. Zhen, J. Glotzbach, H. Sheikh, and A. C. Sankaranarayanan, “Photosequencing of motion blur using short and long exposures,” arXiv preprint arXiv:1912.06102, 2019.</p> morphotech COVID-19 Project 第2回: 自動ミュート hatenablog://entry/26006613591860549 2020-08-03T10:00:07+09:00 2023-08-16T13:09:44+09:00 はじめまして。株式会社モルフォのソフトウェアエンジニア、神谷と申します。 前回に引き続き、withコロナ時代の社会貢献として当社が考えたアイデア 手で顔を触ったことを判定し、教えてくれる機能 オンライン会議中に、しゃべっていないときは自動でマイクをミュートする機能 のうち、2つめのアイデアについて紹介します。なお前回の記事は こちら です。 <p>はじめまして。株式会社モルフォのソフトウェアエンジニア、神谷と申します。</p> <p>前回に引き続き、withコロナ時代の社会貢献として当社が考えたアイデア</p> <ol> <li>手で顔を触ったことを判定し、教えてくれる機能</li> <li>オンライン会議中に、しゃべっていないときは自動でマイクをミュートする機能</li> </ol> <p>のうち、2つめのアイデアについて紹介します。なお前回の記事は <a href="https://techblog.morphoinc.com/entry/2020/07/06/100022">こちら</a> です。</p> <h3 id="開発の背景">開発の背景</h3> <p>新型コロナウイルス感染拡大の影響でオンライン会議が増えた方は多いのではないでしょうか。私もその1人です。大勢の人が参加するオンライン会議で、下記のような経験はないでしょうか。</p> <ul> <li>常にマイクをONにしており、キーボードのタッチ音等のノイズが相手に聞こえてしまっていた</li> <li>発言しないときにマイクをOFFにしていたら、いざ発言する際にマイクをONにするのを忘れてしまい相手に聞こえていなかった</li> <li>マイクの ON/OFF に気をつけているが、手動の操作が煩わしい</li> </ul> <p>本アイデアはこれらの経験をもとに生まれました。今、発話しているかしていないかを判定し、その判定に基づいて自動でマイクのON/OFFを切り替えてくれる機能があればオンライン会議の利便性が向上するだろう、そんな考えをもとに今回の開発がスタートしました。</p> <h3 id="開発の概要">開発の概要</h3> <p>本アイデアを実現するためのシステムとして、図1のようなシステムを考えました。 <figure class="figure-image figure-image-fotolife" title="システム概要"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200701/20200701143700.jpg" width="1200" height="391" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図1.システム概要</figcaption></figure> 本システムはオンライン会議システムで使用するウェブカメラとマイクを利用します。ウェブカメラから得られた画像をもとに画像認識をしつつ、マイクから得られた音声をもとに音声認識をします。そして、画像認識と音声認識とに基づいて現在ユーザーがしゃべっている状態かどうかの発話判定を行い、判定結果に基づいてオンライン会議システムのミュート制御(マイクON/OFF制御)を行います。</p> <p>当社ではオンライン会議システムに <a href="https://gsuite.google.co.jp/intl/ja/products/meet/">Google Meet</a> を標準的に利用しており、今回の開発ではこの Google Meet を開発ターゲットに選定しました。 また開発方針を検討する際に、本機能を多くの人に使ってもらうことを考えた場合にブラウザの拡張機能として動くものであればインストールのハードルが低いと考えブラウザの拡張機能 (Chrome Extension) として開発することにしました。Chrome Extension の開発方法については <a href="https://developer.chrome.com/extensions">Google 公式ページ</a> で JavaScript を用いた開発方法についてチュートリアルがあるため開発の障壁も高くありません。</p> <p>以下、それぞれの開発要素について紹介します。</p> <h3 id="画像認識による判定">画像認識による判定</h3> <p>まず画像認識による発話判定として、口の開閉判定を行うことを考えます。口の開閉判定を行うためには、顔の検出および口の検出を行う必要があります。今回は JavaScript 上で動く顔検出ライブラリとして、MIT ライセンスで公開されている下記の face-api.js を用いています。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fjustadudewhohacks%2Fface-api.js%2F" title="GitHub - justadudewhohacks/face-api.js: JavaScript API for face detection and face recognition in the browser and nodejs with tensorflow.js" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p> <p>図2に示される通り、face-api.js には68点の顔特徴点を抽出するモデルがあり、これら特徴点を利用して口の開閉判定を行います。図の49番から68番までの点が口の座標に対応しているため、これらの座標を用いて何らかの指標を定義し、口の開閉判定を行うことを考えます。</p> <blockquote><p><figure class="figure-image figure-image-fotolife" title="顔の68点の特徴点"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200701/20200701155350.jpg" width="372" height="300" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図2.顔の68点の特徴点</figcaption></figure> 出典:<a href="https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/">iBUG: facial point annotations</a> Figure 2 より引用</p></blockquote> <p>口の開閉判定に用いる指標としては、口の縦横比として下記のサイトで紹介されている MAR (Mouth Aspect Ratio) というアイデアを参考にしています。</p> <p><a href="https://medium.com/free-code-camp/smilfie-auto-capture-selfies-by-detecting-a-smile-using-opencv-and-python-8c5cfb6ec197">Smilefie: how you can auto-capture selfies by detecting a smile | by Rishav Agarwal | We&rsquo;ve moved to freeCodeCamp.org/news | Medium</a></p> <p>このサイトで紹介されている MAR の定義では、唇の外側の座標が使われています。しかし同じ定義の MAR を用いようとすると唇の厚さは個人差が大きいことから、本開発に上手く適用することができませんでした。そこで本開発では唇の内側の座標として図3に示した <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20P_%7B61%7D" alt=" P_{61}"/> から <img src="https://chart.apis.google.com/chart?cht=tx&chl=%20P_%7B68%7D" alt=" P_{68}"/> までの8点を用いることにし、式1で定義される MAR を使用します。</p> <p><figure class="figure-image figure-image-fotolife" title="MARの定義"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200702/20200702095447.jpg" width="365" height="201" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図3.口の開閉判定に用いる8点</figcaption></figure></p> <div align="center"><img src="https://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%7B%0AMAR%20%3D%20%5Cfrac%7B%7C%7CP_%7B68%7D-P_%7B62%7D%7C%7C%2B%7C%7CP_%7B67%7D-P_%7B63%7D%7C%7C%2B%7C%7CP_%7B66%7D-P_%7B64%7D%7C%7C%7D%7B%7C%7CP_%7B65%7D-P_%7B61%7D%7C%7C%7D%0A%7D" alt="\displaystyle{ MAR = \frac{||P_{68}-P_{62}||+||P_{67}-P_{63}||+||P_{66}-P_{64}||}{||P_{65}-P_{61}||} }"/></div> <p><figure class="figure-image figure-image-fotolife"><figcaption>式1.MAR の定義</figcaption></figure></p> <p>この MAR がある閾値以上であれば口が開いていると判定し、閾値未満の場合は口が閉じていると判定します。図4はこのアルゴリズムによって口の開閉判定を行っている例です。MAR の閾値は0.4としています。</p> <p><figure class="figure-image figure-image-fotolife" title="画像認識による発話判定(開発中の画面)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200703/20200703144253.gif" width="640" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図4.画像認識による発話判定(開発中の画面)</figcaption></figure></p> <p>以上により口の開閉判定が行えるようになりましたが、口の開閉判定と発話判定を等価にしてしまうと少し口を閉じただけで頻繁にマイクがOFF(自動ミュート)になってしまい、実用上は好ましくありません。そこで口が開くと即座にマイクがONになるが、マイクをOFFにするには一定時間(例えば約1秒)口を閉じ続けることを条件としています。</p> <h3 id="音声認識による判定">音声認識による判定</h3> <p>次に、音声認識による発話判定について紹介します。画像認識による判定のみではマスク等で口が隠れている場合に判定できなくなってしまうため、音声認識も併用することを考えます。ただし単純に音が発生しているときにマイクをONにするのでは発話以外のノイズにも反応してしまいます。つまり人間が喋っている音声とノイズを明確に区別する必要があります。そこで音声認識によって音声が言葉として認識できたかどうかを判定基準としています。</p> <p>今回は JavaScript で音声認識を行うにあたって Web Speech API の Speech Recognition 機能を利用しています。Web Speech API は W3C コミュニティグループによって策定されている音声関連機能の仕様で、対応しているブラウザは限定的ですが、今回の開発対象である Chrome には対応しています。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FSpeechRecognition" title="SpeechRecognition - Web APIs | MDN" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p> <p><code>SpeechRecognition</code> の API にある <code>onresult</code> というプロパティが、音声を言葉として認識できた際に発火するイベントハンドラです。そのため下記のように、音声を言葉として認識できた際に実行したい処理を記述することができます。</p> <pre class="code" data-lang="" data-unlink>const recognition = new SpeechRecognition(); ... recognition.onresult = function(event) { ... 音声を言葉として認識できた際に実行したい処理 ... }</pre> <p>音声認識による発話判定では、<code>onresult</code> によるイベントハンドラの発火でマイクONになるようにしています。</p> <h3 id="発話判定とミュート制御">発話判定とミュート制御</h3> <p>最後に、最終的な発話判定とミュート制御部分について紹介します。</p> <p>まず最終的な発話判定ですが、画像認識による発話判定と音声認識による発話判定の OR 条件としています。これは画像認識による判定も音声認識による判定もどちらも精度が100%ではなく、相補的なものであると考えたためです。</p> <p>ミュート制御部分についてですが、Google Meet 上でのミュート制御(マイクの ON/OFF 制御)には Windows では <code>Ctrl+d</code> のショートカットキーが割り当てられているためこれを利用します。JavaScript 上の記述で、仮想的に <code>Ctrl+d</code> のキーダウンイベントを発生させるようにしています。具体的なコードについては MIT ライセンスで公開されている下記の Google-Meet-Mute-Toggler を利用しています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fjasonketola%2FGoogle-Meet-Mute-Toggler%2F" title="GitHub - jasonketola/Google-Meet-Mute-Toggler: For muting and unmuting Google Meet from the extension icon." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p> <p>ただし、<code>Ctrl+d</code> による制御はトグル制御(一度押すとミュート状態になり、もう一度押すと元に戻る)ですので、スクリプトによる <code>Ctrl+d</code> 制御と実際のユーザー手動による <code>Ctrl+d</code> 制御が混在してしまうと、意図せずトグル状態が反転してしまうことがありました。そのため、実際のコードではまず現在ミュート状態かどうかを確認してから意図する方向に制御するようにしています。</p> <p>以上により、画像認識と音声認識による発話判定の結果から自動ミュート制御するシステムを作ることができました。</p> <p><figure class="figure-image figure-image-fotolife" title="自動ミュート機能の使用イメージ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/morphotech/20200720/20200720104642.png" width="1200" height="384" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>図5.自動ミュート機能の使用イメージ</figcaption></figure></p> <h3 id="最後に">最後に</h3> <p>今回ご紹介した自動ミュート機能の Chrome 拡張は、下記 Chrome ウェブストアにて公開しています。Chrome とウェブカメラ・マイクがあれば簡単に試すことができますので興味のある方はぜひ一度試してみてください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fgoogle-meet-auto-mute%2Fhbjmnnfhadeedfpchjhofclcdohnbfhe" title="Google Meet Auto Mute" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p> <p>またソースコードも GitHub にて公開しています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmorphoinc%2Fauto_mute" title="GitHub - morphoinc/auto_mute: Chrome extension which controls the mute function of Google Meet automatically" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p> <p>当社には画像処理と機械学習を専門としたソフトウェアエンジニアが数多く在籍しています。「画像処理を用いて課題を解決したい!」「AIで社会貢献したい!」こういった要望がありましたらお気軽にお問い合わせください。</p> morphotech