空間トランスクリプトーム解析(spatial transcriptomics)のうちイメージング型(Xenium・CosMx・MERSCOPE など顕微鏡で1分子ずつ数える方式)は、分子をどの細胞に割り当てるかを、計算で決めなければなりません。Segger の論文はこれを、ほぼすべての下流解析にとって決定的でありながら、この方式の弱点であり続けていると表現しています。難しさの根本は単純です。真の細胞境界を、誰も知らないからです。
1. 手法は「何を手がかりにするか」で分かれる

| 系統 | 手がかり | 代表 | 特徴 |
|---|---|---|---|
| 画像ベース | 核や膜の染色 | Cellpose、StarDist | 速い。分子を割り当てる仕組みを持たない |
| 転写産物ベース | 分子の集まり方 | Baysor、ProSeg | 染色が無くても動く。計算が重い |
| ハイブリッド | 画像 + 分子 | Segger、BIDCell、RNA2seg | 両者の長所を取る。参照や学習が要る |
そして第2の軸があります。核をどこまで広げるか。核だけを取れば細胞質の分子を落とし、大きく広げれば隣の細胞が混ざります。膜の染色があれば話は早いのですが、多くのデータには膜染色がありません。だから、この距離を自分で決めることになります。
💡 分子ベースの手法は、この決定を分子に任せている
「どこまで広げるか」を人が決める代わりに、分子の分布そのものに決めさせるのが転写産物ベースの発想です。同じ細胞から出た分子は、発現パターンが似ているはずだ、という仮定に立ちます。だから細胞の形が不規則でも、原理的には対応できます。
「どこまで広げるか」を人が決める代わりに、分子の分布そのものに決めさせるのが転写産物ベースの発想です。同じ細胞から出た分子は、発現パターンが似ているはずだ、という仮定に立ちます。だから細胞の形が不規則でも、原理的には対応できます。
2. 主な手法
| 手法 | 系統 | しくみ | 注意点 |
|---|---|---|---|
| Cellpose | 画像 | 汎用の深層学習モデル。パラメータ調整や再学習を前提としない | 輪郭しか出ない。分子の割り当ては別に行う |
| StarDist | 画像 | 星型凸多角形として核を検出する | 同上 |
| Baysor | 分子 | マルコフ確率場と EM 法。核マスクを事前情報として渡せる | 計算が重い。細胞数が増えたときの解釈に注意 |
| ProSeg | 分子 | 発現の確率モデルで、観測された分子分布を最もよく説明する細胞を作る | 計算が重い |
| Segger | ハイブリッド | グラフニューラルネットで「分子から細胞への辺」を予測する | 参照 scRNA-seq を活かせる。プレプリント段階 |
| BIDCell | ハイブリッド | Cellpose を拡張し、発現と形態の損失関数を組み合わせる | 競合する損失の重み付けを決める明確な指標が無い |
| RNA2seg | ハイブリッド | 汎用モデルとして学習し、未知の組織にも適用する | ─ |
bash
# 画像ベース:核染色から輪郭を引く(コマンドラインから呼ぶ)
pip install cellpose
# --pretrained_model nuclei : 核用の学習済みモデル
# --diameter 0 : 核の大きさを自動で見積もる
python -m cellpose \
--dir ./dapi_tiles \
--pretrained_model nuclei \
--diameter 0 \
--save_tif --no_npy --use_gpu
python
import numpy as np
from skimage.segmentation import expand_labels
# 出てくるのは核のラベル画像だけ。分子の割り当ては別に行う
nuclei = np.load("dapi_tiles/dapi_masks.npy")
print("検出した核:", int(nuclei.max()))
# 核をどれだけ広げるかは、自分で決める
cells = expand_labels(nuclei, distance=15)
# 広げ方を変えて、あとで比べられるようにしておく
for d in [0, 8, 15, 25]:
lab = expand_labels(nuclei, distance=d)
print(d, "画素 -> 平均面積", round(float((lab > 0).sum() / max(int(lab.max()), 1)), 1))
bash
# 転写産物ベース:分子の集まり方から細胞を推定する
# -m : 1細胞あたりの最小分子数
# -s : 細胞の大きさの見当(µm)
baysor run \
-x x -y y -g feature_name \
-m 30 -s 15 \
-o out_baysor/ \
transcripts_filtered.csv
# 核のマスクを事前情報として渡すこともできる(精度が上がる)
baysor run --prior-segmentation-confidence 0.7 \
-o out_baysor_prior/ \
transcripts_filtered.csv :nucleus_id
⚠️ 核マスクを事前情報として渡すと、多くの場合よくなる
Baysor は分子の位置と種類だけでも動きますが、核染色から得たマスクを事前情報として渡すこともできます。原論文では、補助データを渡すと性能が上がることが示されています。使える情報があるなら、使わない理由はありません。画像ベースと分子ベースは、二者択一ではなく組み合わせられます。
Baysor は分子の位置と種類だけでも動きますが、核染色から得たマスクを事前情報として渡すこともできます。原論文では、補助データを渡すと性能が上がることが示されています。使える情報があるなら、使わない理由はありません。画像ベースと分子ベースは、二者択一ではなく組み合わせられます。
3. 正解が無いので、指標を組で見る

