Caffe, как предсказывать по предварительно обученной сети

Я использую этот код для загрузки своей сети:

net = caffe.Classifier(MODEL_FILE, PRETRAINED,
                   mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1),
                   channel_swap=(2,1,0),
                   raw_scale=255,
                   image_dims=(256, 256))

У меня есть сомнения по трем строчкам.

1- mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)

Что это значит? Должен ли я использовать это среднее значение или другое? И если да, где я могу получить пользовательское среднее значение? Я использую пользовательский набор данных.

2- channel_swap=(2,1,0)

Что означает channel_swap? И опять же, следует ли использовать это значение или пользовательское значение?

И последнее

3- raw_scale=255

Что такое raw_scale? И какое значение я должен использовать?

Я использую набор данных Кон Канаде. Все изображения 64x64 и в оттенках серого.


person Caaarlos    schedule 17.11.2015    source источник


Ответы (2)


channel_swap означает инвертировать RGB в BGR, что, по-видимому, необходимо, если вы используете сетевую модель эталонного изображения, основываясь на комментарии в [1]. В вашем случае изображения имеют оттенки серого, поэтому у вас, вероятно, нет трех каналов. Возможно, вам придется установить его на (0, 0, 0), но даже это может не помочь (я не уверен в точной реализации channel_swap). Если это не помогает, самым простым решением может быть предварительная обработка данных путем разделения каждого пикселя на три значения (RGB) с одинаковыми значениями. После этого вы можете вообще отказаться от channel_swap, потому что ваши каналы имеют одинаковое значение, и поменять их местами не получится.

Среднее значение — это то, что будет вычтено из ваших входных данных для их центрирования. (Помните, что нейронным сетям нужно, чтобы данные имели нулевое среднее значение, в то время как входные изображения обычно имеют положительное среднее, отсюда и необходимость вычитания). Среднее значение, которое вы вычитаете, должно совпадать с тем, которое использовалось для обучения, поэтому правильно использовать среднее значение из файла, связанного с моделью. Однако я не уверен, следует ли вам вызывать для него .mean(1) -- вы взяли эту строку из какого-то примера? Если да, то, скорее всего, это правильный поступок.

raw_scale — это шкала ваших входных данных. Модель ожидает, что пиксели будут нормализованы, поэтому, если ваши входные данные имеют значения от 0 до 255, то raw_scale, установленное на 255, является правильным. Если ваши данные имеют значения от 0 до 1, то raw_scale должно быть установлено на 1.

Наконец, исходя из моего понимания комментария в [2], вам не нужно предоставлять image_dims

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L204

[2] https://github.com/BVLC/caffe/blob/master/python/caffe/classifier.py#L18

person Ishamael    schedule 17.11.2015
comment
Спасибо, я получил этот код на этом сайте. Я не использую Imaginet, я просто искал в Google «предсказание кофе из предварительно обученной модели». Итак, я должен изменить среднее значение на (0,0,0), а не использовать channel_swap и raw_scale на 1/126. Потому что 126 — это среднее значение оттенков серого в моем наборе данных. Я прав? - person Caaarlos; 17.11.2015
comment
Если 126 — это ваше среднее значение, то raw_scale — это 255 (raw_scale — это диапазон, а не среднее значение). Для среднего вам нужно использовать среднее значение набора данных, которое использовалось для обучения используемой вами модели. Какую именно модель вы используете? Для channel_swap в вашем случае он не нужен, это правильно. - person Ishamael; 17.11.2015
comment
Ишамаэль, не могли бы вы объяснить мне, что вы имеете в виду под какой именно моделью вы пользуетесь? Я не понял этого. Caffe и convnet появились у меня совсем недавно. - person Caaarlos; 18.11.2015
comment
Каково значение MODEL_FILE и PRETRAINED_FILE? - person Ishamael; 18.11.2015
comment
Это мой файл_модели. - person Caaarlos; 18.11.2015
comment
У меня проблемы с созданием файла развертывания. Я уже удалил слой данных, но все равно получаю сообщение об ошибке. Это мой файл train.prototxt. Не могли бы вы помочь мне решить мою проблему или я должен задать новый вопрос? - person Caaarlos; 18.11.2015
comment
Всегда предпочтительнее создавать новый вопрос для новой проблемы, чтобы другие люди также видели его и могли ответить, используя ответы вместо комментариев. Это также помогает тем, кто находит эти вопросы позже, поскольку делает вопросы и ответы более согласованными друг с другом. - person Ishamael; 18.11.2015
comment
Итак, как я уже сказал, это был мой файл model_file. Я создам новый вопрос, и после того, как я решу свой вопрос о развертывании, я снова спрошу здесь. Ok? Могу ли я опубликовать здесь ссылку на мой новый вопрос? - person Caaarlos; 18.11.2015
comment
Ишамаэль, это мой вопрос - person Caaarlos; 18.11.2015

Я согласен с комментариями @Ishamael по поводу channel_swap и имею в виду. Я просто хотел добавить дополнительные разъяснения по поводу raw_scale. Предполагая, что изображения загружаются с caffe.io.load_image, значения всегда находятся в диапазоне от 0 до 1 [1]. Просто отметить, что:

В то время как Python представляет изображения в [0, 1], некоторые модели Caffe CaffeNet и AlexNet представляют изображения в [0, 255], поэтому raw_scale этих моделей должен быть 255.

И я думаю, что разумно проверять значения входного изображения перед подачей на уровень данных сети, чтобы выбрать соответствующий raw_scale.

Спасибо.

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L224

person accssharma    schedule 03.03.2017