ホーム » セマンティック・セグメンテーション

セマンティック・セグメンテーション」カテゴリーアーカイブ

TensorFlow 2.0 : 上級Tutorials : 画像 :- 画像セグメンテーション

TensorFlow 2.0 : 上級 Tutorials : 画像 :- 画像セグメンテーション (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/08/2019

* 本ページは、TensorFlow org サイトの TF 2.0 – Advanced Tutorials – Images の以下のページを翻訳した上で
適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

 

画像 :- 画像セグメンテーション

このチュートリアルは修正された U-Net を使用して、画像セグメンテーションのタスクに焦点を当てます。

 

画像セグメンテーションとは何でしょう?

ここまで画像分類を見てきました、そこではネットワークのタスクは入力画像にラベルやクラスを割り当てることです。けれども、オブジェクトが画像のどこに位置するか、そのオブジェクトの形状、どのピクセルがどのオブジェクトに属するか等を貴方は知りたいと仮定しましょう。この場合画像をセグメントすることを望むでしょう、i.e., 画像の各ピクセルにラベルが与えられます。このように、画像セグメントのタスクは画像のピクセル-wise なマスクを出力するようにニューラルネットワークを訓練します。これは画像を遥かに低位 i.e., ピクセルレベルで理解するのに役立ちます。画像セグメントは 2, 3 の例をあげると医療画像処理、自動運転車と衛星画像処理のような多くのアプリケーションを持ちます。

このチュートリアルのために使用されるデータセットは Parkhi et al. により作成された、Oxford-IIIT ペット・データセット です。データセットは画像、対応するラベル、そしてピクセル-wise マスクから成ります。マスクは基本的には各ピクセルのためのラベルです。各ピクセルは 3 つのカテゴリーから 1 つが与えられます :

  • クラス 1 : ペットに属するピクセル。
  • クラス 2 : ペットをふち取る (境界線となる) ピクセル。
  • クラス 3 : 上のどれでもないもの / 周囲のピクセル。
!pip install -q git+https://github.com/tensorflow/examples.git
import tensorflow as tf
from __future__ import absolute_import, division, print_function, unicode_literals

from tensorflow_examples.models.pix2pix import pix2pix

import tensorflow_datasets as tfds
tfds.disable_progress_bar()

from IPython.display import clear_output
import matplotlib.pyplot as plt

 

Oxford-IIIT ペット・データセットをダウンロードする

データセットは既に TensorFlow データセットに含まれていますので、行なう必要がある総てはそれをダウンロードすることです。セグメンテーション・マスクは version 3.0.0 に含まれています、それが何故この特定のバージョンが使用されるかです。

dataset, info = tfds.load('oxford_iiit_pet:3.0.0', with_info=True)
Downloading and preparing dataset oxford_iiit_pet (801.24 MiB) to /home/kbuilder/tensorflow_datasets/oxford_iiit_pet/3.0.0...
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/oxford_iiit_pet/3.0.0.incompleteW15PMN/oxford_iiit_pet-train.tfrecord
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/oxford_iiit_pet/3.0.0.incompleteW15PMN/oxford_iiit_pet-test.tfrecord
Dataset oxford_iiit_pet downloaded and prepared to /home/kbuilder/tensorflow_datasets/oxford_iiit_pet/3.0.0. Subsequent calls will reuse this data.

次のコードは画像を反転する単純な増強を遂行します。加えて、画像は [0,1] に正規化されます。最後に、上で言及されたようにセグメンテーション・マスクのピクセルは {1, 2, 3} のいずれかにラベル付けされます。便宜のため、セグメンテーション・マスクから 1 を引きましょう、結果としてラベルは : {0, 1, 2} になります。

def normalize(input_image, input_mask):
  input_image = tf.cast(input_image, tf.float32) / 255.0
  input_mask -= 1
  return input_image, input_mask
@tf.function
def load_image_train(datapoint):
  input_image = tf.image.resize(datapoint['image'], (128, 128))
  input_mask = tf.image.resize(datapoint['segmentation_mask'], (128, 128))

  if tf.random.uniform(()) > 0.5:
    input_image = tf.image.flip_left_right(input_image)
    input_mask = tf.image.flip_left_right(input_mask)

  input_image, input_mask = normalize(input_image, input_mask)

  return input_image, input_mask
def load_image_test(datapoint):
  input_image = tf.image.resize(datapoint['image'], (128, 128))
  input_mask = tf.image.resize(datapoint['segmentation_mask'], (128, 128))

  input_image, input_mask = normalize(input_image, input_mask)

  return input_image, input_mask

データセットは既にテストと訓練の必要な分割を含ますので同じ分轄を続けて使用しましょう。

TRAIN_LENGTH = info.splits['train'].num_examples
BATCH_SIZE = 64
BUFFER_SIZE = 1000
STEPS_PER_EPOCH = TRAIN_LENGTH // BATCH_SIZE
train = dataset['train'].map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE)
test = dataset['test'].map(load_image_test)
train_dataset = train.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
test_dataset = test.batch(BATCH_SIZE)