真の境界が分からない以上、評価は間接的にならざるを得ません。次の5つを組で見ます。
| 指標 | 多いとき | 少ないとき |
|---|---|---|
| 細胞の数 | 過分割の兆候 | 見落としの兆候 |
| 細胞の面積 | 複数細胞をまとめている | 細胞質を取りこぼしている |
| 細胞あたりの分子数 | 混入の疑い | 型を決められない |
| 分子の回収率 | ─ | 輪郭が小さすぎる |
| 細胞の純度 | ─ | 切り方が汚い |
python
import pandas as pd
import numpy as np
def seg_summary(adata, n_tx_total, name):
"""1つのセグメンテーション結果を、5つの指標で要約する。"""
area = adata.obs["cell_area"].to_numpy(dtype=float)
cnt = adata.obs["total_counts"].to_numpy(dtype=float)
return {
"手法": name,
"細胞数": adata.n_obs,
"面積の中央値": round(float(np.median(area)), 1),
"分子数の中央値": round(float(np.median(cnt)), 1),
"分子の回収率": round(float(cnt.sum() / n_tx_total), 3),
}
# 複数の手法を、同じ表に並べる
rows = [
seg_summary(ad_vendor, N, "装置の既定"),
seg_summary(ad_cellpose, N, "画像ベース"),
seg_summary(ad_baysor, N, "分子ベース"),
]
print(pd.DataFrame(rows))
⚠️ 1つの指標だけでは、良し悪しが決まらない
「細胞が多く取れた」という同じ結果が、感度が上がったとも割りすぎたとも読めます。実際、Baysor の原論文は既存ツールと比べて細胞数がほぼ倍になりアーティファクトも減ったと報告していますが、Segger の論文は同じ現象を過分割の兆候として挙げています。数字が同じでも、解釈は分かれます。だから、必ず複数の指標を並べて見る必要があります。
「細胞が多く取れた」という同じ結果が、感度が上がったとも割りすぎたとも読めます。実際、Baysor の原論文は既存ツールと比べて細胞数がほぼ倍になりアーティファクトも減ったと報告していますが、Segger の論文は同じ現象を過分割の兆候として挙げています。数字が同じでも、解釈は分かれます。だから、必ず複数の指標を並べて見る必要があります。
4. 純度 ─ 正解が無くても測れる指標
5つの中で最も直接的なのが純度です。考え方は単純です。同じ細胞に入るはずのないマーカーの組をあらかじめ決めておき、それが同居している細胞がどれだけあるかを数えます。

