Cellpose 0.6.1 tar.gz 安装与细胞分割实操指南
2026/9/16 3:13:46 网站建设 项目流程

简介:这是一份面向Python开发者与生物医学图像研究者的Cellpose 0.6.1库源码压缩包,可用于细胞分割、模型训练与2D/3D图像处理。包内共67个文件,包含26个py源文件、10个rst文档、6个txt文本、4个yml配置及示例notebook等,覆盖模型实现、GUI、转换脚本和测试代码,压缩包大小12.58MB。已有262人学习下载。从内容预览看,源码目录完整,含核心模型文件、文档与配置文件,并附带notebook示例,便于用户深入理解算法、运行测试或定制开发。无论是希望掌握细胞分割技术的初学者,还是需要集成该库的算法工程师,都能借此快速上手并减少环境配置成本。

1. cellpose-0.6.1.tar.gz 是什么,为什么还要手动装

拿到这个文件名,基本说明你的项目被钉在了一个特定历史版本上:要么是复刻老实验,要么是离线服务器装不了新包,再要么就是同事传过来的源码包。cellpose 0.6.1 处在整个项目从论文配套脚本走向成熟工具的过渡期,models.Cellpose对象、命令行入口、_seg.npy输出体系都已经成型,但它依赖的 torch、torchvision、numba 组合和今天的默认安装路径差异很大,盲目pip install cellpose会拉到新版本,接口和权重格式都对不上。这篇文章沿着「解压 → 建环境 → 安装 → 跑批 → 验证结果」的路径,把 tar.gz 变成一个可复现的细胞分割流程。

2. 解压 tar.gz 并安装:conda 环境、依赖与常见报错

2.1 解压前先看包内容:tar -tzf 与权限坑

拿到cellpose-0.6.1.tar.gz,第一件事不是解压,而是确认文件完整。tar 的-t模式能列出归档内容而不释放文件,适合检查包结构和是否被截断:

ls -lh cellpose-0.6.1.tar.gz tar -tzf cellpose-0.6.1.tar.gz | head -40

-t是 list,-z表示 gzip 压缩,-f指定文件。输出里能看到cellpose-0.6.1/setup.pycellpose-0.6.1/cellpose/cellpose-0.6.1/run_cellpose.py之类的条目,基本可以放心解压。如果文件在传输中损坏,tar -tzf会在中途报gzip: stdin: unexpected end of file,这时候不用继续解压,重新传包。

新手最容易卡在tar: cellpose-0.6.1.tar.gz: Cannot open: No such file or directory这个报错上。这不是包坏了,而是当前工作目录里没有这个文件。先pwd确认你在哪个目录,ls看文件是否在那里,文件在~/downloads/下就写全路径,或者先cd ~/downloads再执行。这类路径错误在 Linux 解压 tar.gz 的场景里出现频率极高,排查思路永远是先确认「命令看到的路径」和「文件实际位置」是不是同一个。

确认无碍后解压到独立目录:

mkdir -p ~/src && cd ~/src tar -xzf ~/downloads/cellpose-0.6.1.tar.gz cd cellpose-0.6.1 ls -la

解压后建议立刻ls一下目录内容,确认setup.py在根目录。源码包和 wheel 不同,它没有编译好的产物,安装过程会先读setup.py里的依赖声明,再在本地完成必要的构建,所以接下来环境的干净度决定成败。

2.2 建立 Python 3.8 环境并按依赖顺序安装

0.6.1 对应的是 torch 1.6/1.7 时代的 API,Python 3.8 是最稳妥的选择。直接用系统 Python 装很容易污染全局环境,而且 0.6.1 的依赖区间和较新的 Python 版本互相踩脚,用 conda 单独建环境是通行做法:

conda create -n cellpose061 python=3.8 -y conda activate cellpose061

如果你在 PyCharm 或 VSCode 里开发,装好后把解释器指向这个 conda 环境:PyCharm 在 Settings → Project → Python Interpreter 里选 Existing conda environment;VSCode 装 Python 扩展后按Ctrl+Shift+P选解释器,路径是~/miniconda3/envs/cellpose061/bin/python。这一步能避免一大堆「命令行能跑但 IDE 里导入失败」的诡异问题。

依赖安装顺序很重要,先装 torch,再装数值库,最后装 cellpose 本体:

pip install torch==1.7.1 torchvision==0.8.2 --index-url https://download.pytorch.org/whl/cu110 pip install numpy scipy numba natsort tifffile imageio fastremap pip install -e .

--index-url指向 PyTorch 官方 wheel 源,cu110代表 CUDA 11.0。CPU 机器把 URL 换成https://download.pytorch.org/whl/cpu,参数结构不变。cellpose 0.6.1 在 CPU 上能跑,只是慢;GPU 机器装了 CPU 版 torch 也能推理,但--gpu参数不会生效。第二行装的是 cellpose 的实际运行依赖,fastremap负责掩码重映射,numba用于后处理的加速,tifffile承担 TIFF 读写。第三行-e是 editable 安装,会在 site-packages 里生成指向当前源码目录的链接,后面调 cellpose 包内代码可以直接生效,排查问题比重新安装方便得多。

