Рубрики
Без рубрики

Сегментация оздоровления опухоли мозга с использованием архитектуры U-NET.

Загрузите образец DataSet MRI из моего GitHub. Файлы входных изображений в формате .jpg и пах … Теги с Python, начинающими, учебниками, карьерой.

Загрузите образец 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”