当使用带有skimage版本0.13.1的Python 3.6.4 32位时,以下代码会导致死亡内核:
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和marker的调用输出来看,内存使用率并不高,而且还有很多可用的内存。 输出如下:
Python 3.6.4 | Anaconda自定义(32位)| (默认,2018年1月16日,10:21:59)[MSC v.1900 32 bit(Intel)]
IPython 6.2.1 - 增强的交互式Python runfile(' H:/CVS/python/171213Koexexperimente/32BitCrashWatershedExample.py' ;, wdir =' H:/ CVS / python / 171213Koexexperimente')
进口后的内存使用量为180.1 MB
加载数据后的内存使用量为262.7 MB 可用内存:2790.7 MB
在CannyPic之后的内存使用量为355.6 MB 可用内存:2723.8 MB
在标记之后的内存使用量为365.9 MB 可用内存:2717.2 MB
标签
后的内存使用量为396.8 MB 可用内存:2682.6 MB
内核死了,重启了
很难切换到64位版本,因为这个代码应该在另一个32位软件调用的库中使用,不能轻易地转移到64位。 并且将大图像切换成较小的图像并处理它们也不是完全稳定的。对于使用1000 x 1000像素图像的不同安装,大部分时间都可以工作,但如果重复调用则不一定。
问题:
1.如何找到死亡核心的根本原因?
如果它是记忆的话,这可能是流域中笨拙的记忆用法吗?
3.有没有人知道如何让它发挥作用?
所有提示都表示赞赏。
可以在下面找到演示数据和代码 http://ascona-cloud.de/index.php/s/hFaqbEkv5PUW820