Databricksにおける機械学習による病理画像分析の自動化

[Automating Digital Pathology Image Analysis with Machine Learning](https://databricks.com/blog/2020/01/31/automating-digital-pathology-image-analysis-with-machine-learning-on-databricks.html)の翻訳です。

> [オンデマンドウェビナー](https://databricks.com/p/webinar/automating-the-analysis-of-digital-pathology-images-with-deep-learning)で詳細およびライブデモを聴講できます。スライド画像から癌細胞を検知する[サンプルノートブック](https://github.com/taka-yayoi/public_repo/tree/main/digital_pathology)があります。

画像処理技術の進展と新たな効率的な計算ツールの出現により、デジタル病理学は研究、診断の両方において中心的な位置を占めるようになりました。病理スライドを高精細イメージに高速に変換するWhole Slide Imaging(WSI)は、この変換の中心に位置しています。高速にスライドを共有、分析可能な状態に変換するため、すでにWSIは再現性を改善しており、教育の改善、リモート病理サービスを実現しています。

今では、スライド全体の高精細デジタル化は低コストかつ数十秒で完了するものになっています。結果として、ヘルスケア、ライフサイエンス企業はこれまで以上に大規模なデジタルスライドのカタログを蓄積しています。これらのデータセットは、特定の表現形を検知、あるいはスライドから直接定量的なバイオマーカーを抽出することで、スライドおよびその断片を分類するような機械学習による自動診断に活用されます。機械学習とディープラーニングの力を借りることで、数千のデジタルスライドは数分で解釈されます。このことは、癌や感染症を診断し、治療する際の効率・効果を改善できる非常に大きな機会があることを意味しています。

# デジタル病理ワークフローの導入を妨げる3つの一般的な課題

多くのヘルスケア、ライフサイエンス企業が、スライド画像全体に対して人工知能を適用することのインパクトを認識しているにもかかわらず、スライド分析の自動化パイプラインの実装は未だ複雑なものになっています。実際のWSIパイプラインは、低コスト、スライドのデジタル化を高いスループットで取り扱える必要があります。我々は、デジタル病理ワークフローの導入を妨げる共通的な3つの課題を確認しています。

1. **データ投入とエンジニアリングパイプラインが高コストかつ遅い**: WSI画像は多くのケースで大容量(通常スライドあたり0.5から2GB)で、負荷の高い画像の前処理が必要です。
1. **テラバイトオーダーの画像に対するディープラーニングをスケールするのが難しい**: シングルノードで数百の標準サイズのWSIに対して、ディープラーニングのモデルをトレーニングしようとすると数日から数週間を要します。このことは、大規模データセットに対する迅速な実験を妨げます。ディープラーニングのワークロードを複数ノードに並列化することで、この遅延を低減することができますが、これは難易度の高いものであり、典型的な生物学データのサイエンティストの範疇外となります。
1. **WSIワークフローの再現性確保**: 患者データに基づいて具体的な洞察を得る際には、結果の再現性を確保することは非常に重要になります。現状のソリューションは多くがアドホックなものであり、機械学習モデルのトレーニングに使われたデータのバージョンや実験の追跡を行うための効果的な方法を提供しません。

この記事では、WSI画像データにおけるエンドツーエンド、スケーラブルなディープラーニングワークフローを実装するために、Databricksのレイクハウスプラットフォームをどのように活用するのかを説明します。ここでは、スライドのがん転移の領域を識別する画像セグメンテーションモデルをトレーニングするワークフローにフォーカスします。この例では、画像コレクションに対するデータ前処理を並列化するためにはApache Spark、複数ノードでの事前学習モデルに基づく特徴量抽出(転移学習)にはpandas UDF(ユーザー定義関数)、モデルトレーニングの再現性確保には[MLflow](https://mlflow.org/)を使用します。

# WSIにおけるエンドツーエンドの機械学習

WSIデータパイプラインを加速するためのDatabricksの使い方をデモンストレーションするために、ここでは[Camelyon16 Grand Challenge データセット](https://camelyon16.grand-challenge.org/)を使用します。これは、ワークフローをデモするための、乳がん組織の[TIFFフォーマット](https://ja.wikipedia.org/wiki/Tagged_Image_File_Format)の画像から構成される400個のスライドイメージのオープンなデータセットです。Camelyon16データセットのサブセットは`/databricks-datasets/med-images/camelyon16/` ([AWS](https://docs.databricks.com/data/databricks-datasets.html)|[Azure](https://docs.microsoft.com/en-us/azure/databricks/data/databricks-datasets))のパスからDatabricksで直接アクセスできます。がんの転移を含むスライドにおいて、当該領域を識別する画像分類器をトレーニングするために、ここで我々は図1に示すように以下の3つのステップを実行します。

1. **パッチ生成**: 病理学者によって指定された座標を用いて、スライドを同じサイズのパッチに分割します。それぞれの画像は数千のパッチを生成、それぞれは腫瘍、正常とラベル付けされます。
1. **ディープラーニング**: 画像パッチから特徴量を抽出するために事前学習モデルを用いて転移学習を行い、腫瘍かどうかを予測する二値分類器をトレーニングするためにApache Sparkを使用します。
1. **スコアリング**: MLflowでロギングされた学習済みモデルを用いて、与えられたスライドに対して確率を示すヒートマップを作成します。

[X線画像の前処理ワークフロー](https://databricks.com/blog/2019/08/13/deep-learning-on-medical-images-at-population-scale-on-demand-webinar-and-faq-now-available.html)と同様に、スライドと注釈の両方を操作するためにApache Sparkを使用します。モデルトレーニングにおいては、Kerasの[InceptionV3](https://keras.io/applications/#inceptionv3)事前学習モデルを用いた特徴量抽出から着手します。特徴量抽出を並列に実行するためにPandasのUDFを活用します。転移学習における特徴量抽出テクニックに関しては、こちらを参照ください。

- [Featurization for transfer learning \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/preprocess-data/transfer-learning-tensorflow.html)
- [Preprocess data \- Azure Databricks \- Workspace \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/databricks/applications/machine-learning/preprocess-data/)

このテクニックはInceptionV3固有のものではなく、他の事前学習モデルに適用できることにご留意ください。
![](https://databricks.com/wp-content/uploads/2020/01/blog-digpath-1-1.png)
図1: WSIデータに基づくDLのデプロイおよびトレーニングのためのエンドツーエンドソリューションの実装

# 画像処理とETL

[Automated Slide Analysis Platform](https://computationalpathologygroup.github.io/ASAP/#home)のようなオープンソースツールを用いることで、病理学者は高精細なWSI画像をナビゲートし、臨床的に正しい箇所をマークすることができます。注釈はマークした箇所を含むポリゴンのエッジの座標情報やズームレベルなどの情報とともにXMLファイルとして保存できます。正解スライドに対する注釈を使ったモデルをトレーニングするためには、イメージごとの注釈箇所のリストをロードし、画像と領域を結合し、注釈箇所に対してトレーニングを行う必要があります。このプロセスを完了することで、画像パッチを機械学習に用いることができます。
![](https://databricks.com/wp-content/uploads/2020/01/blog-digpath-2-2.png)
図2: DatabricksノートブックにおけるWSI画像の可視化

このワークフローは通常XMLファイルに格納された注釈を用いますが、ここでは説明をシンプルにするために、[Baiduの研究チームが構築したCamelyon16データセットに対するNCRF分類器によって作成された前処理された注釈](https://github.com/baidu-research/NCRF)を使います。これらの注釈は[CSV形式](https://ja.wikipedia.org/wiki/Comma-Separated_Values)のテキストファイルであり、これを[Apache Sparkのデータフレームに読み込みます](https://docs.databricks.com/data/data-sources/read-csv.html)。後述するノートブックでは、腫瘍、正常のパッチに対する注釈を読み込み、正常なパッチには0のラベル、腫瘍のパッチには1のラベルを割り当てます。最後に単一のデータフレームに座標情報とラベルを統合します。

多くのSQLベースのシステムはビルトインされた操作しか許可しませんが、[Apache Spark](https://databricks.com/spark/about)は[ユーザー定義関数](https://docs.databricks.com/spark/latest/spark-sql/udf-scala.html)(UDF)をサポートしています。UDFによって、いかなるApache Sparkのデータフレームからも、カスタマイズされたScala、Java、Python、Rの関数を呼び出すことができます。我々のワークフローにおいては、画像から得られるパッチをトレーニングするために[OpenSlideライブラリ](https://openslide.org/)を使用します。ここでは、処理するWSIの名前、パッチの中心のXY座標、パッチのラベルを受け取り、トレーニングに使用するタイルを生成するPythonの関数を定義します。
![](https://databricks.com/wp-content/uploads/2020/01/blog-digpath-3-2.png)
図3: 異なるズームレベルでのパッチの可視化

クラウドストレージから画像をロードするためにOpenSlideライブラリを用い、指定された座標レンジにスライスします。OpenSlideはネイティブで[Amazon S3](https://aws.amazon.com/s3/)や[Azure Data Lake Storage](https://azure.microsoft.com/en-us/solutions/data-lake/)からデータを読み込むことができませんが、[Databricks File System(DBFS)のFUSEレイヤー](https://docs.databricks.com/applications/deep-learning/data-prep/ddl-storage.html)によって、複雑なコードの変更なしにOpenSlideが直接blobストレージのデータにアクセスすることが可能になります。最終的には、上記の関数はDBFSのFUSEレイヤーにパッチを書き出します。

DatabricksデータセットにあるCamelyon16データセットから174,000以上のパッチを生成する際、このコマンドの実行には約10分を必要とします。コマンドが完了すると、ノートブックにパッチを直接読み込んで表示することができます。

# 転移学習とMLFlowを用いた腫瘍病理分類器のトレーニング

これまでのステップで、我々はパッチおよびメタデータを生成し、生成した画像タイルをクラウドストレージに保存しました。これで、スライドのセグメントが腫瘍の転移を含んでいるかどうかを予測する二値分類器をトレーニングする準備ができました。次に、それぞれのパッチから特徴量を抽出するために、事前学習されたディープ[ニューラルネットワーク](https://databricks.com/glossary/neural-network)を用い、分類タスクにはsparkmlを使用します。このテクニックは、多くの画像処理アプリケーションにおいて、スクラッチからトレーニングした場合よりも上回る結果を出します。Kerasから事前学習された重みを用いた、InceptionV3アーキテクチャから着手します。

Apache Sparkのデータフレームはビルトインの画像スキーマを提供し、すべてのパッチを直接データフレームにロードすることができます。次に、KerasのInceptionV3に基づいて画像を特徴量に変換するためにPandasのUDFを使用します。画像の特徴量を抽出した後で、それぞれのパッチのラベルと特徴量の間のロジスティック回帰をフィットするために[spark\.ml](https://spark.apache.org/docs/latest/ml-guide.html)を使用します。後でモデルサービングする際にモデルにアクセスできるように、MLflowでロジスティック回帰モデルをロギングします。

DatabricksでMLワークフローを実行する際、ユーザーはマネージドのMLflowを活用できます。ノートブック上での全てのラン(トレーニング)は、MLflowによって自動的にロギングされ、パラメーター、メトリクス、指定されたアーティファクトが記録されます。加えて、トレーニング済みのモデルを蓄積するので、後ほどデータに対してラベルを予測する際にモデルを活用することができます。DatabricksにおけるMLワークフローの管理において、どのようにMLflowを活用できるのかに関して興味を持たれた方は[こちらのドキュメント](https://docs.databricks.com/applications/mlflow/index.html)を参照ください。

**参考情報**
- [PythonによるDatabricks MLflowクイックスタートガイド \- Qiita](https://qiita.com/taka_yayoi/items/dd81ac0da656bf883a34)

以下の表１では、ワークフローの各コンポーネントで要した時間を示しています。17万以上のサンプルに対してモデルをトレーニングする際、87%の精度で25分以内で処理を完了していることにご注意ください。

| ワークフロー | 時間 |
|:--|:--|
|パッチ生成   | 10分  |
|特徴量エンジニアリングおよびトレーニング   | 25分  |
|(スライドあたりの)スコアリング   | 15秒  |
表1: Databricks MLランタイム6.2の2〜10台のr4.4xlargeワーカーを用いて、Databricksデータセットに含まれるスライドの17万のパッチに対するワークフローの実行時間

実際には、より多くのパッチが存在するので、分類にディープニューラルネットワークを用いることで、精度が劇的に改善する可能性があります。このような場合、トレーニングプロセスをスケールするために分散トレーニング技術を活用することができます。Databricksプラットフォームにおいては、MLのコードを大きく修正することなしに、トレーニングタスクを大規模クラスターに分散できる[HorovodRunner](https://databricks.com/blog/2018/11/19/introducing-horovodrunner-for-distributed-deep-learning-training.html)ツールキットをパッケージとして提供しています。この[ブログ記事](https://databricks.com/blog/2019/08/15/how-not-to-scale-deep-learning-in-6-easy-steps.html)では、DatabricksにおけるMLワークフローをどのようにスケールさせるのかを説明しています。

# 推論

分類器のトレーニングが完了したので、ヒートマップとしてスライドにおける転移の可能性を投影します。まず、スライド上の興味領域にセグメントにグリッドを適用し、予測するためにSparkデータフレームにでtー亜を取り込むために、トレーニングプロセスと同様にパッチを作成します。次に、MLflowを用いてトレーニング済みのモデルをロードし、予測するためにデータフレームに適用することになります。

画像を再構成する際、転移を含む可能性に基づいてそれぞれのタイルの色を変更し、すべてのタイルを統合するためにPythonのPILライブラリーを使用します。以下に示す図4では、腫瘍のセグメントにおける確率を投影した結果を示しています。赤色が密集している場合、癌細胞が転移している確率が高いことを示しています。
![](https://databricks.com/wp-content/uploads/2020/01/blog-digpath-4-2.png)
図4: WSIセグメントにおける予測結果のマッピング

# 病理画像に対する機械学習を始めてみる

本記事では、DatabricksとSpark SQL、SparkMLとMLflowを用いて、どのようにスケーラブルかつ再現性のある病理画像に対する機械学習ワークフローを構築するのかを説明しました。特に、大規模での転移学習を用いて、スライドが癌細胞を含む確率を予測する分類器のトレーニングを行い、トレーニングしたモデルを用いてスライドにおける癌細胞の成長を検知してマッピングを行いました。

実際に試すには、[無料のDatabricksトライアル](https://databricks.com/jp/try-databricks)にサインアップし、[WSI画像セグメンテーションノートブック](https://github.com/taka-yayoi/public_repo/tree/main/digital_pathology)を試してみてください。また、我々のソリューションの詳細に関しては、[ヘルスケア](https://databricks.com/solutions/industries/healthcare)、[ライフサイエンス](https://databricks.com/solutions/industries/life-sciences)のページを訪れてみてください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)