Как преобразовать VGG из даркнета в тензорный поток?

Я пытаюсь преобразовать существующую модель VGG (обученную на 1 классе) из формата Darknet (включая файл .cfg и файл .weights) в формат TensorFlow. Конечная цель - использовать файлы в формате TensorFlow с Intel OpenVINO Toolkit.

В качестве первоначальной попытки я попытался использовать DW2TF, но обнаружил ошибки при запуске программы.

Сначала я попытался использовать официальные файлы, представленные на веб-сайте pjreddie, и столкнулся со следующей ошибкой.

Я специально не ищу прямого решения указанной ниже ошибки, вместо этого я ищу лучший способ конвертировать VGG в формате Darknet в TensorFlow или любые другие пути, чтобы я мог использовать модель с Intel OpenVINO Toolkit. Любые комментарии и предложения приветствуются.

Спасибо за прочтение.


Используемая команда:

python3 main.py\
--cfg data/vgg-16.cfg\
--weights data/vgg-16.weights\
--output output\
--gpu 0

Получена ошибка:

0 Tensor("network/net1:0", shape=(?, 256, 256, 3), dtype=float32)
=> Ignore:  {'name': 'crop', 'crop_height': '224', 'crop_width': '224', 'flip': '1', 'exposure': '1', 'saturation': '1', 'angle': '0'}
1 Tensor("network/net1:0", shape=(?, 256, 256, 3), dtype=float32)
2 Tensor("network/convolutional1/Activation:0", shape=(?, 256, 256, 64), dtype=float32)
3 Tensor("network/convolutional2/Activation:0", shape=(?, 256, 256, 64), dtype=float32)
4 Tensor("network/maxpool1/MaxPool:0", shape=(?, 128, 128, 64), dtype=float32)
5 Tensor("network/convolutional3/Activation:0", shape=(?, 128, 128, 128), dtype=float32)
6 Tensor("network/convolutional4/Activation:0", shape=(?, 128, 128, 128), dtype=float32)
7 Tensor("network/maxpool2/MaxPool:0", shape=(?, 64, 64, 128), dtype=float32)
8 Tensor("network/convolutional5/Activation:0", shape=(?, 64, 64, 256), dtype=float32)
9 Tensor("network/convolutional6/Activation:0", shape=(?, 64, 64, 256), dtype=float32)
10 Tensor("network/convolutional7/Activation:0", shape=(?, 64, 64, 256), dtype=float32)
11 Tensor("network/maxpool3/MaxPool:0", shape=(?, 32, 32, 256), dtype=float32)
12 Tensor("network/convolutional8/Activation:0", shape=(?, 32, 32, 512), dtype=float32)
13 Tensor("network/convolutional9/Activation:0", shape=(?, 32, 32, 512), dtype=float32)
14 Tensor("network/convolutional10/Activation:0", shape=(?, 32, 32, 512), dtype=float32)
15 Tensor("network/maxpool4/MaxPool:0", shape=(?, 16, 16, 512), dtype=float32)
16 Tensor("network/convolutional11/Activation:0", shape=(?, 16, 16, 512), dtype=float32)
17 Tensor("network/convolutional12/Activation:0", shape=(?, 16, 16, 512), dtype=float32)
18 Tensor("network/convolutional13/Activation:0", shape=(?, 16, 16, 512), dtype=float32)
19 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
=> Ignore:  {'name': 'connected', 'output': '4096', 'activation': 'relu'}
20 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
=> Ignore:  {'name': 'dropout', 'probability': '.5'}
21 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
=> Ignore:  {'name': 'connected', 'output': '4096', 'activation': 'relu'}
22 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
=> Ignore:  {'name': 'dropout', 'probability': '.5'}
23 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
=> Ignore:  {'name': 'connected', 'output': '1000', 'activation': 'linear'}
24 Tensor("network/maxpool5/MaxPool:0", shape=(?, 8, 8, 512), dtype=float32)
Traceback (most recent call last):
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1628, in _create_c_op
    c_op = c_api.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 8 for 'network/softmax1/Squeeze' (op: 'Squeeze') with input shapes: [?,8,8,512].

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 112, in <module>
    main(args)
  File "main.py", line 53, in main
    parse_net(args.layers, args.cfg, args.weights, args.training)
  File "main.py", line 33, in parse_net
    training=training, const_inits=const_inits, verbose=verbose)
  File "/home/acusensus/usb_accel_proj/DW2TF/util/cfg_layer.py", line 198, in get_cfg_layer
    layer = _cfg_layer_dict.get(layer_name, cfg_ignore)(B, H, W, C, net, param, weights_walker, stack, output_index, scope, training, const_inits, verbose)
  File "/home/acusensus/usb_accel_proj/DW2TF/util/cfg_layer.py", line 169, in cfg_softmax
    net = tf.squeeze(net, axis=[1, 2], name=scope+'/Squeeze')
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 488, in new_func
    return func(*args, **kwargs)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 2573, in squeeze
    return gen_array_ops.squeeze(input, axis, name)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py", line 8236, in squeeze
    "Squeeze", input=input, squeeze_dims=axis, name=name)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 488, in new_func
    return func(*args, **kwargs)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3274, in create_op
    op_def=op_def)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1792, in __init__
    control_input_ops)
  File "/home/acusensus/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1631, in _create_c_op
    raise ValueError(str(e))
ValueError: Can not squeeze dim[1], expected a dimension of 1, got 8 for 'network/softmax1/Squeeze' (op: 'Squeeze') with input shapes: [?,8,8,512].


person cla1n    schedule 26.06.2019    source источник
comment
Я понимаю, что, возможно, я не идеально задал вопрос. Но для тех, кто когда-либо голосовал против, не могли бы вы хотя бы прокомментировать причину? Я хотел бы стать лучше любым возможным способом.   -  person cla1n    schedule 26.06.2019


Ответы (1)


Я предлагаю вам посмотреть нижеприведенное руководство, чтобы получить хорошее руководство по преобразованию Yolov3 в OpenVINO xml, формат bin.

Вам также следует проверить свою версию Tensorflow, попробуйте понизить ее до 1.12. Методы, описанные в этом руководстве, у меня сработали.

Идея состоит в том, чтобы получить инструмент для пересчета веса от

Затем преобразуйте его с помощью скрипта convert_weights_pb.py, чтобы подготовить его к преобразованию формата IR.

person O Dundar    schedule 17.07.2019
comment
Спасибо за предложение. Я действительно получил YOLOv3, работающий как для конфигурации по умолчанию, так и для настраиваемой конфигурации, используя аналогичный рабочий процесс, который вы описали. У меня сейчас проблема с классификатором VGG, который, к сожалению, еще не отработан. - person cla1n; 18.07.2019
comment
Я только что загрузил конфигурацию / веса VGG с сайта pjreddie. Мне удалось преобразовать, как я предлагал выше. 1) Перейти на Tensorflow 1.12, 2) запустить convert_weights_pb.py, и у вас есть замороженная модель в формате .pb. Оптимизатор модели еще не пробовал. - person O Dundar; 18.07.2019
comment
Спасибо за продолжение! Возможно, я совершил ошибку в процессе конвертации. Я вернусь и повторю процедуру еще раз, как вы предложили. - person cla1n; 19.07.2019
comment
Инструмент преобразования tensorflow-yolo-v3 работает, но выходной файл не работает с оптимизатором. Одна вещь, которую я обнаружил из исходных кодов tensorflow-yolo-v3, заключается в том, что процедура жестко запрограммирована для yolo-v3 или yolo-v3-tiny, поэтому они не конвертируются правильно. - person cla1n; 19.07.2019