diff --git a/notebooks/run_cellpose3.ipynb b/notebooks/run_cellpose3.ipynb new file mode 100644 index 00000000..49430160 --- /dev/null +++ b/notebooks/run_cellpose3.ipynb @@ -0,0 +1,316 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Nc9k-7j1-CUF" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Install and run cellpose3 for denoising and segmentation\n", + "## ⚠️ **Warning:** this notebook will install cellpose3 which is not forwards compatible with cellpose4 (CPSAM). Be careful with your environments and the `pip` command below. ⚠️\n", + "\n", + "## The dedicated denoising components were removed from cellpose4 by training on noisy images, and cellpose4 only has a segmentation network. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U_WCmrG5-CUL" + }, + "source": [ + "# Running cellpose3 in colab with a GPU\n", + "\n", + "Cellpose3 now allows you to restore and segment noisy/blurry/low res images!\n", + "\n", + "For more details on Cellpose3 check out the [paper](https://www.biorxiv.org/content/10.1101/2024.02.10.579780v1).\n", + "\n", + "Mount your google drive to access all your image files. This also ensures that the segmentations are saved to your google drive." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HrakTaa9-CUQ" + }, + "source": [ + "## Installation\n", + "\n", + "Install cellpose -- by default the torch GPU version is installed in COLAB notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "efSQoWFw-CUU", + "outputId": "472a7900-7821-4bc6-d3b3-00a463476721" + }, + "outputs": [], + "source": [ + "!pip install \"opencv-python-headless>=4.9.0.80\"\n", + "!pip install cellpose==3.1.1.2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j7uUatzC-CUY" + }, + "source": [ + "Check CUDA version and that GPU is working in cellpose and import other libraries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a8muq8KG-CUa", + "outputId": "75fabdc8-a976-476d-9f79-d9fc6213eccb" + }, + "outputs": [], + "source": [ + "!nvcc --version\n", + "!nvidia-smi\n", + "\n", + "import os, shutil\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from cellpose import core, utils, io, models, metrics\n", + "from glob import glob\n", + "\n", + "use_GPU = core.use_gpu()\n", + "yn = ['NO', 'YES']\n", + "print(f'>>> GPU activated? {yn[use_GPU]}')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SzD7QlBP-CUd" + }, + "source": [ + "## Images\n", + "\n", + "Load in your own data or use ours (below)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 568 + }, + "id": "PYevQVQd-CUe", + "outputId": "895a5ed4-b2cc-482d-d741-32218eee76bc" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import time, os, sys\n", + "from urllib.parse import urlparse\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib as mpl\n", + "%matplotlib inline\n", + "mpl.rcParams['figure.dpi'] = 200\n", + "from cellpose import utils, io\n", + "\n", + "# download noisy images from website\n", + "url = \"http://www.cellpose.org/static/data/test_poisson.npz\"\n", + "filename = \"test_poisson.npz\"\n", + "utils.download_url_to_file(url, filename)\n", + "dat = np.load(filename, allow_pickle=True)[\"arr_0\"].item()\n", + "\n", + "imgs = dat[\"test_noisy\"]\n", + "plt.figure(figsize=(8,3))\n", + "for i, iex in enumerate([2, 18, 20]):\n", + " img = imgs[iex].squeeze()\n", + " plt.subplot(1,3,1+i)\n", + " plt.imshow(img, cmap=\"gray\", vmin=0, vmax=1)\n", + " plt.axis('off')\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g1dO0Oia-CUk" + }, + "source": [ + "Mount your google drive here if you want to load your own images:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "1qyAEK7R-CUp" + }, + "outputs": [], + "source": [ + "\n", + "#@markdown ###Run this cell to connect your Google Drive to Colab\n", + "\n", + "#@markdown * Click on the URL.\n", + "\n", + "#@markdown * Sign in your Google Account.\n", + "\n", + "#@markdown * Copy the authorization code.\n", + "\n", + "#@markdown * Enter the authorization code.\n", + "\n", + "#@markdown * Click on \"Files\" site on the right. Refresh the site. Your Google Drive folder should now be available here as \"drive\".\n", + "\n", + "#mounts user's Google Drive to Google Colab.\n", + "\n", + "from google.colab import drive\n", + "drive.mount('/content/gdrive')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-KYaPm0H-CUs" + }, + "source": [ + "## run denoising and segmentation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wm6YEVJN-CUu", + "outputId": "f9c222c8-013d-4cbe-ba07-aa0172f8532f" + }, + "outputs": [], + "source": [ + "# RUN CELLPOSE3\n", + "\n", + "from cellpose import denoise, io\n", + "\n", + "io.logger_setup() # run this to get printing of progress\n", + "\n", + "# DEFINE CELLPOSE MODEL\n", + "# model_type=\"cyto3\" or \"nuclei\", or other model\n", + "# restore_type: \"denoise_cyto3\", \"deblur_cyto3\", \"upsample_cyto3\", \"denoise_nuclei\", \"deblur_nuclei\", \"upsample_nuclei\"\n", + "model = denoise.CellposeDenoiseModel(gpu=True, model_type=\"cyto3\",\n", + " restore_type=\"denoise_cyto3\")\n", + "\n", + "# define CHANNELS to run segementation on\n", + "# grayscale=0, R=1, G=2, B=3\n", + "# channels = [cytoplasm, nucleus]\n", + "# if NUCLEUS channel does not exist, set the second channel to 0\n", + "# channels = [0,0]\n", + "# IF ALL YOUR IMAGES ARE THE SAME TYPE, you can give a list with 2 elements\n", + "# channels = [0,0] # IF YOU HAVE GRAYSCALE\n", + "# channels = [2,3] # IF YOU HAVE G=cytoplasm and B=nucleus\n", + "# channels = [2,1] # IF YOU HAVE G=cytoplasm and R=nucleus\n", + "# OR if you have different types of channels in each image\n", + "# channels = [[2,3], [0,0], [0,0]]\n", + "\n", + "# if you have a nuclear channel, you can use the nuclei restore model on the nuclear channel with\n", + "# model = denoise.CellposeDenoiseModel(..., chan2_restore=True)\n", + "\n", + "# NEED TO SPECIFY DIAMETER OF OBJECTS\n", + "# in this case we have them from the ground-truth masks\n", + "diams = dat[\"diam_test\"]\n", + "\n", + "masks, flows, styles, imgs_dn = model.eval(imgs, diameter=diams, channels=[0,0])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tH33nBAE-CUy" + }, + "source": [ + "plot results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "8bAJc0qt-CU0", + "outputId": "906b3476-c272-4cd8-a9cb-a1f46eacce5c" + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(8,12))\n", + "for i, iex in enumerate([2, 18, 20]):\n", + " img = imgs[iex].squeeze()\n", + " plt.subplot(3,3,1+i)\n", + " plt.imshow(img, cmap=\"gray\", vmin=0, vmax=1)\n", + " plt.axis('off')\n", + " plt.title(\"noisy\")\n", + "\n", + " img_dn = imgs_dn[iex].squeeze()\n", + " plt.subplot(3,3,4+i)\n", + " plt.imshow(img_dn, cmap=\"gray\", vmin=0, vmax=1)\n", + " plt.axis('off')\n", + " plt.title(\"denoised\")\n", + "\n", + " plt.subplot(3,3,7+i)\n", + " plt.imshow(img_dn, cmap=\"gray\", vmin=0, vmax=1)\n", + " outlines = utils.outlines_list(masks[iex])\n", + " for o in outlines:\n", + " plt.plot(o[:,0], o[:,1], color=[1,1,0])\n", + " plt.axis('off')\n", + " plt.title(\"segmentation\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "cp4", + "language": "python", + "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.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}