Так вот, если tf я юзаю, есть Николенко тот же, и с этим хозяйством более-менее как-то понятно, в то время как я с торчем не работал, и вот до сих пор неясно почему его надо пробовать.
Я не против TF, сам с ним тоже работаю, бывает. Пробовать PyTorch можно, хотя бы, ради интереса (ну и, статический граф vs динамический граф + всё как в питоне). А так на вкус и цвет, каждому своё.
Владимир, кстати, небезызвестный на kaggle Thomas Van De Wiele, попал в DeepMind, сюдя по его статусу, благодаря kaggle. https://www.kaggle.com/tvdwiele Так что, возможно, и другим повезёт ;)
Сама программа немного тупит на загрузке базы изображений, но потом все довольно плавно. При редактирование разметки, приходится использовать мышь (не особо искал, если есть шорткаты). Вот как-то так.
Как насчет приложения sloth?
Можно размечать изображения точками, прямоугольниками, многоугольниками, связанными с различными классами. Пример. Мне кажется, тоже удобно.
Действительно, в статье не совсем понятно, как был рассчитан размер receptive field. Попробую сам ответить на ваш вопрос. Далее привожу собственные вычисления (могут быть ошибки)
Как посчитать размер receptive field сети DetectNet
Все расчеты можно проводить в 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
В итоге получаем, что для расчета одного пикселя этой сети нужно 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) :
Несложно посчитать, что 7 сверточных слоев имеют receptive field = 29.
7 * Conv(5/1/2) ~ [4*7 + 1] = [29]
Чтобы понять, как получить данный результат, посмотрите на рисунок ниже, где изображены три слоя Conv(5/1/2). Видно, что receptive field = 13 = 4*3 + 1.
Далее идет слой 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).
Следующие два слоя 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 (этот похоже "платный") итд. Правда, не уверен, насчет без разметки.
Я не против TF, сам с ним тоже работаю, бывает. Пробовать PyTorch можно, хотя бы, ради интереса (ну и, статический граф vs динамический граф + всё как в питоне). А так на вкус и цвет, каждому своё.
Мне как-то наоборот было немного лень писать такую программу и вот нашлось уже готовое open-source приложение…
В нем тоже можно связывать кнопки клавиатуры с классами для разметки. Классы для раметки и тип разметки можно конфигурировать, например :
На выходе json файл типа
Сама программа немного тупит на загрузке базы изображений, но потом все довольно плавно. При редактирование разметки, приходится использовать мышь (не особо искал, если есть шорткаты). Вот как-то так.
Как насчет приложения sloth?
Можно размечать изображения точками, прямоугольниками, многоугольниками, связанными с различными классами. Пример. Мне кажется, тоже удобно.
А можно для забывчивых ссылку на то, как вычисляются эти картинки? Спасибо
И на последнем этапе, не совсем так:
receptive field = 275*2 + 5 = 555
Формула
W = (W’ - 1)*S + F - 2*P
не подходит для расчета.Пардон, вот изображения:
Действительно, в статье не совсем понятно, как был рассчитан размер 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, они будут верны и для изображений
Обозначения:
Сначала можно показать, что размер эквивалентного receptive field необязательно меньше размера входных данных.
Пример c небольшой сеткой :
Модель сети :
Представим, что на вход подается изображение размером 8х8. Используя формулы из cs231 получаем следующие размеры данных после каждого слоя (опуская количество фильтров):
Conv/Pool:
W2 = (W1 - F + 2*P) / S + 1
Посчитаем теперь размер receptive field для этой сети. Опишу, понятный мне графический подход.
Если начать с выходных данных сети, рассмотрим один пиксель из данных [2x2], он получен из двух (в 1D) пикселей поступающих на слой Pool2:
В свою очередь, пиксели p_1 и p_2 получены из 4 пикселей поступающих на слой Conv2 (шаг = 1):
Далее, в обратном направлении, идет слой Pool1, получаем:
И последний слой Conv1 дает следующее:
В итоге получаем, что для расчета одного пикселя этой сети нужно 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) :
Несложно посчитать, что 7 сверточных слоев имеют
receptive field = 29
.Чтобы понять, как получить данный результат, посмотрите на рисунок ниже, где изображены три слоя Conv(5/1/2). Видно, что
receptive field = 13 = 4*3 + 1
.Далее идет слой 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
).Следующие два слоя 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 (этот похоже "платный") итд. Правда, не уверен, насчет без разметки.