numpyimage-processingpython-imaging-librarydata-augmentationalbumentations

TypeError: slice indices must be integers or None or have an __index__ method (Albumentations/NumPy)


Hi everyone can you please help me i'm getting this bug with random crop augmentation. TypeError: slice indices must be integers or None or have an index method

Code is below.

!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')

This is for the SIIM Kaggle competition. I don't know how to solve this and the issue is with only random crop. I tried searching online but i was unable to.


Solution

  • I think the error is in this line:

    A.RandomCrop(p=1.0, width=img.shape[0] / 2, height=img.shape[1] / 2)
    

    The problem here is that your width and height may not be integers, but they must be.

    Check Albumentations RandomCrop documentation.

    And here is the solution.

    1. Explicitly convert width and height arguments to integer:
    A.RandomCrop(p=1.0, width=int(img.shape[0] / 2), height=int(img.shape[1] / 2))
    
    1. Use integer division:
    A.RandomCrop(p=1.0, width=img.shape[0] // 2, height=img.shape[1] // 2)
    

    Let me know if it helps!