Skimage transform.resize негативно влияет на оперативную память - PullRequest
0 голосов
/ 09 июня 2018

Недавно я заметил, что использование transform.resize заполняет мою оперативную память (например, много: 23Go).Вот моя функция

def resizePics(i):
    target_size = 500
    h, w = i.shape[0], i.shape[1]

    if h > w:      # crop to get a squared pic
        crop_size = round((h - w)/2)
        i = i[crop_size: h -crop_size, 0:w]
    elif h < w:
        crop_size = round((w - h)/2)
        i = i[0:h, crop_size:w-crop_size]

    i = transform.resize(i, (target_size,target_size), mode="constant", preserve_range=True) ##! HERE !##

    return(i)

И где я ее вызываю (данные представляют собой панды данных)

pool = ThreadPool(multiprocessing.cpu_count())

data["img"] = pool.map(resizePics, data["img"])

pool.close() 
pool.close()

[ Основные гипотезы ]

Я заметил, что вид значений для моих матриц сильно меняется после использования этой функции (даже если я использую preserve_range = True).Это перед transform.resize:

data.head(5)
0   chest_xray/train/PNEUMONIA/person64_bacteria_3...   pneumonia   [[98, 100, 103, 104, 105, 107, 111, 114, 113, ...   504     144.0
1   chest_xray/train/NORMAL/NORMAL2-IM-1342-0001.jpeg   normal  [[0, 173, 163, 154, 144, 140, 132, 131, 129, 1...   1078    138.0
2   chest_xray/train/PNEUMONIA/person1441_bacteria...   pneumonia   [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...   1144    155.0
3   chest_xray/train/NORMAL/NORMAL2-IM-0576-0001.jpeg   normal  [[30, 31, 31, 28, 28, 30, 30, 30, 29, 27, 28, ...   1422    135.0
4   chest_xray/train/NORMAL/NORMAL2-IM-0660-0001.jpeg   normal  [[0, 2, 4, 3, 1, 1, 0, 0, 0, 1, 1, 3, 2, 0, 1,...   950     133.0

Это после:

data.head(5)
0   chest_xray/train/PNEUMONIA/person64_bacteria_3...   pneumonia   [[196.00400000000008, 197.000096, 197.02799999...   504     144.0
1   chest_xray/train/NORMAL/NORMAL2-IM-1342-0001.jpeg   normal  [[38.89042000000035, 38.15600000000006, 36.734...   1078    138.0
2   chest_xray/train/PNEUMONIA/person1441_bacteria...   pneumonia   [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...   1144    155.0
3   chest_xray/train/NORMAL/NORMAL2-IM-0576-0001.jpeg   normal  [[15.940252000000065, 17.550252000001198, 15.6...   1422    135.0
4   chest_xray/train/NORMAL/NORMAL2-IM-0660-0001.jpeg   normal  [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...   950     133.0

Мне кажется, что влияние на ОЗУ как-то связано с пикселями, кодируемыми из int -> плавает.

[ Вопрос ]: есть ли способ настроить transform.resize для того, чтобы

  • придерживался целочисленных значений
  • ограничить диапазончисло после (скажем, 3 десятичных знака)

1 Ответ

0 голосов
/ 09 июня 2018

Для подавляющего большинства функций scikit-image внутреннее представление равно float.Особенно, когда требуется какое-то сглаживание / сглаживание / и т.д.Только так мы можем гарантировать, что результат будет максимально точным и информативным.Чтобы ответить на ваши вопросы:

[Вопрос]: есть ли способ откорректировать transform.resize, чтобы

  • придерживался целых чисел
  • ограничитьдиапазон чисел после, (скажем, 3 десятичных)

«отрицательный» для обеих точек маркера :).Вы должны вручную привести вывод к любому dtype, который вы хотите, используя, например, {resize_output}.astype(np.uint8, casting='unsafe') или numpy.around({resize_output}, decimals=3).

Однако мне любопытно узнать подробности вашего теста.23ГБ это много.Если вы можете подготовить минимальный пример вашего кода, который показывает высокое использование памяти, пожалуйста, опубликуйте его на нашем трекере ошибок GitHub (https://github.com/scikit-image/scikit-image/issues).

...