8

Я хотел бы классифицировать пиксели изображения на «улица» или «не улица». У меня есть данные обучения от KITTI dataset, и я видел, что у Caffe есть тип слоя IMAGE_DATA. Этикетки находятся в виде изображений того же размера, что и входное изображение.Может ли Caffe классифицировать пиксели изображения напрямую?

Помимо Caffe, моей первой идеей решить эту проблему было предоставление графических патчей вокруг пикселя, которые должны быть классифицированы (например, 20 пикселей в верхнюю/левую/правую/нижнюю часть, в результате чего 41 × 41 = 1681 на пиксель Я хочу, чтобы классифицировать.
Однако, если бы я мог сказать, Caffe, как использовать этикетки без необходимости создавать эти заплатки изображения вручную (и тип слоя IMAGE_DATA, кажется, предполагает, что это возможно), я предпочел бы, что.

Может ли Caffe классифицировать пиксели изображения напрямую? Как бы выглядела такая определение прототипной сети? Как мне предоставить информацию о методах Caffe?

Я предполагаю, что входной слой будет что-то вроде

layers { 
    name: "data" 
    type: IMAGE_DATA 
    top: "data" 
    top: "label" 
    image_data_param { 
    source: "path/to/file_list.txt" 
    mean_file: "path/to/imagenet_mean.binaryproto" 
    batch_size: 4 
    crop_size: 41 
    mirror: false 
    new_height: 256 
    new_width: 256 
    } 
} 

Однако я не уверен, что crop_size точно означает. Это действительно сосредоточено? Как caffe обрабатывает угловые пиксели? Что такое new_height и new_width хорошо?

+0

ваш вопрос очень большой в смысле, что он касается многих предметов. Можете ли вы «разбить» его на более мелкие вопросы? одна тема для вопроса? вы можете (и должны?) связывать вопросы, чтобы дать контекст. – Shai

+0

См. Также: [Вопрос о группах Google] (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/caffe-users/AjcfGsxpWrc/lu4YBhWrwA0J) –

ответ

7

Кажется, вы можете попробовать fully convolutional networks for semantic segmentation

Caffe был приведен в этой статье: https://github.com/BVLC/caffe/wiki/Publications

Также здесь модель: https://github.com/BVLC/caffe/wiki/Model-Zoo#fully-convolutional-semantic-segmentation-models-fcn-xs

Кроме того, это представление может быть полезным: http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-pixels.pdf

+0

Это то, что мы на самом деле сделали. Однако это не так прямолинейно, чтобы получить эту работу. –

+0

Следует также упомянуть, что вы должны использовать вилку Caffe –

+0

@moose. Пожалуйста, напишите ссылку на fork. – mrgloom

8

Может ли Caffe классифицировать пиксели? в теории я думаю, что ответ «Да». Я сам не пробовал, но я не думаю, что вам что-то мешает.

Входов:
Вам нужны два IMAGE_DATA слой: один, который загружает изображение RGB и другие, который загружает соответствующего пометки изображения маски. Обратите внимание: если вы используете утилиту convert_imageset, вы не можете перетасовывать каждый набор независимо - вы не сможете сопоставить изображение с его маской-меткой.

В слое «IMAGE_DATA» есть два «вершины» для «данных», а один для «метки». Я предлагаю вам установить «метку» обоих входных слоев на индекс изображения/метки-маски и добавить утилиту слой, который проверяет, что индексы всегда матчи, это предотвратит вас от тренировки на неправильные метки масок;)

Пример:

layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "data-idx" 
    # paramters... 
} 
layer { 
    name: "label-mask" 
    type: "ImageData" 
    top: "label-mask" 
    top: "label-idx" 
    # paramters... 
} 
layer { 
    name: "assert-idx" 
    type: "EuclideanLoss" 
    bottom: "data-idx" 
    bottom: "label-idx" 
    top: "this-must-always-be-zero" 
} 

Loss слой:
Теперь вы можете сделать все, что вы как и входные данные, но в конечном итоге для получения меток с пиксельной меткой вам нужна потеря пикселя. Таким образом, вы должны иметь свой последний слой (до потери), чтобы предсказать с то же самое значение, как и "label-mask". Не все слои потерь знают, как обрабатывать несколько ярлыков, но "EuclideanLoss" (например) может, поэтому вы должны иметь потеря слой что-то вроде

layer { 
    name: "loss" 
    type: "EuclideanLoss" 
    bottom: "prediction" # size on image 
    bottom: "label-mask" 
    top: "loss" 
} 

Я думаю "SoftmaxWithLoss" имеет более новую версию, которая может быть использована в этом случае, но вы должны проверить это нашим себя. В этом случае "prediction" должен иметь форму 2 на h-by-w (так как у вас есть две метки).

Дополнительные примечания:
После того, как вы установите размер входа в параметрах "ImageData" вы исправить размеры всех сгустков сети. Вы должны установить размер метки такого же размера. Вы должны тщательно рассмотреть, как вы собираетесь иметь дело с изображениями различной формы и размеров.

+0

Я попытался решить основные вопросы, поднятые в вашем вопросе о деталях параметров слоя IMAGE_DATA, пожалуйста, задайте другой конкретный вопрос о них. – Shai

+0

Не могли бы вы объяснить более конкретно, почему форма должна быть 2-х-х-х-ш. Насколько я понял, EuclideanLoss должен иметь те же размеры, что и метка, т. Е. Если метка представляет собой изображение в оттенках серого, то будет только один канал, и поэтому предсказание должно иметь форму 1 по h-by-w ? – thigi

+0

Каким будет 'num_output' в последнем сверточном слое или вы используете« полностью подключенный слой »и соответствующим образом изменяете выход? @Shai @Martin Thoma – thigi

Смежные вопросы