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

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

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

    Мне как-то наоборот было немного лень писать такую программу и вот нашлось уже готовое 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"
        },
        ...
    ]

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

  • Колыбель для AI
    +1

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

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

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

  • DetectNet: Deep Neural Network для Object Detection в DIGITS
    0

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

  • DetectNet: Deep Neural Network для Object Detection в DIGITS
    0

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


    image


    image

  • DetectNet: Deep Neural Network для Object Detection в DIGITS
    0

    Действительно, в статье не совсем понятно, как был рассчитан размер 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


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

  • DetectNet: Deep Neural Network для Object Detection в DIGITS
    0

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


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

  • DetectNet: Deep Neural Network для Object Detection в DIGITS
    0
    ZlodeiBaal, Да, напишите что-нибудь про применимость. С удовольствием читаю ваши статьи, мне самому будет интересно.