From 6fb6e7ab318ef55e2b49e6cbe3f0034017416f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=81NIEL=20UNYI?= Date: Wed, 8 Jan 2025 01:18:11 +0100 Subject: [PATCH 1/2] Update tutorial notebook --- docs/notebooks/segger_tutorial.ipynb | 1848 +++++++++++++------------- 1 file changed, 914 insertions(+), 934 deletions(-) diff --git a/docs/notebooks/segger_tutorial.ipynb b/docs/notebooks/segger_tutorial.ipynb index 6a3c11b..a15e7fa 100644 --- a/docs/notebooks/segger_tutorial.ipynb +++ b/docs/notebooks/segger_tutorial.ipynb @@ -1,940 +1,920 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "21ed4db6-5234-46b1-9f38-b5883ac88946", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-11T22:22:55.404267Z", - "iopub.status.busy": "2024-09-11T22:22:55.403876Z", - "iopub.status.idle": "2024-09-11T22:22:58.089917Z", - "shell.execute_reply": "2024-09-11T22:22:58.089303Z", - "shell.execute_reply.started": "2024-09-11T22:22:55.404248Z" - }, - "id": "21ed4db6-5234-46b1-9f38-b5883ac88946" - }, - "source": [ - "# **Introduction to Segger**\n", - "\n", - "\n", - "**Important note (Dec 2024):** As segger is currently undergoing constant development we highly recommend installing directly via github.\n", - "\n", - "\n", - "Segger is a cutting-edge cell segmentation model specifically designed for **single-molecule resolved spatial omics** datasets. It addresses the challenge of accurately segmenting individual cells in complex imaging datasets, leveraging a unique approach based on graph neural networks (GNNs).\n", - "\n", - "The core idea behind Segger is to model both **nuclei** and **transcripts** as graph nodes, with edges connecting them based on their spatial proximity. This allows the model to learn from the co-occurrence of nucleic and cytoplasmic molecules, resulting in more refined and accurate cell boundaries. By using spatial information and GNNs, Segger achieves state-of-the-art performance in segmenting single cells in datasets such as 10X Xenium and MERSCOPE, outperforming traditional methods like Baysor and Cellpose.\n", - "\n", - "Segger's workflow consists of:\n", - "1. **Dataset creation**: Converting raw transcriptomic data into a graph-based dataset.\n", - "2. **Training**: Training the Segger model on the graph to learn cell boundaries.\n", - "3. **Prediction**: Using the trained model to make predictions on new datasets.\n", - "\n", - "This tutorial will guide you through each step of the process, ensuring you can train and apply Segger for your own data." - ] - }, - { - "cell_type": "markdown", - "id": "XEY6CTzK0648", - "metadata": { - "id": "XEY6CTzK0648" - }, - "source": [ - "Installing segger from the GitHub repository:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "TIQnPzfx08Zr", - "metadata": { - "id": "TIQnPzfx08Zr" - }, - "outputs": [], - "source": [ - "!git clone https://github.com/EliHei2/segger_dev.git\n", - "%cd segger_dev\n", - "!pip install \".[rapids12]\" -q" - ] - }, - { - "cell_type": "markdown", - "id": "q3SNnImS09_N", - "metadata": { - "id": "q3SNnImS09_N" - }, - "source": [ - "Downloading the [Xenium Human Pancreatic Dataset](https://www.10xgenomics.com/products/xenium-human-pancreatic-dataset-explorer):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "Qjdt3f-U0_i9", - "metadata": { - "id": "Qjdt3f-U0_i9" - }, - "outputs": [], - "source": [ - "!mkdir data_xenium\n", - "%cd data_xenium\n", - "!wget https://cf.10xgenomics.com/samples/xenium/1.6.0/Xenium_V1_hPancreas_Cancer_Add_on_FFPE/Xenium_V1_hPancreas_Cancer_Add_on_FFPE_outs.zip\n", - "!unzip Xenium_V1_hPancreas_Cancer_Add_on_FFPE_outs.zip\n", - "%cd .." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "trM8h-Ek16sJ", - "metadata": { - "id": "trM8h-Ek16sJ" - }, - "outputs": [], - "source": [ - "from segger.data.parquet.sample import STSampleParquet\n", - "from segger.training.segger_data_module import SeggerDataModule\n", - "from segger.training.train import LitSegger\n", - "from segger.prediction.predict_parquet import segment, load_model\n", - "from lightning.pytorch.loggers import CSVLogger\n", - "from pytorch_lightning import Trainer\n", - "from pathlib import Path\n", - "import pandas as pd\n", - "from matplotlib import pyplot as plt\n", - "import seaborn as sns\n", - "import scanpy as sc" - ] - }, - { - "cell_type": "markdown", - "id": "db009015-c379-4f50-97ed-81dca9df28ac", - "metadata": { - "id": "db009015-c379-4f50-97ed-81dca9df28ac" - }, - "source": [ - "# **1. Create your Segger Dataset**\n", - "\n", - "In this step, we generate the dataset required for Segger's cell segmentation tasks.\n", - "\n", - "Segger relies on spatial transcriptomics data, combining staining **boundaries** (e.g., nuclei or membrane stainings) and **transcripts** from single-cell resolved imaging datasets. These nuclei and transcript nodes are represented in a graph, and the spatial proximity of transcripts to nuclei is used to establish edges between them.\n", - "\n", - "To use Segger with a Xenium dataset, you need the **`transcripts.parquet`** and **`nucleus_boundaries.parquet`** (or **`cell_boundaries.parquet`**, in case the Xenium samples comes with the segmentation kit) files. The **transcripts** file contains spatial coordinates and information for each transcript, while the **boundaries** file defines the polygon boundaries of the nuclei or cells. These files enable segger to map transcripts to their respective nuclei and perform cell segmentation based on spatial relationships. Segger can also be extended to other platforms by modifying the column names or formats in the input files to match its expected structure, making it adaptable for various spatial transcriptomics technologies. See (this)[https://github.com/EliHei2/segger_dev/tree/main/src/segger/data/parquet/_settings] for Xenium settings." - ] - }, - { - "cell_type": "markdown", - "id": "f488a0b7", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "598b4b16", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "9d2b090b", - "metadata": { - "id": "9d2b090b" - }, - "source": [ - "### **1.1. Fast Dataset Creation with segger**\n", - "\n", - "Segger introduces a fast and efficient pipeline for processing spatial transcriptomics data. This method accelerates dataset creation, particularly for large datasets, by using **ND-tree-based spatial partitioning** and **parallel processing**. This results in a much faster preparation of the dataset, which is saved in PyTorch Geometric (PyG) format, similar to the previous method.\n", - "\n", - "**Note**: The previous dataset creation method will soon be deprecated in favor of this optimized pipeline.\n", - "\n", - "The pipeline requires the following inputs:\n", - "\n", - "- **base_dir**: The directory containing the raw dataset.\n", - "- **data_dir**: The directory where the processed dataset (tiles in PyG format) will be saved.\n", - "\n", - "The core improvements in this method come from the use of **ND-tree partitioning**, which splits the data efficiently into spatial regions, and **parallel processing**, which speeds up the handling of these regions across multiple CPU cores. For example, using this pipeline, the Xenium Human Pancreatic Dataset can be processed in just a few minutes when running with 16 workers.\n", - "\n", - "Below is an example of how to create a dataset using the faster Segger pipeline:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "vlDtoWZb24FJ", - "metadata": { - "id": "vlDtoWZb24FJ" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e933ebf3", - "metadata": { - "id": "e933ebf3" - }, - "outputs": [], - "source": [ - "xenium_data_dir = Path('data_xenium')\n", - "segger_data_dir = Path('data_segger')\n", - "\n", - "sample = STSampleParquet(\n", - " base_dir=xenium_data_dir,\n", - " n_workers=4,\n", - " sample_type='xenium', # this could be 'xenium_v2' in case one uses the cell boundaries from the segmentation kit.\n", - " # weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available\n", - ")\n", - "\n", - "sample.save(\n", - " data_dir=segger_data_dir,\n", - " k_bd=3,\n", - " dist_bd=15.0,\n", - " k_tx=3,\n", - " dist_tx=5.0,\n", - " tile_width=120,\n", - " tile_height=120,\n", - " neg_sampling_ratio=5.0,\n", - " frac=1.0,\n", - " val_prob=0.1,\n", - " test_prob=0.2,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "6ab27f9a", - "metadata": { - "id": "6ab27f9a" - }, - "source": [ - "#### **Parameters**\n", - "Here is a complete list of parameters you can use to control the dataset creation process:\n", - "\n", - "- **--base_dir**: Directory containing the raw spatial transcriptomics dataset.\n", - "- **--data_dir**: Directory where the processed Segger dataset (in PyG format) will be saved.\n", - "- **--sample_type**: (Optional) Specifies the type of dataset (e.g., \"xenium\" or \"merscope\"). Defaults to None.\n", - "- **--scrnaseq_file**: Path to the scRNAseq file (default: None).\n", - "- **--celltype_column**: Column name for cell type annotations in the scRNAseq file (default: None).\n", - "- **--k_bd**: Number of nearest neighbors for boundary nodes (default: 3).\n", - "- **--dist_bd**: Maximum distance for boundary neighbors (default: 15.0).\n", - "- **--k_tx**: Number of nearest neighbors for transcript nodes (default: 3).\n", - "- **--dist_tx**: Maximum distance for transcript neighbors (default: 5.0).\n", - "- **--tile_size**: Specifies the size of the tile. If provided, it overrides both tile_width and tile_height.\n", - "- **--tile_width**: Width of the tiles in pixels (ignored if tile_size is provided).\n", - "- **--tile_height**: Height of the tiles in pixels (ignored if tile_size is provided).\n", - "- **--neg_sampling_ratio**: Ratio of negative samples (default: 5.0).\n", - "- **--frac**: Fraction of the dataset to process (default: 1.0).\n", - "- **--val_prob**: Proportion of data used for validation split (default: 0.1).\n", - "- **--test_prob**: Proportion of data used for testing split (default: 0.2).\n", - "- **--n_workers**: Number of workers for parallel processing (default: 1)." - ] - }, - { - "cell_type": "markdown", - "id": "70755046", - "metadata": {}, - "source": [ - "### **1.2. Using custom gene embeddings**\n", - "\n", - "In the default mode, segger initially tokenizes transcripts based on their gene type simply in a one-hot manner. However, one can use other genes embeddings (e.g., pre-trained embeddings). The following example shows how one can employ a cell-type-annotated scRNAseq reference of the same tissue type (not necessary same sample or experiment) to embed genes based on their abaundance in different cell types:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3bf18259", - "metadata": {}, - "outputs": [], - "source": [ - "from segger.data.utils import calculate_gene_celltype_abundance_embedding\n", - "scrnaseq_file = Path('my_scRNAseq_file.h5ad')\n", - "celltype_column = 'celltype_column'\n", - "gene_celltype_abundance_embedding = calculate_gene_celltype_abundance_embedding(\n", - " sc.read(scrnaseq_file),\n", - " celltype_column\n", - ")\n", - "\n", - "sample = STSampleParquet(\n", - " base_dir=xenium_data_dir,\n", - " n_workers=4,\n", - " sample_type='xenium', # this could be 'xenium_v2' in case one uses the cell boundaries from the segmentation kit.\n", - " weights=gene_celltype_abundance_embedding, \n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "9962e4b8-4028-4683-9b75-d674fa6fb01d", - "metadata": { - "id": "9962e4b8-4028-4683-9b75-d674fa6fb01d" - }, - "source": [ - "# **2. Train your Segger Model**\n", - "\n", - "The Segger model training process begins after the dataset has been created. This model is a **heterogeneous graph neural network (GNN)** designed to segment single cells by leveraging both nuclei and transcript data.\n", - "\n", - "Segger uses graph attention layers to propagate information across nodes (nuclei and transcripts) and refine cell boundaries. The model architecture includes initial embedding layers, attention-based graph convolutions, and residual connections for stable learning.\n", - "\n", - "Segger leverages the **PyTorch Lightning** framework to streamline the training and evaluation of its graph neural network (GNN). PyTorch Lightning simplifies the training process by abstracting away much of the boilerplate code, allowing users to focus on model development and experimentation. It also supports multi-GPU training, mixed-precision, and efficient scaling, making it an ideal framework for training complex models like Segger." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4db89cb4-d0eb-426a-a71f-d127926fa412", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-12T00:49:07.236043Z", - "iopub.status.busy": "2024-09-12T00:49:07.235854Z", - "iopub.status.idle": "2024-09-12T00:49:08.351946Z", - "shell.execute_reply": "2024-09-12T00:49:08.351565Z", - "shell.execute_reply.started": "2024-09-12T00:49:07.236028Z" - }, - "id": "4db89cb4-d0eb-426a-a71f-d127926fa412" - }, - "outputs": [], - "source": [ - "# Base directory to store Pytorch Lightning models\n", - "models_dir = Path('models')\n", - "\n", - "# Initialize the Lightning model\n", - "metadata = ([\"tx\", \"bd\"], [(\"tx\", \"belongs\", \"bd\"), (\"tx\", \"neighbors\", \"tx\")])\n", - "ls = LitSegger(\n", - " num_tx_tokens=500,\n", - " init_emb=8, \n", - " hidden_channels=64,\n", - " out_channels=16,\n", - " heads=4,\n", - " num_mid_layers=1,\n", - " aggr='sum',\n", - " metadata=metadata,\n", - ")\n", - "\n", - "# Initialize the Lightning data module\n", - "dm = SeggerDataModule(\n", - " data_dir=segger_data_dir,\n", - " batch_size=2,\n", - " num_workers=2,\n", - ")\n", - "\n", - "dm.setup()\n", - "\n", - "\n", - "# if you wish to use more than 1 device for training you should run this:\n", - "batch = dm.train[0]\n", - "ls.forward(batch)\n", - "\n", - "# Initialize the Lightning trainer\n", - "trainer = Trainer(\n", - " accelerator='cuda',\n", - " strategy='auto',\n", - " precision='16-mixed',\n", - " devices=1, # set higher number if more gpus are available\n", - " max_epochs=100,\n", - " default_root_dir=models_dir,\n", - " logger=CSVLogger(models_dir),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "207864b8-7e52-4add-a4a2-e95a4debdc06", - "metadata": { - "id": "207864b8-7e52-4add-a4a2-e95a4debdc06", - "scrolled": true - }, - "outputs": [], - "source": [ - "# Fit model\n", - "trainer.fit(\n", - " model=ls,\n", - " datamodule=dm\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "e6214a79", - "metadata": {}, - "source": [ - "Key parameters for training:\n", - "- **`--data_dir`**: Directory containing the training data.\n", - "- **`--model_dir`**: Directory in which to store models.\n", - "- **`--epochs`**: Specifies the number of training epochs.\n", - "- **`--batch_size`**: Batch sizes for training and validation data.\n", - "- **`--learning_rate`**: The initial learning rate for the optimizer.\n", - "- **`--hidden_channels`**: Number of hidden channels in the GNN layers.\n", - "- **`--heads`**: Number of attention heads used in each graph convolutional layer.\n", - "- **`--init_emb`**: Sets the dimensionality of the initial embeddings applied to the input node features (e.g., transcripts). A higher embedding dimension may capture more feature complexity but also requires more computation.\n", - "- **`--out_channels`**: Specifies the number of output channels after the final graph attention layer, e.g. the final learned representations of the graph nodes.\n", - "\n", - "Additional Options for Training the Segger Model:\n", - "\n", - "- **`--aggr`**: This option controls the aggregation method used in the graph convolution layers.\n", - "- **`--accelerator`**: Controls the hardware used for training, such as `cuda` for GPU training. This enables Segger to leverage GPU resources for faster training, especially useful for large datasets.\n", - "- **`--strategy`**: Defines the distributed training strategy, with `auto` allowing PyTorch Lightning to automatically configure the best strategy based on the hardware setup.\n", - "- **`--precision`**: Enables mixed precision training (e.g., `16-mixed`), which can speed up training and reduce memory usage while maintaining accuracy." - ] - }, - { - "cell_type": "markdown", - "id": "9a7d20c6-ca16-4beb-b627-afb41e3fb491", - "metadata": { - "id": "9a7d20c6-ca16-4beb-b627-afb41e3fb491" - }, - "source": [ - "### *Troubleshooting #1*\n", - "\n", - "In the cell below, we are visualizing key metrics from the model training and validation process. The plot displays **training loss**, **validation loss**, **F1 validation score**, and **AUROC validation score** over training steps. We expect to see the loss curves decreasing over time, signaling the model's improvement, and the F1 and AUROC scores increasing, reflecting improved segmentation performance as the model learns.\n", - "\n", - "If training is not working effectively, you might observe the following in the plot displaying **training loss**, **validation loss**, **F1 score**, and **AUROC**:\n", - "\n", - "- **Training loss not decreasing**: If the training loss remains high or fluctuates without a consistent downward trend, this indicates that the model is not learning effectively from the training data.\n", - "- **Validation loss decreases, then increases**: If validation loss decreases initially but starts to increase while training loss continues to drop, this could be a sign of **overfitting**, where the model is performing well on the training data but not generalizing to the validation data.\n", - "- **F1 score and AUROC not improving**: If these metrics remain flat or show inconsistent improvement, the model may be struggling to correctly segment cells or classify transcripts, indicating an issue with learning performance.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "43a9c1a4-3898-407d-ac0f-f98b13694593", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-11T22:06:58.182616Z", - "iopub.status.busy": "2024-09-11T22:06:58.182357Z", - "iopub.status.idle": "2024-09-11T22:07:01.063645Z", - "shell.execute_reply": "2024-09-11T22:07:01.063184Z", - "shell.execute_reply.started": "2024-09-11T22:06:58.182599Z" - }, - "id": "43a9c1a4-3898-407d-ac0f-f98b13694593", - "outputId": "70ba8e1b-7814-497a-c8b6-8aa7295cd4d9" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 0, 'Step')" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAKACAYAAADtg4tbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAC4jAAAuIwF4pT92AAEAAElEQVR4nOzdeXhTZdoG8PtkbZrupaVAadn3TUBQ2TcBBRQRZRAH1HHDEcdlnM8ZRcXRcWQUV0YBBVFHUQRFUAREQDYRAdnBAqVAge57mvV8f4ScnNMkbdqmTdrev+tiJsl5z8mbFEuePM/7vIIoiiKIiIiIiIgoZKiCPQEiIiIiIiJSYqBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGICdlA7cSJEwgLC0NycnJArvfZZ59h1KhRiIuLQ1hYGNq3b48HH3wQJ0+eDMj1iYiIiIiIAkUQRVEM9iQqMpvNGDlyJHbu3IlWrVrh/PnzNb6W1WrF9OnTsXLlSq/Hw8PD8eGHH+LWW2+t8XMQEREREREFUshl1Gw2G26//Xbs3LkzINf761//KgVpY8aMwddff42dO3fiP//5D2JiYlBWVoYZM2bg119/DcjzERERERER1VZIZdRycnIwbdo0/PDDD9JjtcmoHT58GL1794bD4cCUKVPwxRdfQBAE6fjx48dx7bXXoqCgAEOHDsXWrVtr/RqIiIiIiIhqK2QyauvWrUO/fv2kIE2lqv3U3n77bTgcDmi1WixYsEARpAFAly5d8PTTTwMAtm3bxqwaERERERGFhJAI1G6//XZMmDABGRkZEAQBTz/9NIYMGVLr63799dcAgKFDh6J169Zex/zxj3+Ubq9atarWz0lERERERFRb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JKqQzU/VR8+pj9kVDNTOHHRPe4xMiEDRlTyf3bNEf2FREShhjZrXPmp276mPfvZdE0II4VaYOTt58qS2Rqt3795eJd/BVcChkGd2w9PatWv55z//qT22Wq1+25XHww8/jKIoWK1Wxo0bR0FBgdd1u93OPffcU2ylv8Jx79y5028lwczMTMaMGeM1dbLouD3L4pdnWuejjz4KuEr133777X6LmKxatUr7ucfGxmp7ol3sRo4cScOGDQF4/fXXWbt2rU+b7Oxsxo4dqwW+jz/+uHZt6NCh2nFxa8h27NihZc08p+EW9l2+fLmWAS6qsHJp0b61gQRqlzB9k2basfOgBGq1iWdlRlNQYdVHd6CWl56H017+ksVnD7orX0WWsj4NvKc+eipL1Uenw0lBlmeFScmoCSFESZo2bUqPHj0A2LRpE+CbTQPo06ePVr1vzpw5jBo1it9//521a9cyc+ZM7rrrLvr27esV8BQWJTkfPXr04KGHHgJce3d169aNH374gXXr1jF16lT69OnD77//rm3KXdSoUaMAV1bliiuu4JtvvmHVqlUsWLCAN998k3bt2vHXX3959Sk6bs+Kki+99BIbNmxg165dpY796quv1orQLV++nE6dOvHll1+yZs0aFi9ezJNPPsmAAQPIy8tDp9MxefLkEqs7XkwMBgMTJ05Ep9ORm5tL//79efLJJ1m0aBFr1qzhyy+/pHPnzqxcuRKAcePGMXLkSK1///79ueKKKwBXFrZPnz7873//096bt956iyuvvBKbzYbJZOJf//qX1vfpp5/GbDajqiqjRo3iH//4h/Zn8bfffmPs2LG8++67gGt6b+EattpCPvlcwvSNm2HD9ReWQwK1WsVrjVqA7xo1VMhNyyU42nduf0FWASe2nSS2fQyWUO9AyzOjVtr6NPCe+uipLPuoAeSmu6c4yNRHIYQo3W233caaNWsA1zoif1mdgIAAJk6cyMiRI7FarcyYMYMZM2b4tLv++usJCgrixx9/5OjRo+Tm5hYbRJXVxx9/jNVq5ZtvvmHbtm3cfvvtXtc7derEddddx2uvvebT97XXXmPJkiXs2LGDxMRE7r//fp828fHx/POf/+SJJ54AYPfu3fTp00e7PnDgQAICAsjLy+PDDz/kww8/pHfv3qxYsaLUsX/99dfo9Xq+++47Dhw4wPjx433aREZG8sMP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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Evaluate results\n", - "model_version = 0 # 'v_num' from training output above\n", - "model_path = models_dir / 'lightning_logs' / f'version_{model_version}'\n", - "metrics = pd.read_csv(model_path / 'metrics.csv', index_col=1)\n", - "\n", - "fig, ax = plt.subplots(1,1, figsize=(2,2))\n", - "\n", - "for col in metrics.columns.difference(['epoch']):\n", - " metric = metrics[col].dropna()\n", - " ax.plot(metric.index, metric.values, label=col)\n", - "\n", - "ax.legend(loc=(1, 0.33))\n", - "ax.set_ylim(0, 1)\n", - "ax.set_xlabel('Step')" - ] - }, - { - "cell_type": "markdown", - "id": "e73687e1-ee8f-46e9-8bd2-1ddc571ef94b", - "metadata": { - "id": "e73687e1-ee8f-46e9-8bd2-1ddc571ef94b" - }, - "source": [ - "# **3. Make Predictions**\n", - "\n", - "Once the Segger model is trained, it can be used to make predictions on seen (partially trained) data or be transfered to unseen data. This step involves using a trained checkpoint to predict cell boundaries and refine transcript-nuclei associations." - ] - }, - { - "cell_type": "markdown", - "id": "9807abf3", - "metadata": { - "id": "9807abf3" - }, - "source": [ - "#### **Requirements for the Faster Prediction Pipeline**\n", - "The pipeline requires the following inputs:\n", - "\n", - "- **segger_data_dir**: The directory containing the processed Segger dataset (in PyG format).\n", - "- **models_dir**: The directory containing the trained Segger model checkpoints.\n", - "- **benchmarks_dir**: The directory where the segmentation results will be saved.\n", - "- **transcripts_file**: Path to the file containing the transcript data for prediction.\n", - "\n", - "#### **Running the Faster Prediction Pipeline**\n", - "Below is an example of how to run the faster Segger prediction pipeline using the command line:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "PEOtAs-t9CiY", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "PEOtAs-t9CiY", - "outputId": "8b7a5375-9ebc-4bb4-9421-254410319120" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting segmentation for segger_embedding_1001...\n" - ] - } - ], - "source": [ - "dm = SeggerDataModule(\n", - " data_dir='data_segger',\n", - " batch_size=1,\n", - " num_workers=4,\n", - ")\n", - "\n", - "dm.setup()\n", - "\n", - "model_version = 0\n", - "model_path = Path('models') / \"lightning_logs\" / f\"version_{model_version}\"\n", - "model = load_model(model_path / \"checkpoints\")\n", - "\n", - "receptive_field = {'k_bd': 4, 'dist_bd': 12, 'k_tx': 15, 'dist_tx': 3}\n", - "\n", - "segment(\n", - " model,\n", - " dm,\n", - " save_dir='benchmarks',\n", - " seg_tag='segger_output',\n", - " transcript_file='data_xenium/transcripts.parquet',\n", - " receptive_field=receptive_field,\n", - " min_transcripts=5,\n", - " cell_id_col='segger_cell_id',\n", - " use_cc=False,\n", - " knn_method='cuda',\n", - " verbose=True,\n", - ")\n" - ] - }, - { - "cell_type": "markdown", - "id": "3aa5002c", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "id": "0a823035", - "metadata": { - "id": "0a823035" - }, - "source": [ - "#### **Parameters**\n", - "Here is a detailed explanation of each parameter used in the faster prediction pipeline:\n", - "\n", - "- **--segger_data_dir**: The directory containing the processed Segger dataset, saved as PyTorch Geometric data objects, that will be used for prediction.\n", - "- **--models_dir**: The directory containing the trained Segger model checkpoints. These checkpoints store the learned weights required for making predictions.\n", - "- **--benchmarks_dir**: The directory where the segmentation results will be saved.\n", - "- **--transcripts_file**: Path to the *transcripts.parquet* file.\n", - "- **--batch_size**: Specifies the batch size for processing during prediction. Larger batch sizes speed up inference but use more memory (default: 1).\n", - "- **--num_workers**: Number of workers to use for parallel data loading (default: 1).\n", - "- **--model_version**: Version of the trained model to load for predictions, based on the version number from the training logs (default: 0).\n", - "- **--save_tag**: A tag used to name and organize the segmentation results (default: segger_embedding).\n", - "- **--min_transcripts**: The minimum number of transcripts required for segmentation (default: 5).\n", - "- **--cell_id_col**: The name of the column that stores the cell IDs (default: segger_cell_id).\n", - "- **--use_cc**: Enables the use of connected components (CC) for grouping transcripts that are not associated with any nucleus (default: False).\n", - "- **--knn_method**: Method for KNN (K-Nearest Neighbors) computation. Only option is \"cuda\" for this pipeline (default: cuda).\n", - "- **--file_format**: The format for saving the output segmentation data. Only option is \"anndata\" for this pipeline (default: anndata).\n", - "- **--k_bd**: Number of nearest neighbors for boundary nodes during segmentation (default: 4).\n", - "- **--dist_bd**: Maximum distance for boundary nodes during segmentation (default: 12.0).\n", - "- **--k_tx**: Number of nearest neighbors for transcript nodes during segmentation (default: 5).\n", - "- **--dist_tx**: Maximum distance for transcript nodes during segmentation (default: 5.0)." - ] - }, - { - "cell_type": "markdown", - "id": "b0917be9-4e82-4ba5-869d-5a9203721699", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-11T23:06:23.977884Z", - "iopub.status.busy": "2024-09-11T23:06:23.977517Z" - }, - "id": "b0917be9-4e82-4ba5-869d-5a9203721699" - }, - "source": [ - "### *Troubleshooting #2*\n", - "\n", - "In the cell below, we are visualizing the distribution of **Segger similarity scores** using a histogram. The **Segger similarity score** reflects how closely transcripts are associated with their respective nuclei in the segmentation process. **Higher scores** indicate stronger associations between transcripts and their nuclei, suggesting more accurate cell boundaries. **Lower scores** might indicate weaker associations, which could highlight potential segmentation errors or challenging regions in the data. We expect to see a large number of the scores clustering toward higher values, which would indicate strong overall performance of the model in associating transcripts with nuclei.\n", - "\n", - "The following would indicate potential issues with the model's predictions:\n", - "\n", - "- **A very large portion of scores near zero**: If many scores are concentrated at the lower end of the scale, this suggests that the model is frequently failing to associate transcripts with their corresponding nuclei, indicating poor segmentation quality.\n", - "- **No clear peak in the distribution**: If the histogram is flat or shows a wide, spread-out distribution, this could indicate that the model is struggling to consistently assign similarity scores, which may be a sign that the training process did not optimize the model correctly.\n", - "\n", - "Both cases would suggest that the model requires further tuning, such as adjusting hyperparameters, data preprocessing, or the training procedure (see below)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a450d3ca-2876-4f48-be89-761147b17387", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-11T22:07:04.216273Z", - "iopub.status.busy": "2024-09-11T22:07:04.215965Z", - "iopub.status.idle": "2024-09-11T22:07:08.177601Z", - "shell.execute_reply": "2024-09-11T22:07:08.177158Z", - "shell.execute_reply.started": "2024-09-11T22:07:04.216257Z" - }, - "id": "a450d3ca-2876-4f48-be89-761147b17387", - "outputId": "0576e0b8-4823-4701-b661-dc6b513841f2" - }, - "outputs": [ - { - "data": { - "image/png": "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AAAA2wiRAAAAsI0QCQAAANsIkQAAALCNEAkAAADbCJEAAACwjRAJAAAA2wiRAAAAsI0QCQAAANsIkQAAALCNEAkAAADbCJEAAACwjRAJAAAA2wiRAAAAsI0QCQAAANsIkYAbGzZs0Ouvv64rr7xSl156qSIjIxUeHq6aNWuqRYsWGjp0qD799FMdPHgw0KXCz06cOKFp06YpPj5eLVq0UPXq1RUWFqZKlSopOjpavXr10pgxY/T333973afD4bAuCxYs8F/xefD8889btXXt2tVlekJCgjU9Kioq3+vzVteuXa06n3/+ebftjDH6+OOPtXLlyvwrLg/OnDmj77//Xvfcc49iY2NVq1YthYeHKzIyUpdccom6du2q559/Xr/99puMMYEuF8WBAeBk8+bNpm/fvkaSV5fQ0FAzYsQIc+TIkUCXDh87d+6cGTVqlClTpozX74e2bduapUuXeuw76zy//vqr/5+MDc8995xVW1xcnMv0jz/+2Jpet27dfK/PW3FxcVadzz33XI5tVq9ebTp37lwgl0OmjIwMM2HCBFO5cmWv34fR0dHm+++/D3TpKOJC/BdPgcJn8eLF6tu3r06cOGHdFxwcrPr166tq1aoKCwvTyZMntXHjRh09elSSdO7cOb333nv68ccf9dNPP+nSSy8NVPnwoVOnTqlfv35KTEx0ur9y5cqqX7++SpcurdTUVO3Zs0dbt261tvz88ccf6ty5s95++23dc889gSgdNrRo0UJpaWmBLsOt9PR0DRkyRNOmTXO6v3z58mrUqJHKli2rc+fO6eDBg9qwYYMyMjIkSWvXrlX//v312GOP6ZVXXglE6SgG2J0N/L89e/Zo4MCBVoCsUqWK/vOf/+jw4cPasGGDFi1apHnz5mnZsmU6cuSIli9fruuuu86af/v27erTp4+OHz8eqKcAH7rzzjutAOlwODRixAitXbtWBw4c0O+//6558+Zp0aJF2rx5s/bt26eXX35ZpUuXliRlZGTovvvu08yZMwP5FOCFghwgJemZZ55xCpCDBg1SUlKSjh49qj/++EPz5s3TwoULtXbtWh09elTvvvuuKleubLUfM2aM3n777UCUjuIg0JtCgYLijjvusHYFVa9e3Wzfvt2r+UaPHu20G+nRRx/1c6XwtyVLljgt0/fff9+r+f7++28TGRlpzVezZk2Tmprq52rzX2HZne2NrMu5oO3O3rp1qylRooRV35NPPunVfDt37jR169a15itVqpTZv3+/n6tFccSWSEAXdklPmTLFuj169GjVqVPHq3mffvppde7c2bo9adIkpaen+7xG5J+PP/7Yut65c2fdcccdXs3XrFkzjR071rq9e/duzZo1y+f1oXj4/PPPdf78eUlS3bp1NXr0aK/mq1WrliZNmmTdTklJ0WeffeaXGlG8ESIBXfj/UEpKinW7ffv2tua/++67retHjx7VmjVrfFYb8l9SUpJ13e57YejQoSpTpox1e8mSJT6rC8VL1vdhmzZtFBTk/Vd2jx491KhRI+s270P4AyESkHT27Fmn2/v377c1f+fOndWoUSN16NBB/fr18+rDfvv27XrhhRfUqVMn65QxlStXVuvWrfX4449r7dq1tmpITU3VBx98oF69eqlq1aoKDQ1VtWrV1KNHD3344YfWf7+uvPJK67QnCQkJufZ54sQJjR8/XnFxcapYsaJCQ0NVq1YtDRgwQF9//bXVrnHjxrZOVzN37lzdeeedio6Otk6dVKdOHV111VV65513nAK9O5mPV6lSJUnSrl27FB8frypVqigiIkL169fXTTfd5PRF7K2s7we774Xw8HBdddVVatmypXr27Kl69erlWr+71yzr6WnWrVsn6cKWzVGjRqlly5aqUKGCSpcurejoaN15551atWqVSx8LFizQkCFDVL9+fYWHh6tChQq6/PLL9fbbb7u857PydIofu9auXav//d//tV6PsmXLKiwsTFWqVNFll12mu+66Sz/++GOufSxYsMCq6frrr5ckLV26VL169VLZsmVVrlw5xcTE6N5777VOu+XuFD9ZT1GU1RVXXGHdHx8fL0m67LLLrPv69u3r9XO+5pprrPm83ZKd3cW8DyWpf//+at68ubp166amTZt6bJ+WlqYvv/xSgwYNUr169RQeHq6IiAhFRUXpuuuu09SpU73+D+nBgwc1ZswY9ejRw/p8i4yMVHR0tO644w7NmTPHYx9Zl9MjjzwiSZo9e7Y6deqkUqVKqUKFCmrVqpUeeeQRpaamusyfkZGh6dOn65ZbbrEOQoqIiFC9evV03XXXafLkydaWXuRRoPenAwXBvn37nP4b1bNnT5OWluaXx0pLSzOPP/64CQsLy/UUHcHBwebuu+82Z8+e9djnsmXLTP369XPtr1WrVmbz5s2md+/e1n0ff/yx2z5nz55tqlSpkmuf3bt3N4cOHTKXXnqpV/8r27x5s+nSpYvH05NUq1bNTJ8+PdfnnNm2YsWKZvfu3aZ27do59vXnn396fP2yu/LKK635IyIizLp162z34UnWGnN6zbKenmbt2rUmISEh11MNhYSEmEmTJhljjDl9+rS59dZbc32NY2NjzaFDh3KszVen+Dl48KC57rrrjMPh8Oq0NO3btze7d+/Osa9ff/3VanfdddeZefPmmdDQUJc+KlasaM6dO+fyGmY9xU/W+t1dhg0bZowxZty4cU6v8YEDB9w+30yHDx92qm3JkiUe58nJiBEjrD4cDodZsGBBnvrxxty5c029evU8vi7NmjUzycnJbvtJT083L774ogkPD/dqeee2bmVdTv/617/MJ598kuN76bLLLnOZNykpyTRr1sxjDQ0bNjSJiYk+eQ2LI0Ik8P+aN2/u9OHSuXNnM3/+fJORkeGzxzh79qxTQMm8NG7c2FxxxRWmVatWTn+kz6zj1KlTbvtcvHixKVmypNM8FSpUMJ07dzZt27Z1Cqt16tQxl112mccQ+dVXX5mgoCCXYBcXF2datmxpgoODrftbtGhhatWq5TFELl++3OU8dxEREaZdu3ama9euLl9gDofDvP76626fd9bn2rVr1xy/IKKjo20snf8aP368SzB5++23zYkTJ/LUX271exMi//3vfzu9Lpnvl+yvWVBQkElKSjIDBgyw7qtUqZK5/PLLTevWrU1ISIhT+2uuuSbH2nwRIvfu3WsaNWrk9HilSpUysbGxpkePHqZTp045/khp1qyZOX/+vEt/WUNkly5d3J4z8e67787xNcwaIufOnWt69+7t9INKkmnTpo11/6uvvmqMufADM+vr9vbbb7tfqP/vnXfesdpfcsklHtu7880337isL6NHj/YqyNrxySefuKzv5cqVM+3btzft2rUzZcuWdZpWqVIls379epd+0tLSzDXXXOOyTOrWrWvi4uJM69atXcJl+fLlzcKFC3OsK+v77KqrrnIbTMeMGeM03+zZs01ERITL8+nYsaPp0qWLqVmzptO00NBQM23aNJ++psUFIRL4f1OnTs3xA6pmzZpmxIgRZurUqWbv3r0X9Rh33XWXU99DhgwxW7dudWpz9OhR89RTTzkFtZtvvjnH/o4cOWJq1Kjh9CXz7rvvWltijDHm+PHj5tFHH83xF3xOIXLz5s2mVKlSTl8Y06ZNM+np6Vabffv2mWHDhuX4euUUiA4ePOgUNEuXLm0mTpxozpw549Ru5cqVTlsqg4KCzE8//ZTjc8/+uBEREWbixInm0KFD5sCBA2bq1KlmypQpbpZE7k6cOGGqVq3q8hjh4eGmX79+5q233jJ//fWX02til50QmXnp27evy5f3lClTnN4rmV/45cqVM59//rlTjTt27DAdOnRw6jOnLUG+CJE33nij1SYsLMy8++67OW5VX7hwodMPG0nmq6++cmmXNURmXurXr29mzZplTp48abZv325ee+01py3P3pxs3NNyMMaYfv36WW3at2+fY5us2rdvb7V/+eWXPbZ3Jz093TRt2tTleYeEhJhu3bqZsWPHmmXLluUYur21YsUKp62mlSpVMpMnT3b6DElNTTWvvvqqU5hu27atS1/33XefU52dOnUySUlJTm1OnjxpXn75ZZfH3LFjh0t/OW0xbtWqlUlMTDQpKSlm48aN5tlnnzW7du2y5tmwYYPTFvuqVauaKVOmuOxZSkxMdHrflSxZ0vz99995fh2LK0IkkMVjjz2WYzDKemnYsKG59dZbzaeffmr27dvndd+LFi1y6uepp57Ktf0XX3zh1H7evHkubZ544glrenBwsPnll1/c9jdx4kSvQuRNN91kTS9TpoxZvXq12z4fffRRr0Lkbbfd5tTnihUr3PZ57tw5079/f6t9VFRUjn8tyP64nnZ/27V8+XKnMJ3TpXz58qZPnz5m7NixuT6nnNgNkf3793f7F4usr68kU6JECfP777/n2Hb37t1OW6cnTpzo0uZiQ+TWrVud6nnnnXdyfS327t3rtOXo9ttvd2mTPUSWLl3a42m4fBUiv/76a6d2mzZtcvuYGzdudFonswacvNiyZYupVq1aru/DUqVKmW7duplRo0aZJUuW2PorTvfu3Z3ezzltYcz07rvvOj3u3LlzrWmrVq1y2prZv39/pyCa3c8//+wUSq+77jqXNtlDZO3atc3Ro0e9fj41atTI9T1y4sQJ07ZtW6t9586dc+0brgiRQDYff/yx07n+crs4HA7TsWNH8+GHH+b6gWmMcdrFGBsb69Vu8uuvv96ap0+fPk7T0tPTnbaWjRw50mN/2XelZw+Rx44dc9qd/tZbb+Xa3/nz5122ImX/It67d69TaPHUpzHGHDhwwGkX/dSpU13aZH3MJk2aeOwzL9auXeuy5S63S82aNc0jjzxidu7c6bFvOyEyKCjIbN682W1fs2bNcupv6NChuT52p06drLYPP/ywy/SLDZEffPCBFSiqVavm1Zaynj17Wn1eeeWVLtOzh8h77rnHY5++CpGpqammYsWKVrtRo0a5fcxnn33W7TqbV7t27XLaGurpUqlSJTNixAizdu3aXPtdv36903zvvfeex1qy/kVhxIgR1v1Dhw617q9YsaI5fPiwx76efvppp/d49gCbPUSOHTs21/5WrFjh1H7mzJkea1i1apXTXpply5Z5nAf/xdHZQDbx8fHasGGDXnjhBV1yySW5tjXGaOnSpbrtttvUtGlTt6fROHPmjNPRp/fcc4/LkaE5ueWWW6zr8+fPdzpac9myZU5HbN57770e+3v44Ydznf7DDz9YRytGRETo1ltvzbV9SEiI7rvvvlzbzJo1yzpyMjw83GOf0oWhBa+88krr9uzZs3Nt74sjiHPSuHFjLV68WF999ZV69+6tkJDcR4rdvXu3Xn31VTVq1EgvvviiNQTdxWrVqpXq16/vdnr2af3798+1v5o1a1rX/THC0u23367Tp09r7dq1+uGHHzy+bpJUrVo16/qZM2c8tvfXMs9JaGiobrrpJuv2559/7rZt1vMxevNe90bNmjX1/fffa+7cubr22msVHh6ea/tDhw7pvffeU0xMjB566CG3R+J///331vXSpUs7fd64M378eE2YMEFz587VM888I+nC5+BPP/1ktYmPj1eFChU89vXggw8qNDRU0oUjqS92PZ8+fbp1vXbt2urXr5/HGmJiYtSiRQvrtqca4IwQCeSgUqVKeuaZZ7R+/XqtWbNGb775pgYOHKiKFSu6nWfjxo3q1q2bvv32W5dpf/zxh9OpJNq1a+dVHbGxsdb1c+fOOZ2uZt68edb1qKioXENGpri4OJUoUcLt9Kx9tm3b1hrGLzc9evTIdXrWYB0TE+NVn5Lzc/d0jrusXwK+FhQUpOuvv15z5szRwYMHNW3aNI0YMULR0dFu5zl79qyefvppDRkyxCdB0tPpWUqWLOl029P47VlDiL9OjB8WFqbGjRurZcuWubbbvn27Pv/8c/3555+2avLnMs9J1kC4YcMGLV++3KXN4sWLtWXLFklSZGSkBgwY4NMaevbsqenTp+vw4cOaOXOmHnroIbVs2dLtKcXS09P15ptvqnfv3jkG8z/++MO6Hhsbq4iICI819OvXT/fee6969uypGjVqSJLWrVtnnVZJknr16uXV86lUqZJatWpl3V68eLHbtg6HQ82bN8+1v6yfE+3atfPqh7pk77MGzjz/PASKuejoaEVHR+uBBx6QMUbJycn69ddf9fPPP2vevHlOH87nzp3T0KFD9c8//6hBgwbW/Zs2bXLqMyYmJk+17N6927q+c+dO67qn0JApLCxM9evX1/r163Ocnpc+M89B6G5rR9bnnpSU5PUHe1ZZn3dOso4V7E/ly5fXoEGDNGjQIEkXzoWXmJio+fPn64cfftCOHTuc2k+dOlUtWrTQ448/flGPW7VqVVvty5Ytm+v0vCyDi5GWlqbk5GStXbtWmzdv1pYtW7Rx40YlJyfryJEjLu2NMR77zK9lnqlVq1Zq1qyZ/vnnH0kXtji2adPGqc2nn35qXR8yZIjCwsL8UktERIT69+9vbXE+fvy4Fi1apPnz5+vHH390Wb8XLlyohx9+WO+9957T/ZmBV/J+fc/Jnj17nG43adLE63ljYmL0+++/59hPVmXLlrW2WrqT9bPm66+/9stnDZyxJRKwweFwKCYmRvfff79mzpypffv26X//939VqlQpq83p06f14osvOs139OhRnzx+1i/cffv2WdfLlSvndR+RkZFup+W1z/Lly7ud5ovnfvbs2Vx3cXoKTf5SuXJlXX/99Xr33Xe1fft2ff/99y5bS1566SWdOnXqoh7H0+7L7PI7JLqzfft2jRgxQpUrV1aLFi1000036emnn9ZHH32kRYsWOb2fvdnlnVUglvmwYcOs61OnTnXaYpqamqpp06ZZt321K9sb5cqVU79+/fT6669r3bp1WrRokeLi4pzafPDBB9q6davTfVn/ymBnfc/u8OHDTrdz+4zJLmvb7P1k5c3y9sVnTU4/auAeWyKBi1C2bFk99dRTuvLKKxUXF2eNtPLdd9/pww8/tL7Ms+7KLlGihLp165anx6tevbp1PesIDXZ2mea2lccffWZ97lFRUXne4pFbPXaGg/Onfv36qVu3burfv79++eUXSdLJkyc1f/58XX311Xnut6CEQju++eYbDR06NMfwHxwcrHr16qlFixZq3769evbsqfHjx+uT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qeL0GJUrVzavvPKK2bBhQ47zrF692owcOdJpuTVo0MDtWL9FNUQaY3JcJ7KvQ/v27TMvv/yyU4jL+rpl568QmXX9uf/++73q1xhjmjdv7lK3N0OP2nH8+HHTuHFjp8coXbq0efrpp81ff/2V4zybNm0yL7zwgtP6VqFCBbNt27Yc2//1119O79natWubmTNnmvT0dKvNuXPnzDvvvOM0vnnv3r1d+rr//vudau3cubNJSkpyanPq1CkzduxYp8eMiIgwycnJLv3lJUQuWbLE6bMuIiLCjB8/3qSkpDi1W7ZsmencubNTvXfffbdXj4H/IkQCWbz11lsmJCTE5cuhRIkSpkGDBqZTp04mLi7ONG3a1GnLZeblzjvvdPrwze7IkSMmNjbWZb66deuarl27mubNmzt9UEsyoaGhZsaMGW77XLp0qSlVqpTTPBUqVDCXX3656dChg9O0hg0bOrWbMmVKjn1+8803Jjg42KlttWrVTFxcnGnbtq3Tc8/e59KlS3Ps84cffnCpMyQkxLRs2dJ07drV1KtXz2kMW0mmadOm5tChQzn2588QacyFQBsVFZVjUK5evbpp1aqV6datm2nVqpWpXLmyS5tGjRrluhW3KIfIRYsWubx/IiIiTLNmzUxcXJxp1KiRy3pWp04d63qpUqVcxpb3V4js06ePU7/Nmzc33bp1M/fee2+ufb/xxhsuy9wfW7F2795tWrRokeP7sFKlSla9bdq0MTVr1nRpU7VqVZcgl91nn33msjyqVKliunTpYjp37uwUSCWZSy65xOzdu9eln3Pnzpm+ffu61BAVFWW6du1q2rZt6xQeM98XOe1pMCZvIdIYYz788EOX5xMeHm7atGljunTpYmrXru1SY9euXc3Zs2e9fgxcQIgEsklKSnLaxeHNpX79+mbatGle9X/69Glz5513unzJ5nRp2LChWbhwocc+Fy1aZOrVq5drXx06dHAJG7ntVv72229zDEdZL/379zfLly93um/lypVu+1y5cqVp2bKlV6/p4MGDXbZUZuXvEGmMMSdOnDAjR450Cfa5XcLCwsxDDz1kTp48mWvfRTlEGmPMlClTvHrdSpYsaV5++WWzatUqp/uzb6H3V4hcsmSJCQ0NdanLU2g5ePCg0xav1q1be1VTXqSmpprRo0ebyMhIr9+HwcHBZtiwYWb//v1ePcbPP//s9kdT1kvv3r3Nvn373PaTnp5unnnmmRy3MGe/tG3b1vz9999u+8priDTGmHnz5rn8wM3pEhQUZO677z4CZB4RIgE31q5da1555RUzcOBA06RJE1O+fHlTokQJExwcbCIjI02rVq3MiBEjzOzZs01aWprt/jdu3GieffZZ07lzZ1O9enUTGhpqIiIiTP369c2gQYPMlClTTGpqqtf9paSkmHfeecd0797d1KhRw4SGhprKlSubnj17msmTJ5v09HRz5MgRpw/QxYsX59rn4cOHzbhx40ynTp1M1apVTWhoqKlevboZOHCgtXV0xYoVTn3u2rUr1z4zMjLMrFmzzB133GGio6NNZGSkCQkJMeXLlzexsbHmgQcecAkQOcmPEJnp2LFj5tNPPzW33367adu2ralWrZoJDw83QUFBJiIiwjRs2NBcc801ZuLEiebgwYNe9VnUQ6Qxxmzbts08/vjjJjY21pQvX94EBwebMmXKmPr165v+/fubsWPHOgWSrF/62f9L6q8QaYwxv//+uxk4cKCpWrWqCQkJMWXKlDExMTHmzJkzufbfrVs3q/+JEyd6VdPFOH36tJk+fbq59957TadOnUytWrVMRESECQoKMuHh4aZu3brmqquuMuPGjTM7d+603X9qaqr56KOPzDXXXGPq1q1rSpYsaUqWLGkaNGhgbrnlFjNv3jyv+9q9e7d58cUXTVxcnPV5VLJkSdO4cWMzfPhwM3fuXI99XEyINMaY8+fPmy+++MIMHTrUNGrUyJQtW9aEhISYihUrmg4dOpjHH3/crF+/3na/+C+HMV4MUgqgSFi3bp2io6Ot29u3b8/TqA5ZzZkzxzoys0SJEjp9+vRFn0gdKOhSU1NVrVo1HTt2TCVLltSePXtyHf4TKIr4pAcKqePHj+upp55SVFSU6tatqwEDBriMApJd5gmRpQsnIs4eIDdv3qy3335bUVFRioqK0sCBAz3WkbXPyy67jACJYmHmzJnWqE6DBw8mQKJY4tMeKKRKlSql999/3zrP2pQpU3TTTTe5bb93716nczQOGDDApU1ISIjefPNN6/bSpUvVoUMHt32uXbvW6RyOOfUJFEUTJkywrt97770BrAQIHE42DhRSISEh1ri90oWRQSZPnuwySoMxRvPmzVPnzp2tEzqHhobqsccec+mzbt26iomJsW4PGjRIM2bMcDnZdlpamqZPn64uXbpYI3VUqFCBL1MUeRkZGXrmmWeskZq6devmNLoMUJzwn0igEFuzZo3atGnjNMRe6dKlVa9ePVWpUkVnzpzR+vXrdfjwYWt6UFCQEhISdMstt+TY5y+//KJevXo5BcfIyEjVrVtXFStW1MmTJ7Vu3TprXGhJCg8P1/fff68ePXr44VkCgfXwww9r6dKlioiI0Nq1a63xmcPCwrRixQo1adIkwBUCgUGIBAq55cuX65ZbbtH69es9tq1Vq5Y++OADp+HOcjJnzhzdfvvt2r17t8c+mzRpooSEBLVp08brmoHCZOzYsS5b7kNCQvTRRx+5/TEGFAeESKAISEtL08yZM/Xtt99qxYoV2rVrl1JSUhQaGqqaNWuqRYsWGjBggG644QaPB99kOnPmjL766ivNmjVLf/31l/bu3avTp08rIiJCtWrVUps2bXTNNddowIABCg4O9vMzBAJn8eLFuvPOO7VlyxaVLVtWbdu21RNPPKFOnToFujQgoAiRAAAAsI0DawAAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAtv0fBe7DHrVOS4oAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1,1, figsize=(2,2))\n", - "sns.histplot(\n", - " segmentation['score'],\n", - " bins=50,\n", - " ax=ax,\n", - ")\n", - "ax.set_ylabel('Count')\n", - "ax.set_xlabel('Segger Similarity Score')\n", - "ax.set_yscale('log')" - ] - }, - { - "cell_type": "markdown", - "id": "5492fb96-bf8e-49d5-b40e-7e6b3f871bbe", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-11T22:34:15.990223Z", - "iopub.status.busy": "2024-09-11T22:34:15.988880Z" - }, - "id": "5492fb96-bf8e-49d5-b40e-7e6b3f871bbe" - }, - "source": [ - "#### The Importance of the Receptive Field in Segger\n", - "\n", - "The **receptive field** is a critical parameter in Segger, as it directly influences how the model interprets the spatial relationships between **transcripts** and **nuclei**. In the context of spatial transcriptomics, the receptive field determines the size of the neighborhood that each node (representing transcripts or nuclei) can \"see\" during graph construction and model training. Segger is particularly sensitive to the size of the receptive field because it affects the model's ability to propagate information across the graph. If the receptive field is too small, the model may fail to capture sufficient context for correct cell boundary delineation. Conversely, a very large receptive field may introduce noise by linking unrelated or distant nodes, reducing segmentation accuracy.\n", - "\n", - "#### Parameters affecting the receptive field in Segger:\n", - "- **`--r`**: This parameter defines the radius used when connecting transcripts to nuclei. A larger `r` expands the receptive field, linking more distant nodes. Fine-tuning this parameter helps ensure that Segger captures the right level of spatial interaction in the dataset.\n", - "- **`--k_bd` and `--k_tx`**: These control the number of nearest neighbors (nuclei and transcripts, respectively) considered in the graph. By increasing these values, the receptive field is effectively broadened, allowing more nodes to contribute to the information propagation.\n", - "- **`--dist_bd` and `--dist_tx`**: These parameters specify the maximum distances used to connect nuclei (`dist_bd`) and transcripts (`dist_tx`) to their neighbors during graph construction. They directly affect the receptive field by defining the cut-off distance for forming edges in the graph. Larger distance values expand the receptive field, connecting nodes that are further apart spatially. Careful tuning of these values is necessary to ensure that Segger captures relevant spatial relationships without introducing noise." - ] - }, - { - "cell_type": "markdown", - "id": "7ece1ac0-0708-45e2-87fc-1b25782831f8", - "metadata": { - "id": "7ece1ac0-0708-45e2-87fc-1b25782831f8" - }, - "source": [ - "# **4. Tune Parameters**" - ] - }, - { - "cell_type": "markdown", - "id": "896b8288-5287-4d10-a206-e68c0e4731c6", - "metadata": { - "id": "896b8288-5287-4d10-a206-e68c0e4731c6" - }, - "source": [ - "### Evaluating Receptive Field Parameters with Grid Search\n", - "\n", - "To evaluate the impact of different receptive field parameters in Segger, we use a **grid search** approach. The parameters `k_bd`, `k_tx`, `dist_bd`, and `dist_tx` (which control the number of neighbors and distances for nuclei and transcripts) are explored through various configurations defined in `param_space`. Each combination of these parameters is passed to the `trainable` function, which creates the dataset, trains the model, and makes predictions based on the specified receptive field.\n", - "\n", - "For each parameter combination:\n", - "1. A dataset is created with the specified receptive field.\n", - "2. The Segger model is trained on this dataset.\n", - "3. Predictions are made, and segmentation results are evaluated using the custom `evaluate` function. This function computes metrics like the fraction of assigned transcripts and average cell sizes.\n", - "\n", - "The results from each configuration are saved, allowing us to compare how different receptive field settings impact the model’s performance. This process enables a thorough search of the parameter space, optimizing the model for accurate segmentation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b0c1a7a8-acb2-4aae-8ae4-8aa9a4196717", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-12T01:10:47.781418Z", - "iopub.status.busy": "2024-09-12T01:10:47.781067Z", - "iopub.status.idle": "2024-09-12T01:10:48.706615Z", - "shell.execute_reply": "2024-09-12T01:10:48.706194Z", - "shell.execute_reply.started": "2024-09-12T01:10:47.781401Z" - }, - "id": "b0c1a7a8-acb2-4aae-8ae4-8aa9a4196717" - }, - "outputs": [], - "source": [ - "import itertools\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0bd0803c-e58d-4f43-9627-d2c1ab187d5e", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-12T01:16:31.976312Z", - "iopub.status.busy": "2024-09-12T01:16:31.975947Z", - "iopub.status.idle": "2024-09-12T01:16:33.168389Z", - "shell.execute_reply": "2024-09-12T01:16:33.167956Z", - "shell.execute_reply.started": "2024-09-12T01:16:31.976295Z" - }, - "id": "0bd0803c-e58d-4f43-9627-d2c1ab187d5e" - }, - "outputs": [], - "source": [ - "tuning_dir = Path('path/to/tutorial/tuning/')\n", - "sampling_rate = 0.125" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b879a0b5-150c-4240-99ec-81075855aa52", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-12T01:16:33.169525Z", - "iopub.status.busy": "2024-09-12T01:16:33.169189Z", - "iopub.status.idle": "2024-09-12T01:16:34.147222Z", - "shell.execute_reply": "2024-09-12T01:16:34.146804Z", - "shell.execute_reply.started": "2024-09-12T01:16:33.169508Z" - }, - "id": "b879a0b5-150c-4240-99ec-81075855aa52", - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "# Fixed function arguments used for each trial\n", - "transcripts_path = xenium_data_dir / 'transcripts.parquet'\n", - "\n", - "boundaries_path = xenium_data_dir / 'nucleus_boundaries.parquet'\n", - "\n", - "dataset_kwargs = dict(\n", - " x_size=80, y_size=80, d_x=80, d_y=80, margin_x=10, margin_y=10,\n", - " num_workers=4, sampling_rate=sampling_rate,\n", - ")\n", - "\n", - "model_kwargs = dict(\n", - " metadata=(['tx', 'bd'], [('tx', 'belongs', 'bd'), ('tx', 'neighbors', 'tx')]),\n", - " num_tx_tokens=500, init_emb=8, hidden_channels=32, out_channels=8,\n", - " heads=2, num_mid_layers=2, aggr='sum',\n", - ")\n", - "\n", - "trainer_kwargs = dict(\n", - " accelerator='cuda', strategy='auto', precision='16-mixed', devices=1,\n", - " max_epochs=100,\n", - ")\n", - "\n", - "predict_kwargs = dict(score_cut=0.2, use_cc=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fbd831c9-3a50-4e3b-97d3-3c152ae01188", - "metadata": { - "id": "fbd831c9-3a50-4e3b-97d3-3c152ae01188", - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "def trainable(config):\n", - "\n", - " receptive_field = {k: config[k] for k in ['k_bd', 'k_tx', 'dist_bd', 'dist_tx']}\n", - "\n", - " # Dataset creation\n", - " xs = XeniumSample(verbose=False)\n", - " xs.set_file_paths(transcripts_path, boundaries_path)\n", - " xs.set_metadata()\n", - " try:\n", - " xs.save_dataset_for_segger(\n", - " processed_dir=config['data_dir'],\n", - " receptive_field=receptive_field,\n", - " **dataset_kwargs,\n", - " )\n", - " except:\n", - " pass\n", - "\n", - " # Model training\n", - " ls = LitSegger(**model_kwargs)\n", - " dm = SeggerDataModule(\n", - " data_dir=config['data_dir'],\n", - " batch_size=2,\n", - " num_workers=dataset_kwargs['num_workers'],\n", - " )\n", - " trainer = Trainer(\n", - " default_root_dir=config['model_dir'],\n", - " logger=CSVLogger(config['model_dir']),\n", - " **trainer_kwargs,\n", - " )\n", - " trainer.fit(model=ls, datamodule=dm)\n", - "\n", - " segmentation = predict(\n", - " load_model(config['model_dir']/'lightning_logs/version_0/checkpoints'),\n", - " dm.train_dataloader(),\n", - " receptive_field=receptive_field,\n", - " **predict_kwargs,\n", - " )\n", - "\n", - " metrics = evaluate(segmentation)\n", - "\n", - "\n", - "def evaluate(segmentation: pd.DataFrame, score_cut: float) -> pd.Series:\n", - "\n", - " assigned = segmentation['score'] > score_cut\n", - " metrics = pd.Series(dtype=float)\n", - " metrics['frac_assigned'] = assigned.mean()\n", - " cell_sizes = segmentation.groupby(assigned)['segger_cell_id'].value_counts()\n", - " assigned_avg = 0 if True not in cell_sizes.index else cell_sizes[True].mean()\n", - " cc_avg = 0 if False not in cell_sizes.index else cell_sizes[False].mean()\n", - " metrics['cell_size_assigned'] = assigned_avg\n", - " metrics['cell_size_cc'] = cc_avg\n", - " return metrics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba2dcc9a-3a06-4b84-a487-59a768eed5d5", - "metadata": { - "execution": { - "iopub.execute_input": "2024-09-12T01:16:35.184598Z", - "iopub.status.busy": "2024-09-12T01:16:35.184180Z", - "iopub.status.idle": "2024-09-12T01:19:55.171470Z", - "shell.execute_reply": "2024-09-12T01:19:55.170810Z", - "shell.execute_reply.started": "2024-09-12T01:16:35.184582Z" - }, - "id": "ba2dcc9a-3a06-4b84-a487-59a768eed5d5", - "scrolled": true - }, - "outputs": [], - "source": [ - "param_space = {\n", - " \"k_bd\": [3, 5, 10],\n", - " \"dist_bd\": [5, 10, 15, 20],\n", - " \"k_tx\": [3, 5, 10],\n", - " \"dist_tx\": [3, 5, 10],\n", - "}\n", - "\n", - "metrics = []\n", - "\n", - "for params in itertools.product(*param_space.values()):\n", - "\n", - " config = dict(zip(param_space.keys(), params))\n", - "\n", - " # Setup directories\n", - " trial_dir = tuning_dir / '_'.join([f'{k}={v}' for k, v in config.items()])\n", - "\n", - " data_dir = trial_dir / 'segger_data'\n", - " data_dir.mkdir(exist_ok=True, parents=True)\n", - " config['data_dir'] = data_dir\n", - "\n", - " model_dir = trial_dir / 'models'\n", - " model_dir.mkdir(exist_ok=True, parents=True)\n", - " config['model_dir'] = model_dir\n", - "\n", - " segmentation = trainable(config)\n", - " trial = evaluate(segmentation, predict_kwargs['score_cut'])\n", - " trial = pd.concat([pd.Series(config), trial])\n", - " metrics.append(trial)\n", - "\n", - "metrics = pd.DataFrame(metrics)" - ] - }, - { - "cell_type": "markdown", - "id": "dcfa5570-ada2-4102-aae0-a3830d304c5f", - "metadata": { - "id": "dcfa5570-ada2-4102-aae0-a3830d304c5f" - }, - "source": [ - "### Interpreting Output Metrics\n", - "\n", - "The key output metrics include:\n", - "- **`frac_assigned`**: The fraction of transcripts that were successfully assigned to a cell. A higher value indicates that the model is doing a good job associating transcripts with nuclei, which is a strong indicator of successful segmentation.\n", - "- **`cell_size_assigned`**: The average size of cells that have assigned transcripts. This helps assess how well the model is predicting cell boundaries, with unusually large or small values indicating potential issues with segmentation accuracy.\n", - "- **`cell_size_cc`**: The average size of connected components that were not assigned to a cell (i.e., nucleus-less regions). Large values here may suggest that transcripts are being incorrectly grouped together in the absence of a nucleus, which could indicate problems with the receptive field parameters or the segmentation process.\n", - "\n", - "These metrics illuminate the effectiveness of the model by highlighting both the success in associating transcripts with cells and potential areas where the model may need further tuning.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a89aed4-c53b-460f-8a6f-f690920b6829", - "metadata": { - "execution": { - "iopub.status.busy": "2024-09-12T01:19:55.171961Z", - "iopub.status.idle": "2024-09-12T01:19:55.172161Z", - "shell.execute_reply": "2024-09-12T01:19:55.172071Z", - "shell.execute_reply.started": "2024-09-12T01:19:55.172062Z" - }, - "id": "1a89aed4-c53b-460f-8a6f-f690920b6829" - }, - "outputs": [], - "source": [ - "metrics" - ] + "cells": [ + { + "cell_type": "markdown", + "id": "21ed4db6-5234-46b1-9f38-b5883ac88946", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-11T22:22:55.404267Z", + "iopub.status.busy": "2024-09-11T22:22:55.403876Z", + "iopub.status.idle": "2024-09-11T22:22:58.089917Z", + "shell.execute_reply": "2024-09-11T22:22:58.089303Z", + "shell.execute_reply.started": "2024-09-11T22:22:55.404248Z" + }, + "id": "21ed4db6-5234-46b1-9f38-b5883ac88946" + }, + "source": [ + "# **Introduction to Segger**\n", + "\n", + "\n", + "**Important note (Dec 2024):** As segger is currently undergoing constant development we highly recommend installing directly via github.\n", + "\n", + "\n", + "Segger is a cutting-edge cell segmentation model specifically designed for **single-molecule resolved spatial omics** datasets. It addresses the challenge of accurately segmenting individual cells in complex imaging datasets, leveraging a unique approach based on graph neural networks (GNNs).\n", + "\n", + "The core idea behind Segger is to model both **nuclei** and **transcripts** as graph nodes, with edges connecting them based on their spatial proximity. This allows the model to learn from the co-occurrence of nucleic and cytoplasmic molecules, resulting in more refined and accurate cell boundaries. By using spatial information and GNNs, Segger achieves state-of-the-art performance in segmenting single cells in datasets such as 10X Xenium and MERSCOPE, outperforming traditional methods like Baysor and Cellpose.\n", + "\n", + "Segger's workflow consists of:\n", + "1. **Dataset creation**: Converting raw transcriptomic data into a graph-based dataset.\n", + "2. **Training**: Training the Segger model on the graph to learn cell boundaries.\n", + "3. **Prediction**: Using the trained model to make predictions on new datasets.\n", + "\n", + "This tutorial will guide you through each step of the process, ensuring you can train and apply Segger for your own data." + ] + }, + { + "cell_type": "markdown", + "id": "XEY6CTzK0648", + "metadata": { + "id": "XEY6CTzK0648" + }, + "source": [ + "Installing segger from the GitHub repository:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "TIQnPzfx08Zr", + "metadata": { + "id": "TIQnPzfx08Zr" + }, + "outputs": [], + "source": [ + "!git clone https://github.com/EliHei2/segger_dev.git\n", + "%cd segger_dev\n", + "!pip install \".[rapids12]\" -q" + ] + }, + { + "cell_type": "markdown", + "id": "q3SNnImS09_N", + "metadata": { + "id": "q3SNnImS09_N" + }, + "source": [ + "Downloading the [Xenium Human Pancreatic Dataset](https://www.10xgenomics.com/products/xenium-human-pancreatic-dataset-explorer):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "Qjdt3f-U0_i9", + "metadata": { + "id": "Qjdt3f-U0_i9" + }, + "outputs": [], + "source": [ + "!mkdir data_xenium\n", + "%cd data_xenium\n", + "!wget https://cf.10xgenomics.com/samples/xenium/1.6.0/Xenium_V1_hPancreas_Cancer_Add_on_FFPE/Xenium_V1_hPancreas_Cancer_Add_on_FFPE_outs.zip\n", + "!unzip Xenium_V1_hPancreas_Cancer_Add_on_FFPE_outs.zip\n", + "%cd .." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "trM8h-Ek16sJ", + "metadata": { + "id": "trM8h-Ek16sJ" + }, + "outputs": [], + "source": [ + "from segger.data.parquet.sample import STSampleParquet\n", + "from segger.training.segger_data_module import SeggerDataModule\n", + "from segger.training.train import LitSegger\n", + "from segger.prediction.predict_parquet import segment, load_model\n", + "from lightning.pytorch.loggers import CSVLogger\n", + "from pytorch_lightning import Trainer\n", + "from pathlib import Path\n", + "import pandas as pd\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "import scanpy as sc" + ] + }, + { + "cell_type": "markdown", + "id": "db009015-c379-4f50-97ed-81dca9df28ac", + "metadata": { + "id": "db009015-c379-4f50-97ed-81dca9df28ac" + }, + "source": [ + "# **1. Create your Segger Dataset**\n", + "\n", + "In this step, we generate the dataset required for Segger's cell segmentation tasks.\n", + "\n", + "Segger relies on spatial transcriptomics data, combining staining **boundaries** (e.g., nuclei or membrane stainings) and **transcripts** from single-cell resolved imaging datasets. These nuclei and transcript nodes are represented in a graph, and the spatial proximity of transcripts to nuclei is used to establish edges between them.\n", + "\n", + "To use Segger with a Xenium dataset, you need the **`transcripts.parquet`** and **`nucleus_boundaries.parquet`** (or **`cell_boundaries.parquet`**, in case the Xenium samples comes with the segmentation kit) files. The **transcripts** file contains spatial coordinates and information for each transcript, while the **boundaries** file defines the polygon boundaries of the nuclei or cells. These files enable segger to map transcripts to their respective nuclei and perform cell segmentation based on spatial relationships. Segger can also be extended to other platforms by modifying the column names or formats in the input files to match its expected structure, making it adaptable for various spatial transcriptomics technologies. See [this](https://github.com/EliHei2/segger_dev/tree/main/src/segger/data/parquet/_settings) for Xenium settings." + ] + }, + { + "cell_type": "markdown", + "id": "9d2b090b", + "metadata": { + "id": "9d2b090b" + }, + "source": [ + "### **1.1. Fast Dataset Creation with segger**\n", + "\n", + "Segger introduces a fast and efficient pipeline for processing spatial transcriptomics data. This method accelerates dataset creation, particularly for large datasets, by using **ND-tree-based spatial partitioning** and **parallel processing**. This results in a much faster preparation of the dataset, which is saved in PyTorch Geometric (PyG) format, similar to the previous method.\n", + "\n", + "**Note**: The previous dataset creation method will soon be deprecated in favor of this optimized pipeline.\n", + "\n", + "The pipeline requires the following inputs:\n", + "\n", + "- **base_dir**: The directory containing the raw dataset.\n", + "- **data_dir**: The directory where the processed dataset (tiles in PyG format) will be saved.\n", + "\n", + "The core improvements in this method come from the use of **ND-tree partitioning**, which splits the data efficiently into spatial regions, and **parallel processing**, which speeds up the handling of these regions across multiple CPU cores. For example, using this pipeline, the Xenium Human Pancreatic Dataset can be processed in just a few minutes when running with 16 workers.\n", + "\n", + "Below is an example of how to create a dataset using the faster Segger pipeline:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e933ebf3", + "metadata": { + "id": "e933ebf3" + }, + "outputs": [], + "source": [ + "xenium_data_dir = Path('data_xenium')\n", + "segger_data_dir = Path('data_segger')\n", + "\n", + "sample = STSampleParquet(\n", + " base_dir=xenium_data_dir,\n", + " n_workers=4,\n", + " sample_type='xenium', # this could be 'xenium_v2' in case one uses the cell boundaries from the segmentation kit.\n", + " # weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available\n", + ")\n", + "\n", + "sample.save(\n", + " data_dir=segger_data_dir,\n", + " k_bd=3,\n", + " dist_bd=15.0,\n", + " k_tx=3,\n", + " dist_tx=5.0,\n", + " tile_width=120,\n", + " tile_height=120,\n", + " neg_sampling_ratio=5.0,\n", + " frac=1.0,\n", + " val_prob=0.1,\n", + " test_prob=0.2,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "6ab27f9a", + "metadata": { + "id": "6ab27f9a" + }, + "source": [ + "#### **Parameters**\n", + "Here is a complete list of parameters you can use to control the dataset creation process:\n", + "\n", + "- **--base_dir**: Directory containing the raw spatial transcriptomics dataset.\n", + "- **--data_dir**: Directory where the processed Segger dataset (in PyG format) will be saved.\n", + "- **--sample_type**: (Optional) Specifies the type of dataset (e.g., \"xenium\" or \"merscope\"). Defaults to None.\n", + "- **--scrnaseq_file**: Path to the scRNAseq file (default: None).\n", + "- **--celltype_column**: Column name for cell type annotations in the scRNAseq file (default: None).\n", + "- **--k_bd**: Number of nearest neighbors for boundary nodes (default: 3).\n", + "- **--dist_bd**: Maximum distance for boundary neighbors (default: 15.0).\n", + "- **--k_tx**: Number of nearest neighbors for transcript nodes (default: 3).\n", + "- **--dist_tx**: Maximum distance for transcript neighbors (default: 5.0).\n", + "- **--tile_size**: Specifies the size of the tile. If provided, it overrides both tile_width and tile_height.\n", + "- **--tile_width**: Width of the tiles in pixels (ignored if tile_size is provided).\n", + "- **--tile_height**: Height of the tiles in pixels (ignored if tile_size is provided).\n", + "- **--neg_sampling_ratio**: Ratio of negative samples (default: 5.0).\n", + "- **--frac**: Fraction of the dataset to process (default: 1.0).\n", + "- **--val_prob**: Proportion of data used for validation split (default: 0.1).\n", + "- **--test_prob**: Proportion of data used for testing split (default: 0.2).\n", + "- **--n_workers**: Number of workers for parallel processing (default: 1)." + ] + }, + { + "cell_type": "markdown", + "id": "70755046", + "metadata": {}, + "source": [ + "### **1.2. Using custom gene embeddings**\n", + "\n", + "In the default mode, segger initially tokenizes transcripts based on their gene type simply in a one-hot manner. However, one can use other genes embeddings (e.g., pre-trained embeddings). The following example shows how one can employ a cell-type-annotated scRNAseq reference of the same tissue type (not necessary same sample or experiment) to embed genes based on their abaundance in different cell types:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bf18259", + "metadata": {}, + "outputs": [], + "source": [ + "from segger.data.utils import calculate_gene_celltype_abundance_embedding\n", + "scrnaseq_file = Path('my_scRNAseq_file.h5ad')\n", + "celltype_column = 'celltype_column'\n", + "gene_celltype_abundance_embedding = calculate_gene_celltype_abundance_embedding(\n", + " sc.read(scrnaseq_file),\n", + " celltype_column\n", + ")\n", + "\n", + "sample = STSampleParquet(\n", + " base_dir=xenium_data_dir,\n", + " n_workers=4,\n", + " sample_type='xenium', # this could be 'xenium_v2' in case one uses the cell boundaries from the segmentation kit.\n", + " weights=gene_celltype_abundance_embedding, \n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9962e4b8-4028-4683-9b75-d674fa6fb01d", + "metadata": { + "id": "9962e4b8-4028-4683-9b75-d674fa6fb01d" + }, + "source": [ + "# **2. Train your Segger Model**\n", + "\n", + "The Segger model training process begins after the dataset has been created. This model is a **heterogeneous graph neural network (GNN)** designed to segment single cells by leveraging both nuclei and transcript data.\n", + "\n", + "Segger uses graph attention layers to propagate information across nodes (nuclei and transcripts) and refine cell boundaries. The model architecture includes initial embedding layers, attention-based graph convolutions, and residual connections for stable learning.\n", + "\n", + "Segger leverages the **PyTorch Lightning** framework to streamline the training and evaluation of its graph neural network (GNN). PyTorch Lightning simplifies the training process by abstracting away much of the boilerplate code, allowing users to focus on model development and experimentation. It also supports multi-GPU training, mixed-precision, and efficient scaling, making it an ideal framework for training complex models like Segger." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4db89cb4-d0eb-426a-a71f-d127926fa412", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-12T00:49:07.236043Z", + "iopub.status.busy": "2024-09-12T00:49:07.235854Z", + "iopub.status.idle": "2024-09-12T00:49:08.351946Z", + "shell.execute_reply": "2024-09-12T00:49:08.351565Z", + "shell.execute_reply.started": "2024-09-12T00:49:07.236028Z" + }, + "id": "4db89cb4-d0eb-426a-a71f-d127926fa412" + }, + "outputs": [], + "source": [ + "# Base directory to store Pytorch Lightning models\n", + "models_dir = Path('models')\n", + "\n", + "# Initialize the Lightning data module\n", + "dm = SeggerDataModule(\n", + " data_dir=segger_data_dir,\n", + " batch_size=2,\n", + " num_workers=2,\n", + ")\n", + "\n", + "dm.setup()\n", + "\n", + "is_token_based = True\n", + "num_tx_tokens = 500\n", + "\n", + "# If you use custom gene embeddings, use the following two lines instead:\n", + "# is_token_based = False\n", + "# num_tx_tokens = dm.train[0].x_dict[\"tx\"].shape[1] # Set the number of tokens to the number of genes\n", + "\n", + "\n", + "num_bd_features = dm.train[0].x_dict[\"bd\"].shape[1]\n", + "\n", + "# Initialize the Lightning model\n", + "ls = LitSegger(\n", + " is_token_based = is_token_based,\n", + " num_node_features = {\"tx\": num_tx_tokens, \"bd\": num_bd_features},\n", + " init_emb=8, \n", + " hidden_channels=64,\n", + " out_channels=16,\n", + " heads=4,\n", + " num_mid_layers=1,\n", + " aggr='sum',\n", + ")\n", + "\n", + "# Initialize the Lightning trainer\n", + "trainer = Trainer(\n", + " accelerator='cuda',\n", + " strategy='auto',\n", + " precision='16-mixed',\n", + " devices=1, # set higher number if more gpus are available\n", + " max_epochs=100,\n", + " default_root_dir=models_dir,\n", + " logger=CSVLogger(models_dir),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "207864b8-7e52-4add-a4a2-e95a4debdc06", + "metadata": { + "id": "207864b8-7e52-4add-a4a2-e95a4debdc06", + "scrolled": true + }, + "outputs": [], + "source": [ + "# Fit model\n", + "trainer.fit(\n", + " model=ls,\n", + " datamodule=dm\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "e6214a79", + "metadata": {}, + "source": [ + "Key parameters for training:\n", + "- **`--data_dir`**: Directory containing the training data.\n", + "- **`--model_dir`**: Directory in which to store models.\n", + "- **`--epochs`**: Specifies the number of training epochs.\n", + "- **`--batch_size`**: Batch sizes for training and validation data.\n", + "- **`--learning_rate`**: The initial learning rate for the optimizer.\n", + "- **`--hidden_channels`**: Number of hidden channels in the GNN layers.\n", + "- **`--heads`**: Number of attention heads used in each graph convolutional layer.\n", + "- **`--init_emb`**: Sets the dimensionality of the initial embeddings applied to the input node features (e.g., transcripts). A higher embedding dimension may capture more feature complexity but also requires more computation.\n", + "- **`--out_channels`**: Specifies the number of output channels after the final graph attention layer, e.g. the final learned representations of the graph nodes.\n", + "\n", + "Additional Options for Training the Segger Model:\n", + "\n", + "- **`--aggr`**: This option controls the aggregation method used in the graph convolution layers.\n", + "- **`--accelerator`**: Controls the hardware used for training, such as `cuda` for GPU training. This enables Segger to leverage GPU resources for faster training, especially useful for large datasets.\n", + "- **`--strategy`**: Defines the distributed training strategy, with `auto` allowing PyTorch Lightning to automatically configure the best strategy based on the hardware setup.\n", + "- **`--precision`**: Enables mixed precision training (e.g., `16-mixed`), which can speed up training and reduce memory usage while maintaining accuracy." + ] + }, + { + "cell_type": "markdown", + "id": "9a7d20c6-ca16-4beb-b627-afb41e3fb491", + "metadata": { + "id": "9a7d20c6-ca16-4beb-b627-afb41e3fb491" + }, + "source": [ + "### *Troubleshooting #1*\n", + "\n", + "In the cell below, we are visualizing key metrics from the model training and validation process. The plot displays **training loss**, **validation loss**, **F1 validation score**, and **AUROC validation score** over training steps. We expect to see the loss curves decreasing over time, signaling the model's improvement, and the F1 and AUROC scores increasing, reflecting improved segmentation performance as the model learns.\n", + "\n", + "If training is not working effectively, you might observe the following in the plot displaying **training loss**, **validation loss**, **F1 score**, and **AUROC**:\n", + "\n", + "- **Training loss not decreasing**: If the training loss remains high or fluctuates without a consistent downward trend, this indicates that the model is not learning effectively from the training data.\n", + "- **Validation loss decreases, then increases**: If validation loss decreases initially but starts to increase while training loss continues to drop, this could be a sign of **overfitting**, where the model is performing well on the training data but not generalizing to the validation data.\n", + "- **F1 score and AUROC not improving**: If these metrics remain flat or show inconsistent improvement, the model may be struggling to correctly segment cells or classify transcripts, indicating an issue with learning performance.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43a9c1a4-3898-407d-ac0f-f98b13694593", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-11T22:06:58.182616Z", + "iopub.status.busy": "2024-09-11T22:06:58.182357Z", + "iopub.status.idle": "2024-09-11T22:07:01.063645Z", + "shell.execute_reply": "2024-09-11T22:07:01.063184Z", + "shell.execute_reply.started": "2024-09-11T22:06:58.182599Z" + }, + "id": "43a9c1a4-3898-407d-ac0f-f98b13694593", + "outputId": "70ba8e1b-7814-497a-c8b6-8aa7295cd4d9" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'Step')" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAKACAYAAADtg4tbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAC4jAAAuIwF4pT92AAEAAElEQVR4nOzdeXhTZdoG8PtkbZrupaVAadn3TUBQ2TcBBRQRZRAH1HHDEcdlnM8ZRcXRcWQUV0YBBVFHUQRFUAREQDYRAdnBAqVAge57mvV8f4ScnNMkbdqmTdrev+tiJsl5z8mbFEuePM/7vIIoiiKIiIiIiIgoZKiCPQEiIiIiIiJSYqBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGIYaBGREREREQUYhioERERERERhRgGakRERERERCGGgRoREREREVGICdlA7cSJEwgLC0NycnJArvfZZ59h1KhRiIuLQ1hYGNq3b48HH3wQJ0+eDMj1iYiIiIiIAkUQRVEM9iQqMpvNGDlyJHbu3IlWrVrh/PnzNb6W1WrF9OnTsXLlSq/Hw8PD8eGHH+LWW2+t8XMQEREREREFUshl1Gw2G26//Xbs3LkzINf761//KgVpY8aMwddff42dO3fiP//5D2JiYlBWVoYZM2bg119/DcjzERERERER1VZIZdRycnIwbdo0/PDDD9JjtcmoHT58GL1794bD4cCUKVPwxRdfQBAE6fjx48dx7bXXoqCgAEOHDsXWrVtr/RqIiIiIiIhqK2QyauvWrUO/fv2kIE2lqv3U3n77bTgcDmi1WixYsEARpAFAly5d8PTTTwMAtm3bxqwaERERERGFhJAI1G6//XZMmDABGRkZEAQBTz/9NIYMGVLr63799dcAgKFDh6J169Zex/zxj3+Ubq9atarWz0lERERERFRb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JKqQzU/VR8+pj9kVDNTOHHRPe4xMiEDRlTyf3bNEf2FREShhjZrXPmp276mPfvZdE0II4VaYOTt58qS2Rqt3795eJd/BVcChkGd2w9PatWv55z//qT22Wq1+25XHww8/jKIoWK1Wxo0bR0FBgdd1u93OPffcU2ylv8Jx79y5028lwczMTMaMGeM1dbLouD3L4pdnWuejjz4KuEr133777X6LmKxatUr7ucfGxmp7ol3sRo4cScOGDQF4/fXXWbt2rU+b7Oxsxo4dqwW+jz/+uHZt6NCh2nFxa8h27NihZc08p+EW9l2+fLmWAS6qsHJp0b61gQRqlzB9k2basfOgBGq1iWdlRlNQYdVHd6CWl56H017+ksVnD7orX0WWsj4NvKc+eipL1Uenw0lBlmeFScmoCSFESZo2bUqPHj0A2LRpE+CbTQPo06ePVr1vzpw5jBo1it9//521a9cyc+ZM7rrrLvr27esV8BQWJTkfPXr04KGHHgJce3d169aNH374gXXr1jF16lT69OnD77//rm3KXdSoUaMAV1bliiuu4JtvvmHVqlUsWLCAN998k3bt2vHXX3959Sk6bs+Kki+99BIbNmxg165dpY796quv1orQLV++nE6dOvHll1+yZs0aFi9ezJNPPsmAAQPIy8tDp9MxefLkEqs7XkwMBgMTJ05Ep9ORm5tL//79efLJJ1m0aBFr1qzhyy+/pHPnzqxcuRKAcePGMXLkSK1///79ueKKKwBXFrZPnz7873//096bt956iyuvvBKbzYbJZOJf//qX1vfpp5/GbDajqiqjRo3iH//4h/Zn8bfffmPs2LG8++67gGt6b+EattpCPvlcwvSNm2HD9ReWQwK1WsVrjVqA7xo1VMhNyyU42nduf0FWASe2nSS2fQyWUO9AyzOjVtr6NPCe+uipLPuoAeSmu6c4yNRHIYQo3W233caaNWsA1zoif1mdgIAAJk6cyMiRI7FarcyYMYMZM2b4tLv++usJCgrixx9/5OjRo+Tm5hYbRJXVxx9/jNVq5ZtvvmHbtm3cfvvtXtc7derEddddx2uvvebT97XXXmPJkiXs2LGDxMRE7r//fp828fHx/POf/+SJJ54AYPfu3fTp00e7PnDgQAICAsjLy+PDDz/kww8/pHfv3qxYsaLUsX/99dfo9Xq+++47Dhw4wPjx433aREZG8sMP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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } - ], - "metadata": { - "accelerator": "GPU", + ], + "source": [ + "# Evaluate results\n", + "model_version = 0 # 'v_num' from training output above\n", + "model_path = models_dir / 'lightning_logs' / f'version_{model_version}'\n", + "metrics = pd.read_csv(model_path / 'metrics.csv', index_col=1)\n", + "\n", + "fig, ax = plt.subplots(1,1, figsize=(2,2))\n", + "\n", + "for col in metrics.columns.difference(['epoch']):\n", + " metric = metrics[col].dropna()\n", + " ax.plot(metric.index, metric.values, label=col)\n", + "\n", + "ax.legend(loc=(1, 0.33))\n", + "ax.set_ylim(0, 1)\n", + "ax.set_xlabel('Step')" + ] + }, + { + "cell_type": "markdown", + "id": "e73687e1-ee8f-46e9-8bd2-1ddc571ef94b", + "metadata": { + "id": "e73687e1-ee8f-46e9-8bd2-1ddc571ef94b" + }, + "source": [ + "# **3. Make Predictions**\n", + "\n", + "Once the Segger model is trained, it can be used to make predictions on seen (partially trained) data or be transfered to unseen data. This step involves using a trained checkpoint to predict cell boundaries and refine transcript-nuclei associations." + ] + }, + { + "cell_type": "markdown", + "id": "9807abf3", + "metadata": { + "id": "9807abf3" + }, + "source": [ + "#### **Requirements for the Faster Prediction Pipeline**\n", + "The pipeline requires the following inputs:\n", + "\n", + "- **segger_data_dir**: The directory containing the processed Segger dataset (in PyG format).\n", + "- **models_dir**: The directory containing the trained Segger model checkpoints.\n", + "- **benchmarks_dir**: The directory where the segmentation results will be saved.\n", + "- **transcripts_file**: Path to the file containing the transcript data for prediction.\n", + "\n", + "#### **Running the Faster Prediction Pipeline**\n", + "Below is an example of how to run the faster Segger prediction pipeline using the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "PEOtAs-t9CiY", + "metadata": { "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" + "base_uri": "https://localhost:8080/" + }, + "id": "PEOtAs-t9CiY", + "outputId": "8b7a5375-9ebc-4bb4-9421-254410319120" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting segmentation for segger_embedding_1001...\n" + ] } + ], + "source": [ + "dm = SeggerDataModule(\n", + " data_dir='data_segger',\n", + " batch_size=1,\n", + " num_workers=4,\n", + ")\n", + "\n", + "dm.setup()\n", + "\n", + "model_version = 0\n", + "model_path = Path('models') / \"lightning_logs\" / f\"version_{model_version}\"\n", + "model = load_model(model_path / \"checkpoints\")\n", + "\n", + "receptive_field = {'k_bd': 4, 'dist_bd': 12, 'k_tx': 15, 'dist_tx': 3}\n", + "\n", + "segment(\n", + " model,\n", + " dm,\n", + " save_dir='benchmarks',\n", + " seg_tag='segger_output',\n", + " transcript_file='data_xenium/transcripts.parquet',\n", + " receptive_field=receptive_field,\n", + " min_transcripts=5,\n", + " cell_id_col='segger_cell_id',\n", + " use_cc=False,\n", + " knn_method='cuda',\n", + " verbose=True,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "3aa5002c", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "0a823035", + "metadata": { + "id": "0a823035" + }, + "source": [ + "#### **Parameters**\n", + "Here is a detailed explanation of each parameter used in the faster prediction pipeline:\n", + "\n", + "- **--segger_data_dir**: The directory containing the processed Segger dataset, saved as PyTorch Geometric data objects, that will be used for prediction.\n", + "- **--models_dir**: The directory containing the trained Segger model checkpoints. These checkpoints store the learned weights required for making predictions.\n", + "- **--benchmarks_dir**: The directory where the segmentation results will be saved.\n", + "- **--transcripts_file**: Path to the *transcripts.parquet* file.\n", + "- **--batch_size**: Specifies the batch size for processing during prediction. Larger batch sizes speed up inference but use more memory (default: 1).\n", + "- **--num_workers**: Number of workers to use for parallel data loading (default: 1).\n", + "- **--model_version**: Version of the trained model to load for predictions, based on the version number from the training logs (default: 0).\n", + "- **--save_tag**: A tag used to name and organize the segmentation results (default: segger_embedding).\n", + "- **--min_transcripts**: The minimum number of transcripts required for segmentation (default: 5).\n", + "- **--cell_id_col**: The name of the column that stores the cell IDs (default: segger_cell_id).\n", + "- **--use_cc**: Enables the use of connected components (CC) for grouping transcripts that are not associated with any nucleus (default: False).\n", + "- **--knn_method**: Method for KNN (K-Nearest Neighbors) computation. Only option is \"cuda\" for this pipeline (default: cuda).\n", + "- **--file_format**: The format for saving the output segmentation data. Only option is \"anndata\" for this pipeline (default: anndata).\n", + "- **--k_bd**: Number of nearest neighbors for boundary nodes during segmentation (default: 4).\n", + "- **--dist_bd**: Maximum distance for boundary nodes during segmentation (default: 12.0).\n", + "- **--k_tx**: Number of nearest neighbors for transcript nodes during segmentation (default: 5).\n", + "- **--dist_tx**: Maximum distance for transcript nodes during segmentation (default: 5.0)." + ] + }, + { + "cell_type": "markdown", + "id": "b0917be9-4e82-4ba5-869d-5a9203721699", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-11T23:06:23.977884Z", + "iopub.status.busy": "2024-09-11T23:06:23.977517Z" + }, + "id": "b0917be9-4e82-4ba5-869d-5a9203721699" + }, + "source": [ + "### *Troubleshooting #2*\n", + "\n", + "In the cell below, we are visualizing the distribution of **Segger similarity scores** using a histogram. The **Segger similarity score** reflects how closely transcripts are associated with their respective nuclei in the segmentation process. **Higher scores** indicate stronger associations between transcripts and their nuclei, suggesting more accurate cell boundaries. **Lower scores** might indicate weaker associations, which could highlight potential segmentation errors or challenging regions in the data. We expect to see a large number of the scores clustering toward higher values, which would indicate strong overall performance of the model in associating transcripts with nuclei.\n", + "\n", + "The following would indicate potential issues with the model's predictions:\n", + "\n", + "- **A very large portion of scores near zero**: If many scores are concentrated at the lower end of the scale, this suggests that the model is frequently failing to associate transcripts with their corresponding nuclei, indicating poor segmentation quality.\n", + "- **No clear peak in the distribution**: If the histogram is flat or shows a wide, spread-out distribution, this could indicate that the model is struggling to consistently assign similarity scores, which may be a sign that the training process did not optimize the model correctly.\n", + "\n", + "Both cases would suggest that the model requires further tuning, such as adjusting hyperparameters, data preprocessing, or the training procedure (see below)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a450d3ca-2876-4f48-be89-761147b17387", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-11T22:07:04.216273Z", + "iopub.status.busy": "2024-09-11T22:07:04.215965Z", + "iopub.status.idle": "2024-09-11T22:07:08.177601Z", + "shell.execute_reply": "2024-09-11T22:07:08.177158Z", + "shell.execute_reply.started": "2024-09-11T22:07:04.216257Z" + }, + "id": "a450d3ca-2876-4f48-be89-761147b17387", + "outputId": "0576e0b8-4823-4701-b661-dc6b513841f2" + }, + "outputs": [ + { + "data": { + "image/png": "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AAAA2wiRAAAAsI0QCQAAANsIkQAAALCNEAkAAADbCJEAAACwjRAJAAAA2wiRAAAAsI0QCQAAANsIkQAAALCNEAkAAADbCJEAAACwjRAJAAAA2wiRAAAAsI0QCQAAANsIkYAbGzZs0Ouvv64rr7xSl156qSIjIxUeHq6aNWuqRYsWGjp0qD799FMdPHgw0KXCz06cOKFp06YpPj5eLVq0UPXq1RUWFqZKlSopOjpavXr10pgxY/T333973afD4bAuCxYs8F/xefD8889btXXt2tVlekJCgjU9Kioq3+vzVteuXa06n3/+ebftjDH6+OOPtXLlyvwrLg/OnDmj77//Xvfcc49iY2NVq1YthYeHKzIyUpdccom6du2q559/Xr/99puMMYEuF8WBAeBk8+bNpm/fvkaSV5fQ0FAzYsQIc+TIkUCXDh87d+6cGTVqlClTpozX74e2bduapUuXeuw76zy//vqr/5+MDc8995xVW1xcnMv0jz/+2Jpet27dfK/PW3FxcVadzz33XI5tVq9ebTp37lwgl0OmjIwMM2HCBFO5cmWv34fR0dHm+++/D3TpKOJC/BdPgcJn8eLF6tu3r06cOGHdFxwcrPr166tq1aoKCwvTyZMntXHjRh09elSSdO7cOb333nv68ccf9dNPP+nSSy8NVPnwoVOnTqlfv35KTEx0ur9y5cqqX7++SpcurdTUVO3Zs0dbt261tvz88ccf6ty5s95++23dc889gSgdNrRo0UJpaWmBLsOt9PR0DRkyRNOmTXO6v3z58mrUqJHKli2rc+fO6eDBg9qwYYMyMjIkSWvXrlX//v312GOP6ZVXXglE6SgG2J0N/L89e/Zo4MCBVoCsUqWK/vOf/+jw4cPasGGDFi1apHnz5mnZsmU6cuSIli9fruuuu86af/v27erTp4+OHz8eqKcAH7rzzjutAOlwODRixAitXbtWBw4c0O+//6558+Zp0aJF2rx5s/bt26eXX35ZpUuXliRlZGTovvvu08yZMwP5FOCFghwgJemZZ55xCpCDBg1SUlKSjh49qj/++EPz5s3TwoULtXbtWh09elTvvvuuKleubLUfM2aM3n777UCUjuIg0JtCgYLijjvusHYFVa9e3Wzfvt2r+UaPHu20G+nRRx/1c6XwtyVLljgt0/fff9+r+f7++28TGRlpzVezZk2Tmprq52rzX2HZne2NrMu5oO3O3rp1qylRooRV35NPPunVfDt37jR169a15itVqpTZv3+/n6tFccSWSEAXdklPmTLFuj169GjVqVPHq3mffvppde7c2bo9adIkpaen+7xG5J+PP/7Yut65c2fdcccdXs3XrFkzjR071rq9e/duzZo1y+f1oXj4/PPPdf78eUlS3bp1NXr0aK/mq1WrliZNmmTdTklJ0WeffeaXGlG8ESIBXfj/UEpKinW7ffv2tua/++67retHjx7VmjVrfFYb8l9SUpJ13e57YejQoSpTpox1e8mSJT6rC8VL1vdhmzZtFBTk/Vd2jx491KhRI+s270P4AyESkHT27Fmn2/v377c1f+fOndWoUSN16NBB/fr18+rDfvv27XrhhRfUqVMn65QxlStXVuvWrfX4449r7dq1tmpITU3VBx98oF69eqlq1aoKDQ1VtWrV1KNHD3344YfWf7+uvPJK67QnCQkJufZ54sQJjR8/XnFxcapYsaJCQ0NVq1YtDRgwQF9//bXVrnHjxrZOVzN37lzdeeedio6Otk6dVKdOHV111VV65513nAK9O5mPV6lSJUnSrl27FB8frypVqigiIkL169fXTTfd5PRF7K2s7we774Xw8HBdddVVatmypXr27Kl69erlWr+71yzr6WnWrVsn6cKWzVGjRqlly5aqUKGCSpcurejoaN15551atWqVSx8LFizQkCFDVL9+fYWHh6tChQq6/PLL9fbbb7u857PydIofu9auXav//d//tV6PsmXLKiwsTFWqVNFll12mu+66Sz/++GOufSxYsMCq6frrr5ckLV26VL169VLZsmVVrlw5xcTE6N5777VOu+XuFD9ZT1GU1RVXXGHdHx8fL0m67LLLrPv69u3r9XO+5pprrPm83ZKd3cW8DyWpf//+at68ubp166amTZt6bJ+WlqYvv/xSgwYNUr169RQeHq6IiAhFRUXpuuuu09SpU73+D+nBgwc1ZswY9ejRw/p8i4yMVHR0tO644w7NmTPHYx9Zl9MjjzwiSZo9e7Y6deqkUqVKqUKFCmrVqpUeeeQRpaamusyfkZGh6dOn65ZbbrEOQoqIiFC9evV03XXXafLkydaWXuRRoPenAwXBvn37nP4b1bNnT5OWluaXx0pLSzOPP/64CQsLy/UUHcHBwebuu+82Z8+e9djnsmXLTP369XPtr1WrVmbz5s2md+/e1n0ff/yx2z5nz55tqlSpkmuf3bt3N4cOHTKXXnqpV/8r27x5s+nSpYvH05NUq1bNTJ8+PdfnnNm2YsWKZvfu3aZ27do59vXnn396fP2yu/LKK635IyIizLp162z34UnWGnN6zbKenmbt2rUmISEh11MNhYSEmEmTJhljjDl9+rS59dZbc32NY2NjzaFDh3KszVen+Dl48KC57rrrjMPh8Oq0NO3btze7d+/Osa9ff/3VanfdddeZefPmmdDQUJc+KlasaM6dO+fyGmY9xU/W+t1dhg0bZowxZty4cU6v8YEDB9w+30yHDx92qm3JkiUe58nJiBEjrD4cDodZsGBBnvrxxty5c029evU8vi7NmjUzycnJbvtJT083L774ogkPD/dqeee2bmVdTv/617/MJ598kuN76bLLLnOZNykpyTRr1sxjDQ0bNjSJiYk+eQ2LI0Ik8P+aN2/u9OHSuXNnM3/+fJORkeGzxzh79qxTQMm8NG7c2FxxxRWmVatWTn+kz6zj1KlTbvtcvHixKVmypNM8FSpUMJ07dzZt27Z1Cqt16tQxl112mccQ+dVXX5mgoCCXYBcXF2datmxpgoODrftbtGhhatWq5TFELl++3OU8dxEREaZdu3ama9euLl9gDofDvP76626fd9bn2rVr1xy/IKKjo20snf8aP368SzB5++23zYkTJ/LUX271exMi//3vfzu9Lpnvl+yvWVBQkElKSjIDBgyw7qtUqZK5/PLLTevWrU1ISIhT+2uuuSbH2nwRIvfu3WsaNWrk9HilSpUysbGxpkePHqZTp045/khp1qyZOX/+vEt/WUNkly5d3J4z8e67787xNcwaIufOnWt69+7t9INKkmnTpo11/6uvvmqMufADM+vr9vbbb7tfqP/vnXfesdpfcsklHtu7880337isL6NHj/YqyNrxySefuKzv5cqVM+3btzft2rUzZcuWdZpWqVIls379epd+0tLSzDXXXOOyTOrWrWvi4uJM69atXcJl+fLlzcKFC3OsK+v77KqrrnIbTMeMGeM03+zZs01ERITL8+nYsaPp0qWLqVmzptO00NBQM23aNJ++psUFIRL4f1OnTs3xA6pmzZpmxIgRZurUqWbv3r0X9Rh33XWXU99DhgwxW7dudWpz9OhR89RTTzkFtZtvvjnH/o4cOWJq1Kjh9CXz7rvvWltijDHm+PHj5tFHH83xF3xOIXLz5s2mVKlSTl8Y06ZNM+np6Vabffv2mWHDhuX4euUUiA4ePOgUNEuXLm0mTpxozpw549Ru5cqVTlsqg4KCzE8//ZTjc8/+uBEREWbixInm0KFD5sCBA2bq1KlmypQpbpZE7k6cOGGqVq3q8hjh4eGmX79+5q233jJ//fWX02til50QmXnp27evy5f3lClTnN4rmV/45cqVM59//rlTjTt27DAdOnRw6jOnLUG+CJE33nij1SYsLMy8++67OW5VX7hwodMPG0nmq6++cmmXNURmXurXr29mzZplTp48abZv325ee+01py3P3pxs3NNyMMaYfv36WW3at2+fY5us2rdvb7V/+eWXPbZ3Jz093TRt2tTleYeEhJhu3bqZsWPHmmXLluUYur21YsUKp62mlSpVMpMnT3b6DElNTTWvvvqqU5hu27atS1/33XefU52dOnUySUlJTm1OnjxpXn75ZZfH3LFjh0t/OW0xbtWqlUlMTDQpKSlm48aN5tlnnzW7du2y5tmwYYPTFvuqVauaKVOmuOxZSkxMdHrflSxZ0vz99995fh2LK0IkkMVjjz2WYzDKemnYsKG59dZbzaeffmr27dvndd+LFi1y6uepp57Ktf0XX3zh1H7evHkubZ544glrenBwsPnll1/c9jdx4kSvQuRNN91kTS9TpoxZvXq12z4fffRRr0Lkbbfd5tTnihUr3PZ57tw5079/f6t9VFRUjn8tyP64nnZ/27V8+XKnMJ3TpXz58qZPnz5m7NixuT6nnNgNkf3793f7F4usr68kU6JECfP777/n2Hb37t1OW6cnTpzo0uZiQ+TWrVud6nnnnXdyfS327t3rtOXo9ttvd2mTPUSWLl3a42m4fBUiv/76a6d2mzZtcvuYGzdudFonswacvNiyZYupVq1aru/DUqVKmW7duplRo0aZJUuW2PorTvfu3Z3ezzltYcz07rvvOj3u3LlzrWmrVq1y2prZv39/pyCa3c8//+wUSq+77jqXNtlDZO3atc3Ro0e9fj41atTI9T1y4sQJ07ZtW6t9586dc+0brgiRQDYff/yx07n+crs4HA7TsWNH8+GHH+b6gWmMcdrFGBsb69Vu8uuvv96ap0+fPk7T0tPTnbaWjRw50mN/2XelZw+Rx44dc9qd/tZbb+Xa3/nz5122ImX/It67d69TaPHUpzHGHDhwwGkX/dSpU13aZH3MJk2aeOwzL9auXeuy5S63S82aNc0jjzxidu7c6bFvOyEyKCjIbN682W1fs2bNcupv6NChuT52p06drLYPP/ywy/SLDZEffPCBFSiqVavm1Zaynj17Wn1eeeWVLtOzh8h77rnHY5++CpGpqammYsWKVrtRo0a5fcxnn33W7TqbV7t27XLaGurpUqlSJTNixAizdu3aXPtdv36903zvvfeex1qy/kVhxIgR1v1Dhw617q9YsaI5fPiwx76efvppp/d49gCbPUSOHTs21/5WrFjh1H7mzJkea1i1apXTXpply5Z5nAf/xdHZQDbx8fHasGGDXnjhBV1yySW5tjXGaOnSpbrtttvUtGlTt6fROHPmjNPRp/fcc4/LkaE5ueWWW6zr8+fPdzpac9myZU5HbN57770e+3v44Ydznf7DDz9YRytGRETo1ltvzbV9SEiI7rvvvlzbzJo1yzpyMjw83GOf0oWhBa+88krr9uzZs3Nt74sjiHPSuHFjLV68WF999ZV69+6tkJDcR4rdvXu3Xn31VTVq1EgvvviiNQTdxWrVqpXq16/vdnr2af3798+1v5o1a1rX/THC0u23367Tp09r7dq1+uGHHzy+bpJUrVo16/qZM2c8tvfXMs9JaGiobrrpJuv2559/7rZt1vMxevNe90bNmjX1/fffa+7cubr22msVHh6ea/tDhw7pvffeU0xMjB566CG3R+J///331vXSpUs7fd64M378eE2YMEFz587VM888I+nC5+BPP/1ktYmPj1eFChU89vXggw8qNDRU0oUjqS92PZ8+fbp1vXbt2urXr5/HGmJiYtSiRQvrtqca4IwQCeSgUqVKeuaZZ7R+/XqtWbNGb775pgYOHKiKFSu6nWfjxo3q1q2bvv32W5dpf/zxh9OpJNq1a+dVHbGxsdb1c+fOOZ2uZt68edb1qKioXENGpri4OJUoUcLt9Kx9tm3b1hrGLzc9evTIdXrWYB0TE+NVn5Lzc/d0jrusXwK+FhQUpOuvv15z5szRwYMHNW3aNI0YMULR0dFu5zl79qyefvppDRkyxCdB0tPpWUqWLOl029P47VlDiL9OjB8WFqbGjRurZcuWubbbvn27Pv/8c/3555+2avLnMs9J1kC4YcMGLV++3KXN4sWLtWXLFklSZGSkBgwY4NMaevbsqenTp+vw4cOaOXOmHnroIbVs2dLtKcXS09P15ptvqnfv3jkG8z/++MO6Hhsbq4iICI819OvXT/fee6969uypGjVqSJLWrVtnnVZJknr16uXV86lUqZJatWpl3V68eLHbtg6HQ82bN8+1v6yfE+3atfPqh7pk77MGzjz/PASKuejoaEVHR+uBBx6QMUbJycn69ddf9fPPP2vevHlOH87nzp3T0KFD9c8//6hBgwbW/Zs2bXLqMyYmJk+17N6927q+c+dO67qn0JApLCxM9evX1/r163Ocnpc+M89B6G5rR9bnnpSU5PUHe1ZZn3dOso4V7E/ly5fXoEGDNGjQIEkXzoWXmJio+fPn64cfftCOHTuc2k+dOlUtWrTQ448/flGPW7VqVVvty5Ytm+v0vCyDi5GWlqbk5GStXbtWmzdv1pYtW7Rx40YlJyfryJEjLu2NMR77zK9lnqlVq1Zq1qyZ/vnnH0kXtji2adPGqc2nn35qXR8yZIjCwsL8UktERIT69+9vbXE+fvy4Fi1apPnz5+vHH390Wb8XLlyohx9+WO+9957T/ZmBV/J+fc/Jnj17nG43adLE63ljYmL0+++/59hPVmXLlrW2WrqT9bPm66+/9stnDZyxJRKwweFwKCYmRvfff79mzpypffv26X//939VqlQpq83p06f14osvOs139OhRnzx+1i/cffv2WdfLlSvndR+RkZFup+W1z/Lly7ud5ovnfvbs2Vx3cXoKTf5SuXJlXX/99Xr33Xe1fft2ff/99y5bS1566SWdOnXqoh7H0+7L7PI7JLqzfft2jRgxQpUrV1aLFi1000036emnn9ZHH32kRYsWOb2fvdnlnVUglvmwYcOs61OnTnXaYpqamqpp06ZZt321K9sb5cqVU79+/fT6669r3bp1WrRokeLi4pzafPDBB9q6davTfVn/ymBnfc/u8OHDTrdz+4zJLmvb7P1k5c3y9sVnTU4/auAeWyKBi1C2bFk99dRTuvLKKxUXF2eNtPLdd9/pww8/tL7Ms+7KLlGihLp165anx6tevbp1PesIDXZ2mea2lccffWZ97lFRUXne4pFbPXaGg/Onfv36qVu3burfv79++eUXSdLJkyc1f/58XX311Xnut6CEQju++eYbDR06NMfwHxwcrHr16qlFixZq3769evbsqfHjx+uT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qeL0GJUrVzavvPKK2bBhQ47zrF692owcOdJpuTVo0MDtWL9FNUQaY3JcJ7KvQ/v27TMvv/yyU4jL+rpl568QmXX9uf/++73q1xhjmjdv7lK3N0OP2nH8+HHTuHFjp8coXbq0efrpp81ff/2V4zybNm0yL7zwgtP6VqFCBbNt27Yc2//1119O79natWubmTNnmvT0dKvNuXPnzDvvvOM0vnnv3r1d+rr//vudau3cubNJSkpyanPq1CkzduxYp8eMiIgwycnJLv3lJUQuWbLE6bMuIiLCjB8/3qSkpDi1W7ZsmencubNTvXfffbdXj4H/IkQCWbz11lsmJCTE5cuhRIkSpkGDBqZTp04mLi7ONG3a1GnLZeblzjvvdPrwze7IkSMmNjbWZb66deuarl27mubNmzt9UEsyoaGhZsaMGW77XLp0qSlVqpTTPBUqVDCXX3656dChg9O0hg0bOrWbMmVKjn1+8803Jjg42KlttWrVTFxcnGnbtq3Tc8/e59KlS3Ps84cffnCpMyQkxLRs2dJ07drV1KtXz2kMW0mmadOm5tChQzn2588QacyFQBsVFZVjUK5evbpp1aqV6datm2nVqpWpXLmyS5tGjRrluhW3KIfIRYsWubx/IiIiTLNmzUxcXJxp1KiRy3pWp04d63qpUqVcxpb3V4js06ePU7/Nmzc33bp1M/fee2+ufb/xxhsuy9wfW7F2795tWrRokeP7sFKlSla9bdq0MTVr1nRpU7VqVZcgl91nn33msjyqVKliunTpYjp37uwUSCWZSy65xOzdu9eln3Pnzpm+ffu61BAVFWW6du1q2rZt6xQeM98XOe1pMCZvIdIYYz788EOX5xMeHm7atGljunTpYmrXru1SY9euXc3Zs2e9fgxcQIgEsklKSnLaxeHNpX79+mbatGle9X/69Glz5513unzJ5nRp2LChWbhwocc+Fy1aZOrVq5drXx06dHAJG7ntVv72229zDEdZL/379zfLly93um/lypVu+1y5cqVp2bKlV6/p4MGDXbZUZuXvEGmMMSdOnDAjR450Cfa5XcLCwsxDDz1kTp48mWvfRTlEGmPMlClTvHrdSpYsaV5++WWzatUqp/uzb6H3V4hcsmSJCQ0NdanLU2g5ePCg0xav1q1be1VTXqSmpprRo0ebyMhIr9+HwcHBZtiwYWb//v1ePcbPP//s9kdT1kvv3r3Nvn373PaTnp5unnnmmRy3MGe/tG3b1vz9999u+8priDTGmHnz5rn8wM3pEhQUZO677z4CZB4RIgE31q5da1555RUzcOBA06RJE1O+fHlTokQJExwcbCIjI02rVq3MiBEjzOzZs01aWprt/jdu3GieffZZ07lzZ1O9enUTGhpqIiIiTP369c2gQYPMlClTTGpqqtf9paSkmHfeecd0797d1KhRw4SGhprKlSubnj17msmTJ5v09HRz5MgRpw/QxYsX59rn4cOHzbhx40ynTp1M1apVTWhoqKlevboZOHCgtXV0xYoVTn3u2rUr1z4zMjLMrFmzzB133GGio6NNZGSkCQkJMeXLlzexsbHmgQcecAkQOcmPEJnp2LFj5tNPPzW33367adu2ralWrZoJDw83QUFBJiIiwjRs2NBcc801ZuLEiebgwYNe9VnUQ6Qxxmzbts08/vjjJjY21pQvX94EBwebMmXKmPr165v+/fubsWPHOgWSrF/62f9L6q8QaYwxv//+uxk4cKCpWrWqCQkJMWXKlDExMTHmzJkzufbfrVs3q/+JEyd6VdPFOH36tJk+fbq59957TadOnUytWrVMRESECQoKMuHh4aZu3brmqquuMuPGjTM7d+603X9qaqr56KOPzDXXXGPq1q1rSpYsaUqWLGkaNGhgbrnlFjNv3jyv+9q9e7d58cUXTVxcnPV5VLJkSdO4cWMzfPhwM3fuXI99XEyINMaY8+fPmy+++MIMHTrUNGrUyJQtW9aEhISYihUrmg4dOpjHH3/crF+/3na/+C+HMV4MUgqgSFi3bp2io6Ot29u3b8/TqA5ZzZkzxzoys0SJEjp9+vRFn0gdKOhSU1NVrVo1HTt2TCVLltSePXtyHf4TKIr4pAcKqePHj+upp55SVFSU6tatqwEDBriMApJd5gmRpQsnIs4eIDdv3qy3335bUVFRioqK0sCBAz3WkbXPyy67jACJYmHmzJnWqE6DBw8mQKJY4tMeKKRKlSql999/3zrP2pQpU3TTTTe5bb93716nczQOGDDApU1ISIjefPNN6/bSpUvVoUMHt32uXbvW6RyOOfUJFEUTJkywrt97770BrAQIHE42DhRSISEh1ri90oWRQSZPnuwySoMxRvPmzVPnzp2tEzqHhobqsccec+mzbt26iomJsW4PGjRIM2bMcDnZdlpamqZPn64uXbpYI3VUqFCBL1MUeRkZGXrmmWeskZq6devmNLoMUJzwn0igEFuzZo3atGnjNMRe6dKlVa9ePVWpUkVnzpzR+vXrdfjwYWt6UFCQEhISdMstt+TY5y+//KJevXo5BcfIyEjVrVtXFStW1MmTJ7Vu3TprXGhJCg8P1/fff68ePXr44VkCgfXwww9r6dKlioiI0Nq1a63xmcPCwrRixQo1adIkwBUCgUGIBAq55cuX65ZbbtH69es9tq1Vq5Y++OADp+HOcjJnzhzdfvvt2r17t8c+mzRpooSEBLVp08brmoHCZOzYsS5b7kNCQvTRRx+5/TEGFAeESKAISEtL08yZM/Xtt99qxYoV2rVrl1JSUhQaGqqaNWuqRYsWGjBggG644QaPB99kOnPmjL766ivNmjVLf/31l/bu3avTp08rIiJCtWrVUps2bXTNNddowIABCg4O9vMzBAJn8eLFuvPOO7VlyxaVLVtWbdu21RNPPKFOnToFujQgoAiRAAAAsI0DawAAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAthEiAQAAYBshEgAAALYRIgEAAGAbIRIAAAC2ESIBAABgGyESAAAAtv0fBe7DHrVOS4oAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(2,2))\n", + "sns.histplot(\n", + " segmentation['score'],\n", + " bins=50,\n", + " ax=ax,\n", + ")\n", + "ax.set_ylabel('Count')\n", + "ax.set_xlabel('Segger Similarity Score')\n", + "ax.set_yscale('log')" + ] + }, + { + "cell_type": "markdown", + "id": "5492fb96-bf8e-49d5-b40e-7e6b3f871bbe", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-11T22:34:15.990223Z", + "iopub.status.busy": "2024-09-11T22:34:15.988880Z" + }, + "id": "5492fb96-bf8e-49d5-b40e-7e6b3f871bbe" + }, + "source": [ + "#### The Importance of the Receptive Field in Segger\n", + "\n", + "The **receptive field** is a critical parameter in Segger, as it directly influences how the model interprets the spatial relationships between **transcripts** and **nuclei**. In the context of spatial transcriptomics, the receptive field determines the size of the neighborhood that each node (representing transcripts or nuclei) can \"see\" during graph construction and model training. Segger is particularly sensitive to the size of the receptive field because it affects the model's ability to propagate information across the graph. If the receptive field is too small, the model may fail to capture sufficient context for correct cell boundary delineation. Conversely, a very large receptive field may introduce noise by linking unrelated or distant nodes, reducing segmentation accuracy.\n", + "\n", + "#### Parameters affecting the receptive field in Segger:\n", + "- **`--r`**: This parameter defines the radius used when connecting transcripts to nuclei. A larger `r` expands the receptive field, linking more distant nodes. Fine-tuning this parameter helps ensure that Segger captures the right level of spatial interaction in the dataset.\n", + "- **`--k_bd` and `--k_tx`**: These control the number of nearest neighbors (nuclei and transcripts, respectively) considered in the graph. By increasing these values, the receptive field is effectively broadened, allowing more nodes to contribute to the information propagation.\n", + "- **`--dist_bd` and `--dist_tx`**: These parameters specify the maximum distances used to connect nuclei (`dist_bd`) and transcripts (`dist_tx`) to their neighbors during graph construction. They directly affect the receptive field by defining the cut-off distance for forming edges in the graph. Larger distance values expand the receptive field, connecting nodes that are further apart spatially. Careful tuning of these values is necessary to ensure that Segger captures relevant spatial relationships without introducing noise." + ] + }, + { + "cell_type": "markdown", + "id": "7ece1ac0-0708-45e2-87fc-1b25782831f8", + "metadata": { + "id": "7ece1ac0-0708-45e2-87fc-1b25782831f8" + }, + "source": [ + "# **4. Tune Parameters**" + ] + }, + { + "cell_type": "markdown", + "id": "896b8288-5287-4d10-a206-e68c0e4731c6", + "metadata": { + "id": "896b8288-5287-4d10-a206-e68c0e4731c6" + }, + "source": [ + "### Evaluating Receptive Field Parameters with Grid Search\n", + "\n", + "To evaluate the impact of different receptive field parameters in Segger, we use a **grid search** approach. The parameters `k_bd`, `k_tx`, `dist_bd`, and `dist_tx` (which control the number of neighbors and distances for nuclei and transcripts) are explored through various configurations defined in `param_space`. Each combination of these parameters is passed to the `trainable` function, which creates the dataset, trains the model, and makes predictions based on the specified receptive field.\n", + "\n", + "For each parameter combination:\n", + "1. A dataset is created with the specified receptive field.\n", + "2. The Segger model is trained on this dataset.\n", + "3. Predictions are made, and segmentation results are evaluated using the custom `evaluate` function. This function computes metrics like the fraction of assigned transcripts and average cell sizes.\n", + "\n", + "The results from each configuration are saved, allowing us to compare how different receptive field settings impact the model’s performance. This process enables a thorough search of the parameter space, optimizing the model for accurate segmentation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0c1a7a8-acb2-4aae-8ae4-8aa9a4196717", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-12T01:10:47.781418Z", + "iopub.status.busy": "2024-09-12T01:10:47.781067Z", + "iopub.status.idle": "2024-09-12T01:10:48.706615Z", + "shell.execute_reply": "2024-09-12T01:10:48.706194Z", + "shell.execute_reply.started": "2024-09-12T01:10:47.781401Z" + }, + "id": "b0c1a7a8-acb2-4aae-8ae4-8aa9a4196717" + }, + "outputs": [], + "source": [ + "import itertools\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bd0803c-e58d-4f43-9627-d2c1ab187d5e", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-12T01:16:31.976312Z", + "iopub.status.busy": "2024-09-12T01:16:31.975947Z", + "iopub.status.idle": "2024-09-12T01:16:33.168389Z", + "shell.execute_reply": "2024-09-12T01:16:33.167956Z", + "shell.execute_reply.started": "2024-09-12T01:16:31.976295Z" + }, + "id": "0bd0803c-e58d-4f43-9627-d2c1ab187d5e" + }, + "outputs": [], + "source": [ + "tuning_dir = Path('path/to/tutorial/tuning/')\n", + "sampling_rate = 0.125" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b879a0b5-150c-4240-99ec-81075855aa52", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-12T01:16:33.169525Z", + "iopub.status.busy": "2024-09-12T01:16:33.169189Z", + "iopub.status.idle": "2024-09-12T01:16:34.147222Z", + "shell.execute_reply": "2024-09-12T01:16:34.146804Z", + "shell.execute_reply.started": "2024-09-12T01:16:33.169508Z" + }, + "id": "b879a0b5-150c-4240-99ec-81075855aa52", + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "# Fixed function arguments used for each trial\n", + "transcripts_path = xenium_data_dir / 'transcripts.parquet'\n", + "\n", + "boundaries_path = xenium_data_dir / 'nucleus_boundaries.parquet'\n", + "\n", + "dataset_kwargs = dict(\n", + " x_size=80, y_size=80, d_x=80, d_y=80, margin_x=10, margin_y=10,\n", + " num_workers=4, sampling_rate=sampling_rate,\n", + ")\n", + "\n", + "model_kwargs = dict(\n", + " metadata=(['tx', 'bd'], [('tx', 'belongs', 'bd'), ('tx', 'neighbors', 'tx')]),\n", + " num_tx_tokens=500, init_emb=8, hidden_channels=32, out_channels=8,\n", + " heads=2, num_mid_layers=2, aggr='sum',\n", + ")\n", + "\n", + "trainer_kwargs = dict(\n", + " accelerator='cuda', strategy='auto', precision='16-mixed', devices=1,\n", + " max_epochs=100,\n", + ")\n", + "\n", + "predict_kwargs = dict(score_cut=0.2, use_cc=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fbd831c9-3a50-4e3b-97d3-3c152ae01188", + "metadata": { + "id": "fbd831c9-3a50-4e3b-97d3-3c152ae01188", + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "def trainable(config):\n", + "\n", + " receptive_field = {k: config[k] for k in ['k_bd', 'k_tx', 'dist_bd', 'dist_tx']}\n", + "\n", + " # Dataset creation\n", + " xs = XeniumSample(verbose=False)\n", + " xs.set_file_paths(transcripts_path, boundaries_path)\n", + " xs.set_metadata()\n", + " try:\n", + " xs.save_dataset_for_segger(\n", + " processed_dir=config['data_dir'],\n", + " receptive_field=receptive_field,\n", + " **dataset_kwargs,\n", + " )\n", + " except:\n", + " pass\n", + "\n", + " # Model training\n", + " ls = LitSegger(**model_kwargs)\n", + " dm = SeggerDataModule(\n", + " data_dir=config['data_dir'],\n", + " batch_size=2,\n", + " num_workers=dataset_kwargs['num_workers'],\n", + " )\n", + " trainer = Trainer(\n", + " default_root_dir=config['model_dir'],\n", + " logger=CSVLogger(config['model_dir']),\n", + " **trainer_kwargs,\n", + " )\n", + " trainer.fit(model=ls, datamodule=dm)\n", + "\n", + " segmentation = predict(\n", + " load_model(config['model_dir']/'lightning_logs/version_0/checkpoints'),\n", + " dm.train_dataloader(),\n", + " receptive_field=receptive_field,\n", + " **predict_kwargs,\n", + " )\n", + "\n", + " metrics = evaluate(segmentation)\n", + "\n", + "\n", + "def evaluate(segmentation: pd.DataFrame, score_cut: float) -> pd.Series:\n", + "\n", + " assigned = segmentation['score'] > score_cut\n", + " metrics = pd.Series(dtype=float)\n", + " metrics['frac_assigned'] = assigned.mean()\n", + " cell_sizes = segmentation.groupby(assigned)['segger_cell_id'].value_counts()\n", + " assigned_avg = 0 if True not in cell_sizes.index else cell_sizes[True].mean()\n", + " cc_avg = 0 if False not in cell_sizes.index else cell_sizes[False].mean()\n", + " metrics['cell_size_assigned'] = assigned_avg\n", + " metrics['cell_size_cc'] = cc_avg\n", + " return metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba2dcc9a-3a06-4b84-a487-59a768eed5d5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-09-12T01:16:35.184598Z", + "iopub.status.busy": "2024-09-12T01:16:35.184180Z", + "iopub.status.idle": "2024-09-12T01:19:55.171470Z", + "shell.execute_reply": "2024-09-12T01:19:55.170810Z", + "shell.execute_reply.started": "2024-09-12T01:16:35.184582Z" + }, + "id": "ba2dcc9a-3a06-4b84-a487-59a768eed5d5", + "scrolled": true + }, + "outputs": [], + "source": [ + "param_space = {\n", + " \"k_bd\": [3, 5, 10],\n", + " \"dist_bd\": [5, 10, 15, 20],\n", + " \"k_tx\": [3, 5, 10],\n", + " \"dist_tx\": [3, 5, 10],\n", + "}\n", + "\n", + "metrics = []\n", + "\n", + "for params in itertools.product(*param_space.values()):\n", + "\n", + " config = dict(zip(param_space.keys(), params))\n", + "\n", + " # Setup directories\n", + " trial_dir = tuning_dir / '_'.join([f'{k}={v}' for k, v in config.items()])\n", + "\n", + " data_dir = trial_dir / 'segger_data'\n", + " data_dir.mkdir(exist_ok=True, parents=True)\n", + " config['data_dir'] = data_dir\n", + "\n", + " model_dir = trial_dir / 'models'\n", + " model_dir.mkdir(exist_ok=True, parents=True)\n", + " config['model_dir'] = model_dir\n", + "\n", + " segmentation = trainable(config)\n", + " trial = evaluate(segmentation, predict_kwargs['score_cut'])\n", + " trial = pd.concat([pd.Series(config), trial])\n", + " metrics.append(trial)\n", + "\n", + "metrics = pd.DataFrame(metrics)" + ] + }, + { + "cell_type": "markdown", + "id": "dcfa5570-ada2-4102-aae0-a3830d304c5f", + "metadata": { + "id": "dcfa5570-ada2-4102-aae0-a3830d304c5f" + }, + "source": [ + "### Interpreting Output Metrics\n", + "\n", + "The key output metrics include:\n", + "- **`frac_assigned`**: The fraction of transcripts that were successfully assigned to a cell. A higher value indicates that the model is doing a good job associating transcripts with nuclei, which is a strong indicator of successful segmentation.\n", + "- **`cell_size_assigned`**: The average size of cells that have assigned transcripts. This helps assess how well the model is predicting cell boundaries, with unusually large or small values indicating potential issues with segmentation accuracy.\n", + "- **`cell_size_cc`**: The average size of connected components that were not assigned to a cell (i.e., nucleus-less regions). Large values here may suggest that transcripts are being incorrectly grouped together in the absence of a nucleus, which could indicate problems with the receptive field parameters or the segmentation process.\n", + "\n", + "These metrics illuminate the effectiveness of the model by highlighting both the success in associating transcripts with cells and potential areas where the model may need further tuning.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a89aed4-c53b-460f-8a6f-f690920b6829", + "metadata": { + "execution": { + "iopub.status.busy": "2024-09-12T01:19:55.171961Z", + "iopub.status.idle": "2024-09-12T01:19:55.172161Z", + "shell.execute_reply": "2024-09-12T01:19:55.172071Z", + "shell.execute_reply.started": "2024-09-12T01:19:55.172062Z" + }, + "id": "1a89aed4-c53b-460f-8a6f-f690920b6829" + }, + "outputs": [], + "source": [ + "metrics" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 5 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } From 7e6b4d8b0f26cba4c54b6139718aaabb7a784c70 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 00:19:03 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- README.md | 6 +- scripts/create_data_fast_sample.py | 74 +++++------- scripts/predict_model_sample.py | 6 +- scripts/sand.py | 142 +++++++++++------------ scripts/train_model_sample.py | 2 +- src/segger/data/Untitled-4.py | 34 +++--- src/segger/data/parquet/_utils.py | 1 + src/segger/prediction/predict_parquet.py | 6 +- 8 files changed, 121 insertions(+), 150 deletions(-) diff --git a/README.md b/README.md index 13d7f3c..4fb0e83 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,8 @@ [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/EliHei2/segger_dev/main.svg)](https://results.pre-commit.ci/latest/github/EliHei2/segger_dev/main) - - **Important note (Dec 2024)**: As segger is currently undergoing constant development we highly recommending installing segger directly via github. - **segger** is a cutting-edge tool for **cell segmentation** in **single-molecule spatial omics** datasets. By leveraging **graph neural networks (GNNs)** and heterogeneous graphs, segger offers unmatched accuracy and scalability. # How segger Works @@ -52,7 +49,7 @@ segger tackles these with a **graph-based approach**, achieving superior segment --- -## Installation +## Installation **Important note (Dec 2024)**: As segger is currently undergoing constant development we highly recommending installing segger directly via github. @@ -78,7 +75,6 @@ pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv - Afterwards choose the installation method that best suits your needs. - ### GitHub Installation For a straightforward local installation from GitHub, clone the repository and install the package using `pip`: diff --git a/scripts/create_data_fast_sample.py b/scripts/create_data_fast_sample.py index 54b8845..573dd1e 100644 --- a/scripts/create_data_fast_sample.py +++ b/scripts/create_data_fast_sample.py @@ -7,87 +7,77 @@ import numpy as np from segger.data.parquet._utils import get_polygons_from_xy -xenium_data_dir = Path('data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/') -segger_data_dir = Path('data_tidy/pyg_datasets/bc_rep1_emb') +xenium_data_dir = Path("data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/") +segger_data_dir = Path("data_tidy/pyg_datasets/bc_rep1_emb") -scrnaseq_file = Path('/omics/groups/OE0606/internal/tangy/tasks/schier/data/atals_filtered.h5ad') -celltype_column = 'celltype_major' -gene_celltype_abundance_embedding = calculate_gene_celltype_abundance_embedding( - sc.read(scrnaseq_file), - celltype_column -) +scrnaseq_file = Path("/omics/groups/OE0606/internal/tangy/tasks/schier/data/atals_filtered.h5ad") +celltype_column = "celltype_major" +gene_celltype_abundance_embedding = calculate_gene_celltype_abundance_embedding(sc.read(scrnaseq_file), celltype_column) sample = STSampleParquet( base_dir=xenium_data_dir, n_workers=4, - sample_type='xenium', - weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available + sample_type="xenium", + weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available ) -transcripts = pd.read_parquet( - xenium_data_dir / 'transcripts.parquet', - filters=[[('overlaps_nucleus', '=', 1)]] -) -boundaries = pd.read_parquet(xenium_data_dir / 'nucleus_boundaries.parquet') +transcripts = pd.read_parquet(xenium_data_dir / "transcripts.parquet", filters=[[("overlaps_nucleus", "=", 1)]]) +boundaries = pd.read_parquet(xenium_data_dir / "nucleus_boundaries.parquet") -sizes = transcripts.groupby('cell_id').size() -polygons = get_polygons_from_xy(boundaries, 'vertex_x', 'vertex_y', 'cell_id') +sizes = transcripts.groupby("cell_id").size() +polygons = get_polygons_from_xy(boundaries, "vertex_x", "vertex_y", "cell_id") densities = polygons[sizes.index].area / sizes bd_width = polygons.minimum_bounding_radius().median() * 2 # 1/4 median boundary diameter dist_tx = bd_width / 4 # 90th percentile density of bounding circle with radius=dist_tx -k_tx = math.ceil(np.quantile(dist_tx ** 2 * np.pi * densities, 0.9)) +k_tx = math.ceil(np.quantile(dist_tx**2 * np.pi * densities, 0.9)) print(k_tx) print(dist_tx) sample.save( - data_dir=segger_data_dir, - k_bd=3, - dist_bd=15.0, - k_tx=dist_tx, - dist_tx=k_tx, - tile_width=120, - tile_height=120, - neg_sampling_ratio=5.0, - frac=1.0, - val_prob=0.1, - test_prob=0.1, + data_dir=segger_data_dir, + k_bd=3, + dist_bd=15.0, + k_tx=dist_tx, + dist_tx=k_tx, + tile_width=120, + tile_height=120, + neg_sampling_ratio=5.0, + frac=1.0, + val_prob=0.1, + test_prob=0.1, ) -xenium_data_dir = Path('data_tidy/bc_5k') -segger_data_dir = Path('data_tidy/pyg_datasets/bc_5k_emb') - +xenium_data_dir = Path("data_tidy/bc_5k") +segger_data_dir = Path("data_tidy/pyg_datasets/bc_5k_emb") sample = STSampleParquet( base_dir=xenium_data_dir, n_workers=1, - sample_type='xenium', - weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available + sample_type="xenium", + weights=gene_celltype_abundance_embedding, # uncomment if gene-celltype embeddings are available ) -transcripts = pd.read_parquet( - xenium_data_dir / 'transcripts.parquet', - filters=[[('overlaps_nucleus', '=', 1)]] -) -boundaries = pd.read_parquet(xenium_data_dir / 'nucleus_boundaries.parquet') +transcripts = pd.read_parquet(xenium_data_dir / "transcripts.parquet", filters=[[("overlaps_nucleus", "=", 1)]]) +boundaries = pd.read_parquet(xenium_data_dir / "nucleus_boundaries.parquet") -sizes = transcripts.groupby('cell_id').size() -polygons = get_polygons_from_xy(boundaries, 'vertex_x', 'vertex_y', 'cell_id') +sizes = transcripts.groupby("cell_id").size() +polygons = get_polygons_from_xy(boundaries, "vertex_x", "vertex_y", "cell_id") densities = polygons[sizes.index].area / sizes bd_width = polygons.minimum_bounding_radius().median() * 2 # 1/4 median boundary diameter dist_tx = bd_width / 4 # 90th percentile density of bounding circle with radius=dist_tx -k_tx = math.ceil(np.quantile(dist_tx ** 2 * np.pi * densities, 0.9)) +k_tx = math.ceil(np.quantile(dist_tx**2 * np.pi * densities, 0.9)) print(k_tx) print(dist_tx) diff --git a/scripts/predict_model_sample.py b/scripts/predict_model_sample.py index 9624abc..c1bc9c0 100644 --- a/scripts/predict_model_sample.py +++ b/scripts/predict_model_sample.py @@ -16,12 +16,11 @@ import dask.dataframe as dd - seg_tag = "bc_fast_data_emb_major" model_version = 1 -segger_data_dir = Path('data_tidy/pyg_datasets') / seg_tag -models_dir = Path("./models") / seg_tag +segger_data_dir = Path("data_tidy/pyg_datasets") / seg_tag +models_dir = Path("./models") / seg_tag benchmarks_dir = Path("/dkfz/cluster/gpu/data/OE0606/elihei/segger_experiments/data_tidy/benchmarks/xe_rep1_bc") transcripts_file = "data_raw/xenium/Xenium_FFPE_Human_Breast_Cancer_Rep1/transcripts.parquet" # Initialize the Lightning data module @@ -58,4 +57,3 @@ gpu_ids=["0"], # client=client ) - diff --git a/scripts/sand.py b/scripts/sand.py index 447c5e6..ab480c0 100644 --- a/scripts/sand.py +++ b/scripts/sand.py @@ -32,7 +32,7 @@ def process_group(group, area_low, area_high): cell_boundary = generate_boundary(seg_cell) if isinstance(cell_boundary, MultiPolygon): # polygons = sorted(cell_boundary, key=lambda p: p.area, reverse=True) - # Extract the largest polygon (by area) from MultiPolygon + # Extract the largest polygon (by area) from MultiPolygon # cell_boundary = polygons[0] # cell_boundary = unary_union(cell_boundary) # polygons = sorted(cell_boundary, key=lambda p: p.area, reverse=True) @@ -72,7 +72,6 @@ def process_group(group, area_low, area_high): }, "seg_mask_value": uint_cell_id, } - def get_coordinates(boundary): @@ -86,8 +85,8 @@ def get_coordinates(boundary): elif isinstance(boundary, Polygon): # Return coordinates from a single Polygon return list(boundary.exterior.coords) - - + + def get_flatten_version(polygon_vertices, max_value=21): """ Flattens and standardizes the shape of polygon vertices to a fixed length. @@ -108,8 +107,11 @@ def get_flatten_version(polygon_vertices, max_value=21): flattened.append(vertices + [(0.0, 0.0)] * (max_value - len(vertices))) return np.array(flattened, dtype=np.float32) + from segger.validation.xenium_explorer import * from segger.prediction.boundary import * + + def seg2explorer( seg_df: pd.DataFrame, source_path: str, @@ -155,18 +157,13 @@ def seg2explorer( cell_id = [res["uint_cell_id"] for res in results] cell_summary = [res["cell_summary"] for res in results] # print('********************************1') - polygon_num_vertices = [ - len(res["cell_boundary"].exterior.coords) for res in results - ] + polygon_num_vertices = [len(res["cell_boundary"].exterior.coords) for res in results] print(polygon_num_vertices) # polygon_vertices = np.array( # [list(res["cell_boundary"].exterior.coords) for res in results], # dtype=object # ) - polygon_vertices = np.array( - [list(res["cell_boundary"].exterior.coords) for res in results], - dtype=object - ) + polygon_vertices = np.array([list(res["cell_boundary"].exterior.coords) for res in results], dtype=object) # polygon_vertices = get_flatten_version( # [get_coordinates(res["cell_boundary"]) for res in results], # max_value=21, @@ -182,7 +179,7 @@ def seg2explorer( "polygon_vertices": np.array(polygon_vertices).astype(np.float32), "seg_mask_value": np.array(seg_mask_value, dtype=np.int32), } - print(len(cells['cell_id'])) + print(len(cells["cell_id"])) # Save cells data existing_store = zarr.open(source_path / "cells.zarr.zip", mode="r") new_store = zarr.open(storage / f"{cells_filename}.zarr.zip", mode="w") @@ -194,7 +191,7 @@ def seg2explorer( new_store.attrs["number_cells"] = len(cells["cell_id"]) print(new_store) new_store.store.close() - + print(cells["polygon_vertices"]) # # Save analysis data if analysis_df is None: @@ -242,8 +239,6 @@ def seg2explorer( ) - - def seg2explorer( seg_df: pd.DataFrame, source_path: str, @@ -274,6 +269,7 @@ def seg2explorer( """ import zarr import json + source_path = Path(source_path) storage = Path(output_dir) cell_id2old_id = {} @@ -297,9 +293,9 @@ def seg2explorer( cell_convex_hull = get_boundary(seg_cell) # print(cell_convex_hull) if isinstance(cell_convex_hull, MultiPolygon): - # polygons = sorted(cell_boundary, key=lambda p: p.area, reverse=True) + # polygons = sorted(cell_boundary, key=lambda p: p.area, reverse=True) # Extract the largest polygon (by area) from MultiPolygon - # cell_boundary = polygons[0] + # cell_boundary = polygons[0] # cell_convex_hull = unary_union(cell_convex_hull) # print('****************1') # polygons = sorted(cell_convex_hull.geoms, key=lambda p: p.area, reverse=True) @@ -404,100 +400,96 @@ def seg2explorer( cells_name=cells_filename, analysis_name=analysis_filename, ) - - -ddf = dd.read_parquet('/dkfz/cluster/gpu/data/OE0606/elihei/segger_experiments/data_tidy/benchmarks/xe_rep1_bc/parquet_train_big_0.5_False_3_10_5_3_20241030/segger_transcripts.parquet').compute() +ddf = dd.read_parquet( + "/dkfz/cluster/gpu/data/OE0606/elihei/segger_experiments/data_tidy/benchmarks/xe_rep1_bc/parquet_train_big_0.5_False_3_10_5_3_20241030/segger_transcripts.parquet" +).compute() ddf = ddf.dropna() -ddf = ddf[ddf.segger_cell_id != 'None'] -ddf = ddf.sort_values('segger_cell_id') +ddf = ddf[ddf.segger_cell_id != "None"] +ddf = ddf.sort_values("segger_cell_id") df = ddf.iloc[:10000, :] - -df_path = Path('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep1_v9_segger.csv.gz') +df_path = Path("data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep1_v9_segger.csv.gz") df_v9 = dd.read_csv(df_path) -df_main = dd.read_parquet('data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/transcripts.parquet') +df_main = dd.read_parquet("data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/transcripts.parquet") -ddf = df_v9.merge(df_main, on='transcript_id') +ddf = df_v9.merge(df_main, on="transcript_id") ddf = ddf.compute() -ddf = ddf[ddf.segger_cell_id != 'None'] -ddf = ddf.sort_values('segger_cell_id') -df = ddf.loc[(ddf.x_location > 250) & (ddf.x_location < 1500) & (ddf.y_location > 500) & (ddf.y_location < 1500),:] +ddf = ddf[ddf.segger_cell_id != "None"] +ddf = ddf.sort_values("segger_cell_id") +df = ddf.loc[(ddf.x_location > 250) & (ddf.x_location < 1500) & (ddf.y_location > 500) & (ddf.y_location < 1500), :] # tx_df = dd.read_csv('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz') # ddf = tx_df.merge(df_main, on='transcript_id') seg2explorer( - seg_df = df, - source_path = 'data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs', - output_dir = 'data_tidy/explorer/rep1sis', - cells_filename = "segger_cells_seg_roi1", - analysis_filename = "segger_analysis_seg_roi1", - xenium_filename = "segger_experiment_seg_roi1.xenium", - analysis_df = None, - cell_id_columns = "segger_cell_id", - area_low = 10, - area_high= 1000, + seg_df=df, + source_path="data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs", + output_dir="data_tidy/explorer/rep1sis", + cells_filename="segger_cells_seg_roi1", + analysis_filename="segger_analysis_seg_roi1", + xenium_filename="segger_experiment_seg_roi1.xenium", + analysis_df=None, + cell_id_columns="segger_cell_id", + area_low=10, + area_high=1000, ) - -df = ddf.loc[(ddf.x_location > 1550) & (ddf.x_location < 3250) & (ddf.y_location > 2250) & (ddf.y_location < 3550),:] +df = ddf.loc[(ddf.x_location > 1550) & (ddf.x_location < 3250) & (ddf.y_location > 2250) & (ddf.y_location < 3550), :] # tx_df = dd.read_csv('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz') # ddf = tx_df.merge(df_main, on='transcript_id') seg2explorer( - seg_df = df, - source_path = 'data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs', - output_dir = 'data_tidy/explorer/rep1sis', - cells_filename = "segger_cells_seg_roi2", - analysis_filename = "segger_analysis_seg_roi2", - xenium_filename = "segger_experiment_seg_roi2.xenium", - analysis_df = None, - cell_id_columns = "segger_cell_id", - area_low = 10, - area_high= 1000, + seg_df=df, + source_path="data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs", + output_dir="data_tidy/explorer/rep1sis", + cells_filename="segger_cells_seg_roi2", + analysis_filename="segger_analysis_seg_roi2", + xenium_filename="segger_experiment_seg_roi2.xenium", + analysis_df=None, + cell_id_columns="segger_cell_id", + area_low=10, + area_high=1000, ) - -df = ddf.loc[(ddf.x_location > 4000) & (ddf.x_location < 4500) & (ddf.y_location > 1000) & (ddf.y_location < 1500),:] +df = ddf.loc[(ddf.x_location > 4000) & (ddf.x_location < 4500) & (ddf.y_location > 1000) & (ddf.y_location < 1500), :] # tx_df = dd.read_csv('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz') # ddf = tx_df.merge(df_main, on='transcript_id') seg2explorer( - seg_df = df, - source_path = 'data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs', - output_dir = 'data_tidy/explorer/rep1sis', - cells_filename = "segger_cells_seg_roi3", - analysis_filename = "segger_analysis_seg_roi3", - xenium_filename = "segger_experiment_seg_roi3.xenium", - analysis_df = None, - cell_id_columns = "segger_cell_id", - area_low = 10, - area_high= 1000, + seg_df=df, + source_path="data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs", + output_dir="data_tidy/explorer/rep1sis", + cells_filename="segger_cells_seg_roi3", + analysis_filename="segger_analysis_seg_roi3", + xenium_filename="segger_experiment_seg_roi3.xenium", + analysis_df=None, + cell_id_columns="segger_cell_id", + area_low=10, + area_high=1000, ) -df = ddf.loc[(ddf.x_location > 1550) & (ddf.x_location < 3250) & (ddf.y_location > 2250) & (ddf.y_location < 3550),:] +df = ddf.loc[(ddf.x_location > 1550) & (ddf.x_location < 3250) & (ddf.y_location > 2250) & (ddf.y_location < 3550), :] # tx_df = dd.read_csv('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz') # ddf = tx_df.merge(df_main, on='transcript_id') seg2explorer( - seg_df = df, - source_path = 'data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs', - output_dir = 'data_tidy/explorer/rep1sis', - cells_filename = "segger_cells_seg_roi2", - analysis_filename = "segger_analysis_seg_roi2", - xenium_filename = "segger_experiment_seg_roi2.xenium", - analysis_df = None, - cell_id_columns = "segger_cell_id", - area_low = 10, - area_high= 1000, + seg_df=df, + source_path="data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs", + output_dir="data_tidy/explorer/rep1sis", + cells_filename="segger_cells_seg_roi2", + analysis_filename="segger_analysis_seg_roi2", + xenium_filename="segger_experiment_seg_roi2.xenium", + analysis_df=None, + cell_id_columns="segger_cell_id", + area_low=10, + area_high=1000, ) - diff --git a/scripts/train_model_sample.py b/scripts/train_model_sample.py index 411cee8..826989f 100644 --- a/scripts/train_model_sample.py +++ b/scripts/train_model_sample.py @@ -15,7 +15,7 @@ import os -segger_data_dir = segger_data_dir = Path('data_tidy/pyg_datasets/bc_fast_data_emb_minor') +segger_data_dir = segger_data_dir = Path("data_tidy/pyg_datasets/bc_fast_data_emb_minor") models_dir = Path("./models/bc_fast_data_emb_minor") dm = SeggerDataModule( diff --git a/src/segger/data/Untitled-4.py b/src/segger/data/Untitled-4.py index 51b3034..dea3858 100644 --- a/src/segger/data/Untitled-4.py +++ b/src/segger/data/Untitled-4.py @@ -1,38 +1,34 @@ -df_path = Path('/omics/groups/OE0606/internal/gleb/xenium/elyas/rep1/baysor_rep1.csv') +df_path = Path("/omics/groups/OE0606/internal/gleb/xenium/elyas/rep1/baysor_rep1.csv") df = dd.read_csv(df_path) -res = compute_cells_per_nucleus(df, new_cell_col='baysor_cell_id') +res = compute_cells_per_nucleus(df, new_cell_col="baysor_cell_id") plot_gradient_nuclei_histogram(res, figures_path) - - - -df_path = Path('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep1_v9_segger.csv.gz') +df_path = Path("data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep1_v9_segger.csv.gz") df_v9 = dd.read_csv(df_path) -df_main = dd.read_parquet('data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/transcripts.parquet') +df_main = dd.read_parquet("data_raw/breast_cancer/Xenium_FFPE_Human_Breast_Cancer_Rep1/outs/transcripts.parquet") -ddf = df_v9.merge(df_main, on='transcript_id') +ddf = df_v9.merge(df_main, on="transcript_id") # df = dd.read_parquet(segger_emb_path/'segger_transcripts.parquet') ddf1 = ddf.compute() -res = compute_cells_per_nucleus(df.compute(), new_cell_col='segger_cell_id') -plot_gradient_nuclei_histogram(res, figures_path, 'segger') +res = compute_cells_per_nucleus(df.compute(), new_cell_col="segger_cell_id") +plot_gradient_nuclei_histogram(res, figures_path, "segger") dfff = df.compute() dfff = dfff.dropna() gene_dropout = calculate_gene_dropout_rate(dfff) -plot_z_distance_distribution(dfff, figures_path, title='Z-Distance Distribution') +plot_z_distance_distribution(dfff, figures_path, title="Z-Distance Distribution") -plot_z_distance_boxplot(dfff, figures_path, title='Z-Distance Distribution') +plot_z_distance_boxplot(dfff, figures_path, title="Z-Distance Distribution") -tx_df = dd.read_csv('data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz') -ddf = tx_df.merge(df_main, on='transcript_id') - +tx_df = dd.read_csv("data_tidy/Xenium_FFPE_Human_Breast_Cancer_Rep2_v9_segger.csv.gz") +ddf = tx_df.merge(df_main, on="transcript_id") from segger.prediction.boundary import generate_boundary @@ -44,14 +40,12 @@ from pqdm.processes import pqdm # or use pqdm.threads for threading-based parallelism + # Modify the function to work with a single group to use with pqdm def process_group(group): cell_id, t = group - return { - "cell_id": cell_id, - "length": len(t), - "geom": generate_boundary(t, x="x_location", y="y_location") - } + return {"cell_id": cell_id, "length": len(t), "geom": generate_boundary(t, x="x_location", y="y_location")} + def generate_boundaries(df, x="x_location", y="y_location", cell_id="segger_cell_id", n_jobs=10): # Group by cell_id diff --git a/src/segger/data/parquet/_utils.py b/src/segger/data/parquet/_utils.py index 9010443..92791a8 100644 --- a/src/segger/data/parquet/_utils.py +++ b/src/segger/data/parquet/_utils.py @@ -55,6 +55,7 @@ def get_xy_extents( # If statistics are not available, compute them manually from the data except: import gc + print("metadata lacks the statistics of the tile's bounding box, computing might take longer!") parquet_file = pd.read_parquet(filepath) x_col = parquet_file.loc[:, x] diff --git a/src/segger/prediction/predict_parquet.py b/src/segger/prediction/predict_parquet.py index e4d499b..43dacf2 100644 --- a/src/segger/prediction/predict_parquet.py +++ b/src/segger/prediction/predict_parquet.py @@ -221,7 +221,7 @@ def get_similarity_scores( coords_1 = coords_2 = batch[to_type].pos else: coords_1 = batch[to_type].pos[:, :2] # 'tx' positions - coords_2 = batch[from_type].pos[:, :2] + coords_2 = batch[from_type].pos[:, :2] if knn_method == "kd_tree": # Compute edge indices using knn method (still on GPU) edge_index = get_edge_index( @@ -244,9 +244,9 @@ def get_similarity_scores( edge_index = coo_to_dense_adj(edge_index.T, num_nodes=shape[0], num_nbrs=receptive_field[f"k_{to_type}"]) with torch.no_grad(): - if from_type != to_type: + if from_type != to_type: embeddings = model(batch.x_dict, batch.edge_index_dict) - else: # to go with the inital embeddings for tx-tx + else: # to go with the inital embeddings for tx-tx embeddings = {key: model.node_init[key](x) for key, x in batch.x_dict.items()} norms = embeddings[to_type].norm(dim=1, keepdim=True) # Avoid division by zero in case there are zero vectors