画像サンプルとデータセットからの対応するマスクを見てみましょう。

def display(display_list):
  plt.figure(figsize=(15, 15))

  title = ['Input Image', 'True Mask', 'Predicted Mask']

  for i in range(len(display_list)):
    plt.subplot(1, len(display_list), i+1)
    plt.title(title[i])
    plt.imshow(tf.keras.preprocessing.image.array_to_img(display_list[i]))
    plt.axis('off')
  plt.show()

for image, mask in train.take(1):
  sample_image, sample_mask = image, mask
display([sample_image, sample_mask])

 

モデルを定義する

ここで使用されるモデルは修正された U-Net です。U-Net はエンコーダ (downsampler) とデコーダ (upsampler) から成ります。堅固な特徴を学習して訓練可能パラメータを減じるために、事前訓練されたモデルがエンコーダとして使用できます。そのため、このタスクのためのエンコーダは事前訓練された MobileNetV2 です、その中間出力が使用されます、そしてデコーダは Pix2pix チュートリアル で TensorFlow サンプルで既に実装された umsample ブロックです。

3 つのチャネルを出力する理由は各ピクセルのために 3 つの可能なラベルがあるからです。これをマルチ分類として考えてください、そこでは各ピクセルは 3 つのクラスに分類されます。

OUTPUT_CHANNELS = 3

言及したように、エンコーダは事前訓練された MobileNetV2 モデルでこれは tf.keras.applications で準備されてすぐに利用できます。エンコーダはモデルの中間層からの特定の出力から成ります。エンコーダは訓練プロセスの間に訓練されないことに注意してください。

base_model = tf.keras.applications.MobileNetV2(input_shape=[128, 128, 3], include_top=False)

# Use the activations of these layers
layer_names = [
    'block_1_expand_relu',   # 64x64
    'block_3_expand_relu',   # 32x32
    'block_6_expand_relu',   # 16x16
    'block_13_expand_relu',  # 8x8
    'block_16_project',      # 4x4
]
layers = [base_model.get_layer(name).output for name in layer_names]

# Create the feature extraction model
down_stack = tf.keras.Model(inputs=base_model.input, outputs=layers)

down_stack.trainable = False
Downloading data from https://github.com/JonathanCMitchell/mobilenet_v2_keras/releases/download/v1.1/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_128_no_top.h5
9412608/9406464 [==============================] - 0s 0us/step

デコーダ/upsampler は単純に TensorFlow サンプルで実装された upsample のブロックのシリーズです。

up_stack = [
    pix2pix.upsample(512, 3),  # 4x4 -> 8x8
    pix2pix.upsample(256, 3),  # 8x8 -> 16x16
    pix2pix.upsample(128, 3),  # 16x16 -> 32x32
    pix2pix.upsample(64, 3),   # 32x32 -> 64x64
]
def unet_model(output_channels):

  # This is the last layer of the model
  last = tf.keras.layers.Conv2DTranspose(
      output_channels, 3, strides=2,
      padding='same', activation='softmax')  #64x64 -> 128x128

  inputs = tf.keras.layers.Input(shape=[128, 128, 3])
  x = inputs

  # Downsampling through the model
  skips = down_stack(x)
  x = skips[-1]
  skips = reversed(skips[:-1])

  # Upsampling and establishing the skip connections
  for up, skip in zip(up_stack, skips):
    x = up(x)
    concat = tf.keras.layers.Concatenate()
    x = concat([x, skip])

  x = last(x)

  return tf.keras.Model(inputs=inputs, outputs=x)

 

モデルを訓練する

今は、残された行なうことの総てはモデルをコンパイルして訓練することです。ここで使用される損失は losses.sparse_categorical_crossentropy です。この損失関数を使用する理由はネットワークは、丁度マルチクラス予測のように各ピクセルにラベルを割り当てようとするからです。真のセグメンテーション・マスクで、各ピクセルは {0,1,2} のいずれかを持ちます。ここでネットワークは 3 つのチャネルを出力します。基本的に、各チャネルはクラスを予測することを学習しようとして、losses.sparse_categorical_crossentropy はそのようなシナリオのために推奨される損失です。ネットワークの出力を使用して、ピクセルに割り当てられたラベルは最も高い値を持つチャネルです。これが create_mask 関数が行なっていることです。

model = unet_model(OUTPUT_CHANNELS)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

結果としてのモデル・アーキテクチャを素早く見てみます :

