Комментарии 12
Про DIGITS. Он очень неплох, но нельзя очень много вещей настраивать, а хотелось бы. По сути говоришь «распознай», он берёт какой-нить VGG16 и распознаёт. Но тюнинговать и настраивать не умеет. Тем не менее, мне кажеться что нужный и послезный инструмент.
По поводу простоты установки сразу скажу, что это немного не так:) Просто должен ставиться под 14 убунту, если у вас свежая система и не последняя видюха. В остальных ситуациях стоит приготовиться к сборке DIGITS+CAFFE. Это на пол дня.
В остальных ситуациях стоит приготовиться к сборке DIGITS+CAFFE. Это на пол дня.
Да ладно, вроде бы оно безпроблемно собирается с cmake'а за час...:-\
Но как-то caffe уже не тащит, сейчас статьи поперли сплошняком с кодом на tf.
Насколько я понял из примеров (тут или тут), датасет с картинками они не дают, зато предлагают использовать базу KITTI.
Регистрация только дает возможность скачать стабильную версию кода DIGITS, которая и так доступна на github здесь. Если, все же, требуются спутниковые снимки, то, может быть, стоит посмотреть открытые базы от aws: landsat 8 или spacenet (этот похоже "платный") итд. Правда, не уверен, насчет без разметки.
Действительно, в статье не совсем понятно, как был рассчитан размер 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 для этой сети. Опишу, понятный мне графический подход.
Если начать с выходных данных сети, рассмотрим один пиксель из данных [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
.
Далее идет слой 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
Надеюсь, что-то из моего объяснения разъясняет, фразу из статьи.
DetectNet: Deep Neural Network для Object Detection в DIGITS