Mekansal Omikler için Hücre Görüntüleme Özellik Çıkarımı ve Morfoloji Kümelemesi

8


VISTA-2D, NVIDIA’nın hücre görüntüleme ve mekansal omik iş akışlarında tüm alt akış görevlerinin doğruluğu açısından kritik öneme sahip temel bir görev olan hücre segmentasyonunu hızlı ve doğru bir şekilde gerçekleştirebilen yeni bir temel modelidir.

VISTA-2D modeli, görüntü yerleştirmeleri oluşturmak için bir görüntü kodlayıcı kullanır ve bunları daha sonra segmentasyon maskelerine dönüştürebilir (Şekil 1). Yerleştirmeler, her hücrenin morfolojileri hakkında bilgi içermelidir.

Diyagram, Vista2D'nin girdi olarak eğitildiği verileri, Vista2D modelinin mimarisini ve çıktı segmentasyon haritalarını göstermektedir.
Şekil 1. VISTA-2D ağının VISTA-2D ağ mimarisi

Her hücre segmentasyonu için bir yerleştirme oluşturulabilseydi, o zaman tüm yerleştirmelerde kümelemeyi çalıştırabilir ve benzer morfolojilere sahip hücreleri otomatik olarak gruplandırma yöntemi olarak kullanabilirsiniz.

Bu yazıda, bu araçların önce hücreleri segmentlemek ve VISTA-2D kullanarak mekansal özelliklerini çıkarmak, ardından bu hücre özelliklerini RAPIDS kullanarak kümelemek için nasıl kullanılabileceğini göstermek için eşlik eden bir Jupyter not defterinde derinlemesine size yol gösteriyorum. Bu, hücre tiplerini hızla sınıflandırmak için otomatik bir işlem hattı oluşturur.

Ön koşullar

Bu eğitimi takip edebilmek için aşağıdaki kaynaklara ihtiyacınız olacak:

  • Python, Jupyter ve Docker ile ilgili temel bilgilere sahip olmak
  • Docker sürüm 19.03+

Defteri başlatma

Bu Jupyter not defterinin kodu şu şekildedir: /clara-parabricks-workflows/vista2d_rapids_kümeleme GitHub deposu ve içinde çalışır NGC’den PyTorch Docker konteyneri. Dizüstü bilgisayar, aşağıdakiler kullanılarak oluşturuldu: 24:03-py3 Bu kapsayıcı için etiket. Aşağıdaki komutu kullanarak kapsayıcıyı çalıştırın:

docker run --rm -it \
    -v /path/to/this/repo/:/workspace \
    -p 8888:8888 \
    --gpus all \
    nvcr.io/nvidia/pytorch:24.03-py3 \
    /bin/bash

Bu komut aşağıdaki eylemleri başlatır:

  • Docker konteynerini başlatır.
  • Depo klasörünü konteynera bağlar.
  • Ana makinedeki 8888 portunu Docker içindeki 8888 portuna eşler.
  • Konteynera kullanılabilir tüm GPU’ları atar.
  • PyTorch konteynerini başlatır.
  • Bir terminal döndürür.

Daha sonra, şu adreste bulunabilen birkaç ek Python paketine ihtiyacınız olacak: requirements.txt.

fastremap
tifffile 
monai
plotly

Bu paketler çoğunlukla yardımcı işlevler ve çizim içindir, bu yazının ilerleyen kısımlarında daha da belirginleşecektir. Şimdilik, Docker konteynerinin üstüne kurulabilirler:

pip install -r requirements.txt 

Daha sonra not defterini başlatın:

Artık notebook sunucusu çalışıyor ve notebook’a, sunucunun çalıştığı makinede veya ayrı bir makinede web tarayıcısı kullanılarak erişilebilir.

Bir tarayıcıda, sunucunun çalıştığı makinenin IP adresini ve ardından 8888 portunu girin:

Artık dizüstü bilgisayar çalışmaya hazır. Daha fazla bilgi için bkz. [REPO LINK?] GitHub deposu.

VISTA-2D ile hücre segmentasyonu ve özellik çıkarma

Bu not defterinin ilk yarısı şu verileri kullanır: Canlı Hücre VISTA-2D ile birlikte görüntüdeki hücreleri segmentlere ayırmak ve VISTA-2D modelinin kendisinden kodlama katmanını kullanarak özellikleri çıkarmak.

Öncelikle bir VISTA-2D model kontrol noktası yükleyin, çünkü bu not defteri modeli eğitmeye değil, özellik çıkarma amacıyla kullanmaya odaklanıyor.

model_ckpt = "cell_vista_segmentation/results/model.pt"

Daha sonra ana not defterinin çok uzun olmamasını sağlayacak yardımcı fonksiyonları yükleyin.

from segmentation import segment_cells, plot_segmentation, feature_extract

Sonraki bölümler bu yardımcı işlevlerin ne işe yaradığı hakkında daha fazla bilgi sunar. Hepsi şurada bulunabilir: segmentation.py.

segment_hücreleri

Bu fonksiyon hücre görüntüsünü alır ve baştan sona VISTA-2D’de çalıştırır. Bu, biri tam segmentasyon için ve biri de her hücrenin 1’den görüntüde bulunan hücre sayısına kadar etiketlendiği iki ek görüntüyle sonuçlanır (not defterinde şu şekilde anılır: pred_mask). Bu, hücrelerin ileride özellik çıkarımı için ayrı ayrı indekslenmesini sağlar.

img_path="example_livecell_image.tif"
patch, segmentation, pred_mask = segment_cells(img_path, model_ckpt)

plot_segmentation

Bu fonksiyon şu çıktıyı alır: segment_cells ve görüntüleri görüntüler, böylece segmentasyon ve tahmin maskelerinde doğruluk açısından görsel olarak doğrulanabilirler. Şekil 2, not defterinde sağlanan hücre görüntüsünü kullanarak çıktının nasıl görünmesi gerektiğine dair bir örnek gösterir.

plot_segmentation(patch, segmentation, pred_mask)

Alt: Üç görüntü VISTA-2D segmentasyonunun sonucunu göstermektedir: orijinal hücre görüntüsü, arka plandan tüm hücrelerin segmentasyonu ve her hücre için ayrı maskeler.

Bu fonksiyon her bir hücre segmentasyonunu alır ve bir özellik vektörü oluşturur. Her hücre, yalnızca bir hücreye ve çevresindeki herhangi bir arka plana uyacak şekilde kırpılmış kare bir maskede bulunur. Bu özellik vektörlerini oluşturmak için VISTA-2D modelinin ilk yarısını bir kodlayıcı olarak kullanır.

Fikir, ortaya çıkan vektörün hücre segmentasyonu için gereken tüm bilgileri içermesi ve dolayısıyla her hücrenin morfolojisi hakkında bilgi içermesi gerektiğidir. Bu bilgi, bir vektör olarak, kolayca bir kümeleme algoritmasına takılabilir. Benzer morfolojilere sahip hücreler benzer özellik vektörlerine sahip olmalı ve benzer kümelere atanmalıdır.

cell_features = feature_extract(pred_mask, patch, model_ckpt) 

Bu, şu matrisle sonuçlanır: num_cells satırlar ve 1024 sütunlar, her hücre için kodlama vektörünün uzunluğudur.

Artık her hücre için özellik vektörlerine sahip olduğunuza göre, bunları RAPIDS kullanarak bir kümeleme algoritmasından geçirmenin zamanı geldi.

RAPIDS ile Kümeleme

RAPIDS, pandas ve sci-kit learn gibi yaygın olarak kullanılan Python veri bilimi kütüphaneleri için eşleşen API’lere sahip GPU hızlandırmalı bir makine öğrenme kütüphanesidir. Bu not defterinde, RAPIDS’in yalnızca özellik azaltma ve kümeleme bölümlerini kullanırsınız, ancak çok daha fazla teklif mevcuttur.

from cuml import TruncatedSVD, DBSCAN

KesilmişSVD

VISTA-2D’den elde ettiğiniz özellik vektörleri uzunlukları 1024Ancak, görüntüde yalnızca yaklaşık 80 hücre bulunduğundan, bu kadar çok özelliğe sahip kümeler oluşturmanın bir anlamı yok.

Bu yerleştirmelerin uzunluğunu azaltırken kaybolan bilgileri en aza indirmek için boyut azaltma algoritmalarını kullanabilirsiniz. Bu not defterinde, Kesilmiş SVD boyutları azaltmak için algoritma 1024 ile 3Ayrıca kümeleri 3 boyutlu uzayda görselleştirebildiğiniz için kümeleri çizmeniz de kolaylaşır.

dim_red_model = TruncatedSVD(n_components=3)
X = dim_red_model.fit_transform(cell_features)

Bu, özellik vektörlerinin yeni matrisiyle sonuçlanır, Xartık boyutu [num_cells, 3] orijinal vektörler yerine cell_featuresboyutları [num_cells, 1024].

DBSCAN

RAPIDS’te birçok kümeleme algoritması mevcuttur. Bu not defteri için şunu seçtim: DBSCANBurada eps’yi (iki nokta arasındaki maksimum mesafe) ayarlayın 0.003 ve bir kümeyi oluşturmaya izin verilen minimum örnek sayısını şu şekilde ayarlayın: 2.

model = DBSCAN(eps=0.003, min_samples=2)
labels = model.fit_predict(X)

Koşma fit_predict artık görüntüdeki her hücre için bir küme etiketi üretir. Etiket listesini bir etiket sözlüğüne dönüştürürseniz, hangi hücrelerin hangi kümelere atandığını görmek daha kolaydır.

# Background is 0, so cell IDs start at 1
labels_dict = {x:np.add(np.where(labels==x),1) for x in np.unique(labels)}

# Label -1 means "data was too noisy" so we remove it
labels_dict.pop(-1)
labels_dict

Son olarak, her hücrenin nerede kümelendiğini göstermek için Plotly’yi kullanarak 3 boyutlu etkileşimli bir çizim yapılandırabilirsiniz.

import plotly

data = []

for l in labels_dict.keys():
    
    cluster_indices = labels_dict[l][0]-1

    # Configure the trace
    trace = go.Scatter3d(
        x=X[cluster_indices,0],  
        y=X[cluster_indices,1],  
        z=X[cluster_indices,2],
        name="Cluster "+str(l),
        mode='markers',
        marker={
            'size': 10,
            'opacity': 0.8,
        }
    )
    
    data.append(trace)

# Configure the layout
layout = go.Layout(
    margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
)

plot_figure = go.Figure(data=data, layout=layout)

# Render the plot
plotly.offline.iplot(plot_figure)
RAPIDS tarafından bulunan farklı bir kümeyi temsil eden her bir rengin bulunduğu 3 boyutlu bir dağılım grafiği.
Şekil 3. Kümelenmiş özellik vektörlerinin çiziminden elde edilen etkileşimli 3B diyagram

Çözüm

Bu yazıda, VISTA-2D modelini kullanarak bir görüntüdeki hücreleri nasıl bölebileceğinizi ve bu bölütlenmiş hücrelerin her birinden özellik vektörlerini nasıl çıkarabileceğinizi gösterdim. Ayrıca, bu vektörlerde kümelemeyi çalıştırmak için RAPIDS’in nasıl kullanılacağını da gösterdim.

Daha fazla bilgi için aşağıdaki kaynaklara bakın:

Kaynak: Nvidia

Doğrudan cihazınızda gerçek zamanlı güncellemeleri alın, şimdi abone olun.

Yorumlar