kou6839’s blog

c++ 競プロ(特にcsacademy) linuxについて書きます。普段は自動車屋さんでナビ開発してます。転職しました!!!!

PDFからtextを抽出する

入力サンプルPDF

https://arxiv.org/pdf/1703.10593.pdf


・参照サイトに書かれているpdfminerを使うと
https://techacademy.jp/magazine/22374

下記のような感じになってしまい、textとしてまとまった領域が取得できませんでした。

Unpaired Image-to-Image Translation
using Cycle-Consistent Adversarial Networks

Jun-Yan Zhu竏・
Taesung Park竏・
Phillip Isola

Alexei A. Efros

Berkeley AI Research (BAIR) laboratory, UC Berkeley

8
1
0
2

・色々格闘しましたが、2段組や図が挿入されているとわけがわからなくなるので、
一度jpegにして、google cloudを使ってみました。

ページがわかれていたりすると、分のつなぎが難しいだろうなという気はしますが、
ブロックごとに取得されることもあり、(縦の文字も回避できる)
トータルでは使いやすそうでした。

f:id:kou6839:20200628210853p:plain

Image denoising: Can plain Neural Networks compete with BM3D?

2012年の論文です。

DeepLによる翻訳
http://webdav.is.mpg.de/pixel/files/neural_denoising/paper.pdf

Abstract
画像のノイズ除去は、ノイズの多い画像からノイズのない画像へのマッピングの問題として説明することができます。現在利用可能な最良のデノイジング手法は、巧妙に設計されたアルゴリズムマッピングを近似しています。本研究では、このマッピングを画像パッチに適用したプレーンマルチレイヤーパーセプトロン(MLP)を用いて直接学習することを試みる。さらに、我々の手法は、あまり詳しく研究されていないタイプのノイズにも容易に適応でき、(学習データを交換するだけで)優れた結果を得ることができます。

1. Introduction
画像のノイズ除去手順は、ノイズの多い画像を入力とし、ノイズが低減された画像を出力する。数多くの多様なアプローチが存在します。ノイズの多い画像の一部を選択的に平滑化するものもあれば [25, 26]、ウェーブレット係数を慎重に縮小するものもあります [24, 26]。他には,ウェーブレット係数の慎重な縮小に依存する方法もある [24, 18].概念的に類似したアプローチは、学習辞書[1, 4]の要素の疎な線形組み合わせを用いて、ノイズの多いパッチを近似しようとすることで、画像パッチをノイズ除去することである。辞書の学習は、ノイズのないデータセットでの学習によって達成されることもあります。他の方法では、例えば [20, 27, 9] のように、ノイズフリーのデータセット上でグローバル画像優先度を学習することもあります。最近のアプローチでは、画像の「非局所的」な統計量を利用しています。この最後のクラスのアルゴリズムと、特にBM3D [3]は、自然画像のノイズ除去における現在の最先端を表しています。
BM3Dはよくできたアルゴリズムですが、ノイズのあるパッチとノイズのないパッチのペアからなる訓練例から画像のノイズ除去手順を純粋に自動学習することはできないのでしょうか?この論文では、ノイズのあるパッチをノイズのないパッチにマッピングするプレーンマルチレイヤーパーセプトロン(MLP)を用いて、最先端のノイズ除去性能を達成することが可能であることを示します。
これは、以下の要因が重なっているからこそ可能なのです。

  • MLPの容量は十分に大きく、十分に多くの隠蔽ユニットを持つ隠蔽層で構成されていることが選ばれている。
  • パッチサイズは十分に大きく、すなわち、パッチはノイズのないバージョンを復元するのに十分な情報を含んでいます。これは以前の知見[12]と一致しています。
  • 選ばれた学習セットは十分に大きい。訓練例は、ノイズのないパッチをノイズで破壊することにより、オンザフライで生成されます。

大規模なトレーニングセットを用いた大容量MLPのトレーニングは、最新のGPU(Graphics Processing Unit)を用いて実現可能です。

Contributions:
本研究では、プレーンニューラルネットワークを用いて大規模データセット上で学習されたパッチベースのノイズ除去アルゴリズムを紹介する。加法ホワイトガウシアン(AWG)ノイズに対する結果は、現在の技術水準に匹敵するものであった。このアプローチは、AWGノイズほど広く研究されていない他のタイプのノイズに対しても同様に有効である。

2. Related work
ニューラルネットワークはすでに画像のノイズ除去に利用されている[9]。一般的に使用されているネットワークは、畳み込みニューラルネットワーク(CNN)[10]と呼ばれる特殊なタイプのもので、手書きの数字や交通標識の認識など様々なタスクに有効であることが示されています[23]。これにより、通常の多層パーセプトロンに比べてパラメータの数を減らしつつ、良好な結果を得ることができる。これは学習データ量が少ない場合に有効である。一方、多層パーセプトロンはCNNよりも強力な性能を持つ可能性がある。MLPは普遍的な関数近似器[8]と考えることができるが,CNNは学習可能な関数のクラスを制限している.
19]では、画像パッチのノイズ除去のために、特殊なアーキテクチャ(すなわち、スパース化ロジスティックを含む)を持つ別の種類のニューラルネットワークが使用されている。小さな訓練セットが使用されている。強いレベルのノイズに対して結果が報告されている。また、ウェーブレット係数に多層パーセプトロンを適用して画像のノイズ除去を行う試みも行われている[28]。ウェーブレットベースの使用は、画像に関する事前知識を組み込む試みと見ることができます。
Differences to this work:
これまで述べてきた手法の多くは,自然画像を前提としている.そのような仮定を明示的に課すのではなく,むしろ純粋な学習アプローチを提案する.

