Повышение точности сегментации семантического изображения на спутниковых снимках диаметром 25 см [закрыто] ⇐ Python
Повышение точности сегментации семантического изображения на спутниковых снимках диаметром 25 см [закрыто]
Я пытаюсь выполнить семантическую сегментацию изображений на спутниковых снимках высокого разрешения (25 см) для классификации земного покрова. Я уже пытался использовать предварительно обученную модель U-Net с магистралью ResNet34, но столкнулся с двумя основными проблемами:
1). Оценка модели «Пересечение через объединение» (IoU) довольно низкая, что указывает на то, что результаты сегментации плохо согласуются с основными истинными метками. 2). Функция потерь, используемая во время обучения, очень высока, что говорит о том, что модель с трудом сходится и изучает значимые представления данных.
Мне нужны предложения и рекомендации по решению этих проблем. В частности, меня интересуют стратегии повышения производительности модели, уменьшения потерь и, возможно, изучения альтернативных моделей, которые могут лучше подойти для этой задачи по сравнению с U-Net с ResNet34.
импортировать файл tiff как tiff импортировать numpy как np из последовательности импорта tensorflow.keras.utils импортировать ОС из sklearn.preprocessing импорт MinMaxScaler из keras.utils импорт в_categorical из tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator импортировать cv2 импортировать сегментационные_модели как sm # Определите генератор изображений и масок, чтобы мы могли читать их прямо с диска. img_dim = 256 семя = 24 размер_пакета = 32 num_class = 9 # Используйте это для предварительной обработки ввода для трансферного обучения МАГАЗИН = 'resnet34' preprocess_input = sm.get_preprocessing(BACKBONE) класс CustomDataGenerator (Последовательность): def __init__(self, image_folder, маска_folder, package_size, num_class, target_size): self.image_folder = image_folder self.mask_folder = маска_папка self.batch_size = размер_пакета self.num_class = num_class self.target_size = целевой_размер self.image_paths = [os.path.join(self.image_folder, filename) для имени файла в сортировке (os.listdir(self.image_folder))] self.mask_paths = [os.path.join(self.mask_folder, filename) для имени файла в сортировке (os.listdir(self.mask_folder))] self.indexes = np.arange(len(self.image_paths)) # Определить пользовательское увеличение данных self.data_augmentation = ImageDataGenerator( диапазон вращения_=30, ширина_шифт_диапазон=0,2, height_shift_range=0,2, диапазон_сдвига=0,2, масштаб_диапазона = 0,2, Horizontal_flip = Верно, вертикальный_флип = Правда, fill_mode = 'отражать' ) защита __len__(сам): return int(np.ceil(len(self.image_paths)/self.batch_size)) Защиту load_and_preprocess_images (self, image_paths): изображения = [] для пути в image_paths: img = load_img(путь, target_size=self.target_size) img = img_to_array(img) img = img/255.0 img = preprocess_input (img) images.append(img) вернуть np.array(изображения) def load_and_preprocess_masks(self, Mask_paths): маски = [] для пути в Mask_paths: маска = cv2.imread(path, cv2.IMREAD_GRAYSCALE) # Считать маску как изображение в оттенках серого маска = cv2.resize(mask, self.target_size, interpolation=cv2.INTER_NEAREST) # Изменение размера маски маска = to_categorical (маска, self.num_class) Masks.append(маска) вернуть np.array(маски) def __getitem__(сам, индекс): начало = индекс * self.batch_size конец = (индекс + 1) * self.batch_size package_image_paths = self.image_paths[начало:конец] package_mask_paths = self.mask_paths[начало:конец] X = self.load_and_preprocess_images(batch_image_paths) y = self.load_and_preprocess_masks(batch_mask_paths) # Применить увеличение данных к X и y seed = np.random.randint(0, 1000) # Случайное начальное число для аугментации X = self.apply_data_augmentation(X, начальное число) y = self.apply_data_augmentation(y, начальное число) вернуть Х, у def apply_data_augmentation (сам, изображения, семя): augmented_images = [] для img в изображениях: img = self.data_augmentation.random_transform(img, семя=семя) augmented_images.append(img) вернуть np.array(augmented_images) # Определите пути к папкам изображений и масок train_image_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/training/" train_mask_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/masks/training/" val_image_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/validation/" val_mask_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/masks/validation/" target_size = (256, 256) # Установите желаемый целевой размер train_data_generator = CustomDataGenerator (папка_изображения поезда, папка_маски поезда, размер_пакета, num_class=num_class, target_size=target_size) val_data_generator = CustomDataGenerator(val_image_folder, val_mask_folder, package_size, num_class=num_class, target_size=target_size) #Определите метрики модели и загрузите модель. num_train_imgs = len(os.listdir('C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/training/')) num_val_images = len(os.listdir('C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/validation/')) шагов_за_эпоху = num_train_imgs//batch_size val_steps_per_epoch = num_val_images//batch_size IMG_HEIGHT = x.shape[1] IMG_WIDTH = x.shape[2] IMG_CHANNELS = x.shape[3] # определить модель модель = sm.Linknet(BACKBONE, encoder_weights='imagenet', input_shape = (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), классы=num_class, активация='softmax') # Добавьте в свою модель пользовательский показатель точности пикселей. из tensorflow.keras.metrics Точность импорта # Скомпилируйте модель, используя как оценку IoU, так и точность в качестве показателей. model.compile('Адам', loss=sm.losses.categorical_focal_jaccard_loss, metrics=[sm.metrics.iou_score, Accuracy()]) # Распечатать сводную информацию о модели и ввести форму печать(model.summary()) печать (модель.input_shape) #Обучите модель. история = model.fit(train_data_generator, шаги_per_epoch=steps_per_epoch, эпох=25, подробный = 1, validation_data=val_data_generator, validation_steps=val_steps_per_epoch) model.save('landcover_25_epochs_RESNET_backbone_batch16.hdf5')
Я пытаюсь выполнить семантическую сегментацию изображений на спутниковых снимках высокого разрешения (25 см) для классификации земного покрова. Я уже пытался использовать предварительно обученную модель U-Net с магистралью ResNet34, но столкнулся с двумя основными проблемами:
1). Оценка модели «Пересечение через объединение» (IoU) довольно низкая, что указывает на то, что результаты сегментации плохо согласуются с основными истинными метками. 2). Функция потерь, используемая во время обучения, очень высока, что говорит о том, что модель с трудом сходится и изучает значимые представления данных.
Мне нужны предложения и рекомендации по решению этих проблем. В частности, меня интересуют стратегии повышения производительности модели, уменьшения потерь и, возможно, изучения альтернативных моделей, которые могут лучше подойти для этой задачи по сравнению с U-Net с ResNet34.
импортировать файл tiff как tiff импортировать numpy как np из последовательности импорта tensorflow.keras.utils импортировать ОС из sklearn.preprocessing импорт MinMaxScaler из keras.utils импорт в_categorical из tensorflow.keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator импортировать cv2 импортировать сегментационные_модели как sm # Определите генератор изображений и масок, чтобы мы могли читать их прямо с диска. img_dim = 256 семя = 24 размер_пакета = 32 num_class = 9 # Используйте это для предварительной обработки ввода для трансферного обучения МАГАЗИН = 'resnet34' preprocess_input = sm.get_preprocessing(BACKBONE) класс CustomDataGenerator (Последовательность): def __init__(self, image_folder, маска_folder, package_size, num_class, target_size): self.image_folder = image_folder self.mask_folder = маска_папка self.batch_size = размер_пакета self.num_class = num_class self.target_size = целевой_размер self.image_paths = [os.path.join(self.image_folder, filename) для имени файла в сортировке (os.listdir(self.image_folder))] self.mask_paths = [os.path.join(self.mask_folder, filename) для имени файла в сортировке (os.listdir(self.mask_folder))] self.indexes = np.arange(len(self.image_paths)) # Определить пользовательское увеличение данных self.data_augmentation = ImageDataGenerator( диапазон вращения_=30, ширина_шифт_диапазон=0,2, height_shift_range=0,2, диапазон_сдвига=0,2, масштаб_диапазона = 0,2, Horizontal_flip = Верно, вертикальный_флип = Правда, fill_mode = 'отражать' ) защита __len__(сам): return int(np.ceil(len(self.image_paths)/self.batch_size)) Защиту load_and_preprocess_images (self, image_paths): изображения = [] для пути в image_paths: img = load_img(путь, target_size=self.target_size) img = img_to_array(img) img = img/255.0 img = preprocess_input (img) images.append(img) вернуть np.array(изображения) def load_and_preprocess_masks(self, Mask_paths): маски = [] для пути в Mask_paths: маска = cv2.imread(path, cv2.IMREAD_GRAYSCALE) # Считать маску как изображение в оттенках серого маска = cv2.resize(mask, self.target_size, interpolation=cv2.INTER_NEAREST) # Изменение размера маски маска = to_categorical (маска, self.num_class) Masks.append(маска) вернуть np.array(маски) def __getitem__(сам, индекс): начало = индекс * self.batch_size конец = (индекс + 1) * self.batch_size package_image_paths = self.image_paths[начало:конец] package_mask_paths = self.mask_paths[начало:конец] X = self.load_and_preprocess_images(batch_image_paths) y = self.load_and_preprocess_masks(batch_mask_paths) # Применить увеличение данных к X и y seed = np.random.randint(0, 1000) # Случайное начальное число для аугментации X = self.apply_data_augmentation(X, начальное число) y = self.apply_data_augmentation(y, начальное число) вернуть Х, у def apply_data_augmentation (сам, изображения, семя): augmented_images = [] для img в изображениях: img = self.data_augmentation.random_transform(img, семя=семя) augmented_images.append(img) вернуть np.array(augmented_images) # Определите пути к папкам изображений и масок train_image_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/training/" train_mask_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/masks/training/" val_image_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/validation/" val_mask_folder = "C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/masks/validation/" target_size = (256, 256) # Установите желаемый целевой размер train_data_generator = CustomDataGenerator (папка_изображения поезда, папка_маски поезда, размер_пакета, num_class=num_class, target_size=target_size) val_data_generator = CustomDataGenerator(val_image_folder, val_mask_folder, package_size, num_class=num_class, target_size=target_size) #Определите метрики модели и загрузите модель. num_train_imgs = len(os.listdir('C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/training/')) num_val_images = len(os.listdir('C:/Users/AdekunleAdeoya/Desktop/workfolder/images/data_for_keras_aug/images/validation/')) шагов_за_эпоху = num_train_imgs//batch_size val_steps_per_epoch = num_val_images//batch_size IMG_HEIGHT = x.shape[1] IMG_WIDTH = x.shape[2] IMG_CHANNELS = x.shape[3] # определить модель модель = sm.Linknet(BACKBONE, encoder_weights='imagenet', input_shape = (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), классы=num_class, активация='softmax') # Добавьте в свою модель пользовательский показатель точности пикселей. из tensorflow.keras.metrics Точность импорта # Скомпилируйте модель, используя как оценку IoU, так и точность в качестве показателей. model.compile('Адам', loss=sm.losses.categorical_focal_jaccard_loss, metrics=[sm.metrics.iou_score, Accuracy()]) # Распечатать сводную информацию о модели и ввести форму печать(model.summary()) печать (модель.input_shape) #Обучите модель. история = model.fit(train_data_generator, шаги_per_epoch=steps_per_epoch, эпох=25, подробный = 1, validation_data=val_data_generator, validation_steps=val_steps_per_epoch) model.save('landcover_25_epochs_RESNET_backbone_batch16.hdf5')
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Повышение точности набора данных FlickrLogos32 с помощью YOLO [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-