(thanks to Matteo Carandini for setting this up)
UPDATED DEC 2020 for TORCH VERSION cellpose v0.6
UPDATED NOV 2021 for cellpose / omnipose v0.7
Install cellpose -- by default the torch GPU version is installed in COLAB notebook.
Note that cellpose uses the latest version of numpy, so please click the "Restart runtime" button once the install completes.
!pip install "opencv-python-headless<4.3"
!pip install cellpose
Collecting opencv-python-headless<4.3
Downloading opencv_python_headless-4.2.0.34-cp37-cp37m-manylinux1_x86_64.whl (21.6 MB)
|████████████████████████████████| 21.6 MB 12.0 MB/s
Requirement already satisfied: numpy>=1.14.5 in /usr/local/lib/python3.7/dist-packages (from opencv-python-headless<4.3) (1.19.5)
Installing collected packages: opencv-python-headless
Successfully installed opencv-python-headless-4.2.0.34
Collecting cellpose
Downloading cellpose-1.0.0-py3-none-any.whl (174 kB)
|████████████████████████████████| 174 kB 5.3 MB/s
Requirement already satisfied: tifffile in /usr/local/lib/python3.7/dist-packages (from cellpose) (2021.11.2)
Requirement already satisfied: torch>=1.6 in /usr/local/lib/python3.7/dist-packages (from cellpose) (1.10.0+cu111)
Requirement already satisfied: natsort in /usr/local/lib/python3.7/dist-packages (from cellpose) (5.5.0)
Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from cellpose) (1.4.1)
Requirement already satisfied: numba in /usr/local/lib/python3.7/dist-packages (from cellpose) (0.51.2)
Requirement already satisfied: opencv-python-headless in /usr/local/lib/python3.7/dist-packages (from cellpose) (4.2.0.34)
Collecting fastremap
Downloading fastremap-1.12.2-cp37-cp37m-manylinux2010_x86_64.whl (3.4 MB)
|████████████████████████████████| 3.4 MB 42.9 MB/s
Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages (from cellpose) (4.62.3)
Collecting numpy>=1.20.0
Downloading numpy-1.21.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.7 MB)
|████████████████████████████████| 15.7 MB 272 kB/s
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch>=1.6->cellpose) (3.10.0.2)
Requirement already satisfied: llvmlite<0.35,>=0.34.0.dev0 in /usr/local/lib/python3.7/dist-packages (from numba->cellpose) (0.34.0)
Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from numba->cellpose) (57.4.0)
Installing collected packages: numpy, fastremap, cellpose
Attempting uninstall: numpy
Found existing installation: numpy 1.19.5
Uninstalling numpy-1.19.5:
Successfully uninstalled numpy-1.19.5
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
yellowbrick 1.3.post1 requires numpy<1.20,>=1.16.0, but you have numpy 1.21.5 which is incompatible.
datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.
albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.
Successfully installed cellpose-1.0.0 fastremap-1.12.2 numpy-1.21.5
Check CUDA version and GPU
!nvcc --version
!nvidia-smi
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2020 NVIDIA Corporation Built on Mon_Oct_12_20:09:46_PDT_2020 Cuda compilation tools, release 11.1, V11.1.105 Build cuda_11.1.TC455_06.29190527_0 Tue Jan 25 20:23:39 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 495.46 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 | | N/A 32C P8 28W / 149W | 0MiB / 11441MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
import libraries and check GPU (the first time you import cellpose the models will download).
import numpy as np
import time, os, sys
from urllib.parse import urlparse
import skimage.io
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
mpl.rcParams['figure.dpi'] = 300
from urllib.parse import urlparse
from cellpose import models, core
use_GPU = core.use_gpu()
print('>>> GPU activated? %d'%use_GPU)
# call logger_setup to have output of cellpose written
from cellpose.io import logger_setup
logger_setup();
>>> GPU activated? 1 creating new log file 2022-01-25 20:24:09,570 [INFO] WRITING LOG OUTPUT TO /root/.cellpose/run.log
Download sample images
from cellpose import utils
# I will download images from website
urls = ['http://www.cellpose.org/static/images/img02.png',
'http://www.cellpose.org/static/images/img03.png',
'http://www.cellpose.org/static/images/img05.png',
'http://www.cellpose.org/static/data/rgb_3D.tif']
files = []
for url in urls:
parts = urlparse(url)
filename = os.path.basename(parts.path)
if not os.path.exists(filename):
sys.stderr.write('Downloading: "{}" to {}\n'.format(url, filename))
utils.download_url_to_file(url, filename)
files.append(filename)
# REPLACE FILES WITH YOUR IMAGE PATHS
# files = ['img0.tif', 'img1.tif']
imgs = [skimage.io.imread(f) for f in files]
nimg = len(imgs)
plt.figure(figsize=(8,4))
for k,img in enumerate(imgs[:-1]):
plt.subplot(1,3,k+1)
plt.imshow(img)
Downloading: "http://www.cellpose.org/static/images/img02.png" to img02.png 100%|██████████| 131k/131k [00:00<00:00, 1.89MB/s] Downloading: "http://www.cellpose.org/static/images/img03.png" to img03.png 100%|██████████| 135k/135k [00:00<00:00, 1.77MB/s] Downloading: "http://www.cellpose.org/static/images/img05.png" to img05.png 100%|██████████| 180k/180k [00:00<00:00, 2.25MB/s] Downloading: "http://www.cellpose.org/static/data/rgb_3D.tif" to rgb_3D.tif 100%|██████████| 1.63M/1.63M [00:00<00:00, 8.62MB/s]
(exclude last download, it's a 3D tiff)
# RUN CELLPOSE
imgs_2D = imgs[:-1]
from cellpose import models
# DEFINE CELLPOSE MODEL
# model_type='cyto' or model_type='nuclei'
model = models.Cellpose(gpu=use_GPU, model_type='cyto')
# define CHANNELS to run segementation on
# grayscale=0, R=1, G=2, B=3
# channels = [cytoplasm, nucleus]
# if NUCLEUS channel does not exist, set the second channel to 0
# channels = [0,0]
# IF ALL YOUR IMAGES ARE THE SAME TYPE, you can give a list with 2 elements
# channels = [0,0] # IF YOU HAVE GRAYSCALE
# channels = [2,3] # IF YOU HAVE G=cytoplasm and B=nucleus
# channels = [2,1] # IF YOU HAVE G=cytoplasm and R=nucleus
# or if you have different types of channels in each image
channels = [[2,3], [0,0], [0,0]]
# channels = [1,1]
# if diameter is set to None, the size of the cells is estimated on a per image basis
# you can set the average cell `diameter` in pixels yourself (recommended)
# diameter can be a list or a single number for all images
masks, flows, styles, diams = model.eval(imgs_2D, diameter=None, flow_threshold=None, channels=channels)
2022-01-25 20:24:11,604 [INFO] ** TORCH CUDA version installed and working. ** 2022-01-25 20:24:11,606 [INFO] >>>> using GPU 2022-01-25 20:24:11,609 [INFO] Downloading: "https://www.cellpose.org/models/cytotorch_0" to /root/.cellpose/models/cytotorch_0
100%|██████████| 25.3M/25.3M [00:00<00:00, 63.4MB/s]
2022-01-25 20:24:12,153 [INFO] Downloading: "https://www.cellpose.org/models/cytotorch_1" to /root/.cellpose/models/cytotorch_1
100%|██████████| 25.3M/25.3M [00:00<00:00, 58.8MB/s]
2022-01-25 20:24:12,731 [INFO] Downloading: "https://www.cellpose.org/models/cytotorch_2" to /root/.cellpose/models/cytotorch_2
100%|██████████| 25.3M/25.3M [00:00<00:00, 56.2MB/s]
2022-01-25 20:24:13,329 [INFO] Downloading: "https://www.cellpose.org/models/cytotorch_3" to /root/.cellpose/models/cytotorch_3
100%|██████████| 25.3M/25.3M [00:00<00:00, 55.7MB/s]
2022-01-25 20:24:14,118 [INFO] Downloading: "https://www.cellpose.org/models/size_cytotorch_0.npy" to /root/.cellpose/models/size_cytotorch_0.npy
100%|██████████| 5.23k/5.23k [00:00<00:00, 5.32MB/s]
2022-01-25 20:24:14,273 [INFO] ~~~ ESTIMATING CELL DIAMETER(S) ~~~ 2022-01-25 20:24:14,277 [INFO] 0%| | 0/3 [00:00<?, ?it/s]
2022-01-25 20:24:16,101 [INFO] 33%|###3 | 1/3 [00:01<00:03, 1.82s/it] 2022-01-25 20:24:17,211 [INFO] 67%|######6 | 2/3 [00:02<00:01, 1.40s/it] 2022-01-25 20:24:20,263 [INFO] 100%|##########| 3/3 [00:05<00:00, 2.16s/it] 2022-01-25 20:24:20,265 [INFO] 100%|##########| 3/3 [00:05<00:00, 2.00s/it] 2022-01-25 20:24:20,268 [INFO] estimated cell diameter(s) in 6.00 sec 2022-01-25 20:24:20,274 [INFO] >>> diameter(s) = 2022-01-25 20:24:20,278 [INFO] [29.38, 33.30, 30.58, ] 2022-01-25 20:24:20,281 [INFO] ~~~ FINDING MASKS ~~~ 2022-01-25 20:24:20,284 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:22,036 [INFO] 33%|###3 | 1/3 [00:01<00:03, 1.75s/it] 2022-01-25 20:24:23,368 [INFO] 67%|######6 | 2/3 [00:03<00:01, 1.50s/it] 2022-01-25 20:24:26,153 [INFO] 100%|##########| 3/3 [00:05<00:00, 2.09s/it] 2022-01-25 20:24:26,155 [INFO] 100%|##########| 3/3 [00:05<00:00, 1.96s/it] 2022-01-25 20:24:26,161 [INFO] >>>> TOTAL TIME 11.89 sec
# DISPLAY RESULTS
from cellpose import plot
nimg = len(imgs_2D)
for idx in range(nimg):
maski = masks[idx]
flowi = flows[idx][0]
fig = plt.figure(figsize=(12,5))
plot.show_segmentation(fig, imgs[idx], maski, flowi, channels=channels[idx])
plt.tight_layout()
plt.show()
you will see the files save in the Files tab and you can download them from there
from cellpose import io
io.masks_flows_to_seg(imgs_2D, masks, flows, diams, files, channels)
There are two ways to run cellpose in 3D, this cell shows both, choose which one works best for you.
First way: computes flows from 2D slices and combines into 3D flows to create masks
# test 3D stack
img_3D = imgs[-1]
# * with 3D you have to set the diameter manually (no auto detect) *
### TWO WAYS TO RUN CELLPOSE IN 3D
# 1. computes flows from 2D slices and combines into 3D flows to create masks
print('running cellpose 2D slice flows => masks')
masks, flows, styles, _ = model.eval(img_3D, channels=[2,1], diameter=25, do_3D=True)
running cellpose 2D slice flows => masks 2022-01-25 20:24:32,906 [INFO] ~~~ FINDING MASKS ~~~ 2022-01-25 20:24:32,908 [INFO] multi-stack tiff read in as having 75 planes 2 channels 2022-01-25 20:24:32,967 [INFO] running YX: 75 planes of size (75, 75) 2022-01-25 20:24:33,109 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:33,423 [INFO] 33%|###3 | 1/3 [00:00<00:00, 3.22it/s] 2022-01-25 20:24:33,686 [INFO] 67%|######6 | 2/3 [00:00<00:00, 3.54it/s] 2022-01-25 20:24:33,901 [INFO] 100%|##########| 3/3 [00:00<00:00, 3.97it/s] 2022-01-25 20:24:33,905 [INFO] 100%|##########| 3/3 [00:00<00:00, 3.78it/s] 2022-01-25 20:24:34,014 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:34,237 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.52it/s] 2022-01-25 20:24:34,449 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.63it/s] 2022-01-25 20:24:34,651 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.77it/s] 2022-01-25 20:24:34,653 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.70it/s] 2022-01-25 20:24:34,759 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:34,982 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.52it/s] 2022-01-25 20:24:35,196 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.61it/s] 2022-01-25 20:24:35,390 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.84it/s] 2022-01-25 20:24:35,393 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.74it/s] 2022-01-25 20:24:35,517 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:35,728 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.78it/s] 2022-01-25 20:24:35,940 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.75it/s] 2022-01-25 20:24:36,134 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.93it/s] 2022-01-25 20:24:36,136 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.87it/s] 2022-01-25 20:24:36,168 [INFO] running ZY: 75 planes of size (75, 75) 2022-01-25 20:24:36,268 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:36,477 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.84it/s] 2022-01-25 20:24:36,689 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.76it/s] 2022-01-25 20:24:36,883 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.93it/s] 2022-01-25 20:24:36,886 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.87it/s] 2022-01-25 20:24:36,995 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:37,206 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.79it/s] 2022-01-25 20:24:37,416 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.76it/s] 2022-01-25 20:24:37,612 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.92it/s] 2022-01-25 20:24:37,614 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.86it/s] 2022-01-25 20:24:37,723 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:37,939 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.66it/s] 2022-01-25 20:24:38,156 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.63it/s] 2022-01-25 20:24:38,352 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.83it/s] 2022-01-25 20:24:38,354 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.76it/s] 2022-01-25 20:24:38,470 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:38,683 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.74it/s] 2022-01-25 20:24:38,893 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.75it/s] 2022-01-25 20:24:39,087 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.93it/s] 2022-01-25 20:24:39,089 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.86it/s] 2022-01-25 20:24:39,121 [INFO] running ZX: 75 planes of size (75, 75) 2022-01-25 20:24:39,219 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:39,429 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.82it/s] 2022-01-25 20:24:39,641 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.76it/s] 2022-01-25 20:24:39,835 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.92it/s] 2022-01-25 20:24:39,837 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.87it/s] 2022-01-25 20:24:39,941 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:40,154 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.75it/s] 2022-01-25 20:24:40,365 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.74it/s] 2022-01-25 20:24:40,561 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.90it/s] 2022-01-25 20:24:40,563 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.84it/s] 2022-01-25 20:24:40,682 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:40,893 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.77it/s] 2022-01-25 20:24:41,104 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.75it/s] 2022-01-25 20:24:41,302 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.88it/s] 2022-01-25 20:24:41,305 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.82it/s] 2022-01-25 20:24:41,410 [INFO] 0%| | 0/3 [00:00<?, ?it/s] 2022-01-25 20:24:41,621 [INFO] 33%|###3 | 1/3 [00:00<00:00, 4.79it/s] 2022-01-25 20:24:41,835 [INFO] 67%|######6 | 2/3 [00:00<00:00, 4.72it/s] 2022-01-25 20:24:42,030 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.90it/s] 2022-01-25 20:24:42,032 [INFO] 100%|##########| 3/3 [00:00<00:00, 4.84it/s] 2022-01-25 20:24:42,060 [INFO] network run in 9.15s 2022-01-25 20:24:42,658 [INFO] masks created in 0.59s 2022-01-25 20:24:42,700 [INFO] >>>> TOTAL TIME 9.79 sec
Second way: computes masks in 2D slices and stitches masks in 3D based on mask overlap
Note stitching (with stitch_threshold > 0) can also be used to track cells over time.
# 2. computes masks in 2D slices and stitches masks in 3D based on mask overlap
print('running cellpose 2D + stitching masks')
masks_stitched, flows_stitched, styles_stitched, _ = model.eval(img_3D, channels=[2,1], diameter=25, do_3D=False, stitch_threshold=0.5)
running cellpose 2D + stitching masks 2022-01-25 20:24:42,715 [INFO] ~~~ FINDING MASKS ~~~ 2022-01-25 20:24:42,717 [INFO] multi-stack tiff read in as having 75 planes 2 channels 2022-01-25 20:24:42,722 [INFO] 0%| | 0/75 [00:00<?, ?it/s] 2022-01-25 20:24:43,204 [INFO] 1%|1 | 1/75 [00:00<00:35, 2.09it/s] 2022-01-25 20:24:43,650 [INFO] 3%|2 | 2/75 [00:00<00:33, 2.17it/s] 2022-01-25 20:24:44,118 [INFO] 4%|4 | 3/75 [00:01<00:33, 2.16it/s] 2022-01-25 20:24:44,545 [INFO] 5%|5 | 4/75 [00:01<00:31, 2.23it/s] 2022-01-25 20:24:45,001 [INFO] 7%|6 | 5/75 [00:02<00:31, 2.21it/s] 2022-01-25 20:24:45,474 [INFO] 8%|8 | 6/75 [00:02<00:31, 2.18it/s] 2022-01-25 20:24:45,939 [INFO] 9%|9 | 7/75 [00:03<00:31, 2.17it/s] 2022-01-25 20:24:46,377 [INFO] 11%|# | 8/75 [00:03<00:30, 2.20it/s] 2022-01-25 20:24:46,845 [INFO] 12%|#2 | 9/75 [00:04<00:30, 2.18it/s] 2022-01-25 20:24:47,294 [INFO] 13%|#3 | 10/75 [00:04<00:29, 2.20it/s] 2022-01-25 20:24:47,755 [INFO] 15%|#4 | 11/75 [00:05<00:29, 2.19it/s] 2022-01-25 20:24:48,208 [INFO] 16%|#6 | 12/75 [00:05<00:28, 2.19it/s] 2022-01-25 20:24:48,658 [INFO] 17%|#7 | 13/75 [00:05<00:28, 2.20it/s] 2022-01-25 20:24:49,102 [INFO] 19%|#8 | 14/75 [00:06<00:27, 2.22it/s] 2022-01-25 20:24:49,532 [INFO] 20%|## | 15/75 [00:06<00:26, 2.25it/s] 2022-01-25 20:24:50,006 [INFO] 21%|##1 | 16/75 [00:07<00:26, 2.20it/s] 2022-01-25 20:24:50,455 [INFO] 23%|##2 | 17/75 [00:07<00:26, 2.21it/s] 2022-01-25 20:24:51,057 [INFO] 24%|##4 | 18/75 [00:08<00:28, 2.01it/s] 2022-01-25 20:24:51,497 [INFO] 25%|##5 | 19/75 [00:08<00:26, 2.08it/s] 2022-01-25 20:24:51,960 [INFO] 27%|##6 | 20/75 [00:09<00:26, 2.11it/s] 2022-01-25 20:24:52,398 [INFO] 28%|##8 | 21/75 [00:09<00:25, 2.16it/s] 2022-01-25 20:24:52,874 [INFO] 29%|##9 | 22/75 [00:10<00:24, 2.14it/s] 2022-01-25 20:24:53,347 [INFO] 31%|### | 23/75 [00:10<00:24, 2.13it/s] 2022-01-25 20:24:53,821 [INFO] 32%|###2 | 24/75 [00:11<00:23, 2.13it/s] 2022-01-25 20:24:54,299 [INFO] 33%|###3 | 25/75 [00:11<00:23, 2.11it/s] 2022-01-25 20:24:54,764 [INFO] 35%|###4 | 26/75 [00:12<00:23, 2.12it/s] 2022-01-25 20:24:55,213 [INFO] 36%|###6 | 27/75 [00:12<00:22, 2.16it/s] 2022-01-25 20:24:55,758 [INFO] 37%|###7 | 28/75 [00:13<00:22, 2.05it/s] 2022-01-25 20:24:56,299 [INFO] 39%|###8 | 29/75 [00:13<00:23, 1.98it/s] 2022-01-25 20:24:56,750 [INFO] 40%|#### | 30/75 [00:14<00:21, 2.05it/s] 2022-01-25 20:24:57,201 [INFO] 41%|####1 | 31/75 [00:14<00:20, 2.10it/s] 2022-01-25 20:24:57,648 [INFO] 43%|####2 | 32/75 [00:14<00:20, 2.14it/s] 2022-01-25 20:24:58,093 [INFO] 44%|####4 | 33/75 [00:15<00:19, 2.17it/s] 2022-01-25 20:24:58,529 [INFO] 45%|####5 | 34/75 [00:15<00:18, 2.20it/s] 2022-01-25 20:24:58,985 [INFO] 47%|####6 | 35/75 [00:16<00:18, 2.20it/s] 2022-01-25 20:24:59,436 [INFO] 48%|####8 | 36/75 [00:16<00:17, 2.21it/s] 2022-01-25 20:24:59,886 [INFO] 49%|####9 | 37/75 [00:17<00:17, 2.21it/s] 2022-01-25 20:25:00,325 [INFO] 51%|##### | 38/75 [00:17<00:16, 2.23it/s] 2022-01-25 20:25:00,773 [INFO] 52%|#####2 | 39/75 [00:18<00:16, 2.23it/s] 2022-01-25 20:25:01,219 [INFO] 53%|#####3 | 40/75 [00:18<00:15, 2.23it/s] 2022-01-25 20:25:01,657 [INFO] 55%|#####4 | 41/75 [00:18<00:15, 2.25it/s] 2022-01-25 20:25:02,111 [INFO] 56%|#####6 | 42/75 [00:19<00:14, 2.23it/s] 2022-01-25 20:25:02,555 [INFO] 57%|#####7 | 43/75 [00:19<00:14, 2.24it/s] 2022-01-25 20:25:02,995 [INFO] 59%|#####8 | 44/75 [00:20<00:13, 2.25it/s] 2022-01-25 20:25:03,433 [INFO] 60%|###### | 45/75 [00:20<00:13, 2.26it/s] 2022-01-25 20:25:03,878 [INFO] 61%|######1 | 46/75 [00:21<00:12, 2.26it/s] 2022-01-25 20:25:04,325 [INFO] 63%|######2 | 47/75 [00:21<00:12, 2.25it/s] 2022-01-25 20:25:04,775 [INFO] 64%|######4 | 48/75 [00:22<00:12, 2.24it/s] 2022-01-25 20:25:05,300 [INFO] 65%|######5 | 49/75 [00:22<00:12, 2.13it/s] 2022-01-25 20:25:05,775 [INFO] 67%|######6 | 50/75 [00:23<00:11, 2.12it/s] 2022-01-25 20:25:06,226 [INFO] 68%|######8 | 51/75 [00:23<00:11, 2.15it/s] 2022-01-25 20:25:06,666 [INFO] 69%|######9 | 52/75 [00:23<00:10, 2.19it/s] 2022-01-25 20:25:07,110 [INFO] 71%|####### | 53/75 [00:24<00:09, 2.21it/s] 2022-01-25 20:25:07,566 [INFO] 72%|#######2 | 54/75 [00:24<00:09, 2.20it/s] 2022-01-25 20:25:08,010 [INFO] 73%|#######3 | 55/75 [00:25<00:09, 2.22it/s] 2022-01-25 20:25:08,459 [INFO] 75%|#######4 | 56/75 [00:25<00:08, 2.22it/s] 2022-01-25 20:25:08,912 [INFO] 76%|#######6 | 57/75 [00:26<00:08, 2.22it/s] 2022-01-25 20:25:09,366 [INFO] 77%|#######7 | 58/75 [00:26<00:07, 2.21it/s] 2022-01-25 20:25:09,815 [INFO] 79%|#######8 | 59/75 [00:27<00:07, 2.22it/s] 2022-01-25 20:25:10,257 [INFO] 80%|######## | 60/75 [00:27<00:06, 2.23it/s] 2022-01-25 20:25:10,717 [INFO] 81%|########1 | 61/75 [00:27<00:06, 2.21it/s] 2022-01-25 20:25:11,166 [INFO] 83%|########2 | 62/75 [00:28<00:05, 2.22it/s] 2022-01-25 20:25:11,616 [INFO] 84%|########4 | 63/75 [00:28<00:05, 2.22it/s] 2022-01-25 20:25:12,049 [INFO] 85%|########5 | 64/75 [00:29<00:04, 2.24it/s] 2022-01-25 20:25:12,699 [INFO] 87%|########6 | 65/75 [00:29<00:05, 1.97it/s] 2022-01-25 20:25:13,414 [INFO] 88%|########8 | 66/75 [00:30<00:05, 1.76it/s] 2022-01-25 20:25:14,334 [INFO] 89%|########9 | 67/75 [00:31<00:05, 1.48it/s] 2022-01-25 20:25:14,839 [INFO] 91%|######### | 68/75 [00:32<00:04, 1.60it/s] 2022-01-25 20:25:15,326 [INFO] 92%|#########2| 69/75 [00:32<00:03, 1.72it/s] 2022-01-25 20:25:15,835 [INFO] 93%|#########3| 70/75 [00:33<00:02, 1.78it/s] 2022-01-25 20:25:16,314 [INFO] 95%|#########4| 71/75 [00:33<00:02, 1.87it/s] 2022-01-25 20:25:16,819 [INFO] 96%|#########6| 72/75 [00:34<00:01, 1.90it/s] 2022-01-25 20:25:17,303 [INFO] 97%|#########7| 73/75 [00:34<00:01, 1.95it/s] 2022-01-25 20:25:17,800 [INFO] 99%|#########8| 74/75 [00:35<00:00, 1.97it/s] 2022-01-25 20:25:18,300 [INFO] 100%|##########| 75/75 [00:35<00:00, 1.98it/s] 2022-01-25 20:25:18,302 [INFO] 100%|##########| 75/75 [00:35<00:00, 2.11it/s] 2022-01-25 20:25:18,306 [INFO] network run in 35.58s 2022-01-25 20:25:23,252 [INFO] stitching 75 planes using stitch_threshold=0.500 to make 3D masks 2022-01-25 20:25:24,152 [INFO] masks created in 5.84s 2022-01-25 20:25:24,191 [INFO] >>>> TOTAL TIME 41.48 sec
Results from 3D flows => masks computation
# DISPLAY RESULTS 3D flows => masks
plt.figure(figsize=(15,3))
for i,iplane in enumerate(np.arange(0,75,10,int)):
img0 = plot.image_to_rgb(img_3D[iplane, [1,0]].copy(), channels=[2,3])
plt.subplot(1,8,i+1)
outlines = utils.masks_to_outlines(masks[iplane])
outX, outY = np.nonzero(outlines)
imgout= img0.copy()
imgout[outX, outY] = np.array([255,75,75])
plt.imshow(imgout)
plt.title('iplane = %d'%iplane)
Results from stitching
# DISPLAY RESULTS stitching
plt.figure(figsize=(15,3))
for i,iplane in enumerate(np.arange(0,75,10,int)):
img0 = plot.image_to_rgb(img_3D[iplane, [1,0]].copy(), channels=[2,3])
plt.subplot(1,8,i+1)
outlines = utils.masks_to_outlines(masks_stitched[iplane])
outX, outY = np.nonzero(outlines)
imgout= img0.copy()
imgout[outX, outY] = np.array([255,75,75])
plt.imshow(imgout)
plt.title('iplane = %d'%iplane)
so that you can run your own files (alternatively, upload them directly to the Files tab)
## RUN THIS CELL TO ACCESS GOOGLE DRIVE
# mount your google drive here if you want to access your own files
from google.colab import drive
drive.mount('/content/drive')
# files will be in
# file_root = '/content/drive/My Drive/'