3. Multi layer perceptrons (MLPs)
多層パーセプトロン(MLP)は非線形関数であり、複数の隠れ層を介してベクトル値の入力をベクトル値の出力に写像する。例えば、2つの隠れ層を持つMLPは次のように書くことができます。
f:id:kou6839:20200527211536p:plain
重み行列W1,W2,W3とベクトル値バイアスb1,b2,b3がMLPをパラメータ化し、関数tanhコンポーネント単位で動作します。MLPアーキテクチャは、隠れ層の数と層のサイズによって定義されます。例えば、(256,2000,1000,10)MLPは2つの隠れ層を持ち、入力層は256次元、すなわちx∈<256である。入力層は256次元、すなわちx∈<256であり、第1の隠れ層のベクトルv1 = tanh(b1 + W1x)は2000次元、第2の隠れ層のベクトルv2 = tanh(b2 + W2v1)は1000次元、出力層のベクトルf(x)は10次元である。一般的にMLPフィードフォワードニューラルネットワークとも呼ばれる。

3.1. Training MLPs for image denoising
このアイデアは、ノイズの多い画像パッチを、ノイズが低減または除去されたクリーンな画像パッチにマッピングするMLPを学習することである[11]。MLPのパラメータは、stochastic gradient descent [11]を用いて、ノイズの多い画像パッチとクリーンな画像パッチのペアを学習することで推定されます。MLPパラメータは、マップされたノイズパッチf(x)とクリーンパッチyの間の二次誤差を最小化するバックプロパゲーションアルゴリズム[21]によって更新されます。
1. データの正規化。ピクセル値は、ほぼ平均が0で分散が1に近い値に変換されます。より正確には、画素値が0と1の間にあると仮定して、0.5を引き、0.2で割る。
2. 重みの初期化。重みは平均0、標準偏差σ=√Nの正規分布からサンプリングされます。最初のトリックと組み合わせることで、シグモイド関数の線形部分と非線形部分の両方に到達することを保証します。
3. 学習率の分割。各レイヤでは、学習率をそのレイヤの入力ユニット数であるNで割る。これにより,学習率を変更することなく,隠れユニットの数を変更することができる.
基本学習率は0.1とし,重みには正則化を施していない.

3.2. Applying MLPs for image denoising
画像をノイズ除去するには、与えられたノイズの多い画像を重ね合わせたパッチに分解し、各パッチxを個別にノイズ除去します。非ノイズ化された画像は、非ノイズ化されたパッチf(x)をノイズの多い対応するパッチの位置に配置し、重なり合った領域で平均化することで得られます。デノイズされたパッチにガウス窓で重み付けをすることで、結果が若干改善されることがわかりました。また、すべての可能なオーバーラップパッチ(ストライドサイズ1、すなわちパッチオフセット1)を使用する代わりに、3番目のスライドウィンドウパッチ(ストライドサイズ3)を使用することで、計算時間を9分の1に短縮しながら、ほぼ同等の結果が得られることがわかりました。 ストライドサイズ3を使用することで、最新のCPUで512×512ピクセルの画像を約1分でノイズ除去することができ、BM3D [3]よりは遅いですが、KSVD [1]よりはかなり高速になりました。

3.3. Implementation
MLPで最も計算量の多い演算は、行列-ベクトルの乗算です。この演算にはCPUよりもGPU(Graphics Processing Unit)の方が適しています。このため、GPU上にMLPを実装しました。nVidia社のC2050GPUを使用し、クアッドコアCPUで実装した場合と比較して一桁以上の高速化を実現しました。この高速化は非常に重要な要素であり、より大規模な実験が可能になりました。

4. Experimental setup
カラー画像からMATLABのrbg2gray関数を用いて得られたグレースケール画像を用いて実験を行った。2つのノイズサンプルが同じである可能性は低いため、どのデータセットを使用しても学習データ量は実質的に無限大である。しかし、破損していないパッチの数は、データセットのサイズによって制限されます。

Training data:
:実験のために、2つの訓練セットを定義する。
小規模なトレーニングセット 200枚の画像を含むBerkeleyセグメンテーションデータセット[15]と
大規模なトレーニングセット。LabelMeデータセット[22](約150,000枚の画像を含む)とBerkeleyセグメンテーションデータセットの組み合わせ。
LabelMeデータセットのいくつかの画像は、少しノイズが多かったり、少しぼやけているように見えたので、MATLABのimresize関数をデフォルトのパラメータで使用して、そのデータセットの画像を2倍に縮小しました。

Test data:
我々のアプローチを評価するために、3つの異なるテストセットを定義します。
標準的なテスト画像。この11枚の画像は、"Lena "や "Barbara "など、他のノイズ除去アルゴリズム[3]の評価に使用されている標準画像を含んでいます。
パスカルVOC 2007のテストセット[5]から500枚の画像をランダムに選択した。Pascal VOC 2007のテストセット[5]から500枚の画像をランダムに選択しました。
McGill:McGillデータセット[17]から500枚の画像をランダムに選択しました。

5. Results
次に、BM3Dや他の既存のアルゴリズムとの比較を行い、最後に他のタイプのノイズに対してMLPがどのような性能を発揮するかを示します。

5.1. More training data and more capacity is better
我々は、異なるアーキテクチャとパッチサイズのネットワークを学習します。例えば、L-17-4x2047はパッチサイズ17×17、サイズ2047の4つの隠れ層を持つ大規模な学習セットで学習されるネットワークであり、同様にS-13-2x511はパッチサイズ13×13、サイズ511の2つの隠れ層を持つ小規模な学習セットで学習されるネットワークである。その他のアーキテクチャは、図1の凡例で示されています。これらのMLPはすべて、σ=25のガウスノイズで破壊された画像パッチ上で訓練されています。
ネットワークの性能を監視するために、標準偏差σ=25のガウスノイズで破壊された2つのテスト画像 "Barbara "と "Lena "の200万回の学習例ごとにネットワークをテストしました。図1は、2つのテスト画像上でのネットワークのPSNRの向上を示しています。
Observations:
良い結果を得るためには、多くのトレーニングサンプルが必要です。最初の4,000万個のトレーニングサンプルでは、進歩は安定しています。その後も、テスト画像のPSNRはゆっくりとではありますが改善されています。オーバーフィットが問題になることはありません。サイズ13×13のパッチよりも17×17のパッチの方が良い結果が得られます。小さな学習セット(Berkeley)から大きな学習セット(LabeleMe + Berkeley)に切り替えると、結果が非常に良くなります。学習データセットを用いて画像統計学を学習しようとする試みのほとんどは、Berkeleysegmentationデータセット[20, 9, 19]のみを使用していることに注意してください。

f:id:kou6839:20200527212624p:plain
図1. 学習中の "Barbara "と "Lena "の平均PSNRの改善。

f:id:kou6839:20200527212654p:plain
図3. BM3Dと比較した500枚のテスト画像の2つのデータセットにおける本手法の性能プロファイル。

5.2. Can MLPs compete with BM3D?
前節では,大規模な学習セットを用いて学習した4つの隠れ層のサイズ2047,パッチサイズ17×17のMLP L-17-4x2047が最も良い結果を得た.以下では,テストデータを用いて,BM3D[3]を含む他のデノイジング手法との比較を行う.

Pascal VOC 2007, McGill:
図3はPASCAL VOC 2007とMcGillのBM3Dとの比較である。平均的には、PASCAL VOC 2007(0.03dB改善)とMcGill(0.08dB改善)で同等の結果が得られています。同様に、我々のMLPはMcGill画像の500枚の画像のうち347枚でBM3Dを上回っている。画像 "pippin0120 "では0.81dB、画像 "merry mexico0152 "では1.32dBの改善が見られます。

Standard test images:
また、標準的なテスト画像を用いて、BM3DとMLP(アストライドサイズ1)を比較した(表1参照)。BM3Dでは、同じテスト画像の105個の異なるノイズのあるインスタンスの平均結果を報告している。実行時間を長くするために、我々のアプローチでは、17種類のノイズのあるインスタンスのみを使用している。11個のテスト画像のうち、6個のテスト画像でBM3Dを上回る結果が得られました。BM3Dはバーバラのパンツのような規則的な構造を持つ画像では明らかに有利である。Barbaraを除く全ての画像でKSVD[1]を上回る性能を示した.KSVDは辞書ベースのノイズ除去アルゴリズムで、ノイズの多い画像に適応した辞書を学習します。繰り返し構造の多い画像はBM3DとKSVDの両方に適しています。ニューラルネットワークがBM3Dに対抗できることがわかる。

f:id:kou6839:20200527213052p:plain
図2. BM3Dと比較した結果。一部の画像(上段)では、我々の手法がBM3Dを凌駕している。しかし、それ以外の画像では、BM3Dの方が我々の手法よりもはるかに優れた結果が得られている。BM3Dが優れている画像は、バーバラのズボンの縞模様(下段)のような規則的な構造を持った画像である。

f:id:kou6839:20200527213151p:plain


f:id:kou6839:20200527213211p:plain
図4. 様々なノイズレベルの画像での比較:σ=25で訓練されたMLPは、σ=25では競争力がある。いくつかのノイズレベルで学習したMLPは、より高いノイズレベルでも競争力があります。

5.3. Robustness at other noise levels
前節のMLPは、σ=25のAWGノイズで破損した画像パッチのみを学習しました。他のノイズレベル(σが25より小さいか大きい)にも対応できるのでしょうか?この疑問に答えるために、異なる値のσを持つAWGノイズで破壊された11の標準テスト画像に適用しました。図4は、GSM、KSVD、BM3Dで得られた結果との比較を示しています。σ=25の場合、当社のMLP(茶色の線)は競争力がありますが、それ以外のノイズレベルでは劣化していることがわかります。このMLPはノイズのレベルが変化したことを知りませんが、他の手法はその情報を提供しています。この効果を調べるために、BM3Dを異なるノイズレベルで実行しましたが、入力パラメータをσ=25に固定しました(赤い曲線)。我々の手法と同様の挙動が見られます。我々のMLPは、より高いノイズレベル(赤の上の茶色)でもわずかに良好に一般化しています。

5.4. MLPs trained on several noise levels
単一のノイズレベルの例で学習したMLPの限界を克服するために、我々はノイズレベルが異なるノイズによって破損した画像パッチでネットワークを学習することを試みた。我々は、σ=25で訓練したネットワークと同じアーキテクチャを使用しました。与えられた訓練パッチのノイズ量(すなわちσの値)をネットワークへの追加入力として与えました。これは2つの方法で行われました。1つの追加入力ユニットが直接σの値を与え、15個の追加入力ユニットは、対応するσの値をコード化している1つのユニットを除いて、すべてのユニットが-1に設定されたスイッチとして機能しました。トレーニングは前述のように行い、σは0から105までの間で5個の中からランダムに選択した。このネットワークを、異なるσ値の11の標準テスト画像でテストしました(図4の緑の線を参照)。どのノイズレベルでもBM3Dを上回る性能を発揮しましたが、GSMとKSVDの両方の高ノイズレベルよりも優れた性能を発揮しました。低ノイズレベル(σ=5)では、ノイズの多い入力よりもデノワイアの結果は悪くなります。我々は以下の結論を導き出しました。複数のノイズレベルでのデノイジングは、単一のノイズレベルでのデノイジングよりも難しい。ネットワークが高いノイズレベルで良好な性能を発揮するのは、ノイズの多いパッチの方がより長いグラディエントを提供するという事実に起因するものと推測されます。したがって、ノイズレベルが高いほど訓練手順が支配的になります。潜在的な解決策としては、学習率をσの値に適応させることが考えられます。

