Как стать автором
Обновить
16
0

Пользователь

Отправить сообщение
Так вот, если tf я юзаю, есть Николенко тот же, и с этим хозяйством более-менее как-то понятно, в то время как я с торчем не работал, и вот до сих пор неясно почему его надо пробовать.

Я не против TF, сам с ним тоже работаю, бывает. Пробовать PyTorch можно, хотя бы, ради интереса (ну и, статический граф vs динамический граф + всё как в питоне). А так на вкус и цвет, каждому своё.

Владимир, кстати, небезызвестный на kaggle Thomas Van De Wiele, попал в DeepMind, сюдя по его статусу, благодаря kaggle. https://www.kaggle.com/tvdwiele Так что, возможно, и другим повезёт ;)
Спасибо за статью! Действительно, было увлекательное соревнования и привет с 31 места

Мне как-то наоборот было немного лень писать такую программу и вот нашлось уже готовое open-source приложение…


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


Конфигурация
LABELS = (
    {"attributes": {"type":  "rect",
                    "class": "head"},
     "item":     "sloth.items.RectItem",
     "inserter": "sloth.items.RectItemInserter",
     "text":     "Head",
     "hotkey":   "w"
    },

    {"attributes": {"type":  "rect",
                    "class": "rhand"},
     "item":     "sloth.items.RectItem",
     "inserter": "sloth.items.RectItemInserter",
     "text":     "Right Hand",
     "hotkey":   "d",
    },

    {"attributes": {"type":  "rect",
                    "class": "lhand"},
     "item":     "sloth.items.RectItem",
     "inserter": "sloth.items.RectItemInserter",
     "text":     "Left Hand",
     "hotkey":   "a",
    },

    {"attributes": {"type":  "rect",
                    "class": "steer_wheel"},
     "item":     "sloth.items.RectItem",
     "inserter": "sloth.items.RectItemInserter",
     "text":     "Steering wheel",
     "hotkey":   "s",
    },
)

На выходе json файл типа


json
[
    {
        "annotations": [
            {
                "class": "head",
                "height": 150.0,
                "type": "rect",
                "width": 155.0,
                "x": 52.0,
                "y": 48.0
            },
            {
                "class": "lhand",
                "height": 51.0,
                "type": "rect",
                "width": 52.0,
                "x": 420.0,
                "y": 96.0
            },
            {
                "class": "rhand",
                "height": 73.0,
                "type": "rect",
                "width": 71.0,
                "x": 458.0,
                "y": 110.0
            },
            {
                "class": "steer_wheel",
                "height": 214.0,
                "type": "rect",
                "width": 115.0,
                "x": 406.0,
                "y": 99.0
            }
        ],
        "class": "image",
        "filename": "train\\c0\\img_34.jpg"
    },
    ...
]

Сама программа немного тупит на загрузке базы изображений, но потом все довольно плавно. При редактирование разметки, приходится использовать мышь (не особо искал, если есть шорткаты). Вот как-то так.

Как насчет приложения sloth?
Можно размечать изображения точками, прямоугольниками, многоугольниками, связанными с различными классами. Пример. Мне кажется, тоже удобно.

Напомню, как выглядят рецепторные области нейронов на разных уровнях и какие признаки они извлекают.

А можно для забывчивых ссылку на то, как вычисляются эти картинки? Спасибо

И на последнем этапе, не совсем так: receptive field = 275*2 + 5 = 555
Формула W = (W’ - 1)*S + F - 2*P не подходит для расчета.

Пардон, вот изображения:


image


image

Действительно, в статье не совсем понятно, как был рассчитан размер receptive field. Попробую сам ответить на ваш вопрос. Далее привожу собственные вычисления (могут быть ошибки)


Как посчитать размер receptive field сети DetectNet


Здесь, скорей всего, речь идет о том, что, к примеру, два сверточных слоя размером 3х3, подобны одному сверточному слою 5х5 [1: Prefer a stack of small filter CONV to one large receptive field CONV layer.]


Все расчеты можно проводить в 1D, они будут верны и для изображений
Обозначения:


  • Conv(F/S/P) — сверточный слой с размером ядра F, шагом S и размером подложки P
  • Pool(F/S/P) — слой pool с размером ядра F, шагом S и размером подложки P

Сначала можно показать, что размер эквивалентного receptive field необязательно меньше размера входных данных.


Пример c небольшой сеткой :


Модель сети :


Data -> Conv(3/1/1) -> Pool(2/2/0) -> Conv(3/1/1) -> Pool(2/2/0) -> Result

Представим, что на вход подается изображение размером 8х8. Используя формулы из cs231 получаем следующие размеры данных после каждого слоя (опуская количество фильтров):
Conv/Pool: W2 = (W1 - F + 2*P) / S + 1