tf.keras.utils.plot_model(model, show_shapes=True)

 
訓練の前に (モデルが) 何を予測するかを見るためにモデルを試してみましょう。

def create_mask(pred_mask):
  pred_mask = tf.argmax(pred_mask, axis=-1)
  pred_mask = pred_mask[..., tf.newaxis]
  return pred_mask[0]
def show_predictions(dataset=None, num=1):
  if dataset:
    for image, mask in dataset.take(num):
      pred_mask = model.predict(image)
      display([image[0], mask[0], create_mask(pred_mask)])
  else:
    display([sample_image, sample_mask,
             create_mask(model.predict(sample_image[tf.newaxis, ...]))])
show_predictions()

 
訓練している間にモデルがどのように改良されるか観察しましょう。このタスクを達成するために、コールバック関数が下で定義されます。

class DisplayCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs=None):
    clear_output(wait=True)
    show_predictions()
    print ('\nSample Prediction after epoch {}\n'.format(epoch+1))
EPOCHS = 20
VAL_SUBSPLITS = 5
VALIDATION_STEPS = info.splits['test'].num_examples//BATCH_SIZE//VAL_SUBSPLITS

model_history = model.fit(train_dataset, epochs=EPOCHS,
                          steps_per_epoch=STEPS_PER_EPOCH,
                          validation_steps=VALIDATION_STEPS,
                          validation_data=test_dataset,
                          callbacks=[DisplayCallback()])

Sample Prediction after epoch 20

57/57 [==============================] - 4s 62ms/step - loss: 0.1465 - accuracy: 0.9337 - val_loss: 0.3640 - val_accuracy: 0.8746
loss = model_history.history['loss']
val_loss = model_history.history['val_loss']

epochs = range(EPOCHS)

plt.figure()
plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'bo', label='Validation loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss Value')
plt.ylim([0, 1])
plt.legend()
plt.show()

 

予測を行なう

幾つかの予測を行ないましょう。時間を節約するために、エポック数は小さく保持されていますが、より正確な結果を得るためにこれをより高く設定しても良いです。

show_predictions(test_dataset, 3)

 

Next steps

画像セグメンテーションが何でありそれがどのように動作するかを理解した今、異なる中間層出力、あるいは異なる事前訓練モデルでさえこのチュートリアルを試すことができます。また Kaggle にホストされている Carvana 画像マスキング・チャレンジを試すことに取り組んでも良いでしょう。

 

以上



ClassCat® TF/ONNX Hub : 提供モデル例一覧

作成者 :(株)クラスキャット セールスインフォメーション
最終更新日 : 01/20/2019 ; 作成日 : 01/13/2019

 

ClassCat® TF/ONNX Hub とは

「ClassCat® TF/ONNX Hub」はクラスキャットが提供する実用性の高い機械学習モデルのレポジトリです。各モデルは TensorFlow 固有フォーマットと ONNX フォーマットの両者で提供されます。 [ClassCat® ONNX Hub 詳細]

  • ONNX (Open Neural Network Exchange) は深層学習モデルのためのオープンなフォーマットで、異なるオープンソースの深層学習フレームワーク間の相互作用を可能にします。

「ClassCat TF/ONNX Hub」で提供されるモデルについてはクラスキャットが検証の上で仕様を公開致しますので、ユーザ企業は希望するモデルを自由に選択することができます。更に (ユーザ企業の保持するデータセットによる) 再調整も含めて実運用するために必要なトータルサポートを提供致します。

◆ このページでは「ClassCat TF/ONNX Hub」で提供可能なモデル例を一覧にまとめています。

 

ClassCat® TF/ONNX Hub 提供モデル例一覧

 

画像処理

Mask R-CNN 対応 Detectron 互換 物体検出モデル

物体検出」は画像の複数種類の物体の位置を特定してクラス分類することを可能にする、実用的で応用範囲が広い技術です。

深層学習技術の普及により画像全体の情報からクラス分類を行なう「物体認識」については畳み込みニューラルネットワーク (CNN) の利用により手軽に成果が出せるようになりましたが、「物体検出」を行なうためには更に多岐に渡る技術が必要となります。

物体検出の手法としては Fast R-CNN, Faster R-CNN, YOLO 更には SSD などが良く知られていますが、最新技術としては Mask R-CNN が有名です。Mask R-CNN は物体検出した領域についてセマンティック・セグメンテーションも遂行します。

Detectron は FAIR (Facebook AI Research) が開発して 2018 年にオープンソース化した物体検出フレームワークです。クラスキャットでは、機能を Faster R-CNN と Mask R-CNN 中心に限定した Detectron 互換モデルを提供しております。

 

セマンティック・セグメンテーション