5.5. Learning to remove arbitrary noise types
事実上すべてのノイズ除去アルゴリズムは、ノイズをAWGと仮定しています。しかし、画像がAWGノイズによって常に破損しているわけではありません。ノイズは必ずしも加法的、白色、ガウシアン、信号に依存しないとは限りません。例えば、状況によっては、画像処理がポアソンノイズ(フォトンショットノイズなど)によって破壊されることもあります。このような場合、AWGノイズを想定したノイズ除去アルゴリズムが、何らかのイメージ変換を用いてこのような画像に適用される可能性があります[14]。同様に,磁気共鳴イメージングで発生するRice-distributed noiseにも対応可能である[6].このような場合には、ノイズの種類に合わせて設計されたノイズ除去アルゴリズムを作成することで解決することができます。MLPを用いることで、与えられたノイズタイプのノイズをシミュレートすることができれば、与えられたノイズタイプのノイズ除去アルゴリズムを効果的に学習することができます。以下では、AWGノイズとは異なる3つのノイズタイプについての結果を示しています。

Stripe noise:画像データには構造が含まれていると思われがちですが、ノイズは無相関であるため構造化されていません。ノイズにも構造が含まれている場合、この仮定は違反しており、ノイズ除去の結果は悪くなります。ここでは、ノイズが加法的なガウスノイズであるが、水平方向に隣接する8つのノイズ値が同じ値を持つ場合の例を示します。5,800万個の学習例で学習したMLPは、BM3Dを凌駕した(図5の左欄参照)。

Salt and pepper noise:ノイズが加法ガウスノイズの場合、ノイズのある画像値は元の画像値と相関があります。ソルト&ペッパーノイズでは、ノイズ値は元の画像データと相関していません。各ピクセルは破損している確率pを持っています。破損したピクセルは確率0.5で0に設定され、そうでない場合は可能な限り高い値(8ビット画像では255)に設定されます。塩コショウノイズを除去する一般的なアルゴリズムは、中央値フィルタリングです。また、BM3D(σの値を変化させて)を用いて実験したところ、PSNRは25.55dBとなりました。5,000万個の学習例を用いて学習したMLPは、図5の中段に示すように、両手法を凌駕しています。

JPEG quantization artifacts:このようなアーチファクトは、JPEG画像の圧縮アルゴリズムによって発生します。JPEGノイズの特徴としては、画像がブロック状になったり、エッジの鮮明さが失われたりすることが挙げられます。この種のノイズはランダムではなく、入力画像によって完全に決定されます。JPEG圧縮された画像を向上させる一般的な方法は、画像をシフトさせ、JPEG圧縮を再度適用し、シフトバックして平均化することです[16]。BM3Dは、パラメータを調整した後、このタスクで同様の結果を得ています。1,200万個の訓練用サンプルを用いて学習したMLPは、図5の右の列にあるように、両方の手法よりも優れた結果を出しています。

f:id:kou6839:20200527213721p:plain

6. Discussion
入力層に適用される学習済みの重みと出力層を計算する重みは、図7と図6を参照してください。図6の後者のパッチは、重み付け係数として最後の隠れ層のスカラと線形的に結合されているので、denoisedパッチの辞書を形成しています。1)ガボールフィルタに似たパッチ、2)ブロブ、3)より大きなスケール構造、4)ノイズの多いパッチです。ガボールフィルタは、異なるスケール、シフト、方向で発生します。同様の辞書は、他のノイズ除去アプローチでも学習されています。MLPはシフト不変ではないので、いくつかのパッチがお互いにシフトしたバージョンであることを説明しています。このパッチはフィルタとして解釈することができ、隠れニューロンの活動は、入力に対するフィルタの応答に対応するパッチに接続されています。これらのパッチは、大きく3つのカテゴリーに分類されます。これらのパッチは、ノイズの多い入力データから有用な特徴を抽出することができますが、出力層のパッチよりも解釈が難しくなっています。重みの進化をランダムウォークのように考えたくなるかもしれません。その場合、「1-ノルム」は時間の経過とともに増加するはずです。しかし、最初の層を除くすべての層で、`1-ノルムは時間の経過とともに減少することが観察されます(最初の短い期間に増加した後)。このことは、重さに対する明示的な正則化がない場合に起こり、そのような正則化は必要ないことを示している。

f:id:kou6839:20200527215642p:plain
図6. 出力層の重みのランダム選択。各パッチは、1つの隠れニューロンから出力ピクセルへの重みを表しています。

f:id:kou6839:20200527221021p:plain
図7. 入力層の重みのランダム選択。各パッチは、入力ピクセルから1つの隠れニューロンへの重みを表しています。

f:id:kou6839:20200527221104p:plain
図8. 学習中にいくつかの層の重みの`1-ノルムが減少する(明示的な正則化を行わない)。

MLPs vs. Support Vector Regression:我々は、回帰問題を解くためにMLPを用いてノイズ除去法を学習する。同様に有効なアプローチとしては、サポートベクター回帰(SVR)のようなカーネルアプローチを使用することが考えられます。(i) MLPは行列-ベクトル乗算に基づいているため、GPU上での実装が容易である。(ii) MLP確率的勾配降下法を用いて非常に大規模なデータセットに対して容易に学習できる。しかし、我々はSVRで達成可能な結果の質については何も主張していない。

Is deep learning necessary?多くの隠れた層を持つMLPを学習すると,バニシンググラディエントやオーバーフィッティングなどの問題が発生する.これらの問題を回避するために、教師なし学習段階から始まるディープラーニングと呼ばれる新しい学習手順が提案されている[7]。このようなアプローチは、ラベル付けされたデータが少ないが、ラベル付けされていないデータが豊富な場合や、バックプロパゲーションを用いて効果的に学習するにはネットワークが深すぎる場合に最も有効である。本研究では、ラベル付きデータが豊富で、ネットワークの隠れ層が4層以下の場合に、バックプロパゲーションが有効であることを示した。バックプロパゲーションがうまく機能していることがわかったので、深層学習技術は必要ないと結論づけたが、教師なし事前学習技術を用いることで、より良い結果が得られる可能性がある。

7. Conclusion
ニューラルネットワークは、最先端の画像ノイズ除去性能を実現することができます。そのためには、①ネットワークの容量が十分に大きいこと、②パッチサイズが十分に大きいこと、③学習セットが十分に大きいこと、が重要ですが、これらの条件を満たすためには、ニューラルネットワークの学習と適用に必要な計算に最適なGPUをMLPsonに実装することが必要です。しかし、我々の最も競争力のあるMLPは単一のノイズレベルに合わせたものであり、他のノイズレベルに対しては他のノイズ除去法と比較して一般化しにくい。これは、我々が既に複数のノイズレベルで学習したMLPで克服しようとしている深刻な限界です。しかし、後者では、σ=25の場合には、特化したMLPのような性能はまだ得られていません。しかし、より大容量で十分な学習時間を持つネットワークであれば、これは可能であると考えています。

UNet++: A Nested U-Net Architecture for Medical Image Segmentation

DeepLによる翻訳
https://arxiv.org/pdf/1807.10165.pdf


Abstract.
この論文では、医用画像のセグメンテーションのためのより強力な新しいアーキテクチャであるUNet++を紹介する。我々のアーキテクチャは、本質的に深層監視されたエンコーダ-デコーダネットワークであり、エンコーダとデコーダのサブネットワークは、一連の入れ子になった密なスキップパスウェイを介して接続されている。再設計されたスキップパスウェイは、エンコーダとデコーダのサブネットワークの特徴マップ間のセマンティックギャップを減らすことを目的としています。
デコーダネットワークとエンコーダネットワークの特徴マップが意味的に類似している場合、オプティマイザはより簡単な学習タスクを扱うことができると主張している。胸部の低線量CTスキャンにおける結節のセグメンテーション、顕微鏡画像における核のセグメンテーション、腹部CTスキャンにおける肝臓のセグメンテーション、大腸内視鏡ビデオにおけるポリープのセグメンテーションなど、複数の医用画像のセグメンテーションタスクを対象に、U-NetおよびワイドU-Netアーキテクチャと比較してUNet++を評価した。我々の実験では、深い監視機能を持つUNet++が、U-NetとワイドU-Netに対して、それぞれ3.9ポイントと3.4ポイントの平均的なIoU利得を達成していることが実証された。

1 Introduction
画像のセグメンテーションのための最新モデルは、U-Net [9] や完全畳み込みネットワーク(FCN) [8] などのエンコーダデコーダアーキテクチャの変種です。 セグメンテーションに使用されるこれらのエンコーダデコーダネットワークには、重要な共通点があります。 それは,深い意味的で粗視化された特徴マップを組み合わせたスキップ接続です. デコーダサブネットワークからの浅くて低レベルの微細なフィーチャーマップを持つ エンコーダのサブネットワークから スキップ接続は、以下の点で効果的であることが証明されています。 対象物の詳細をきめ細かく復元し、セグメンテーションを生成する 複雑な背景でも細かいマスクを作成できます。接続をスキップするのも MaskRCNNのようなインスタンスレベルのセグメンテーションモデルを成功させるためには、オクルードオブジェクトのセグメンテーションを可能にするための基本的な技術が必要です。おそらく、画像 自然画像のセグメンテーションは、満足のいくレベルの性能に達しています。 しかし、これらのモデルは医用画像の厳密なセグメンテーション要件を満たしているのでしょうか?
医用画像における病変や異常のセグメンテーションには、自然画像よりも高い精度が要求されます。自然画像では正確なセグメンテーションマスクは重要ではないかもしれませんが、医療画像ではわずかなセグメンテーションエラーであっても、臨床現場でのユーザーエクスペリエンスの低下につながる可能性があります。例えば、結節の周囲に見られる微妙なスピキュレーションパターンは結節の悪性を示唆している可能性があるため、セグメンテーションマスクから除外すると、臨床的な観点からモデルの信頼性が低下することになる。さらに、セグメンテーションの不正確さは、その後にコンピュータで作成された診断に大きな変化をもたらす可能性がある。例えば、縦断的研究で結節の成長を誤って測定した場合、スクリーニング患者に誤ったLung-RADScategoryが割り当てられる可能性がある。そのため、医用画像中の対象物の細部を効果的に復元できるような、より効果的な画像分割アーキテクチャの考案が望まれている。
医用画像におけるより正確なセグメンテーションの必要性に対応するために、入れ子になったコネクションとデンシスキップコネクションに基づく新しいセグメンテーションアーキテクチャであるUNet++を紹介します。このアーキテクチャの背景にある仮説は、エンコーダーネットワークからの高解像度の特徴量マップを徐々にリッチにしてから、デコーダーネットワークからの対応する意味的にリッチな特徴量マップと融合させることで、前景の物体の詳細をより効果的に捉えることができるというものである。本研究では、デコーダネットワークとエンコーダネットワークの特徴マップが意味的に類似している場合には、ネットワークの学習が容易になることを論じている。これは、U-Netで一般的に用いられているプレーンスキップ接続では、エンコーダーからデコーダーネットワークへ高解像度の特徴量マップを直接早送りしてしまい、意味的に異なる特徴量マップを融合させてしまうのとは対照的である。実験の結果、提案されたアーキテクチャは効果的であり、U-NetおよびワイドU-Netと比較して大幅な性能向上をもたらした。

