I would suggest the following approach where you save cropped images
eg. for classfication in two classes

Convert all images to numpy array → save [cropped_image_pixelarray, class]
Create a dataset class for loading from saved array

You can use similar code for getting cropped images:
Loop over all images, open then as cv2 images and use this function (i have not verified if the function works, but something similar should suffice)
def process_data(image, label, df):
    '''
    image: cv2 image
    label: numpy array label eg. [0, 1] or [1, 0]
    df: main df
    '''
    image_x = 2160
    image_y = 2560
    crop = 64
    for i in range(math.floor(image_x/crop)): # loop over width 
        for y in range(math.floor(image_y/crop)):  # loop over height
            new_image = image[i*crop : (i+1)*crop, y*crop : (y+1)*crop]
            df.append([np.array(new_image), label]) 

np.save('data.npy', df)

The Dataset class would look like:
class Data(Dataset):
    def __init__(self, data_path, transform=None):
        self.data = np.load(data_path, allow_pickle=True)
        self.transform = transform

    def __len__(self):
        return len(self.data)

    def __getitem__(self, x):
        # we saved data as [image_data, label]
        label = torch.from_numpy(data[x][1])
        image = torch.from_numpy(data[x][0])
        if self.transform is not None:
            image = self.transform(image)
        return image, label

Hope this helps
thanks