Keras to ONNX problem

參照3.1.1 Keras to ONNX報錯

指令如下:

python /workspace/scripts/convert_model.py keras /docker_mount/tiny_yolo_weights.h5 /docker_mount/convert_tiny.onnx


錯誤訊息:

Using TensorFlow backend.

Traceback (most recent call last):

 File "/workspace/libs/ONNX_Convertor/keras-onnx/generate_onnx.py", line 32, in <module>

  converter.loadFromFile(args.kfile)

 File "/workspace/libs/ONNX_Convertor/keras-onnx/onnx_keras/frontend.py", line 48, in loadFromFile

  self.kmodel = Kmodels.load_model(kpath, custom_objects={ 'tf': tf, 'relu6': helper.relu6 })

 File "/workspace/miniconda/lib/python3.7/site-packages/keras/engine/saving.py", line 419, in load_model

  model = _deserialize_model(f, custom_objects, compile)

 File "/workspace/miniconda/lib/python3.7/site-packages/keras/engine/saving.py", line 221, in _deserialize_model

  model_config = f['model_config']

 File "/workspace/miniconda/lib/python3.7/site-packages/keras/utils/io_utils.py", line 302, in __getitem__

  raise ValueError('Cannot create group in read only mode.')

ValueError: Cannot create group in read only mode.

Traceback (most recent call last):

 File "/workspace/scripts/convert_model.py", line 58, in <module>

  args.input_model], check=True)

 File "/workspace/miniconda/lib/python3.7/subprocess.py", line 512, in run

  output=stdout, stderr=stderr)

subprocess.CalledProcessError: Command '['python', '/workspace/libs/ONNX_Convertor/keras-onnx/generate_onnx.py', '-o', '/docker_mount/tiny_yolo.onnx', '-O', '--duplicate-shared-weights', '/docker_mount/tiny_yolo_weights.h5']' returned non-zero exit status 1.

how do i fix problem, thanks.

