Python skimage.形态学.Waterline导致32位内核死亡

Python skimage.形态学.Waterline导致32位内核死亡,python,memory,32-bit,scikit-image,watershed,Python,Memory,32 Bit,Scikit Image,Watershed,将Python 3.6.432位与skimage版本0.13.1一起使用时,以下代码会导致内核死亡: from scipy.io import loadmat import skimage.morphology import skimage.feature import scipy import numpy as np import psutil import os process = psutil.Process(os.getpid()) print('Mem usage %4.1f MB

将Python 3.6.432位与skimage版本0.13.1一起使用时,以下代码会导致内核死亡:

from scipy.io import loadmat
import skimage.morphology
import skimage.feature
import scipy
import numpy as np
import psutil
import os

process = psutil.Process(os.getpid())
print('Mem usage %4.1f MB after imports\n'%(process.memory_info().vms / float(2 ** 20)))
data = loadmat('demoData.mat')
print('Mem usage %4.1f MB after loading the data'%(process.memory_info().vms / float(2 ** 20)))
print('Mem available: %4.1f MB\n'%(psutil.virtual_memory().available/float(2 ** 20)))

#Just show the input data
#import matplotlib.pyplot as plt
#plt.figure('Watershed')
#plt.clf()
#plt.imshow(data['pic'])


#%%Do some Calculations
l = 10 # hysteresis for Canny edge detector lower limit
h = 20 # hysteresis for Canny edge detector high limit
sigma = 0.1

gradient = skimage.filters.sobel(data['pic'])
# find forground and background
l,h = 10, 20 # hysteresis for Canny edge detector

cannyPic = skimage.feature.canny(data['pic'], sigma = sigma, low_threshold=l, high_threshold=h)
print('Mem usage %4.1f MB after CannyPic'%(process.memory_info().vms / float(2 ** 20)))
print('Mem available: %4.1f MB\n'%(psutil.virtual_memory().available/float(2 ** 20)))

markers = cannyPic == 0
print('Mem usage %4.1f MB after markers'%(process.memory_info().vms / float(2 ** 20)))
print('Mem available: %4.1f MB\n'%(psutil.virtual_memory().available/float(2 ** 20)))

seg = np.ones((3,3))
markers, numFeatures = scipy.ndimage.measurements.label(markers, seg)
print('Mem usage %4.1f MB after label'%(process.memory_info().vms / float(2 ** 20)))
print('Mem available: %4.1f MB\n'%(psutil.virtual_memory().available/float(2 ** 20)))

#***** Crash occurs in the line below ****
labels = skimage.morphology.watershed(gradient, markers)
print('Mem usage %4.1f MB after watershed'%(process.memory_info().vms / float(2 ** 20)))
print('Mem available: %4.1f MB\n'%(psutil.virtual_memory().available/float(2 ** 20)))
它适用于64位版本,也适用于较小的图像。因此我猜可能是内存问题。但从之前对sobel、canny和markers的调用的输出来看,内存使用率并不是很高,而且还有很多可用内存。 结果如下:

Python 3.6.4 | Anaconda自定义(32位)|(默认值,2018年1月16日,10:21:59)[MSC v.1900 32位(英特尔)]
IPython 6.2.1--增强的交互式Python。
runfile('H:/CVS/python/171213koexexperiment/32BitCrashWatershedExample.py',wdir='H:/CVS/python/171213koexexperiment')
导入后的内存使用量为180.1 MB

加载数据后的内存使用量262.7 MB
可用内存:2790.7 MB

CannyPic后的内存使用量355.6 MB
可用内存:2723.8MB

标记后的内存使用率365.9 MB
可用内存:2717.2MB

标签后内存使用396.8 MB
可用内存:2682.6 MB


内核已死亡,正在重新启动
仅切换到64位版本是困难的,因为此代码应在另一个32位软件调用的库中使用,而该库不容易转换为64位。 将大图像分割成更小的图像并对其进行处理也不是完全稳定的。对于不同的安装,使用1000 x 1000像素的图像大部分时间都能正常工作,但如果反复调用,则不一定能正常工作

问题:
1.如何找到内核死亡的根本原因?
2.如果这真的是记忆的话,这可能是流域中的一种笨拙的记忆使用吗?
3.有人知道如何让它工作吗

谢谢你的提示

演示数据和代码可以在下找到

希望您能给出答案,但“像素”值的范围是什么?这听起来像是某种溢出。在加载的映像中,所有内容都在0到255(8位)之间,但在32位系统中被处理为np.float64。或者可能是np.float32?您是否有可能(甚至值得)将它们转换为0-1范围(然后在最后转换回来,这样您就不会得到黑色图片)?对不起,我只是想知道你的溢油在哪里。你从python崩溃中得到堆栈跟踪吗?不,它是64位浮点。添加行数据['pic']/=data['pic'].max()不会更改结果。但老实说,我不确定如何从内核获取跟踪。