使用trackpy和pims处理TIFF序列时遇OSError(Errno9)错误求助
问题
使用Python的trackpy和pims库追踪流体粒子位置,处理.tiff序列帧时,执行tp.batch出现OSError: [Errno 9] Bad file descriptor错误,且每次报错的帧不固定。
代码示例
import numpy as np %matplotlib inline import matplotlib as mpl import matplotlib.pyplot as plt from scipy.ndimage.interpolation import zoom import pandas as pd import trackpy as tp import pims from scipy.optimize import curve_fit v = pims.ImageSequence('Capture_*.tiff') v = pims.as_grey(v) f = tp.locate(v[0], 5, minmass=20, maxsize=3, invert=True) f = tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True)
报错信息
--------------------------------------------------------------------------- OSError Traceback (most recent call last) /var/folders/xj/cw6n24v100l7s1rkm85p4qym0000gn/T/ipykernel_3149/1176320070.py in ----> 1 f=tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True) ~/opt/anaconda3/envs/APL_BM_env2/lib/python3.7/site-packages/trackpy/feature.py in batch(frames, diameter, output, meta, processes, after_locate, **kwargs) 555 try: 556 all_features = [] --> 557 for i, features in enumerate(map_func(curried_locate, frames)): 558 image = frames[i] 559 if hasattr(image, 'frame_no') and image.frame_no is not None: ~/opt/anaconda3/envs/APL_BM_env2/lib/python3.7/multiprocessing/pool.py in next(self, timeout) 746 if success: 747 return value --> 748 raise value 749 750 __next__ = next # XXX OSError: [Errno 9] Bad file descriptor
解决思路与方案
该错误多由tp.batch默认多进程模式下,pims的ImageSequence对象出现文件句柄共享冲突导致,可尝试以下方案:
强制单进程运行:在
tp.batch中指定processes=1,避免多进程间的文件资源竞争:f = tp.batch(v[:], 5, minmass=20, maxsize=3, invert=True, processes=1)预先加载所有帧到内存:将所有tiff帧读取到内存列表后再传入
tp.batch,绕开多进程重复读取文件的问题:frames_list = [frame for frame in v] f = tp.batch(frames_list, 5, minmass=20, maxsize=3, invert=True)验证文件完整性:随机抽取报错帧单独读取,确认.tiff文件无损坏:
# 替换为报错的帧序号 test_frame = v[10] plt.imshow(test_frame) plt.show()更新依赖库:旧版本trackpy/pims可能存在多进程兼容bug,更新至最新稳定版:
pip install --upgrade trackpy pims
内容的提问来源于stack exchange,提问作者NikNack
相关产品推荐
相关产品推荐