Comments

  • Hi,

    我剛這邊跑一下,發現你的模型tiny_yolo_weights.h5, 是不是只有weights? 如果你這模型只有這個,我們是不支援的.

    但你可以參考

    https://www.kneron.com/forum/discussion/53/example-keras-kl520-how-to-convert-and-compile-tiny-yolo-v3-from-github-project#latest

    裡面有跟你說如何轉跟範例.. thanks

  • Hi,

    參考 https://www.kneron.com/forum/discussion/53/example-keras-kl520-how-to-convert-and-compile-tiny-yolo-v3-from-github-project#latest

    Step 4: save weight and model architecture into one h5 file (2021/03/29 Update)

    this project provide us a script to convert the weights file

    python convert.py yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny-weights.h5

    將其中yolov3-tiny.weights換成自己的weights後,Step 5~7都能成功執行

    但最後Step 8: quantization and compiling出現以下錯誤,請問如何解決?謝謝


  • Hi Ellen,

    Could you please provide the original keras model (dummy weight is fine)?


    Thanks

    Bike

  • edited March 2021

    Hi Bike,

    我們的model是根據

    https://github.com/Adamdad/keras-YOLOv3-mobilenet

    train.py 生成的 tiny yolo model


    能否套用在你們提供的

    https://www.kneron.com/forum/discussion/53/example-keras-kl520-how-to-convert-and-compile-tiny-yolo-v3-from-github-project#latest

    呢?

    再麻煩您確認

    謝謝


    Ellen

  • edited March 2021

    Hi Ellen,

    上面提到的 forum 中的 yolo example 已经被重新编辑整理成了 step by step 的教程,见 http://doc.kneron.com/docs/#toolchain/yolo_example/

    根据你的链接生成的 yolov3-tiny 模型完全没有问题,不如说应该和我们那个 step by step 的教程提到的 repo 是一致的。只需要把命令中的 yolov3 替换成 yolov3-tiny 即可。下面是我执行过的指令,可以做以参考:

    # 获取 tiny yolo 的 dummy weight 
    wget https://pjreddie.com/media/files/yolov3-tiny.weights
    # 生成 h5
    python convert.py yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.h5
    # 转成 onnx 并优化
    python /workspace/libs/ONNX_Convertor/keras-onnx/generate_onnx.py /data1/yolov3-tiny.h5 -o /data1/yolov3-tiny.onnx -O --duplicate-shared-weights -I 1 416 416 3
    python /workspace/libs/ONNX_Convertor/optimizer_scripts/onnx2onnx.py /data1/yolov3-tiny.onnx -o /data1/yolov3-tiny.opt.onnx -t
    # 编辑 input_params.json
    # Quantize 生成 bie
    python /workspace/scripts/fpAnalyserCompilerIpevaluator_520.py -c /data1/input_params.json -t 4
    # 编辑 batch_input_params.json
    # Batch compile 生成 nef
    python /workspace/scripts/batchCompile_520.py -c /data1/batch_input_params.json
    

    最后生成的 yolov3-tiny.opt.onnx 就是我们 toolchain 可以处理的。

  • Hi Jiyuan Liu,

    謝謝回覆

     yolo example step by step 可以成功執行

    您提供的tiny yolo sample(從網路上下載的weights)也可以生成 yolov3-tiny.opt.onnx


    但我們根據 https://github.com/Adamdad/keras-YOLOv3-mobilenet train.py 生成的 tiny yolo model 是 train_weights_final.h5

    請問 train_weights_final.h5 就是 yolov3-tiny.weights 嗎?

    我試著將 step4. python convert. yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.h5 的yolov3-tiny.weights改成我們train出來的weights

    會出現上圖的錯誤

    請問該怎麼解決?謝謝

    Ellen

  • Hi Ellen,


    train_weights_final.h5跟yolov3-tiny.weights是不同的東西,

    train_weights_final.h5是keras格式的weight file. 使用netron查看的話看起來像這樣:


    它不需要過python convert.py的步驟.

    你可以參考 https://github.com/Adamdad/keras-YOLOv3-mobilenet 中yolo.py的程式碼把weight file與model architecture合在一起並save出.h5. 看起來會像下面這樣:

    這樣格式的h5檔案,可以直接使用toolchain中keras2onnx來轉換.

  • Hi Quote,

    關於上述回復了解train_weights_final.h5只有weight, 因此需再結合model architecture

    但在yolo.py的程式碼沒有看到能將兩者合在一起的部分

    我是從train.py的

    ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',

            monitor='val_loss', save_weights_only=True, save_best_only=True, period=3)

    修改 save_weights_only=False

    過程中存出的就會是 weight file+model architecture

    也有使用netron查看如下圖:


    再將這個檔案 epxxx.h5 套用到

    1. python /workspace/libs/ONNX_Convertor/keras-onnx/generate_onnx.py /data1/ epxxx.h5 -o /data1/yolov3-tiny.onnx -O --duplicate-shared-weights -I 1 416 416 3

    做轉換

    但會得到以下錯誤訊息

     File "d:\ARCS\keras-YOLOv3-mobilenet\yolo3\model.py", line 376, in yolo_loss

    NameError: name 'yolo_head' is not defined

    是否還有哪部分的參數需做設定?

    謝謝協助.


    Ellen

  • Hi Ellen,

    抱歉你所提供的截圖解析度太差沒辦法清楚的看到裡面的資訊,不知道你是否方便直接提供你的epxxx.h5讓我們確認?

  • Hi Ethon,

    因為.h5檔案太大無法上傳,提供大一點的截圖,謝謝



  • Hi Ellen,


    你的model含有Lambda layer, 我們並不支援這個type的轉換, 必須想辦法拿掉這個layer.


    修改source code是一個方法, 可以參考tutorial中step 5 (remove redundant layer):

    https://www.kneron.com/forum/discussion/53/legacy-v0-12-example-keras-kl520-how-to-convert-and-compile-tiny-yolo-v3-from-github-project

  • Hi Eric

    根據step5 remove redundant layer已成功轉換onnx

    不過最後inference的部份有出錯(如附圖)

    我們的train只有分3類,這部份我要修改那邊參數做修正?

    謝謝.


  • edited May 2021


    Hi Ellen,


    看起來是在post_process (yolo_eval) 的部分出問題, 請問你有試過在keras可以成功inference嗎?

    你更改了模型參數, 可能跟tutorial的設置的參數不符, 需要根據你的需求作修改.

    建議先確認你的新model可以先在keras測試搭配post process可以成功運行.

The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.