Перейти к содержимому
Compvision.ru

Recommended Posts

За счёт чего в оригинальной статье получают 'сглаженный' результат? даже для FCN-32S, где по идее должно быть увеличении сжатого блоба в 32 раза.

https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/voc-fcn32s/train.prototxt

https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf

 

Я пробовал такую версию на базе VGG16 или проблема в том, что Conv2DTranspose не подходит?

def get_fcn_vgg16_32s(inputs):
    
    bn = BatchNormalization()(inputs)
    
    # Block 1
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(bn)
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

    # Block 2
    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

    # Block 3
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

    # Block 4
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

    # Block 5
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)
    
    x = Conv2D(128, (3, 3), activation='relu', padding="same")(x)
    
    x = Conv2DTranspose(128, kernel_size=(32, 32), strides=(32, 32), padding='same')(x)
    
    return x 

 

binary_crossentropy_result.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 32 шаг свертки больше, результат грубее получается чем в 16 или 8.

Восьмерка самая аккуратная по опыту. А так то там, можно вероятности получить размыть и по порогу отсечь должно как раз дать плавные границы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мой вопрос не в этом, а в том что у меня явно видны блоки как у jpeg сжатия, а у них плавные границы, хоть и грубые.

 

Походу там stride 32, а kernel 64, а у меня 32 и 32, надо попробовать.

https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/pascalcontext-fcn32s/train.prototxt#L505

Хотя и не понятно как ' Deconvolution ' слой в caffe работает по сравнению с Conv2DTranspose.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да в этом и было дело.

Кстати попробовал сделать не сразу 64 32, а 5 раз по 2 2 и не заработало, хотя вот в unet как раз 2 2 используется.

https://github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.py#L55 

 

Еще непонятно в чем смысл падинга и кропа в оригинальной сетке на caffe?

https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/voc-fcn32s/train.prototxt#L27

https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/voc-fcn32s/train.prototxt#L509

 

 

Запилил пример на keras по мотивам https://github.com/ZFTurbo/ZF_UNET_224_Pretrained_Model

Пока добавил unet, segnet, fcn.

https://github.com/mrgloom/keras-semantic-segmentation-example

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понял что pad и crop нужен для того чтобы подавать изображения на которые сетка 'не расчитана', т.е. чтобы не получалось дробных значений, когда мы сжимаем блоб в 32 раза (для vgg16).

 

Еще не понятно как у них учится без взвешивания классов:

https://arxiv.org/pdf/1605.06211.pdf

Class balancing
Fully  convolutional  training  can  balance  classes  by  weighting  or  sampling  the  loss.  Although our  labels  are  mildly  unbalanced  (about 3/4 are  background), we find class balancing unnecessary.

 

У меня на Pascal Voc 2012 у которого 70% background class обучается так, что предсказывает всё как background, пробовал так же убирать этот класс и так же предсказывает больше классы которые более представлены в выборке по кол-ву пикселей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1) Чтобы гладенько с Deconvolution апскейлилось, нужно их инициализировать весами bilinear-интерполяции. Ну и шаг там должен быть таким, чтобы ядра с нахлестом друг на друга шли.

2) падинги и кропы - это попытки победить краевые эффекты, когда на границе feature map'ы отклики получаются не вполне адекватными.

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну тут вот без нахлеста работает, т.е. (2, 2), strides=(2, 2), видимо потому что concatenation идёт с нормальными слоями без дырок и это компенсирует.

https://github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.py#L55

Я пробовал на FCN 5 раз по (2, 2) и были артефакты насколько помню.

 

Краевые эффекты от того что padding='same', добивается нулями? где то можно про это почитать?

 

В caffe репе они кстати пишут:

Цитата

Why pad the input?: The 100 pixel input padding guarantees that the network output can be aligned to the input for any input size in the given datasets, for instance PASCAL VOC. The alignment is handled automatically by net specification and the crop layer. It is possible, though less convenient, to calculate the exact offsets necessary and do away with this amount of padding.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 minutes ago, mrgloom said:

Краевые эффекты от того что padding='same', добивается нулями? где то можно про это почитать?

Типа того, из статей, с этим бились и явно указывали на такой артефакт в статье про UNet.

 

6 minutes ago, mrgloom said:

Ну тут вот без нахлеста работает, т.е. (2, 2), strides=(2, 2), видимо потому что concatenation идёт с нормальными слоями без дырок и это компенсирует.

В Unet апсемплят по чуть-чуть, поэтому там итак работает.

 

7 minutes ago, mrgloom said:

Я пробовал на FCN 5 раз по (2, 2) и были артефакты насколько помню.

Без skip-connections ступенчатые декодеры отвраттельно работают.

 

з.ы. а зачем ты используешь  FCN, причем такой извращеный с апсемплингом в 32 раза?

13 minutes ago, mrgloom said:

В caffe репе они кстати пишут:

Вообще в "боевых" архитектурах обычно не кропают края.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

> Типа того, из статей, с этим бились и явно указывали на такой артефакт в статье про UNet.

Так там это в контексте того, что изображение тайлится, а потом склеивается, а если целиком пихать то норм, не?

>Без skip-connections ступенчатые декодеры отвраттельно работают.

Segnet (без unpooling'а с индексами как в оригинальной статье) у меня нормально работает, или о каких декодерах речь?

> з.ы. а зачем ты используешь  FCN, причем такой извращеный с апсемплингом в 32 раза?

Я не в продакшн, а для бенчмарка.

>Вообще в "боевых" архитектурах обычно не кропают края.

Тогда надо размер изображения подгонять под конкретную сеть, например чтобы на 32 делилось целиком (для VGG16).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
On 1/9/2018 at 11:30 PM, mrgloom said:

Segnet (без unpooling'а с индексами как в оригинальной статье) у меня нормально работает, или о каких декодерах речь?

Ну он дерьмово и работает) Качество плохое, эффективность сети низкая.

 

On 1/9/2018 at 11:30 PM, mrgloom said:

Тогда надо размер изображения подгонять под конкретную сеть, например чтобы на 32 делилось целиком (для VGG16).

Размер всегда надо подгонять, чтобы в сети слои стыковались корректно) А на выходе всегда можно билинейно апсемплить к выходному сайзу, чтобы инпут с аутпутом по размеру совпадали.

 

On 1/9/2018 at 11:30 PM, mrgloom said:

Так там это в контексте того, что изображение тайлится, а потом склеивается, а если целиком пихать то норм, не?

Можно и без кропов, тот-же PSPNet даже с тайлингом ничего не кропал, а просто с нахлестом тайлы вычисляет, а потом усредняет в стыках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×