セマンティック・セグメンテーション」は簡単に言えば、画像の各ピクセルをクラス分類するタスクです。物体検出と混同されやすいですが、物体検出は物体を囲む最小の bounding box (矩形) の予測を主眼としていますので異なるタスクです。

風景写真のようにオブジェクトが分離しやすい画像では物体検出とそれほど違わない印象を受けますが、生物医学的なタスクではセマンティック・セグメンテーションが目的に良く適合することが多々あります。

 

医療画像処理モデル

医療画像処理の分野は AI の活用が大きく期待されている分野の一つです。

医療画像は通常 DICOM 形式で提供されますが、 一般的なフォーマットに変換すれば後は物体認識 (分類)、物体検出、あるいはセマンティック・セグメンテーションのような汎用 AI 技術が当てはまるタスクが多いです。

ここでは胸部レントゲンを中心に疾患の分類と患部の位置特定を遂行しています。また血液細胞の画像で赤血球、白血球そして血小板を検出する例も示します。

 

顔検出モデル

顔検出 は歩行者検出等の技術と同様に深層学習ブーム以前から研究されてきています。OpenCV や dlib C++ ライブラリを利用した、顔の bounding box 検出や輪郭検出は数多くの実装例がありましたが、深層学習フレームワークと組み合わせることによってより複雑なモデルが考案・開発されるようになりました。

モデルの発展の方向性は多岐に渡ります。顔の単純なローカリゼーション (位置特定) だけでなく、例えば目鼻の位置も併せて特定したり (顔の造形の再構築が可能であるような) 十分な数のランドマーク (目印) を予測するモデルもあります。

更には Pix2Face と呼ばれる、2 次元の顔画像から 3 次元の顔を構築する試みもされています。

 

人物ポーズ推定

上で顔のポーズ推定のためにランドマーク検出するモデルを紹介しましたが、身体全体を扱うモデルもあります。身体全体のポーズ推定でもやはりキーポイントの検出を遂行します。

人物ポーズ推定モデルでは、2 次元 RGB 画像から複数の人物のキーポイントを 2 次元の座標で検出します。キーポイントには目鼻・手足などが選択されています。高速ですので動画にも適用可能です。

最近のモデルとしては OpenPose (CMU) や DensePose (FAIR) が有名で、特に OpenPose が発表されて以来、2 次元画像から人物ポーズ推定するモデルが数多く発表されています。

 

GAN モデル (生成モデル、画像変換)

GAN

GAN」は敵対的生成ネットワーク (Generative Adversarial Network) と呼称される生成モデルの一種で、深層学習におけるホットな領域の一つとして様々なモデルやその応用が活発に研究されています。

基本的には 2 つのネットワーク generator と discriminator から構成され、訓練データセットの分布をネットワークに学習させるための仕組みです。その分布から新しい有用なデータを生成することができます。

Cycle GAN, StarGAN や Pix2Pix のように画像変換を目的とするモデルが多いですが、超解像モデルのように低解像画像を鮮明な高解像画像に変換する実用性を重視したモデルもあります。

StarGAN は髪の色や顔の表情を変換することができます

 


お問合せ
本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット
セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com
WebSite: http://www.classcat.com/
 

以上






ClassCat® TF / ONNX Hub : セマンティック・セグメンテーション・モデル

作成者 :(株)クラスキャット セールスインフォメーション
作成日 : 01/13/2019

 

ClassCat® TF / ONNX Hub とは

「ClassCat® TF / ONNX Hub」はクラスキャットが提供する実用性の高い機械学習モデルのレポジトリです。各モデルは TensorFlow 固有フォーマットと ONNX フォーマットの両者で提供されます。 [ClassCat® ONNX Hub 詳細]

  • ONNX (Open Neural Network Exchange) は深層学習モデルのためのオープンなフォーマットで、異なるオープンソースの深層学習フレームワーク間の相互作用を可能にします。

「ClassCat TF / ONNX Hub」で提供されるモデルについてはクラスキャットが検証の上で仕様を公開致しますので、ユーザ企業は希望するモデルを自由に選択することができます。更に (ユーザ企業の保持するデータセットによる) 再調整も含めて配備・実運用するために必要なトータルサポートを提供致します。

今回は超音波画像や電子顕微鏡写真を題材にセマンティック・セグメンテーション・モデルを紹介致します。

 

 

セマンティック・セグメンテーションとは

セマンティック・セグメンテーションは簡単に言えば、画像の各ピクセルをクラス分類するタスクです。
物体検出と混同されやすいですが、物体検出は物体を囲む最小の bounding box (矩形) の予測を主眼としていますので異なるタスクです。

風景写真のようにオブジェクトが分離しやすい画像では (表面的には) 物体検出とそれほど違わない結果を得ますが、今回取り上げるような生物医学的なタスクではセマンティック・セグメンテーションが目的に良く適合することが多々あります。

