Пиксельная потеря веса для сегментации изображения в Керасе - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время я использую модифицированную версию U-Net (https://arxiv.org/pdf/1505.04597.pdf) для сегментирования клеточных органелл на микроскопических изображениях. Поскольку я использую Keras, я взял код из https://github.com/zhixuhao/unet. Однако в В этой версии карта весов не реализована, чтобы заставить сеть изучать пиксели границы.

Результаты, которые я получил до сих пор, довольно хороши, но сеть не может разделить объекты, которые находятся близко друг к другу. Поэтому я хочу попробовать использовать карту весов, упомянутую в статье. Мне удалось сгенерировать карту весов (на основе заданной формулы) для каждого изображения метки, но я не смог выяснить, как использовать эту карту весов для обучения моей сети и, таким образом, решить вышеупомянутую проблему.

Нужно ли каким-либо образом комбинировать карты весов и изображения этикеток, или есть функция Keras, которая позволит мне использовать карты весов? Я биолог, который только недавно начал работать с нейронными сетями, поэтому мое понимание все еще ограничено. Любая помощь или совет будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

В случае, если это все еще актуально: мне нужно было решить это недавно. Вы можете вставить приведенный ниже код в блокнот Jupyter, чтобы посмотреть, как он работает.

%matplotlib inline
import numpy as np
from skimage.io import imshow
from skimage.measure import label
from scipy.ndimage.morphology import distance_transform_edt

def generate_random_circles(n = 100, d = 256):
    circles = np.random.randint(0, d, (n, 3))
    x = np.zeros((d, d), dtype=int)
    f = lambda x, y: ((x - x0)**2 + (y - y0)**2) <= (r/d*10)**2
    for x0, y0, r in circles:
        x += np.fromfunction(f, x.shape)
    x = np.clip(x, 0, 1)

    return x

def unet_weight_map(y, wc=None, w0 = 10, sigma = 5):

    """
    Generate weight maps as specified in the U-Net paper
    for boolean mask.

    "U-Net: Convolutional Networks for Biomedical Image Segmentation"
    https://arxiv.org/pdf/1505.04597.pdf

    Parameters
    ----------
    mask: Numpy array
        2D array of shape (image_height, image_width) representing binary mask
        of objects.
    wc: dict
        Dictionary of weight classes.
    w0: int
        Border weight parameter.
    sigma: int
        Border width parameter.

    Returns
    -------
    Numpy array
        Training weights. A 2D array of shape (image_height, image_width).
    """

    labels = label(y)
    no_labels = labels == 0
    label_ids = sorted(np.unique(labels))[1:]

    if len(label_ids) > 1:
        distances = np.zeros((y.shape[0], y.shape[1], len(label_ids)))

        for i, label_id in enumerate(label_ids):
            distances[:,:,i] = distance_transform_edt(labels != label_id)

        distances = np.sort(distances, axis=2)
        d1 = distances[:,:,0]
        d2 = distances[:,:,1]
        w = w0 * np.exp(-1/2*((d1 + d2) / sigma)**2) * no_labels

        if wc:
            class_weights = np.zeros_like(y)
            for k, v in wc.items():
                class_weights[y == k] = v
            w = w + class_weights
    else:
        w = np.zeros_like(y)

    return w

y = generate_random_circles()

wc = {
    0: 1, # background
    1: 5  # objects
}

w = unet_weight_map(y, wc)

imshow(w)
0 голосов
/ 09 мая 2018

Я думаю, вы хотите использовать class_weight в Керасе.Это на самом деле просто ввести в вашу модель, если вы уже рассчитали весовые коэффициенты класса.

  1. Создайте словарь с вашими метками классов и связанными с ними весами.Например,

    class_weight = {0: 10.9,
            1: 20.8,
            2: 1.0,
            3: 50.5}
    
  2. Или создайте одномерный массив Numpy той же длины, что и количество классов.Например,

    class_weight = [10.9, 20.8, 1.0, 50.5]
    
  3. Передайте этот параметр во время обучения на вашем model.fit или model.fit_generator

    model.fit(x, y, batch_size=batch_size, epochs=num_epochs, verbose=1, class_weight=class_weight)
    

Вы можете посмотреть вверхдокументация Keras для более подробной информации здесь .

...