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

Комментарии 12

Да, тоже хотел написать пост, но всё ленился. Наверное даже напишу ещё, так как у вас нет ничего про применимость и использование.
Про DIGITS. Он очень неплох, но нельзя очень много вещей настраивать, а хотелось бы. По сути говоришь «распознай», он берёт какой-нить VGG16 и распознаёт. Но тюнинговать и настраивать не умеет. Тем не менее, мне кажеться что нужный и послезный инструмент.

По поводу простоты установки сразу скажу, что это немного не так:) Просто должен ставиться под 14 убунту, если у вас свежая система и не последняя видюха. В остальных ситуациях стоит приготовиться к сборке DIGITS+CAFFE. Это на пол дня.
ZlodeiBaal, Да, напишите что-нибудь про применимость. С удовольствием читаю ваши статьи, мне самому будет интересно.
В остальных ситуациях стоит приготовиться к сборке DIGITS+CAFFE. Это на пол дня.

Да ладно, вроде бы оно безпроблемно собирается с cmake'а за час...:-\
Но как-то caffe уже не тащит, сейчас статьи поперли сплошняком с кодом на tf.

Собирается. Пока не начинаются различные конфликты и прочие прелести:)
У меня 16 убунта + 1080 даже при установке только caffe это часа 3 шаманства. А DIGITS, который на днях ставил — это ещё часа 3 у меня заняло.
В DIGITS ещё Torch есть, кстати.
А не подскажете насколько большой у них датасет с картинками? Не хочется у них зарегестрироваться и обнаружить что там данных 1-2 Тб которые некуда выкачать )

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


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

Ясно, спасибо большое.
А можете пояснить, как у них получилось, что окошко размера 555x555? Вроде бы у оригинального GoogLeNet вход 224x224

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


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

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


image


image

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

Спасибо за пояснение!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации