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
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
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 即可。下面是我执行过的指令,可以做以参考:
最后生成的 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 套用到
做轉換
但會得到以下錯誤訊息
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類,這部份我要修改那邊參數做修正?
謝謝.
Hi Ellen,
看起來是在post_process (yolo_eval) 的部分出問題, 請問你有試過在keras可以成功inference嗎?
你更改了模型參數, 可能跟tutorial的設置的參數不符, 需要根據你的需求作修改.
建議先確認你的新model可以先在keras測試搭配post process可以成功運行.