ImageJ(Fiji)でU-Netを用いた細胞認識をする方法


細胞の認識(ここでは細胞の領域のピクセルを取り出すことを指す)は、生物学研究にとってかなり汎用的な作業になります。
従来の方法としてよくあるのは、平均化フィルタによってノイズを軽減し、その後閾値処理（ImageJの[Threshold...]）によって二値化画像を取得する方法です。
しかし、その方法は透明な細胞画像やマルチチャンネル画像などには適応できませんし、一度に多種類の細胞を認識することはできません。また閾値の設定によっては恣意的な結果になってしまいます。
そこで、新たな方法としてDeep Learningも用いる方法があります。

##U-Netの概要
U-Netは2015年のISBIの2部門で優勝した有名なネットワークです。生物学や医学系のセマンティックセグメンテーションでよく使われます。このU-Netが自分で実装しなくともソフトウェアとしてFijiで開いた画像に対して使えるようになったのです。

ホームページ：https://lmb.informatik.uni-freiburg.de/resources/opensource/unet/
論文：https://www.nature.com/articles/s41592-018-0261-2
＊ホームページにはビデオチュートリアルもあります。

コードはcaffeで実装されているようです。
Deep Learningを用いるとなると大量のデータが必要なように思えますが、fine-tuningを行うことで、少ない枚数のデータで可能です。このソフトでは事前学習されたモデルが公開されているため、そこからfine-tuningを行うことができます。また、データ拡張や解像度の調整はソフトが自動で行ってくれます。

##セットアップ方法
セットアップには、Deep Learningを行うバックエンドのPCとFijiから画像を送るフロントエンドPCの2つが必要です。
Fijiのプラグインからssh接続でつないでバックエンドを動かすという仕組みです。
以下2つに分けて説明します。

###バックエンドPC
バックエンドPCはUbuntu OSでそれなりの性能も求められます。実際にDeep Learningを行うため、GPUがほぼ必須です。(なくてもできなくはない。)また、ホームページにもあるようにAWSのEC2を用いることも可能です。
ここでは特に自前のPCで使う方法を解説します。
以前書いた記事に、Deep Learning PCの設定方法を書きました。(https://qiita.com/takeajioka/items/429451db33051da83e54)
この方法でPCが設定出来たら、次にホームページからU-Netソフトウェアをダウンロードしましょう。cuDNNは使うヴァージョンの方がよいです。解凍したフォルダを「u-net」とフォルダ名を変えて、ホームフォルダに入れましょう。
また「.bashrc」ファイルを編集して以下のコマンドを最初に加えましょう。

```
export PATH=$PATH:/home/＜ユーザー名＞/u-net/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/＜ユーザー名＞/u-net/lib:/home/＜ユーザー名＞/u-net/extlib
```
これでパスが通るはずです。
また、ssh接続をするためにopen-ssh serverを入れましょう。端末から

```
$ sudo apt-get install openssh-server
```
これでインストールされます。
確認として、

```
$ ssh localhost caffe_unet
```
と端末で実行して、以下が出てきたらオッケーです。

```
caffe: /usr/lib/x86_64-linux-gnu/libcudnn.so.7: no version information available (required by /home/＜ユーザー名＞/u-net/lib/libcaffe.so.1.0.0)
caffe: command line brew
usage: caffe <command> <args>

commands:
  train           train or finetune a model
  test            score a model
  device_query    show GPU diagnostic information
  time            benchmark model execution time

  Flags from /home/unetuser/caffe/tools/caffe.cpp:
    -gpu (Optional; run in GPU mode on given device IDs separated by ','.Use
      '-gpu all' to run on all available GPUs. The effective training batch
      size is multiplied by the number of devices.) type: string default: ""
    -iterations (The number of iterations to run.) type: int32 default: 50
    -level (Optional; network level.) type: int32 default: 0
    -model (The model definition protocol buffer text file.) type: string
      default: ""
    -phase (Optional; network phase (TRAIN or TEST). Only used for 'time'.)
      type: string default: ""
    -sighup_effect (Optional; action to take when a SIGHUP signal is received:
      snapshot, stop or none.) type: string default: "snapshot"
    -sigint_effect (Optional; action to take when a SIGINT signal is received:
      snapshot, stop or none.) type: string default: "stop"
    -snapshot (Optional; the snapshot solver state to resume training.)
      type: string default: ""
    -solver (The solver definition protocol buffer text file.) type: string
      default: ""
    -stage (Optional; network stages (not to be confused with phase), separated
      by ','.) type: string default: ""
    -weights (Optional; the pretrained weights to initialize finetuning,
      separated by ','. Cannot be

```



###フロントエンドPC
フロントエンドPCでは性能は重要ではありません。ノートPCでも大丈夫です。
バックエンドPCとは、同じルーター内でつながっていれば簡単にバックエンドPCに接続できます。
設定はFijiとFijiのU-Netのプラグインを入れておくだけです。

バックエンドPCが自前のPC場合には、フロントエンドPCを兼ねて使うこともできます。その場合はssh接続がいらないように見えますが、なしではエラーになりました。なのでこの場合でもssh接続を介して動かします。

##機能
詳しくはビデオチュートリアル等で紹介されているため概要のみにします。

###segmentation
選択した画像に対してセグメンテーションを行います。使うモデルファイルを選択できます。サイズが大きい画像にはタイリングをして適応してくれます。
また、GPUをどれだけ使うかを決めることができます。GPU使用を減らすと、モデルのタイルサイズが小さくなります。
また、セグメンテーションをする前に。解像度をモデルに合わせるようにスケール変換が行われます。

###detection
細胞のカウントなどに利用できます。
これ自体は、セグメンテーションと同じ仕組みで行っているようです。(小さなディスクとして考える)

###fine-tuning
既存のモデルに学習を加えて新しいモデルの作成を行います。データはtrainingとvalidationの両方が必要です。Element Sizeを解像度と合わせておきましょう。また、最後の項目である[Weights:]はフルパスではなく、ファイル名だけにしておく方がよいです。(そうすればバックエンドPCのホームフォルダに保存される。)
また、[Download Weights]にチェックを入れておくと、フロントエンドPCにもモデルファイルがダウンロードされて便利です。

fine-tuningの利点は、自分の画像や目的に合わせたモデルを作成出来るという点です。学習にはそれほど多くのデータを必要としていません。実際にやってみたところ、**数枚の教師データで学習できました**。

具体的には下図のような使い方ができます。
![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/36b0b512-6ac9-679b-0a42-669ef34c0744.jpeg)
＊上図での「適用」はsegmentationやdetectionのことを指しています。
＊上図では「転移学習」となってますが、実際しているのはfine-tuningです。

##終わりに
やってみて非常に便利で強力なソフトウェアだと感じました。教師データとしてROI取りをするだけでよく、今までのように細胞領域を取り出すための戦略を考える必要がありません。(しかし、前処理として何か処理を加えてからU-Netを行うということはあり得ます。)
そして学習は少ない枚数で精度よくできるようになってます。これはU-Netがシンプルなネットワークで汎化性能が高いからではないかと個人的には思います。
加えてこのソフトでは、タイムスタック画像にセグメンテーションを適応すると、勝手にフレームごとに処理を行ってくれます。
また、このソフトウェアは３D U-Netも行うことができて、ｚスタック画像に適するセグメンテーションも可能です。このやり方は別記事にします。