U-Net

セマンティック・セグメンテーションのためにも (物体検出のように) 数多くの手法が考案され実装されています。FCN (Fully Convolutional Network), U-Net, SegNet, PSPNet 等が良く知られています。

今回は基本的な U-Net モデルを中心に紹介します。U-Net は FCN の改良版です。
U-Net の基本構造は単純です。エンコーダとデコーダに分かれ、エンコーダは (画像分類タスクで使用されるような) 通常の畳込みネットワークです。そしてデコーダで Upsampling を行ないます。畳込み Autoencoder をイメージすれば分かりやすいかもしれません。

 

セマンティック・セグメンテーション・モデルの紹介

以下に U-Net を中心にセマンティック・セグメンテーション・モデルの例を紹介します :

 

U-Net for 超音波画像

最初の例の題材は Kaggle の出題からで、超音波画像のデータセット上で神経構造を識別できるモデルの構築が求められています :

具体的には以下のサンプル画像のような首の超音波画像の BP セグメンテーションを行ないます。BP は Brachial Plexus, 腕神経叢 (わんしんけいそう) を意味します。訓練データセットには腕神経叢の超音波画像とそのマスク画像がペアになって含まれています。マスク画像が疼痛部に相当します。

左側が超音波画像、右側がそのマスク画像です :

訓練した U-Net モデルをテスト画像に適用して得られた画像です :

 

U-Net for 電子顕微鏡写真

次に同じく U-Net モデルを利用した別のセマンティック・セグメンテーションの例として、電子顕微鏡写真のデータセットを題材とします :

訓練データは、ショウジョウバエ 1 齢幼虫の腹部神経索 (VNC, ventral nerve cord) の serial section 透過電子顕微鏡 (ssTEM) データセットからの 30 セクションのセットです。提供される二値ラベルは、セグメントされた物体のピクセルのために白、残りのピクセル (殆どは膜組織に相当) のために黒で与えられます。

以下は訓練データセットのサンプルで、左側が電子顕微鏡写真で右側が正解ラベルです :

 
以下は U-Net モデルの適用結果です。左側がテスト画像で右側が予測になります。
このケースは目視が容易で、正しく予測されていることが分かります :

 

風景写真理解のためのセマンティック・セグメンテーション

少し特殊な画像が続きましたので、最後に風景画像のセマンティック・セグメンテーションの例をあげておきます。データセットは MIT Scene Parsing Benchmark からの ADE 20K データセットを利用し、モデルは PSPNet (Pyramid Scene Parsing ネットワーク) を使用してます。

 

 

以上






TensorFlow : 完全畳込みネットワークによるセグメンテーション


TensorFlow : 完全畳込みネットワークによるセグメンテーション

作成 : (株)クラスキャット セールスインフォメーション
日時 : 07/05/2017

 

セグメンテーションとデータセット PASCAL VOC2012

セマンティック・セグメンテーションの実験が続いたので、基本的なセグメンテーション・モデルである完全畳み込みネットワーク FCN (Fully Convolutional Network) を定番のデータセット PASCAL VOC2012 上で試しておきます。

セグメンテーションは簡単に言えばピクセル単位の分類問題です。そして完全畳み込みネットワークはセグメンテーション・タスク用のモデルの一つで、畳み込み層中心で構成されスキップ・アーキテクチャが導入されています。最先端のセグメンテーション技術に比較すると少し精度が劣る印象ですが、基本となるモデルで完全畳み込みネットワークのバリエーションも多いです。
(補足: 完全畳み込みネットワークという訳語は定着していませんのでご注意ください。もっとも他に訳しようもないのですが。)

データセットは PASCAL VOC 2012 を使用します。このデータセットは物体検出やセグメンテーション目的で標準的に利用されるデータセットです。セグメンテーションについては訓練セットが 1464 画像、検証セットが 1449 画像用意されていて総計 2,913 枚あります。クラスは以下の 20 ありますが (背景をカウントすれば 21) :

1=aeroplane, 2=bicycle, 3=bird, 4=boat, 5=bottle, 6=bus, 7=car , 8=cat, 9=chair, 10=cow, 11=diningtable, 12=dog, 13=horse, 14=motorbike, 15=person, 16=potted plant, 17=sheep, 18=sofa, 19=train, 20=tv/monitor

クラスの詳細については以下を参照してください :

以下は訓練したモデルでセグメンテーションを行なったものです :

 

完全畳込みネットワーク (FCN, Fully Convolutional Networks)

完全畳み込みネットワークの基本は以下のペーパーを読めば十分で、(セグメンテーション、あるいは Auto-encoder を手がけたことがあれば) 特に難しい話しもありません。図を見るだけでもアーキテクチャの概要は掴めるかと思います :

