0

I'm trying to do some image segmentation for ocr, my mask image is a 3 classes image, like this

enter image description here

and my original image is a gray image like this

enter image description here

but when I try to fit the model I get this error

could not broadcast input array from shape (128,128,3) into shape (128,128)

here is the code I'm using to create the datasets

    img_size = (128, 128)
    batch_size = 32
    input_img_paths = sorted(
        [  os.path.join(input_dir, fname)
            for fname in os.listdir(input_dir)
            if fname.endswith(".jpg") ] )
    target_img_paths = sorted(
        [   os.path.join(target_dir, fname)
            for fname in os.listdir(target_dir)
            if fname.endswith(".jpg") and not fname.startswith(".") ])

class OxfordPets(keras.utils.Sequence):
    """Helper to iterate over the data (as Numpy arrays)."""

    def __init__(self, batch_size, img_size, input_img_paths, target_img_paths):
        self.batch_size = batch_size
        self.img_size = img_size
        self.input_img_paths = input_img_paths
        self.target_img_paths = target_img_paths

    def __len__(self):
        return len(self.target_img_paths) // self.batch_size

    def __getitem__(self, idx):
        """Returns tuple (input, target) correspond to batch #idx."""
        i = idx * self.batch_size
        batch_input_img_paths = self.input_img_paths[i : i + self.batch_size]
        batch_target_img_paths = self.target_img_paths[i : i + self.batch_size]
        x = np.zeros((batch_size,) + self.img_size, dtype="float32")
        for j, path in enumerate(batch_input_img_paths):
            img = load_img(path, target_size=self.img_size)

            x[j] = img
        y = np.zeros((batch_size,) + self.img_size, dtype="float32")
        for j, path in enumerate(batch_target_img_paths):
            img = load_img(path, target_size=self.img_size, color_mode="rgb")
            y[j] = img
        return x, y



val_samples = 150
random.Random(1337).shuffle(input_img_paths)
random.Random(1337).shuffle(target_img_paths)
train_input_img_paths = input_img_paths[:-val_samples]
train_target_img_paths = target_img_paths[:-val_samples]
val_input_img_paths = input_img_paths[-val_samples:]
val_target_img_paths = target_img_paths[-val_samples:]

# Instantiate data Sequences for each split
train_gen = OxfordPets(
    batch_size, img_size, train_input_img_paths, train_target_img_paths
)
val_gen = OxfordPets(batch_size, img_size, val_input_img_paths, val_target_img_paths)

but when i try to fit whit this

model_history = model.fit(train_gen, epochs=30,
                          steps_per_epoch=50,
                          validation_steps=25,
                          validation_data=val_gen)

I get the error, I am trying to adapt this solution https://keras.io/examples/vision/oxford_pets_image_segmentation/?fbclid=IwAR2wFYju-N0X7FUaWkhvOVaAAaVqLdOryBwg7xDC0Rji9LQ5F2jYOkeNnns from keras

into the example of the tensorflow page https://www.tensorflow.org/tutorials/images/segmentation

and I have the impression that the problem has something to do whit the fact that the original image is on gray scale, how can I solve this error? any advice would be great!

Roshin Raphel
  • 2,612
  • 4
  • 22
  • 40
mimus
  • 367
  • 4
  • 21

2 Answers2

0

Your mask is RGB and has 3 channels. but your image is grayscale and has one channel. See This question for converting RGB image to grayscale image

Roshin Raphel
  • 2,612
  • 4
  • 22
  • 40
0

You should convert your image to RGB first. Your image is gray-scaled and has only 1 channel. Its shape is (128,128,1). Them apply sth like opencv: backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) to every image in your data and everything will be ok

dtlam26
  • 1,410
  • 11
  • 19