Загрузите образец DataSet MRI из моих Github Отказ Файлы входных изображений находятся в формате .jpg, а Marktruth находится в формате .xml. Есть отсутствующие файлы для формирования полного набора данных для процесса сегментации.
Цель данных набора данных заключается в том, чтобы обеспечить исследовательское сообщество ресурсом для продвижения современного выявления в обнаружении, сегментации и классификации и классификации, а также помощь в целях оценки недостатков существующих методов. Для мечественной области мы предоставляем расположение с точки зрения ограничивающих коробок, классификаций. Мы также предоставляем подробное описание нашего конвейера аннотации. Результаты показывают, что некоторые методы достигают превосходной точности обнаружения и Хорошая точность транскрипции
Обработка изображений – это любая форма обработки сигналов, для которой вход является изображением, таким как фотография или видеокадра, а выход обработки изображений может быть либо изображением, либо набором характеристик или параметров, связанных с изображением. Большинство методов обработки изображений включают в себя обработку изображения в качестве двумерного сигнала и нанесение стандартных методов обработки сигналов к нему.
Сегментация изображения – это процесс разбивания изображения в несколько сегментов. Сегментация изображения обычно используется для определения местоположения объектов и границ в изображениях. Представляет результат сегментации изображения бедренного бедствия. Он показывает внешнюю поверхность (красную), поверхность между компактной костью и губчатой костью (зеленым) и поверхностью костного мозга (синего цвета). Тестирование применило пример сегментации изображения для демонстрации метода PSO для поиска лучших кластеров сегментации изображения. Результаты показали, что PSO работает на 170% быстрее, когда он использовал графический процессор в параллельном режиме, отличный от того, что только подержал ЦП, для количества частиц 100. Этот ускорение растет, поскольку количество частиц становится выше.
Импорт пакетов, которые нам нужно выполнить
import numpy as np import pandas as pd from matplotlib import pyplot as plt import tensorflow as tf import re import glob import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import ast from PIL import Image, ImageDraw
Изображение определяется и расположено в рядах и столбцах
plt.subplots() def image_show(image, nrows=1, ncols=1, cmap='gray'): fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(14, 14)) ax.imshow(image, cmap='gray') ax.axis('off') return fig, ax
def read_xml(filename): with open(filename, 'r') as f: lines = f.readlines() return lines
filenames = glob.glob("thyroid/*") images = [x for x in filenames if x.endswith(".jpg")] segments = [x for x in filenames if x.endswith(".xml")]
pattern = r'"points"(.*?)"annotation"' segments = segments[segments["mark"].apply(lambda x: len(re.findall(pattern, x))<=2)]
from ast import literal_eval # test = segments.loc[segments['img_id']=="thyroid/88_1.jpg"] test = segments.iloc[0,:] l = test['mark']#.get_values()[0] # l = literal_eval(test['mark'])[0] i = 0 t = 0 test_1 = re.findall(r'\d+', l) dims = len(test_1)//2 temp = np.empty([dims, 2]) temp while i < dims: temp[i] = (test_1[t], test_1[t+1]) i = i+1 t = t+2
fig, ax = image_show(Image.open('thyroid/197_1.jpg'), cmap='gray') ax.plot(temp[:, 0], temp[:, 1], '.r',lw=3)
pattern = r'"points"(.*?)"annotation"' segments["mark_1"] = segments["mark"].apply(lambda x: re.findall(pattern, x)[0]) segments["mark_2"] = segments["mark"].apply(lambda x: re.findall(pattern, x)[1] if len(re.findall(pattern, x)) > 1 else "")
temp_1 = segments[["img_id","mark_1"]].copy() temp_2 = segments[["img_id","mark_2"]].copy() temp_1=temp_1.rename(columns = {'mark_1':'mark'}) temp_2=temp_2.rename(columns = {'mark_2':'mark'}) frames = [temp_1, temp_2] df_new = pd.concat(frames,ignore_index = True) df_new.head()
def parse_mark(mark): i = 0 t = 0 test_1 = re.findall(r'\d+', mark) dims = len(test_1)//2 temp = np.empty([dims, 2]) while i < dims: temp[i] = (test_1[t], test_1[t+1]) i = i+1 t = t+2 return temp
Окончательный набор данных готов содержать изображения, маскирует изображения, маскиристым изображениям, несколько сегментированных масок изображений, контуры изображений, наложение изображений и One_segmented_masks И он состоит из общего количества 1965 года.
Unet был впервые разработан специально для сегментации медицинской помощи. Он показал такие хорошие результаты, которые он использовал во многих других полях после. В этой статье мы поговорим о том, почему и как работает NOT. Архитектура выглядит как «U», которая оправдывает свое имя. Эта архитектура состоит из трех разделов: Сокращение, узкое место и раздел расширения. Секция сокращения выполнена из многих блоков сжатия. Каждый блок принимает вход, который применяет две слои для свертывания 3×3, за которыми следуют балубирование 2×2 Max. Количество ядер или карты функций после каждого блока удваивается, так что архитектура может эффективно изучать сложные структуры. Оздоровительный слой медиатируется между слоем сжатия и слоем расширения. Он использует два слоя 3×3 CNN, за которым следует 2×2 вверх слой свертки. Аналогично на слое сжатия, он также состоит из нескольких блоков расширения. Каждый блок передает ввод до двух слоев 3×3 CNN, за которым следует 2×2, слой повышенного использования.
Я реализовал модель NOT, используя Pytorch Framework. Вы можете проверить модуль NOT для моего настроенного набора данных.
import os import numpy as np from skimage.io import imread, imshow, concatenate_images from skimage.transform import resize from skimage.morphology import label import tensorflow as tf from keras.models import Model, load_model from keras.layers import Input, BatchNormalization, Activation, Dense, Dropout from keras.layers.core import Lambda, RepeatVector, Reshape from keras.layers.convolutional import Conv2D, Conv2DTranspose from keras.layers.pooling import MaxPooling2D, GlobalMaxPool2D from keras.layers.merge import concatenate, add from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau from keras.optimizers import Adam from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img import os import random import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.style.use("ggplot") %matplotlib inline from tqdm import tqdm_notebook, tnrange from itertools import chain from sklearn.model_selection import train_test_split def conv2d_block(input_tensor, n_filters, kernel_size = 3, batchnorm = True): """Function to add 2 convolutional layers with the parameters passed to it""" # first layer x = Conv2D(filters = n_filters, kernel_size = (kernel_size, kernel_size),\ kernel_initializer = 'he_normal', padding = 'same')(input_tensor) if batchnorm: x = BatchNormalization()(x) x = Activation('relu')(x) # second layer x = Conv2D(filters = n_filters, kernel_size = (kernel_size, kernel_size),\ kernel_initializer = 'he_normal', padding = 'same')(input_tensor) if batchnorm: x = BatchNormalization()(x) x = Activation('relu')(x) return x def get_unet(input_img, n_filters = 8, dropout = 0.2, batchnorm = True): """Function to define the UNET Model""" # Contracting Path c1 = conv2d_block(input_img, n_filters * 1, kernel_size = 3, batchnorm = batchnorm) p1 = MaxPooling2D((2, 2))(c1) p1 = Dropout(dropout)(p1) c2 = conv2d_block(p1, n_filters * 2, kernel_size = 3, batchnorm = batchnorm) p2 = MaxPooling2D((2, 2))(c2) p2 = Dropout(dropout)(p2) c3 = conv2d_block(p2, n_filters * 4, kernel_size = 3, batchnorm = batchnorm) p3 = MaxPooling2D((2, 2))(c3) p3 = Dropout(dropout)(p3) c4 = conv2d_block(p3, n_filters * 8, kernel_size = 3, batchnorm = batchnorm) p4 = MaxPooling2D((2, 2))(c4) p4 = Dropout(dropout)(p4) c5 = conv2d_block(p4, n_filters = n_filters * 16, kernel_size = 3, batchnorm = batchnorm) # Expansive Path u6 = Conv2DTranspose(n_filters * 8, (3, 3), strides = (2, 2), padding = 'same')(c5) u6 = concatenate([u6, c4]) u6 = Dropout(dropout)(u6) c6 = conv2d_block(u6, n_filters * 8, kernel_size = 3, batchnorm = batchnorm) u7 = Conv2DTranspose(n_filters * 4, (3, 3), strides = (2, 2), padding = 'same')(c6) u7 = concatenate([u7, c3]) u7 = Dropout(dropout)(u7) c7 = conv2d_block(u7, n_filters * 4, kernel_size = 3, batchnorm = batchnorm) u8 = Conv2DTranspose(n_filters * 2, (3, 3), strides = (2, 2), padding = 'same')(c7) u8 = concatenate([u8, c2]) u8 = Dropout(dropout)(u8) c8 = conv2d_block(u8, n_filters * 2, kernel_size = 3, batchnorm = batchnorm) u9 = Conv2DTranspose(n_filters * 1, (3, 3), strides = (2, 2), padding = 'same')(c8) u9 = concatenate([u9, c1]) u9 = Dropout(dropout)(u9) c9 = conv2d_block(u9, n_filters * 1, kernel_size = 3, batchnorm = batchnorm) outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9) model = Model(inputs=[input_img], outputs=[outputs]) return model
Установить параметры (изменить размер все изображения в высоту и ширину)
im_width = 128 im_height = 128 border = 5
for n, id_ in tqdm_notebook(enumerate(ids), total=len(ids)): # Load images img = load_img("./data/images/"+id_, grayscale=True) x_img = img_to_array(img) x_img = resize(x_img, (128, 128, 1), mode = 'constant', preserve_range = True) # Load masks mask_orig = img_to_array(load_img("./data/masks_inverted/"+id_, grayscale=True)) mask = resize(mask_orig, (128, 128, 1), mode = 'constant', preserve_range = True) # Save images X[n] = x_img/255.0 y[n] = mask/255.0
Сплит поезда и действительный набор данных
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.1, random_state=42) #Calculate test size ratio test_size = (X_valid.shape[0]/X_train.shape[0]) # Split train and test X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=test_size, random_state=42) y_train.shape y_train_plt = y_train.reshape(1571, 128, 128) import matplotlib.pyplot as plt plt.imshow(y_train_plt[179, :,:], cmap='gray')
Выход показан ниже
plt.figure(figsize=(8, 8)) plt.title("Learning curve") plt.plot(results.history["loss"], label="loss") plt.plot(results.history["val_loss"], label="val_loss") plt.plot( np.argmin(results.history["val_loss"]), np.min(results.history["val_loss"]), marker="x", color="r", label="best model") plt.xlabel("Epochs") plt.ylabel("log_loss") plt.legend();
Выход кривой обучения – это поставленные потери против эпохи, как показано ниже
ix = random.randint(0, len(preds_val)) print(ix) plot_sample(X_test, y_test, preds_test, preds_test_t,ix=ix) threshold =.4082 binarize = .1 intersection = np.logical_and(y_test[ix].squeeze() > binarize, preds_test[ix].squeeze() > threshold) union = np.logical_or(y_test[ix].squeeze() > binarize, preds_test[ix].squeeze() > threshold) iou=np.sum(intersection) / np.sum(union) print('IOU:',iou)
plt.figure(figsize=(8, 8)) acc = results.history['acc'] val_acc = results.history['val_acc'] epochs = range(len(acc)) plt.plot(epochs, acc, 'r', label='Training acc') plt.plot(epochs, val_acc, 'b', label='Validation acc') plt.title('Training and validation accuracy') plt.legend() plt.figure()
results = model.fit(X_train, y_train, batch_size=32, epochs=50, callbacks=callbacks,\validation_data=(X_valid, y_valid))
Сегментация изображения является важной проблемой, и каждый день публикуются некоторые новые исследовательские документы. UNET значительно внес вклад в такие исследования. Многие новые архитектуры вдохновлены unet. Но все же, так много, чтобы исследовать. В отрасли существует так много вариантов этой архитектуры, и, следовательно, необходимо понять первую, чтобы понять их лучше. Так что, если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте ниже.
Оригинал: “https://dev.to/sairajesh/brain-tumour-image-segmentation-using-u-net-architecture-35mf”