2 Related Work
Longら[8]が最初に完全畳み込みネットワーク(FCN)を導入したのに対し、UNetはRonnebergerら[9]によって導入された。両者は、スキップコネクショ ンという重要なアイデアを共有している。FCNでは、アップサンプリングされた特徴量マップをエンコーダからスキップされた特徴量マップと合計するのに対し、U-Netではそれらを連結し、各アップサンプリングステップの間に畳み込みと非線形性を付加する。スキップ接続により、ネットワーク出力での空間分解能を完全に回復させることができるため、完全畳み込み法はセマンティックセグメンテーションに適しています。DenseNetアーキテクチャ[5]に触発されて、Liら[7]は肝臓と肝臓腫瘍のセグメンテーションのためのH-denseunetを提案した。Drozdzalet al. [2]は、スキップ接続の重要性を体系的に調査し、エンコーダ内に短いスキップ接続を導入した。上記のアーキテクチャの間のわずかな違いにもかかわらず、これらのアーキテクチャはいずれもエンコーダとデコーダのサブネットワークから意味的に異なる特徴マップを融合する傾向があり、我々の実験によると、セグメンテーション性能を低下させる可能性があります。
最近では、GridNet [3]とMask-RCNN [4]があります。GridNetは、特徴マップをグリッド状に配線したエンコーダ・デコーダアーキテクチャで、古典的なセグメンテーション・アーキテクチャを一般化したものです。しかし、GridNetはスキップ接続間のアップサンプリング層を持たないため、UNet++を表現することができません。マスクRCNNは、物体検出、分類、セグメンテーションのための最も重要なメタフレームワークである。マスク-RCNNのバックボーン・アーキテクチャとしてUNet++が容易に導入できることに注意したいと思います。スペースが限られているため、バックボーンアーキテクチャとしてUNet++を用いたMask RCNNの結果は掲載できませんでしたが、詳細については補足資料を参照してください。

f:id:kou6839:20200527203347p:plain
図1: (a) UNet++はエンコーダとデコーダで構成されており、一連のネストされた密な畳み込みブロックを介して接続されている。UNet++の背後にある主なアイデアは、融合に先立ってエンコーダとデコーダの特徴マップ間のセマンティックギャップを埋めることである。例えば、(X0,0,X1,3)の間のセマンティックギャップは、3つの畳み込み層を持つ密な畳み込みブロックを使用して橋渡しされます。図中、黒は元のU-Net、緑と青はスキップパスウェイ上のdenseconvolutionブロック、赤はdeep supervisionを示している。(b) UNet++の最初のスキップ経路の詳細解析。(c) UNet++はディープスーパービジョンで学習すれば、推論時に剪定することができる。

3 Proposed Network Architecture: UNet++
図 1a は、提案されたアーキテクチャのハイレベルな概要を示している。このように、UNet++はエンコーダサブネットワークまたはバックボーンから始まり、デコーダサブネットワークが続く。UNet++がU-Net(図1aの黒いコンポーネント)と異なるのは、2つのサブネットワークを接続するために再設計されたスキップ・パスウェイ(緑と青で示されている)と、ディープ・スーパービジョン(赤で示されている)を使用していることです。

3.1 Re-designed skip pathways
再設計されたスキップパスウェイは、エンコーダとデコーダのサブネットワークの接続性を変換します。U-Netでは、エンコーダの特徴マップはデコーダで直接受信されますが、UNet++では、畳み込み層の数がピラミッドレベルに依存する高密度の畳み込みブロックを受けます。例えば、ノード X0,0 と X1,3 の間のスキップ経路は、3 つの畳み込み層を持つ密な畳み込みブロックで構成されており、各畳み込み層の前には、同じ密なブロックの前の畳み込み層からの出力と、下位の密なブロックの対応するアップサンプル出力を融合する連結層があります。本質的に、密な畳み込みブロックは、エンコーダの特徴マップの意味レベルを、デコーダで待ち受けている特徴マップの意味レベルに近づけます。仮説として、受信したエンコーダ特徴量マップと対応するデコーダ特徴量マップが意味的に類似している場合、オプティマイザは最適化問題に直面しやすくなるというものがあります。
ここで、i はエンコーダに沿ったダウンサンプリング層、j はスキップ経路に沿った高密度ブロックの畳み込み層を表す。xi,jで表される特徴量マップのスタックは次のように計算される。
f:id:kou6839:20200527203832p:plain
ここで、関数 H(-) は畳み込み演算に続いて活性化関数、U(-) はアップサンプリング層、[ ] は連結層を表す。 基本的に、レベル j = 0 のノードはエンコーダの前のレイヤからの入力を 1 つだけ受け取り、レベル j = 1 のノードはエンコーダサブネットワークからの 2 つの入力を連続した 2 つのレベルで受け取り、レベル j > 1 のノードは j + 1 の入力を受け取り、そのうち j の入力は sameskip パスウェイの前の j ノードの出力であり、最後の入力は下位スキップパスウェイからのアップサンプリングされた出力である。すべての先行特徴マップが蓄積されてcurrentノードに到達するのは、各スキップ経路に沿って密な畳み込みブロックを利用しているからである。図1bは、特徴マップがどのようにしてUNet++のトップスキップパスウェイを通過するかを示すことによって、式1をさらに明確にする。


3.2 Deep supervisio
1) すべてのセグメンテーション・ブランチからの出力を平均化するアキュレート・モード、2) 最終的なセグメンテーション・マップをセグメンテーション・ブランチのうちの1つだけから選択する高速モード、である。図 1c は、高速モードでのセグメンテーション・ブランチの選択が、異なる複雑さのアーキテクチャにどのような結果をもたらすかを示しています。
スキップ経路が入れ子になっているため、UNet++は複数の意味レベル、{x0,j , j∈{1,2,3,4}}で完全な解像度の特徴量マップを生成し、深い監視が可能である。損失関数として、2値クロスエントロピーと2値係数の組み合わせを上記の4つの意味レベルのそれぞれに追加した。
f:id:kou6839:20200527204249p:plain
ここで,Yˆb,Ybはそれぞれb番目の画像の平坦化予測確率と平坦化基底真実を表し,Nはバッチサイズを表す.
要約すると、図 1a に示すように、UNet++ はオリジナルの U-Net とは 3 つの点で異なっている。1) スキップ経路上に畳み込み層(緑で示す)を持つことで、エンコーダとデコーダの特徴マップ間のセマンティックギャップを埋めていること、2) スキップ経路上に密なスキップ接続(青で示す)を持つことで勾配フローを改善していること、3) ディープスーパービジョン(赤で示す)を持つことで、セクション4で示されるようにモデルの剪定が可能となり、損失層を1つだけ使用する場合と同等の性能を向上させるか、最悪の場合には同等の性能を達成していることである。