Abstract だけ翻訳しておきます :

畳み込みネットワークは特徴の階層を生むパワフルな視覚モデルです。end-to-end で、pixel-to-pixel に訓練された畳み込みネットワークはそれ自体でセマンティック・セグメンテーションにおいて以前のベストな結果を更新することを示します。キーとなる洞察は “完全畳み込み (fully convolutional)” ネットワークを構築することです、これは任意のサイズの入力を取り相当するサイズの出力を効率的な推論と学習で生成します。完全畳み込みネットワークの位相 (space) を定義して詳述し、空間的に密な予想タスク (訳注: ピクセル単位での予想タスク) へのそれらの適用を説明し、そして以前のモデルとの関連性をとらえます。現代的な分類ネットワーク (AlexNet、VGG と GoogLeNet) を完全畳み込みネットワークに適応させそれらが学習した表現を再調整してセグメンテーション・タスクに遷移しました。そしてスキップ・アーキテクチャを定義しました、これは正確で詳細なセグメンテーションを生成するために深い、粗い層からのセマンティック情報を浅い、完成度が高い (fine) 層からの外観 (appearance) 情報と結合します。この完全畳み込みネットワークは、推論に典型的な画像に対して 0.1 秒かかる一方で、PASCAL VOC (2012 上で 67.2% mean IU へと 30 % の相対的な改善)、NYUDv2、SIFT Flow、そして PASCAL-Context の改善されたセグメンテーションを獲得しました。

abstract は抽象的で少し分かりにくいかもしれませんが抑えたいポイントは :

  1. (完全結合層がないという意味で) 畳み込み層中心にモデルを構築し end-to-end, pixel-to-pixel にセグメンテーション・タスクを訓練/推論する。
  2. スキップ・アーキテクチャ – 通常の特徴出力に、より浅い層の出力を結合する。
  3. 分類ネットワークとしての AlexNet, VGG, GoogLeNet から遷移させている。

 

訓練モデル

モデルは VGG-16 ベースの FCN を実装した上で、(セールスポイントである) スキップ・アーキテクチャの有無で比較してみました。それからデータセットは train と val に分かれていますが、通常のように train のみで訓練したモデルと (ImageNet 画像で検証する目的で) 両者を合わせた trainval で訓練したモデルも用意しました。

具体的には以下の3種類です :

  1. スキップ・アーキテクチャなし / train データセットで訓練
  2. スキップ・アーキテクチャあり / train データセットで訓練

    この 2. を軸としました。以下は訓練時の損失の推移を TensorBoard でグラフにしたものです :

  3. val データセットを加えた trainval データセットを使用して 2 を再調整

 

Val データセット画像で検証

最初にスキップ・アーキテクチャなし/ありの場合のそれぞれのモデルについて(訓練では使用していない) Val データセットの画像で検証してみます。もちろん全く同じ条件で訓練しています。
* 色分けは、乗り物 : 青系、生物: グリーン系、その他: 赤系としましたが、便宜上、人間だけ赤色にしてあります。
* また予想されたカテゴリーのピクセル数も併せて示します。

  • 最初は aeroplane (飛行機) です。skip ありの方がより良い表現ですが、エンジン部は自動車と誤判定されています。
スキップ・アーキテクチャ なし スキップ・アーキテクチャ あり

1) aeroplane: 8691
2) car: 1650
3) boat: 173
1) aeroplane: 10543
2) car: 2867
3) chair: 29
4) sheep: 4
5) bus: 2
  • 次に電車です。正面窓の赤い部分は TV モニタと誤判定されています。局所的にはやむを得ませんが、全体が掴めていないとも言えます。

1) train: 22795
2) motorbike: 23
3) tv/monitor: 2
4) boat: 1,
1) train: 19915,
2) tv/monitor: 554,
3) boat: 143,
4) bottle: 51,
5) potted plant: 18,
  • そしてボートです。人間の目で見ても少し分かりにくいですが、明るい青はモーターバイク、赤色は TV モニタと誤判定されています。

1) motorbike: 1946
2) boat: 435
3) tv/monitor: 163

1) boat: 653,
2) tv/monitor: 246
3) train: 59
4) bottle: 58
5) car: 13
6) diningtable: 4
7) potted plant: 1

参考までに、以下は trainval データセットを利用して訓練したモデルを使用した結果です。つまり概ね正解の画像です :

aeroplane: 15576

train: 27851

boat: 6558

 

ImageNet 画像で検証

最後に trainval で訓練したモデルを使用して、(クラスキャットのマスコット猫に続いて) 定番の ImageNet 画像でテストしてみます。
全体的に位置判定は悪くないのですが、部分的に分類ミスも起きています。
* ImageNet 画像の元画像の版権は所有者に帰属します。

  • 概ね猫ですが、部分的に犬判定されています。

