Segment Anythingモデル(SAM)の材料科学分野での活用

  • セグメンテーションは、材料特性の理解や新素材の開発に欠かせない手法です。近年、Metaが発表したSegment Anythingモデル(SAM)は、画像のセグメンテーション技術において革新的なツールとなっています。この記事では、SAMを材料科学分野でどのように活用できるかについて説明します。

Segment Anythingモデル(SAM)とは

Segment Anythingモデル(SAM)は、Metaが開発した最新の画像セグメンテーションツールです。SAM は、オブジェクトが何であるかについての一般的な概念を10億をこえる画像から学習させたモデルです。

私たちがこのモデルを利用するときには、追加の学習を必要とせずに(つまり教師データの作成もいりません!)、セグメンテーションをいきなり実行できます。このサイトで扱うには少し残念な点があり、現在は2次元画像への適用しかできません。主に、Metaが学習に使ったデータセットが2次元のものだからです。それでも様々な用途で使い道があるはずです。

材料科学分野での活用例

FIB-SEMにより取得された電池材料のセグメンテーション

FIB-SEM(焦点イオンビーム走査電子顕微鏡)を使用した電池材料の解析では、材料内の空隙によってポアバックとよばれる映り込みが生じたり、異物によるアーティファクトが生じたりして、画像処理を複雑にします。SAMによるセグメンテーションは、これらの困難を解消し、材料の微細構造を正確に把握しやすくします。特に、電池の性能に直接影響を与える粒子、ポア構造の詳細なマッピングが可能となり、電極材料の最適化や劣化メカニズムの解明に貢献します。

file

SEMにより取得されたナノパーティクル画像のセグメンテーション

SEM(走査電子顕微鏡)は、ナノスケールの粒子を高解像度で観察する際に不可欠ですが、画像のコントラストが低いと個々のナノパーティクルをセグメンテーションするのが難しくなります。この課題を解決するためにSAMを用いるのは良いアイデアです。SAMは、粒子上のオブジェクトの認識が得意で、ナノパーティクルを非常に正確に区別できることが多くあります。SEM画像からの粒子の自動カウント、分類、大きさや形状の計測が可能になり、時間と労力の節約につながります。

自動的に粒子のカウントや分類などができるようになれば、ナノ粒子の表面特性や集合体の形成メカニズムを大規模に解析することが可能になります。例えば、異なる条件下で合成されたナノ粒子の形状や大きさの変化を比較分析し、製造プロセスの最適化ができるでしょう。このような高度な解析が、新材料の開発や既存材料の性能向上に役立つことを期待しています。

file

FIB-SEMにより取得された半導体の検査のためのセグメンテーション

FIB-SEMは、半導体の検査と分析にも広く使用されています。非常に高い分解能で半導体デバイスの断面を観察することができ、内部の微細な構造を詳細に捉えることが可能です。しかし、多層構造や異なる材料の界面が複雑に絡み合っている場合、正確なセグメンテーションが困難になることがあります。

SAMを用いることで、これらの複雑な構造の自動セグメンテーションが可能になります。半導体の品質保証や故障分析の効率が大幅に向上します。

たとえば、デバイスの各層を正確に識別し、それぞれの厚みや組成の変化を追跡することができます。また、製造過程で発生する微小な欠陥や異物の同定にも非常に有効です。このように、SAMの導入により、セグメンテーションプロセスの自動化と精度の向上が図られ、半導体業界における品質管理と研究開発の加速が期待されます。

file

試してみるには

Metaのデモサイトで試す

こちらのデモサイトで簡単に試せます。

Pythonで実行する

pip install git+https://github.com/facebookresearch/segment-anything.git
pip install pycocotools onnxruntime onnx supervision

 

学習済みの重みをダウンロードしておきます。今回は、vit_hを使います。
https://github.com/facebookresearch/segment-anything#model-checkpoints

実行するためのコードです。

from segment_anything import sam_model_registry, SamPredictor
import torch
import cv2
import numpy as np

# モデルの設定
sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"
device = "cuda"

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)
predictor = SamPredictor(sam)

# 画像読み込み
image = cv2.imread('images/kyoto.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 画像のembeddingを計算
predictor.set_image(image)

# ポイントを指定して、セグメンテーションを実行
input_point = np.array([[120, 250], [255, 23]])
input_label = np.array([1, 2])

masks, scores, logits = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    multimask_output=True,
)

 

3D Slicerで実行する

こちらのコミュニティページでいくつかのSAMの3D Slicerへの統合を実装したプラグインが紹介されています。3次元画像に適用することが今のところ難しいため、それに関する議論もされています。

さいごに

MetaのSegment Anythingモデル(SAM)は、その高精度なセグメンテーション能力により、材料科学分野での2次元画像解析において大きな進化をもたらす可能性を秘めています。現在は2次元画像に限定されていますが、3D画像データへの適用が可能なモデルが少しずつ発表されています。これにより、三次元構造の解析が可能になると、従来のセグメンテーションの課題であった、非常に労力がかかるという問題を一掃できるかもしれません。