4 Experiments
Datasets:
表1に示すように、本研究では、異なる医用画像モダリティの病変・臓器を対象とした4つの医用画像データセットを用いて、モード評価を行っています。
Baseline models:
:比較のために,オリジナルのU-Netとカスタマイズされた全体的なU-Netアーキテクチャを使用した.U-Netを選択した理由は,画像分割の性能が共通しているからである.また,提案したアーキテクチャと同程度のパラメータ数で幅広U-Netを設計した.これは,単にパラメータ数が増えただけでは性能が向上しないことを確認するためである.表2にU-NetとワイドU-Netの詳細を示す。
Implementation details:
Dice係数とIoU(Intersectionover Union)を監視し、検証セットにはアーリーストップ機構を使用した。また、学習率3e-4のAdamオプティマイザを使用した。UNetとワイドU-Netのアーキテクチャの詳細を表2に示す。UNet++は元々のU-Netアーキテクチャをベースに構築されている。スキップパスウェイ(Xi,j )に沿ったすべての畳み込み層は、3×3(3D肺結節セグメンテーションの場合は3×3×3×3)のサイズのk個のカーネルを使用しており、ek = 32×2iである。深い監視を可能にするために、1×1の畳み込み層にシグモイド活性化関数を付加した。x0,j |j∈{1,2,3,4}}}が追加された。その結果、UNet++は入力画像を与えられた4つのセグメンテーションマップを生成し、それらをさらに平均化して最終的なセグメンテーションマップを生成します。詳細は github.com/Nested-UNet

f:id:kou6839:20200527204617p:plain
図2. ポリープ、肝臓、細胞核のデータセットのセグメンテーション結果を示す、U-Net、wide U-Net、UNet++の定性的な比較(2Dのみで識別可能な可視化のため)。

Results:
表 3 は,肺結節セグメンテーション,結腸ポリープセグメンテーション,肝臓セグメンテーション,細胞核セグメンテーションの各タスクについて,U-Net,ワイド U-Net,および UNet++ を数パラメータおよびセグメンテーション精度の観点から比較したものである.このように、肝臓のセグメンテーションを除いては、ワイドU-Netが一貫してU-Netを上回っており、2つのアーキテクチャの性能は同等である。この改善は、ワイドU-Netの方がパラメータ数が多いことに起因しています。ディープ・スーパービジョンなしの UNet++ は、UNet とワイド U-Net の両方に対して大幅な性能向上を達成し、IoU で平均 2.8 ポイントと 3.3 ポイントの改善を実現しました。深層監視付きのUNet++は深層監視なしのUNet++に比べて平均0.6ポイントの改善を示した。具体的には、ディープスーパービジョンの使用は、肝臓と肺の結節のセグメンテーションで顕著な改善をもたらしますが、細胞核と結腸のポリープのセグメンテーションでは改善は見られませんでした。これは、ポリープや肝臓は、ビデオフレームやCTスライスの中に様々なスケールで表示されるため、正確なセグメンテーションを行うためには、すべてのセグメンテーションブランチを使用したマルチスケールアプローチ(深層スーパービジョン)が必要不可欠であるためです。図2にU-Net、wide U-Net、UNet++の結果を定性的に比較したものを示す。

表 3: U-Net, wide U-Net と我々の提案アーキテクチャ UNet++ のセグメンテーション結果 (IoU:%) (深層監理あり・なし)
f:id:kou6839:20200527204930p:plain

f:id:kou6839:20200527204950p:plain
図3: (a)細胞核、(b)結腸ポリープ、(c)肝臓、(d)肺結節のセグメンテーションタスクにおける剪定後のUNet++の複雑さ、速度、精度。推論時間は、12GBのメモリを搭載したNVIDIA TITAN X (Pascal)を1台使用し、10k枚のテスト画像を処理するのに要した時間である。


Model pruning:
図3は、異なるレベルの剪定を適用した後のUNet++のセグメンテーション性能を示す。UNet++ Lito は UNet++ prunedat level i を表している(詳細は図1c を参照)。見られるように、UNet++ L3 は平均 32.2%の推論時間の短縮を達成しているが、IoU は 0.6 ポイントしか低下していない。

5 Conclusion
より正確な医用画像のセグメンテーションの必要性に対応するために、我々はUNet++を提案した。この提案されたアーキテクチャは、再設計されたスキップパスウェイとディープスーパービジョンを利用している。再設計されたスキップパスウェイは、エンコーダとデコーダのサブネットワークの特徴マップ間のセマンティックギャップを減らすことを目的としており、その結果、オプティマイザが解くべき最適化問題がより単純になる可能性があります。我々は、肺結節のセグメンテーション、結腸ポリープのセグメンテーション、細胞核のセグメンテーション、肝臓のセグメンテーションを含む4つの医用画像データセットを用いてUNet++を評価した。実験の結果、ディープスーパービジョンを用いたUNet++は、U-NetとワイドU-Netに対して、それぞれ3.9ポイント、3.4ポイントの平均IoU利得が得られることを示した。

CSA Diesel Train

csacademy.com

<問題>
長さLの機関車が、0からDまで移動する。
位置0,Dとそれ以外のN個のガソリンスタンドが位置G_iにある。
機関車が0~Dの間にランダムで止まる時(一様分布)、最寄りのガソリンスタンドまでの距離の期待値を求めよ。
機関車とガソリンスタンドは、機関車の長さLのうちいずれかの位置がG_iと一致していれば距離0とする。