1) cat: 22245
2) dog: 5695
3) person: 675
  • 正面はバスですが、側面は電車判定です。

1) bus: 13323
2) train: 9010
3) boat: 1276
4) car: 118
5) tv/monitor: 8
  • 一見良さそうに見えますが、犬が馬と判定されています。

1) horse: 9419
2) person: 2046
3) car: 339
4) cow: 148
5) boat: 52
  • これは比較的上手くいっています。強いて言えば、ソファの面積がもう少し欲しいところです。

1) dog: 14863
2) cat: 9956
3) sofa: 4422

 
以上

TensorFlow : 自動運転のための道路画像のセグメンテーション


TenosorFlow : 自動運転のための道路画像のセグメンテーション

作成 : (株)クラスキャット セールスインフォメーション
日時 : 06/24/2017

 

概要

セグメンテーションは生物医学の画像処理や自動運転技術の基本の一つですが、医療画像については 2,3 の例を試してみましたので自動運転のリサーチ用の画像でセグメンテーションを試してみます。

ここではシーン理解を主目的とするセマンティック・セグメンテーションのための SegNet モデルの Caffe 実装と共に提供されている CamVid データセットを題材にして TensorFlow 実装で実験してみます。CamVid データセットは道路シーンのサイズ 360 x 480 の 367 の訓練画像と 233 のテスト画像を含みます。ケンブリッジ界隈で撮られたもので昼と夕方のシーンを含みます。具体的には、下の左画像のような道路 (road) シーンが連続的に撮影されています。もちろん実際に自動車を走らせて撮影したのでしょう。

下の右画像は自前で訓練したモデルで予測したものです ( : 自動車, : 人間, : 自転車です) :


 

モデルと訓練

SegNet については (少し古いですが) 以下の記事がわかりやすいです :

SegNet を主題とするペーパーは幾つかありますが、以下が読みやすいです :

Abstract だけいつものように翻訳しておきます :

SegNet と呼ばれる pixel-wise なセマンティック・セグメンテーションのための新しい実用的な深層完全畳み込みニューラルネットワーク・アーキテクチャを提案します。この訓練可能なコア・セグメンテーション・エンジンは 、encoder ネットワーク、相当する decoder ネットワークそれに続く pixel-wise 分類層から成ります。encoder ネットワークのアーキテクチャは VGG 16 ネットワークの 13 畳み込み層と位相的に同一です。decoder ネットワークの役割は pixel-wise 分類のために低解像度 encoder 特徴マップを完全な入力解像度特徴マップにマップすることです。SegNet の新しさは decoder がそのより低解像度な入力特徴マップ(群)を upsample する方法にあります。特に、decoder は非線形 upsampling を実行するために、相当する encoder の max-pooling ステップで計算された pooling インデックスを使用します。これは upsample のための学習の必要性を取り除きます。upsample されたマップはスパースでそして密な特徴マップを生成するために訓練可能なフィルターで畳み込まれます。提案したアーキテクチャを広く採用されている FCN とそしてまた良く知られている DeepLab-LargeFOV, DeconvNet と比較します。この比較は良いセグメンテーション性能の獲得に関与するメモリ対精度のトレードオフを明らかにします。SegNet は主としてシーン理解アプリケーションにより動機付けられます。それ故に、推論の間にメモリと計算時間の両方の点から効率的であるようにデザインされています。また他の競合的なアーキテクチャよりも訓練可能なパラメータの数が本質的に小さいです。また道路 (road) シーンと SUN RGB-D 屋内 (indoor) シーン・セグメンテーションタスクの両者上で SegNet と他のアーキテクチャの制御されたベンチマークを実行しました。SegNet は他のアーキテクチャと比較して競合的な推論時間と memory-wise に より効率的な推論 で良い性能を提供することを示します。

実装は Caffe から TensorFlow に移しましたが、SegNet の位相そのままではなくやや簡略化したものを使用しました。
オリジナルモデルは encoder/decoder それぞれに VGG-16 を使用していますが、安直に試すには重過ぎますので。

訓練時の損失と検証精度の TensorBoard によるグラフは以下のようなものです。
100 epochs 回してみましたが、検証精度は 78 % くらいで頭打ちになりました (もちろんモデルを簡略化した影響もあるでしょう) :
 

 

結果

少なくとも提供されている検証データセット上で試した限りでは、結果は初期実験として見れば概ね良好です。人間の目では暗くて分かりにくい画像でも識別に問題ありません。ペーパーの abstract でも言及されていますが、モデルの完成度をあげた場合には精度とメモリや速度のトレードオフになるのでしょう。

