TypeError: slice indices must be integers or None or have an __index__ method (Albumentations/NumPy)
TypeError: slice indices must be integers or None or have an __index__ method (Albumentations/NumPy)
大家好,请帮帮我,我遇到了随机裁剪增强的错误。
类型错误:切片索引必须是整数或 None 或具有 index 方法
代码如下。
!conda install -c conda-forge gdcm -y
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import cv2 as cv
import albumentations as A
import pydicom
from pydicom.pixel_data_handlers.util import apply_voi_lut
from tqdm.auto import tqdm
def read_img(path, voi_lut=True, fix_monochrome=True):
dcm = pydicom.read_file(path)
if voi_lut:
img = apply_voi_lut(dcm.pixel_array, dcm)
else:
img = dcm.pixel_array
if fix_monochrome and dcm.PhotometricInterpretation == "MONOCHROME1":
img = np.amax(img) - img
img = img - np.min(img)
img = img / np.max(img)
img = (img * 255).astype(np.uint8)
return img
def resize_img(img, size, pad=True, resample=Image.LANCZOS):
img = np.array(img)
if pad:
max_width = 4891
max_height = 4891
img = np.pad(img, ((0, max_height - img.shape[0]), (0, max_width - img.shape[1]), (0, 0)))
img = img.resize((size, size), resample)
return img
def augment_img(img, clahe=True, albumentations=True):
if clahe:
clahe = cv.createCLAHE(clipLimit=15.0, tileGridSize=(8,8))
img = clahe.apply(img)
else:
img = cv.equalizeHist(img)
if albumentations:
img = np.stack((img, ) * 3, axis=-1)
transform = A.Compose([
A.RandomSunFlare(p=0.2),
A.RandomFog(p=0.2),
A.RandomBrightness(p=0.2),
A.RandomCrop(p=1.0, width=img.shape[0] / 2, height=img.shape[1] / 2),
A.Rotate(p=0.2, limit=90),
A.RGBShift(p=0.2),
A.RandomSnow(p=0.2),
A.HorizontalFlip(p=0.2),
A.VerticalFlip(p=0.2),
A.RandomContrast(p=0.2, limit=0.2),
A.HueSaturationValue(p=0.2, hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=50)
])
img = transform(image=img)["image"]
return img
img = read_img('../input/siim-covid19-detection/test/00188a671292/3eb5a506ccf3/3dcdfc352a06.dcm') #You can replace this with any .dcm filepath on your system
img = augment_img(img)
img = resize_img(img, 1024)
plt.imshow(img, cmap='gray')
这是为 SIIM Kaggle 比赛准备的。我不知道如何解决这个问题,问题只在于随机裁剪。我尝试在线搜索,但无法搜索到。
我认为错误在这一行:
A.RandomCrop(p=1.0, width=img.shape[0] / 2, height=img.shape[1] / 2)
这里的问题是你的宽度和高度可能不是整数,但它们必须是。
检查Albumentations RandomCrop documentation。
这是解决方案。
- 将宽度和高度参数显式转换为整数:
A.RandomCrop(p=1.0, width=int(img.shape[0] / 2), height=int(img.shape[1] / 2))
- 使用整数除法:
A.RandomCrop(p=1.0, width=img.shape[0] // 2, height=img.shape[1] // 2)
如果有帮助请告诉我!
大家好,请帮帮我,我遇到了随机裁剪增强的错误。 类型错误:切片索引必须是整数或 None 或具有 index 方法
代码如下。
!conda install -c conda-forge gdcm -y
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import cv2 as cv
import albumentations as A
import pydicom
from pydicom.pixel_data_handlers.util import apply_voi_lut
from tqdm.auto import tqdm
def read_img(path, voi_lut=True, fix_monochrome=True):
dcm = pydicom.read_file(path)
if voi_lut:
img = apply_voi_lut(dcm.pixel_array, dcm)
else:
img = dcm.pixel_array
if fix_monochrome and dcm.PhotometricInterpretation == "MONOCHROME1":
img = np.amax(img) - img
img = img - np.min(img)
img = img / np.max(img)
img = (img * 255).astype(np.uint8)
return img
def resize_img(img, size, pad=True, resample=Image.LANCZOS):
img = np.array(img)
if pad:
max_width = 4891
max_height = 4891
img = np.pad(img, ((0, max_height - img.shape[0]), (0, max_width - img.shape[1]), (0, 0)))
img = img.resize((size, size), resample)
return img
def augment_img(img, clahe=True, albumentations=True):
if clahe:
clahe = cv.createCLAHE(clipLimit=15.0, tileGridSize=(8,8))
img = clahe.apply(img)
else:
img = cv.equalizeHist(img)
if albumentations:
img = np.stack((img, ) * 3, axis=-1)
transform = A.Compose([
A.RandomSunFlare(p=0.2),
A.RandomFog(p=0.2),
A.RandomBrightness(p=0.2),
A.RandomCrop(p=1.0, width=img.shape[0] / 2, height=img.shape[1] / 2),
A.Rotate(p=0.2, limit=90),
A.RGBShift(p=0.2),
A.RandomSnow(p=0.2),
A.HorizontalFlip(p=0.2),
A.VerticalFlip(p=0.2),
A.RandomContrast(p=0.2, limit=0.2),
A.HueSaturationValue(p=0.2, hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=50)
])
img = transform(image=img)["image"]
return img
img = read_img('../input/siim-covid19-detection/test/00188a671292/3eb5a506ccf3/3dcdfc352a06.dcm') #You can replace this with any .dcm filepath on your system
img = augment_img(img)
img = resize_img(img, 1024)
plt.imshow(img, cmap='gray')
这是为 SIIM Kaggle 比赛准备的。我不知道如何解决这个问题,问题只在于随机裁剪。我尝试在线搜索,但无法搜索到。
我认为错误在这一行:
A.RandomCrop(p=1.0, width=img.shape[0] / 2, height=img.shape[1] / 2)
这里的问题是你的宽度和高度可能不是整数,但它们必须是。
检查Albumentations RandomCrop documentation。
这是解决方案。
- 将宽度和高度参数显式转换为整数:
A.RandomCrop(p=1.0, width=int(img.shape[0] / 2), height=int(img.shape[1] / 2))
- 使用整数除法:
A.RandomCrop(p=1.0, width=img.shape[0] // 2, height=img.shape[1] // 2)
如果有帮助请告诉我!