<解説>
重要:long doubleじゃないと落ちる!
位置0,Dを含んで、N+2個のガソリンスタンドうち、隣り合うガソリンスタンドの間に、機関車の一部が含まれて停車する場合を考える。
i番目とi+1番目のガソリンスタンドの距離がL以下、つまりL \ge G_{i+1}-G_iの時、
機関車とガソリンスタンドは必ず重なるため移動距離は0になる。
L \lt G_{i+1}-G_iの場合、機関車の中心が、ガソリンスタンドの中心の左右どちらにあるかで、最寄りのガソリンスタンドが変わる。
(ここから先は文章だけだと厳しいですが)
Bet_i=G_{i+1}-G_iとすると
 1+2+...+(Bet_i/2-L/2)の距離を左右に動かす必要があります。
ただし、(Bet_i/2-L/2)はダブってカウントしているので、結局
( 1+2+..+(Bet_i/2-L/2-1) ) *2 + 1/2(Bet_i-N)
 =(1 + (Bet_i/2-L/2-1) )(Bet_i/2-L/2-1)+(Bet_i/2-L/2)
=1/4(Bet_i-L)^2
をすべてのiについて足し合わせます。
<コード>

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	long double D, L, N;
	cin >> D >> L >> N;

	long double ans = 0;
	vector<long double> stations;
	stations.pb(0);
	stations.pb(D);
	rep(i, N) {
		long double a; cin >> a;
		stations.pb(a);
	}
	SORT(stations);

	rep(i, N+1) {
		long double dist = stations[i + 1] - stations[i];
		if (dist > L) {
			ans += 0.25 * (dist - L) * (dist - L);
		}
	}
	ans /= D;
	FSP(7);
	P(ans+9e-7);

	return 0;
}

<感想>
重要:long doubleじゃないと落ちる!

CSA Cookie Clicker

csacademy.com

<問題>
初めに0枚のクッキーを持っていて、毎秒S(\le10^5)枚ずつ増える。
何秒でC(\le10^5)枚のクッキーを手に入れられるか。
また、N(\le 5)個の工場を買うことができ、i番目の工場はクッキーA_i(\le10^5)枚で買えて、毎秒B_i(\le10^5)枚のクッキーを生産する

<解説>
N(工場の数)が少ないので
・何個買うか
・どれを買うか
・どの順で買うか
を全探索します。
<コード>

int N, C, S;
vi A(6), B(6);
int popcount(int mask) {
	int ret = 0;
	while (mask > 0) {
		if (mask % 2)ret++;
		mask/=2;
	}
	return ret;
}
int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	cin >> N >> C >> S;
	rep(i, N) {
		cin >> A[i] >> B[i];
	}

	int ans = (C + S - 1) / S;
	for(int i=1;i<=N;i++) {//何個買うか

		for (int mask = 1; mask < (1 << N); mask++) {//何を買うか
			if (popcount(mask) == i) {//組み込み関数注意
				vi kouho;//買う工場と順番が入る
				rep(j, N) {
					if (mask & (1 << j))kouho.pb(j);
				}
				do {//どの順で買うか
					int day = 0;
					int have = 0;
					int get = S;
					for (int f : kouho) {
						if (A[f] <= have) {//工場買えたら買う
							have -= A[f];
							get += B[f];
						}
						else {
							int need_cookie = A[f] - have;
							int need_day = (need_cookie + get - 1) / get;
							day += need_day;
							have += need_day * get;
							have -= A[f];
							get += B[f];
						}
					}
					if (C <= have) {//必要なクッキーを持っているか
						ans = min(ans, day);
					}
					else {
						int need_cookie = C - have;
						int need_day = (need_cookie + get - 1) / get;
						day += need_day;
						ans=min(ans,day);
					}

				} while (next_permutation(ALL(kouho)));
			}
		}
	}
	P(ans);

	return 0;
}

<感想>
builtin_popcountでハマった
もっと大きな工場数でも解けないものか・・・。

統計検定2級合格しました。

f:id:kou6839:20191116232919j:plain

特にいうことはないですが、勉強内容だけ書いておきます。

過去問2周
https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2013%E3%80%9C2015%E5%B9%B4/dp/4788925281/ref=sr_1_10?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A+2013&qid=1573914848&sr=8-10
と統計web
https://bellcurve.jp/statistics/course/
だけです。
(過去問からかなり似たような問題が多数ありました・・・。)
統計webはstep0は説明が長いので飛ばしてもいいと思いました。

休日5時間*2と、平日1時間ずつくらいの勉強で1週間で受かりました。
統計自体はそれなりに知識はあったので、オンライン受験できるならと思い受験しました。

過去問がそれなりにできるようになればほぼ受かると思います。
あとCBTは2014年以前の過去問が良いというのをどっかで見たので、
2013~2015版で勉強しました。

これで来年の資格受験予定は、
・4月デスペ
・6月統計検定準1級
・10月ネスペ
・11月統計検定1級
となりそうです。

ネスペは1度かなり勉強しているので、11月の1級と近いですが受けます。
1級までの期間が長いので準1級も受験予定です。

c++で違う型を返す

知らなかったんですが、
以下のように、クラスB型のコンストラクタにクラスA型を受け取るものを作っておくと、クラスB型を返す関数funcの戻り値をクラスA型にすることができます。
どういう目的でそうなったのかはわからないですが・・・。

class A {
public:
	int a;
	A(int a) :a(a) {}
};

class B {
public:
	int b;
	B(int b) : b(b) {}
	B(A AA) { b = AA.a;}
};

B Func() {
	A tmp(100);
	return tmp;
}

int main() {

	B b = Func();

	cout << b.b << endl; //100

	return 0;
}