Если вы хотите использовать MXNet, как это сделать с переменным размером пакета в data_shapes? - PullRequest
0 голосов
/ 15 мая 2018

Привет , У меня вопрос, как я могу сделать прогноз с нефиксированными входными данными? Я постараюсь подробно описать: Я использую MTCNN для обнаружения лица (это нормально, незнакомо с этим), и он использует 3 сети: PNet, RNet, ONet. PNet обнаруживает массу ограничивающих рамок граней предложений, затем эти блоки грубо облагаются остальной сеткой одна за другой, и в итоге получают точные грани bbox. При получении изображения в качестве входных данных в PNet, размер изображения не фиксирован, и номер ящика с выходным предложением из PNet также не фиксирован, как RNet, ONet. Ссылка на другой код MTCNN Я устанавливаю большие data_shapes (например, размер изображения, размер пакета), когда я связываю модуль, и инициализирую все в ноль, затем делаю прогноз. Это работает, хотя, это не избыточный расчет? (Вопрос 1)

Pnet:

max_img_w=1000
max_img_h=1000
sym, arg_params, aux_params = mx.model.load_checkpoint(‘det1’, 0)
self.PNets = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.PNets.bind(data_shapes=[(‘data’, (1, 3, max_img_w, max_img_h))],for_training=False)
self.PNets.set_params(arg_params,aux_params)

Rnet

sym, arg_params, aux_params = mx.model.load_checkpoint(‘det2’, 0)
self.RNet = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.RNet.bind(data_shapes=[(‘data’, (2048,3, 24, 24))],for_training=False)
self.RNet.set_params(arg_params,aux_params,allow_missing=True)

он

sym, arg_params, aux_params = mx.model.load_checkpoint(‘det3’, 0)
self.ONet = mx.mod.Module(symbol=sym, context=ctx,label_names=None)
self.ONet.bind(data_shapes=[(‘data’, (256, 3, 48, 48))],for_training=False)
self.ONet.set_params(arg_params,aux_params,allow_missing=True)

И я пробую mx.mod.Module.reshape перед прогнозированием, который будет корректировать форму данных в соответствии с последним выходом сети, но я получаю эту ошибку: (Вопрос 2) AssertionError: Форма неопределенного массива arg: prob1_label изменена. Это может привести к тому, что новый исполнитель не поделится параметрами со старым. Пожалуйста, проверьте на наличие ошибок в сети. Если это необходимо, установите значениеpart_shaping = True, чтобы подавить это предупреждение.

Еще одна вещь состоит в том, что код MTCNN (https://github.com/pangyupo/mxnet_mtcnn_face_detection) устаревшая функция основного использования для загрузки моделей:

self.PNet = mx.model.FeedForward.load(‘det1’,0)

Одна строка для работы с произвольными формами данных, почему эта функция не рекомендуется ..? (Вопрос 3) Я обнаружил небольшую разницу в том, что после загрузки модели FeedFroward занимает 0 МБ памяти, прежде чем сделать один прогноз, но mx.mod.Module занимает память после загрузки и, очевидно, увеличивается после одного прогноза.

1 Ответ

0 голосов
/ 30 мая 2018

Вы можете использовать MXNet императивный API Gluon, и это позволит вам использовать пакеты разных размеров.

Если, как и в этом случае, ваша модель была обучена с использованием символического API или была экспортирована в сериализованный формат MXNet (например, '-0001.params', '-symbol.json'), вы можете загрузить ее в Gluon таким образом:

ctx = mx.cpu()

sym = mx.sym.load_json(open('det1-symbol.json', 'r').read())
PNet = gluon.nn.SymbolBlock(outputs=sym, inputs=mx.sym.var('data'))
PNet.load_params('det1-0001.params', ctx=ctx)

Тогда вы можете использовать его следующим образом:

# a given batch size (1)
data1 = mx.nd.ones((1, C, W, H))
output1 = PNet(data1)

# a different batch size (5)
data2 = mx.nd.ones((5, C, W, H))
output2 = PNet(data2)

И это сработало бы.

Вы можете начать работу с MXNet Gluon с официального 60-минутного ускоренного курса

...