[8x8] -> Conv1(3/1/1) -> [8x8] -> Pool1(2/2/0) -> [4x4] -> Conv2(3/1/1) -> [4x4] -> Pool2(2/2/0) -> [2x2]

Посчитаем теперь размер receptive field для этой сети. Опишу, понятный мне графический подход.


image


Если начать с выходных данных сети, рассмотрим один пиксель из данных [2x2], он получен из двух (в 1D) пикселей поступающих на слой Pool2:


p -> Pool2(2/2/0) -> {p_1, p_2}

В свою очередь, пиксели p_1 и p_2 получены из 4 пикселей поступающих на слой Conv2 (шаг = 1):


p_1 -> {pp_1, pp_2, pp_3}
p_2 -> {pp_2, pp_3, pp_4}

Далее, в обратном направлении, идет слой Pool1, получаем:


pp_1 -> {ppp_1, ppp_2}
pp_2 -> {ppp_3, ppp_4}
pp_3 -> {ppp_5, ppp_6}
pp_4 -> {ppp_7, ppp_8}

И последний слой Conv1 дает следующее:


ppp_1 -> {pppp_1, pppp_2, pppp_3}
ppp_2 -> {pppp_2, pppp_3, pppp_4}
ppp_3 -> {pppp_3, pppp_4, pppp_5}
…
ppp_7 -> {pppp_7, pppp_8, pppp_9}
ppp_8 -> {pppp_8, pppp_9, pppp_10}

В итоге получаем, что для расчета одного пикселя этой сети нужно 10 пикселей данных. При этом, мы можем на вход подать данные размером 8 пикселей (недостающие данные идут из подложки слоев). Таким образом, receptive field равен 10.


Сеть DetectNet и ее подсеть GoogLeNet


Вот ссылка на изображение графа сети DetectNet. Если проанализировать маршрут данных через сеть и выбирать ветки, в которых слои имеют наибольшие значения receptive field, то получаем, что сеть можно представить (в обратном направлении) как 7 Conv(5/1/2), Pool(3/20), 2 Pool(3/2/0), Conv(3/1/1), Pool(3/2/0), Conv(7/2/3) :


Result <- Conv_5b(5/1/2) <- Conv_5a(5/1/2) <- Conv_4e(5/1/2) <-  … <- Conv_4a(5/1/2) <- Pool_3(3/2/0) <- Conv_3b(5/1/2) <- Conv_3a(5/1/2) <- Pool_2(3/2/0) <- Conv_2(3/1/1) <- Pool_1(3/2/0) <- Conv_1(7/2/3) <- Data

Несложно посчитать, что 7 сверточных слоев имеют receptive field = 29.


7 * Conv(5/1/2) ~ [4*7 + 1] = [29]

Чтобы понять, как получить данный результат, посмотрите на рисунок ниже, где изображены три слоя Conv(5/1/2). Видно, что receptive field = 13 = 4*3 + 1.


image


Далее идет слой Pool(3/2/0) и новый receptive field = 29 * 2 + 1 = 59. Чтобы понять, как получить данный результат, посмотрите на рисунок ниже, где изображен слой Pool(3/2/0), на который подается 9 пикселей и на выходе получается 4. Таким образом, если на выходе Pool(3/2/0) имеем M пикселей, то на вход подается 2*M + 1 (обратная формула расчета W’ = (W - F)/S + 1).


image


Следующие два слоя Conv(5/1/2) добавляют 8 пикселей в receptive field, receptive field = 59 + 8 = 67.
Далее снова идет слой Pool(3/2/0) и получаем receptive field = 67 * 2 + 1 = 135. Слой Conv(3/1/1) добавляет еще 2 пикселя, receptive field = 135 + 2 = 137. Далее снова идет слой Pool(3/2/0) и получаем receptive field = 137 * 2 + 1 = 275.


И наконец, для слоя Conv(7/2/3) получаем следующее: W = (W’ - 1)*S + F - 2*P = 2*W’ + 1 и receptive field = 275*2 + 1 = 555


Надеюсь, что-то из моего объяснения разъясняет, фразу из статьи.

Насколько я понял из примеров (тут или тут), датасет с картинками они не дают, зато предлагают использовать базу KITTI.


Регистрация только дает возможность скачать стабильную версию кода DIGITS, которая и так доступна на github здесь. Если, все же, требуются спутниковые снимки, то, может быть, стоит посмотреть открытые базы от aws: landsat 8 или spacenet (этот похоже "платный") итд. Правда, не уверен, насчет без разметки.

ZlodeiBaal, Да, напишите что-нибудь про применимость. С удовольствием читаю ваши статьи, мне самому будет интересно.

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность