• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 數據中心/云端

    用于空間組學的細胞成像特征提取和形態聚類

    VISTA-2D 是 NVIDIA 的新基礎模型,可以快速準確地執行細胞分割,這項基本任務在細胞成像和空間組學工作流程中至關重要,對所有下游任務的準確性至關重要。

    VISTA-2D 模型使用圖像編碼器創建圖像嵌入,然后將其轉換為分割蒙版(圖 1)。這些嵌入必須包含每個細胞的形態信息。

    Diagram shows the data that Vista2D was trained on as input, the architecture of the Vista2D model, and the output segmentation maps.
    圖 1.VISTA-2D 網絡架構

    如果可以為每個細胞分割生成嵌入,則可以在所有嵌入上運行聚類,以自動將具有類似形態的細胞分組。

    在本文中,我將帶您深入了解隨附的 Jupyter Notebook,以展示如何使用這些工具首先分割細胞并使用 VISTA-2D 提取其空間特征,然后使用 RAPIDS。這將創建一個自動化流程來快速分類細胞類型。

    預備知識

    要學習本教程,您需要以下資源:

    • 基本熟悉 Python、Jupyter 和 Docker
    • Docker 版本 19.03 及更高版本

    啟動 notebook

    此 Jupyter Notebook 的代碼位于 /clara-parabricks-workflows/vista2d_rapids_clustering GitHub 庫中,并在 NVIDIA 的 PyTorch Docker 容器 內運行。此 Notebook 使用該容器的 24:03-py3 標簽構建。使用以下命令運行容器:

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

    此命令會啟動以下操作:

    • 啟動 Docker 容器。
    • 將資源庫的文件夾安裝到容器中。
    • 將主機上的端口 8888 映射到 Docker 中的端口 8888。
    • 將所有可用的 GPU 分配給容器。
    • 啟動 PyTorch 容器。
    • 返回終端。

    接下來,您需要一些其他的 Python 包,這些包可以在 requirements.txt 中找到。

    fastremap
    tifffile
    monai
    plotly

    這些包主要用于輔助函數和繪圖,這在本文稍后部分將更加明顯。目前,它們可以在 Docker 容器之上安裝。

    pip install -r requirements.txt

    接下來,啟動 notebook:

    jupyter notebook

    現在,notebook 服務器正在運行,并且可以使用 web 瀏覽器在運行服務器的同一臺機器上或在單獨的機器上訪問 notebook。

    在瀏覽器中,輸入服務器所在計算機的 IP 地址,然后輸入端口 8888:

    <ip-address>/8888

    現在 Notebook 已經準備就緒,可以運行了。有關更多信息,請參閱 GitHub 資源庫。

    使用 VISTA-2D 進行細胞分割和特征提取

    本 Notebook 的上半部分結合使用 Live Cell 數據與 VISTA-2D 分割圖像中的細胞,并使用 VISTA-2D 模型本身的編碼層提取特征。

    首先,加載 VISTA-2D 模型檢查點,因為本筆記本不專注于訓練模型,而是將其用于特征提取的目的。

    model_ckpt = "cell_vista_segmentation/results/model.pt"

    接下來,加載輔助函數,以避免主筆記本變得太冗長。

    from segmentation import segment_cells, plot_segmentation, feature_extract

    下幾節將詳細介紹這些輔助函數的作用。它們均可在segmentation.py中找到。

    segment_cells

    此函數獲取細胞圖像,并從頭到尾通過 VISTA-2D 運行。這會生成另外兩張圖像,一張用于完整分割,另一張用于標記圖像中發現的細胞數(在 Notebook 中稱為pred_mask),從 1 到細胞數之間的每個細胞。這使得細胞能夠單獨索引,以便向下行提取特征。

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

    plot_segmentation

    此函數接收segment_cells的輸出并顯示圖像,以便在分割和預測蒙版中直觀地驗證其準確性。圖 2 展示了使用 notebook 中提供的單元圖像輸出的示例。

    plot_segmentation(patch, segmentation, pred_mask)

    Alt:三張圖像顯示 VISTA-2D 分割的結果:原始細胞圖像,從背景中分割出所有細胞,以及每個細胞的單個蒙版。

    feature_extract

    此函數獲取每個單獨的單元分割,并生成特征向量。每個單元都包含在一個裁剪的方形遮罩中,以適應該單元和周圍的任何背景。它使用 VISTA-2D 模型的前半部分作為編碼器來生成這些特征向量。

    我們的想法是,生成的向量包含細胞分割所需的所有信息,因此還必須包含有關每個細胞形態的信息。這些信息作為向量,可以輕松插入聚類算法中。形態相似的細胞應具有類似的特征向量,并被分配給類似的集群。

    cell_features = feature_extract(pred_mask, patch, model_ckpt)

    這將生成一個包含 num_cells 行和 1024 列的矩陣,該矩陣的列數是每個單元的編碼向量的長度。

    現在您已經擁有每個單元的特征向量,是時候使用 RAPIDS 通過聚類算法運行它們了。

    使用 RAPIDS 進行聚類

    RAPIDS 是一個 GPU 加速的機器學習庫,具有適用于常用 Python 數據科學庫(例如 pandas 和 scikit-learn)的匹配 API。在此 Notebook 中,您僅使用 RAPIDS 的特征降維和聚類部分,但還有更多可用產品。

    from cuml import TruncatedSVD, DBSCAN

    TruncatedSVD

    您從 VISTA-2D 獲得的特征向量長度為 1024。然而,考慮到圖像中只有大約 80 個單元,因此使用如此多特征來制作集群是不合理的。

    您可以使用降維算法來減少這些嵌入的長度,同時最大限度地減少丟失的信息。在此筆記本中,使用TruncatedSVD算法將維度從1024縮減到3。這還可以更輕松地繪制集群,因為您可以在 3D 空間中可視化集群。

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

    這將生成新的特征向量矩陣 X,現在其大小為[num_cells, 3],而不是 cell_features 中大小為[num_cells, 1024]的原始向量。

    DBSCAN

    RAPIDS 中提供了許多集群算法。對于此 Notebook,我選擇了 DBSCAN。在這里,您將 eps(兩個點之間的最大距離)設置為 0.003,并將允許構成集群的最小樣本數設置為 2

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

    現在,運行 fit_predict 會為圖像中的每個單元生成集群標簽。如果將標簽列表轉換為標簽字典,則更容易看到哪些單元已被分配給哪些集群。

    # 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

    最后,您可以使用 Plotly 配置 3D 交互式圖形,以顯示每個單元的聚類位置。

    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)
    A 3D scatter plot where each color represents a different cluster found by RAPIDS.
    圖 3. 由聚類特征向量圖生成的交互式三維圖

    結束語

    在本文中,我向您展示了如何使用 VISTA-2D 模型分割圖像中的細胞,并從每個分割細胞中提取特征向量。我還展示了如何使用 RAPIDS 對這些向量運行聚類。

    有關更多信息,請參閱以下資源:

    ?

    0

    標簽

    人人超碰97caoporen国产