python
# 純度:同じ細胞に入るはずのないマーカーの共発現を数える
# 組織に合わせて、排他的な組を自分で決める
pairs = [
(["EPCAM", "KRT19"], ["COL1A1", "DCN"]), # 上皮 と 線維芽細胞
(["EPCAM", "KRT19"], ["PTPRC", "CD3D"]), # 上皮 と 免疫細胞
]
def impurity(adata, pairs, thr=1):
X = adata.layers["counts"]
bad = np.zeros(adata.n_obs, dtype=bool)
for ga, gb in pairs:
ga = [g for g in ga if g in adata.var_names]
gb = [g for g in gb if g in adata.var_names]
if not ga or not gb:
continue
a = np.asarray(adata[:, ga].layers["counts"].sum(axis=1)).ravel()
b = np.asarray(adata[:, gb].layers["counts"].sum(axis=1)).ravel()
bad |= (a >= thr) & (b >= thr)
return float(bad.mean())
# 値が小さいほど、切り方が清潔
for name, ad in [("装置の既定", ad_vendor),
("画像ベース", ad_cellpose),
("分子ベース", ad_baysor)]:
print(name, "不純な細胞の割合:", round(impurity(ad, pairs), 3))
💡 正解のラベルが要らないのが利点
この指標には、真の細胞境界も、正解の細胞型ラベルも要りません。組織の生物学的な知識だけで計算できます。だから、自分のデータで複数の手法を同じ物差しで比べられます。同じ発想の指標が、独立したベンチマークでも使われています。10 種類のマウス組織で複数手法を比較した研究では、排他的なマーカーの共発現から純度を測る指標が提案され、正解データを必要とせずに評価できることが示されました。
この指標には、真の細胞境界も、正解の細胞型ラベルも要りません。組織の生物学的な知識だけで計算できます。だから、自分のデータで複数の手法を同じ物差しで比べられます。同じ発想の指標が、独立したベンチマークでも使われています。10 種類のマウス組織で複数手法を比較した研究では、排他的なマーカーの共発現から純度を測る指標が提案され、正解データを必要とせずに評価できることが示されました。
⚠️ 排他的な組は、組織ごとに決める
「上皮と線維芽細胞は同居しない」は多くの組織で成り立ちますが、上皮間葉転換が起きている腫瘍では成り立たないことがあります。その組織で本当に排他的なのかを、自分で判断してください。判断に迷うなら、より確実な組(免疫細胞と上皮など)だけを使うほうが安全です。手動アノテーションでマーカーを選ぶときと、同じ種類の判断です。
「上皮と線維芽細胞は同居しない」は多くの組織で成り立ちますが、上皮間葉転換が起きている腫瘍では成り立たないことがあります。その組織で本当に排他的なのかを、自分で判断してください。判断に迷うなら、より確実な組(免疫細胞と上皮など)だけを使うほうが安全です。手動アノテーションでマーカーを選ぶときと、同じ種類の判断です。
5. 回収量と純度は、同時には上げられない
ここが、この問題の本質です。輪郭を広げれば分子は多く回収できますが、隣の細胞が混ざって純度が落ちます。狭めれば純度は上がりますが、細胞質の分子を落とします。この2つは、原理的に両立しません。
しかも、どちらを優先すべきかは組織によって変わります。細胞が密に詰まった組織では混入が起きやすいので純度を優先すべきですが、細胞がまばらな組織では、多少広げても混ざらないので回収量を優先できます。
⚠️ 他人の組織で1位だった手法が、自分の組織で1位とは限らない
10 種類のマウス組織を横断した比較では、このトレードオフの深刻さが組織ごとに違うことが示されました。平均で最も良かった手法はありましたが、その差は組織によって幅がありました。つまり、論文で1位だった手法をそのまま採用することには根拠がありません。自分の組織で、自分の指標で比べてください。
10 種類のマウス組織を横断した比較では、このトレードオフの深刻さが組織ごとに違うことが示されました。平均で最も良かった手法はありましたが、その差は組織によって幅がありました。つまり、論文で1位だった手法をそのまま採用することには根拠がありません。自分の組織で、自分の指標で比べてください。
6. 実務のワークフロー
- 1. 装置の既定の結果を、まず見る。多くの組織では、これで十分なことがある。ここを基準にする。
- 2. 同じ視野を目で見比べる。画像・輪郭・分子を重ねて描く。数字の前に、まず目で見る。
- 3. 2〜3 の手法を走らせる。性格の違うものを選ぶ(画像ベースと分子ベース)。
- 4. 5つの指標を表にする。細胞数、面積、分子数、回収率、純度。
- 5. 回収量と純度の釣り合いで選ぶ。どちらを優先するかは、組織と問いによって決める。
python
import spatialdata_plot # noqa
# 同じ場所を、手法ごとに描いて見比べる
# 同じ視野を切り出して、手法ごとに描き比べる
for shp in ["cell_boundaries", "cellpose_cells", "baysor_cells"]:
(
sdata.pl.render_images("morphology_focus")
.pl.render_shapes(shp, fill_alpha=0, outline_alpha=1)
.pl.render_points("transcripts", size=1)
.pl.show(title=shp)
)
# 数字だけで決めない。同じ視野を目で見比べる
💡 まず装置の既定を基準にする
各社の解析ソフトが出す輪郭は、標準的な組織ではよく調整されています。いきなり別の手法に飛びつくより、既定の結果がどこで失敗しているかを特定してから、その弱点を補う手法を選ぶほうが効率的です。たとえば「核しか取れていないので細胞質の分子が捨てられている」と分かれば、広げ方を変えるか、分子ベースの手法を試す、という判断ができます。
各社の解析ソフトが出す輪郭は、標準的な組織ではよく調整されています。いきなり別の手法に飛びつくより、既定の結果がどこで失敗しているかを特定してから、その弱点を補う手法を選ぶほうが効率的です。たとえば「核しか取れていないので細胞質の分子が捨てられている」と分かれば、広げ方を変えるか、分子ベースの手法を試す、という判断ができます。
7. やり直しのコストを、先に理解しておく
⚠️ セグメンテーションを変えると、その先はすべて無効になる
細胞の数も、各細胞の発現プロファイルも変わります。つまり、細胞レベルの QC・正規化・クラスタリング・アノテーション・下流解析は、すべてやり直しです。先に進んでから戻ると、それまでの作業がまるごと失われます。ここで時間をかけることには、明確な見返りがあります。
細胞の数も、各細胞の発現プロファイルも変わります。つまり、細胞レベルの QC・正規化・クラスタリング・アノテーション・下流解析は、すべてやり直しです。先に進んでから戻ると、それまでの作業がまるごと失われます。ここで時間をかけることには、明確な見返りがあります。
逆に言えば、この段階で複数の手法を試して比べておけば、あとから「別の切り方だったらどうだったか」と悩む必要がなくなります。結果を論文にするときも、どの手法をなぜ選んだかを書けるようになります。
8. 判断のまとめ
| 状況 | 選ぶもの |
|---|---|
| 標準的な組織、まず全体像を見たい | 装置の既定 |
| 核染色がきれいで、細胞の形も整っている | 画像ベース + 適切な広げ方 |
| 細胞の形が不規則、突起がある | 分子ベース(Baysor、ProSeg) |
| 核染色が弱い、または無い | 分子ベース |
| 参照 scRNA-seq がある | ハイブリッド(Segger など) |
| 細胞が密に詰まっている | 純度を優先。広げすぎない |
| 細胞がまばら | 回収量を優先してよい |
| どれが良いか判断できない | 2〜3 走らせて、5指標と目視で比べる |
まとめ
- 難しさの根本は真の細胞境界を誰も知らないこと。評価は間接的にならざるを得ない。
- 手法は何を手がかりにするかで3系統に分かれる。画像だけ/分子だけ/両方。
- 第2の軸は核をどこまで広げるか。膜染色は多くのデータに無いので、自分で決める。
- 評価は5つの指標を組で見る。細胞数・面積・分子数・回収率・純度。
- 1つの指標だけでは決まらない。同じ「細胞が増えた」が、感度向上とも過分割とも読まれている。
- 純度は、正解のラベルが無くても測れる。排他的なマーカーの共発現を数えるだけ。組織ごとに組を決める。
- 回収量と純度は同時には上げられない。どちらを優先するかは組織によって変わるので、自分のデータで比べる。
- やり直すと、その先はすべて無効。ここで時間をかける価値がある。
関連記事
- イメージング型 空間トランスクリプトーム:前処理の全体像
- イメージング型 空間トランスクリプトーム:転写産物レベルの QC
- イメージング型 空間トランスクリプトーム:細胞レベルの QC と正規化
- イメージング型 空間トランスクリプトーム:パネル制約下でのアノテーション
- scRNA-seq解析:細胞型アノテーション手法の全体像
- scRNA-seq解析:細胞型アノテーション(手動)
- scRNA-seq解析:ダブレット検出の基本(Scrublet)
- scRNA-seq解析:データの読み込みと品質管理(QC)
- scRNA-seq解析の土台:AnnData のデータ構造をリレーショナルDBの発想で理解する
- ターミナルの基本操作入門【Windows版】
参考文献
- Petukhov, V., Xu, R. J., Soldatov, R. A., et al. (2022). Cell segmentation in imaging-based spatial transcriptomics. Nature Biotechnology, 40(3), 345–354. doi:10.1038/s41587-021-01044-w
- Stringer, C., Wang, T., Michaelos, M., & Pachitariu, M. (2021). Cellpose: a generalist algorithm for cellular segmentation. Nature Methods, 18(1), 100–106. doi:10.1038/s41592-020-01018-x
- Heidari, E., Moorman, A., Unyi, D., et al. (2025). Segger: fast and accurate cell segmentation of imaging-based spatial transcriptomics data. bioRxiv(プレプリント). doi:10.1101/2025.03.14.643160
- Schmidt, U., Weigert, M., Broaddus, C., & Myers, G. (2018). Cell detection with star-convex polygons. In Medical Image Computing and Computer Assisted Intervention (MICCAI) 2018, 265–273. doi:10.1007/978-3-030-00934-2_30
- Janesick, A., Shelansky, R., Gottscho, A. D., et al. (2023). High resolution mapping of the tumor microenvironment using integrated single-cell, spatial and in situ analysis. Nature Communications, 14(1), 8353. doi:10.1038/s41467-023-43458-x
- Cervilla, S., Grases, D., Perez, E., et al. (2026). A technical comparison of spatial transcriptomics platforms across six cancer types. Genome Biology, 27, 22. doi:10.1186/s13059-026-03937-y
- Marconato, L., Palla, G., Yamauchi, K. A., et al. (2025). SpatialData: an open and universal data framework for spatial omics. Nature Methods, 22(1), 58–62. doi:10.1038/s41592-024-02212-x
- Wolf, F. A., Angerer, P., & Theis, F. J. (2018). SCANPY: large-scale single-cell gene expression data analysis. Genome Biology, 19, 15. doi:10.1186/s13059-017-1382-0


コメント