受网络限制时,第二、三行可以加国内源地址-i https://pypi.tuna.tsinghua.edu.cn/simple。torch 那一行不要加 PyPI 镜像,因为官方源才有带 CUDA 运行时的完整 wheel,镜像源上不一定有老版本。

2.3 三个高频安装报错

第一个典型报错是ImportError: cannot import name '...' from 'torch',这类问题多半是 torch 与 torchvision 版本没配对。cellpose 加载时要用 torchvision 的 nms 算子,两者编译基线不一致就会在导入阶段翻车。解法是装回官方源里的一组配对版本,torch 1.7.1 配 torchvision 0.8.2 是常用组合。

第二个是 numba 相关报错,特征是日志里出现TypeError: No matching definition或 LLVM 字样。0.6.1 的掩码后处理包含 numba jit 函数,Python 3.9/3.10 环境下的新版本 numba 编译这类旧代码容易失败。回到 Python 3.8 后执行pip install numba==0.53.1,多数情况能解决。

第三个是pip install -e .时依赖解析失败。0.6.1 的setup.py里依赖版本偏老,pip 会尝试组合出满足全部约束的解,索引更新后反而可能找不到合适组合。常见做法是把依赖拆开先装(也就是上面第二行命令),装完再装 cellpose 本身,绕过整体解析。

3. cellpose-0.6.1 的分割流程:命令行与 Python API 双路径

3.1 命令行入口与核心参数

环境没问题后,用cellpose命令对目录做批量分割是最快的验证方式:

cellpose --dir ./images --pretrained_model cyto --chan 0 --diameter 30 --save_png --gpu

--dir是图像目录;--pretrained_model指定模型,0.6.1 自带 cyto 和 nuclei 两套预训练权重,处理细胞质、细胞膜选 cyto,密集细胞核选 nuclei;--chan的 0 表示灰度,1 红、2 绿、3 蓝;--diameter是细胞直径的像素估计,默认 30,这个值直接影响分割粒度,设得比实际细胞小,会把一个大细胞切开;--save_png保存掩码和叠加预览图;--gpu走 GPU 推理,CPU 机器不加即可。

输出位置建议用--output_dir显式控制,0.6.1 的默认输出位置有时会让新用户找半天:

mkdir -p ./outputs cellpose --dir ./images --output_dir ./outputs --pretrained_model cyto --chan 0 --save_tif

--save_tif输出 16 位 TIFF 掩码,比 png 更适合后续定量分析。png 格式会限制对象编号在 255 以内,TIFF 可以容纳几千上万个细胞核。第一次跑通后要把--diameter--flow_threshold等参数记下来,这些参数会被写进输出文件命名之外的地方,实验记录里单独留一行最稳妥。

3.2 Python API 的四元返回与结果对象

批量跑场景用命令行够用,但调参阶段必须用 Python API,才能逐个变量观察输出变化:

import imageio from cellpose import models, io img = imageio.imread("./images/sample_01.png") model = models.Cellpose(model_type="cyto", gpu=False) masks, flows, styles, diams = model.eval( img, diameter=30.0, channels=[0, 0], flow_threshold=0.4, cellprob_threshold=0.0, ) io.masks_flows_to_seg(img, masks, flows, diams, "./sample_01", "./outputs")

model.eval返回四个值,这是 0.6.1 区别于后续版本的重要特征:

  • masks:与原图同尺寸的整数数组,背景为 0,每个连通区域一个编号;
  • flows:字典结构,包含梯度流场flow、细胞概率cellprob、按阈值过滤后的掩码mask,调试重叠细胞时看flows["cellprob"]最直观;
  • styles:每个对象的特征向量,可用于后续聚类或相似度比较;
  • diams:本次推理实际使用的直径,受传入值、图像内容共同影响,最终要记录的是这个值而不是你传进去的 30。

io.masks_flows_to_seg负责落盘,它一次性生成_seg.npy_cp_masks.png_overlay.png三份产物。传入的文件名./sample_01不带扩展名,函数会自动拼出完整文件名。

3.3 通道参数 channels 的取值与效果

channels=[第一通道, 第二通道]表达输入图像中的角色分配,下表是常用取值:

channels含义典型场景
[0, 0]只用灰度单通道明场、单色荧光
[1, 0]红通道作为分割依据多色荧光里的红色标记
[2, 0]绿通道作为分割依据绿色荧光蛋白
[1, 2]红通道细胞质,绿通道细胞核双色共定位分割
[3, 1]蓝通道细胞质,红通道细胞核反色组合

第二通道为 0 表示没有核标记,模型会退化成只依赖第一通道的纹理和边界信息。换了模型或换了实验体系,先打印一张图的masks.max()看对象数量级,对象数异常偏少时把cellprob_threshold往负调,接受更多低置信度像素;对象过多且碎片化,就往正调。0.6.1 的这个参数默认 0.0,调参步长建议 0.1。

4. 数据组织与批量输出:把装好的能力用在真实图像上

4.1 目录结构与文件名排序

cellpose 的后台流程假设一个目录里的图像按文件名自然排序,所以目录结构建议固定为:

data/ images/ ctrl_01.png ctrl_02.png drugA_01.png ... outputs/

批量运行前先确认目录里没有.DS_Store、隐藏文件或其他格式的文件,否则它们也会被当成图像读入。安全检查命令:

find data/images -maxdepth 1 -type f -name "*.png" | sort | head -5

不同处理条件混在同一个目录时,把条件编号写进文件名,不要依赖子目录。0.6.1 的输出文件名完全沿用输入文件名,后续按条件筛选统计时,文件名规则就是唯一索引。

4.2 多通道、大图切块与 GPU 内存控制

多通道图像读进来是(H, W, C)的 numpy 数组,通道维度的顺序要和channels下标对应。灰度单通道图经imageio.imread出来是二维数组,直接配[0, 0]即可。

GPU 显存不足是 0.6.1 跑大图的头号问题,报错通常是RuntimeError: CUDA out of memory。先加--fast_mode降低网络深度,这个参数牺牲少量边界精度换速度;仍不够就按比例缩小输入:

from skimage.transform import resize img_resized = resize(img, (img.shape[0] // 2, img.shape[1] // 2), preserve_range=True) masks_small, _, _, _ = model.eval(img_resized, diameter=15.0, channels=[0, 0])

缩小一半后diameter要跟着调整,原图细胞 30 像素,缩小后约 15。这里是最容易踩的坑:只缩小图像不缩小diameter,小目标会被直接切没。跑完如果只需要统计信息,小图输出足够;要精确轮廓,再回到原图对目标区域做局部推理。

4.3 输出文件格式:_seg.npy、_cp_masks.png 与 _overlay.png 的区别

一次命令或一次masks_flows_to_seg调用会生成三种文件:

  • _seg.npy:把 masks、flows、styles、diams 打包存储的 numpy 数组,后续重载全部结果的唯一入口;
  • _cp_masks.png:掩码可视化,肉眼检查分割数量方便;
  • _overlay.png:原图叠加掩码轮廓的预览图,适合贴进实验记录。

重载_seg.npy的方式:

from cellpose import io seg = io.load_masks("./sample_01_seg.npy") masks = seg["masks"]

0.6.1 的_seg.npy里还可能带outlines键,存的是每个对象的轮廓坐标。做形态学分析时可以直接用,不必再从 mask 重新提边缘,省掉一轮skimage.measure.find_contours

5. 验证 mask 质量的三个小脚本:0.6.1 输出的最后一道关

分割结果进统计之前,用三个快速检查把问题拦下来。

第一个检查对象数量与面积分布。掩码里面积小于 16 像素的通常是噪声碎片:

import numpy as np import tifffile masks = tifffile.imread("outputs/sample_01_cp_masks.tif").astype(np.int32) ids, counts = np.unique(masks, return_counts=True) ids = ids[ids > 0] valid = ids[counts[ids] >= 16] print("总对象数:", ids.size, "有效对象数:", valid.size) print("面积中位数:", int(np.median(counts[ids])), "像素")

np.unique(masks, return_counts=True)把每个编号的出现次数当作面积;过滤后打印中位数,如果中位数明显偏离实验体系里的细胞面积,多半是diameter没设对。

第二个检查是轮廓接触图像边界。接触边界的 mask 统计面积时不完整,占比超过 20% 就要回采集流程补视野:

from scipy import ndimage edges = ndimage.laplace((masks > 0).astype(np.float32)) > 0 edge_ids = np.unique(masks[edges]) edge_ids = edge_ids[edge_ids > 0] print("接触边界的对象数:", edge_ids.size, "占比: %.2f" % (edge_ids.size / max(valid.size, 1)))

第三个做法是给 mask 编号排序后重新落盘。cellpose 输出的编号顺序和各对象在图像中的扫描顺序相关,不同运行环境下可能不一致,先按面积降序重排,保证同一文件任意机器上编号对齐:

order = np.argsort(counts[ids])[::-1] remap = np.zeros(masks.max() + 1, dtype=np.uint32) remap[ids[order]] = np.arange(1, len(ids) + 1) masks_sorted = remap[masks] tifffile.imwrite("outputs/sample_01_masks_sorted.tif", masks_sorted.astype("uint16"))

remapdiamsflow_thresholdcellprob四个值和实验批次号存进同一个 JSON,下次复现时直接读 JSON 重建环境,0.6.1 从 tar.gz 到定量结果的全链路就都有据可查。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询