[凡例]
: 自動車 ; : 人間 ; : 自転車
: 道路 ; : 空 ; 舗道 ; : 建物 ; : 木 ; : (未定義)


以下の画像は自動車について false positive です。これは訓練時に自動車の比重を大きくしているために自動車 (らしき物体) に対して過敏であるためでしょう。もっとも極端な話し、フェンスに自動車の絵が描かれている場合にはこのアプローチだけでは誤検知して当然にも思われます :


ImageNet

SegNet のセールスポイントは見たことのない画像に対しても効果的であることですが、提供されているデータセットだけで訓練したモデルを ImageNet 画像に適用するとさすがに結果はあまり芳しくありません。自動車の false positive もより顕著になります :


* ImageNet 画像の元画像の版権は所有者に帰属します。

 
以上

TensorFlow : 超音波画像の神経構造セグメンテーション


TenosorFlow : 超音波画像の神経構造セグメンテーション

作成 : (株)クラスキャット セールスインフォメーション
日時 : 06/13/2017

 

概要

今回は超音波画像セグメンテーションを TensorFlow で実装してみます。
題材は前回に続いて Kaggle の出題からで、超音波画像のデータセット上で神経構造を識別可能なモデルの構築が求められています :

具体的には以下のサンプル画像のような首の超音波画像の BP セグメンテーションを行ないます。BP は Brachial Plexus, 腕神経叢 (わんしんけいそう) を意味します :

実際に実験してみると、目標が訓練しやすい形式に設定されていることもあってこの課題自体はさほど難しいわけではありませんが、セグメンテーションは医療分野に限らず応用範囲が広い技術です。

 

データセットの概要

訓練用データセットには、腕神経叢の超音波画像とそのセグメンテーション・マップ i.e. セグメンテーションを表わすマスク画像が対になって含まれています。患者毎に 120 枚の超音波画像が含まれ、超音波画像は shape 580 x 420 x 1 のグレースケール画像です。それぞれの超音波画像に対応したマスク画像も併せて用意されています。約 50 人の患者分が用意されていて、つまり約 12,000 (= 120*2*50) 枚の画像が含まれています。

今回はマスク画像が用意されている訓練用データセットを分割して、訓練・検証・テスト用として利用しました。

以下は最初の患者の 1 枚目の超音波画像とそのマスク画像です :

そして以下は最初の患者の (120 枚ある) 超音波画像群のサブセットです :

以下は上の超音波画像のそれぞれに対して対(つい)になっているマスク画像です :

 

モデル

課題はセグメンテーションですが、このケースでは要するにマスク画像を教師信号とする教師あり学習です。

セグメンテーションを行なうモデルは定石としては FCN (Fully Convolutional Network) あるいはその改良版の U-Net が考えられます。U-NET は生物医学でのセグメンテーションに良く利用されるようです。

基本的には Convolutional Auto-encoder の一種と考えられますので、先に VGG-16 による Auto-encoder でも試してみます。入出力が異なるので厳密には Auto-encoder ではありませんが、ここでは便宜上 Auto-encoder と呼称します。

なお参考まで、FCN の元ペーパーは以下です :

そして U-Net :

 

訓練

損失関数は基本的には類似度が測れれば良いのですが、ここでは ダイス係数 を用いました (MSE では上手くいきません)。
ダイス係数は自然言語処理で良く用いられます :

[Auto-encoder 損失]

[U-Net 損失]

 

予測

さて予測結果です。概ね位置特定については上手くいっているようですが、その範囲については正確性を欠いています。
また、(意外なことに) 普通の Auto-encoder でも U-Net でも予測結果に殆ど違いは見られませんでした。これは課題のセグメンテーションが比較的単純な構造であるためかもしれません。

● 以下の5例は比較的上手くいっている例です。
Auto-encoder による予測、U-Net による予測、そしてマスク画像の正答の順に示します :

患者 1 : 予測 (Auto-encoder)

患者 1 : 予測 (U-Net)

患者 1 : 正答

患者 2 : 予測 (Auto-encoder)

患者 2 : 予測 (U-Net)

患者 2 : 正答

患者 3 : 予測 (Auto-encoder)

患者 3 : 予測 (U-Net)

患者 3 : 正答

患者 4 : 予測 (Auto-encoder)

患者 4 : 予測 (U-Net)

患者 4 : 正答

患者 5 : 予測 (Auto-encoder)

患者 5 : 予測 (U-Net)

患者 5 : 正答

● 以下の2例は上手くいってない例です :

患者 6 : 予測 (Auto-encoder)

患者 6 : 予測 (U-Net)

患者 6 : 正答

患者 7 : 予測 (Auto-encoder)

患者 7 : 予測 (U-Net)

患者 7 : 正答

 
以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com