yolov5 학습 모델 rknn 변환 후 로딩 에러

ODROID-M1
Post Reply
kimsjpk
Posts: 4
Joined: Wed May 04, 2022 4:14 pm
languages_spoken: english
ODROIDs: ODROID-M1
Has thanked: 0
Been thanked: 0
Contact:

yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by kimsjpk »

안녕하세요? 회사에서 yolov5 모델을 사용하여 rknn 모델로 변환 후 결과를 얻는 작업을 진행하고 있습니다.

하드커널 github의 rknn_toolkit2(github.com/hardkernel/rknn-toolkit2/~/example/yolov5/image/test.py)를 실행시켜서 객체 검출에 성공하였습니다.

그래서 yolov5 github에서 학습된 모델(yolov5s.pt을 export.py를 사용하여 onnx로 변환함)을 다운 받아서 windows 10의 wsl2를 사용하여 ubuntu 18.04, anaconda

가상환경 python 3.6 환경에서

github.com/rockchip-linux/rknn-toolkit2/rknn-toolkit-lite2-v1.2.0을 다운 받아서(git clone https://github.com/rockchip-linux/rknn-toolkit2.git)

packages 내 rknn_toolkit2-1.2.0~linux_x86_64.whl 를 pip를 사용하여 설치를 하고

rockchip-linux/rknpu2 내부의 rknn 변환 코드(github.com/rockchip-linux/rknpu2~/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5)를

사용해서 onnx 모델을 rknn 모델로 변환하였습니다.

변환한 rknn 모델을 hardkernel/rknn-toolkit2/rknn-toolkit-lite2-v1.2.0/example/yolov5/image 내부의 test.py로 실행을 하면

--->Running model
E RKNN[시간] Meet unsupported split 이라는 화면이 뜨면서 inference가 되지 않고
Aborted (core dumped)

라고 화면에 뜨고 종료됩니다.

참고로 rockchip-linux/rknpu2/의 깃허브에 저장된 onnx 모델(github.com/rockchip-linux
/rknpu2/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5/onnx_models/yolov5s_rm_transpose.onnx)

을 rknn 변환 코드에 적용하여 rknn으로 변환된 모델은 잘 작동합니다.

살펴보시고 어떻게 하면 에러 메시지 없이 파이썬 코드가 잘 작동되는지를 알고 싶습니다.

긴 글 읽어 주셔서 감사합니다

steve.jeong
Posts: 24
Joined: Wed Dec 01, 2021 10:18 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by steve.jeong »

yolov5.onnx 모델을 .rknn로 변환 후 테스트 결과를 얻는 작업을 진행하시려면
python3 rknn-toolkit2/examples/onnx/yolov5/test.py 를 실행하시면 됩니다.

이 다음 부분은 참고하시면 도움이 되실 수도 있을것 같아서 남깁니다.

rknn-toolkit2-lite에서 사용하는 패키지는 rknn-toolkit2의 패키지와 다릅니다.

"rknn-toolkit2"은 호스트에서 onnx모델을 M1의 npu에서 사용가능한 .rknn으로 변환해 주면서 테스트까지 하는 프로그램이고
"rknn-toolkit-lite2"은 rk3568에서 즉, M1보드 위에서 직접 .rknn파일을 사용하기 위한 것입니다.
즉 두가지가 다릅니다.

설치하신 rknn_toolkit2-1.2.0~linux_x86_64.whl의 경우에는 전자에서 사용되는 패키지이고
rknn-toolkit2/rknn-toolkit-lite2-v1.2.0/example/yolov5/image의 test.py는 후자의 패키지를 요구합니다.
rknn-toolkit2/rknn-toolkit-lite2-v1.2.0/packages 경로로 가 보시면

rknn_toolkit_lite2-1.2.0-cp37-cp37m-linux_aarch64.whl
rknn_toolkit_lite2-1.2.0-cp39-cp39-linux_aarch64.whl
파이썬 3.7과 3.9 버전에 맞는 패키지가 따로 존재합니다.

모델의 변환과 테스트가 목적이라면 rknn-toolkit2/rknn-toolkit-lite2-v1.2.0 디렉토리는 신경쓰지 않으셔도 됩니다.

rknn-toolkit2-lite의 예제는 https://wiki.odroid.com/odroid-m1/appli ... ab__python 참고해주세요.

감사합니다.

kimsjpk
Posts: 4
Joined: Wed May 04, 2022 4:14 pm
languages_spoken: english
ODROIDs: ODROID-M1
Has thanked: 0
Been thanked: 0
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by kimsjpk »

글이 길어서 의미전달이 잘 안된듯 한데 제 질문은 pt파일을 어떻게 하면 rknn-lite에 맞는 모델로 변환해서 inference 결과를 얻는지에 대한 질문이었습니다.
링크 걸어주신 python3 rknn-toolkit2/examples/onnx/yolov5/test.py 이 파일은 변환 모델을 불러와서 결과를 얻는 소스이므로 그 전 작업인 모델 변환에 대해서
질문 드립니다. 요약하자면 rknn-lite에 맞는 모델 변환 방법을 알려 주셨으면 합니다.

steve.jeong
Posts: 24
Joined: Wed Dec 01, 2021 10:18 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by steve.jeong »

kimsjpk wrote:
Wed May 04, 2022 6:58 pm
글이 길어서 의미전달이 잘 안된듯 한데 제 질문은 pt파일을 어떻게 하면 rknn-lite에 맞는 모델로 변환해서 inference 결과를 얻는지에 대한 질문이었습니다.
링크 걸어주신 python3 rknn-toolkit2/examples/onnx/yolov5/test.py 이 파일은 변환 모델을 불러와서 결과를 얻는 소스이므로 그 전 작업인 모델 변환에 대해서
질문 드립니다. 요약하자면 rknn-lite에 맞는 모델 변환 방법을 알려 주셨으면 합니다.
pt -> onnx -> rknn 과정은 저희도 한번 다시 검증해 보겠습니다.
개발단계에서는 vendor에서 제공하는 toolkit의 정상동작(onnx->rknn)만을 확인했습니다.
그래서 yolov5 github에서 학습된 모델(yolov5s.pt을 export.py를 사용하여 onnx로 변환함)
https://github.com/ultralytics/yolov5 여기를 참조하셨나요?
다른 곳을 참조하셨다면 링크 남겨 주시면 최대한 비슷하게 테스트 할 수 있을 것 같습니다.

rknn-toolkit2/examples/pytorch/resnet18_export_onnx/test.py
rknn-toolkit2에서 pt -> onnx로 변환하는 소스가 있습니다. 기존에 공유되어 있는것과 같은것인지 다른것인지 모르겠지만 다른것이라면 github에 공유되어있는 export.py로 변환된 파일은 정상동작이 안 될 가능성도 있어보입니다. 이 역시 확인해 보겠습니다.

감사합니다.

kimsjpk
Posts: 4
Joined: Wed May 04, 2022 4:14 pm
languages_spoken: english
ODROIDs: ODROID-M1
Has thanked: 0
Been thanked: 0
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by kimsjpk »

yolov5는 링크거신 사이트(https://github.com/ultralytics/yolov5)를 참고하였습니다.

링크걸어주신 resnet18의 test.py에서 사용된 torch.onnx.export를

yolov5((https://github.com/ultralytics/yolov5)의 export.py에서도 함수 인자만 다르고 동일한 함수를 사용하고

있습니다. 그리고

혹시나 싶어서 odroid-m1에서 yolov5의 export.py를 사용하여 yolov5s.pt를 onnx로 변환하고

wsl2, anaconda 가상환경에서 onnx를 rknn으로 변환하여 odroid-m1에서

rknn-toolkit-lite2-v1.2.0/examples/yolov5/image/test.py를 실행시켰더니 전과 동일한 에러메시지를 띄웠습니다.

RKNN [시간] Meet unsupported split
Aborted (core dumped)

테스트에 성공하시면 저에게 메일로 남겨주시거나 아님 답글을 달아주시면 제가 여기에 주기적으로 접속해서

답글을 확인하도록 하겠습니다.

성공하시길 빕니다. 감사합니다.

steve.jeong
Posts: 24
Joined: Wed Dec 01, 2021 10:18 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by steve.jeong »

export.py로 나타난 onnx파일을 rknn파일로 변환했을 때 에러 로그입니다.

Code: Select all

W __init__: rknn-toolkit2 version: 1.2.0-f7bb160f
--> Config model
W config: 'target_platform' is None, use rk3566 as default, Please set according to the actual platform!
W config: The output_tensor_type is only valid on runtime ! Simulator will be consistent with the origin model!
done
--> Loading model
E load_onnx: Catch exception when loading onnx model: /home/steve/rknn-toolkit2/examples/onnx/yolov5/yolov5s.onnx!
E load_onnx: Traceback (most recent call last):
E load_onnx:   File "rknn/api/rknn_base.py", line 1126, in rknn.api.rknn_base.RKNNBase.load_onnx
E load_onnx:   File "rknn/api/rknn_base.py", line 584, in rknn.api.rknn_base.RKNNBase._create_ir_and_inputs_meta
E load_onnx:   File "rknn/api/ir_graph.py", line 39, in rknn.api.ir_graph.IRGraph.__init__
E load_onnx:   File "rknn/api/ir_graph.py", line 180, in rknn.api.ir_graph.IRGraph.rebuild
E load_onnx:   File "rknn/api/ir_graph.py", line 140, in rknn.api.ir_graph.IRGraph._clean_model
E load_onnx:   File "rknn/api/ir_graph.py", line 59, in rknn.api.ir_graph.IRGraph.infer_shapes
E load_onnx:   File "/home/steve/venv/rknn/lib/python3.6/site-packages/onnx/checker.py", line 93, in check_model
E load_onnx:     C.check_model(model.SerializeToString())
E load_onnx: onnx.onnx_cpp2py_export.checker.ValidationError: Field 'shape' of type is required but missing.
Load model failed!
그리고 이 로그는 rknn-toolkit2/examples/onnx/yolov5/test.py의 239 line과 관련있습니다.

Code: Select all

ret = rknn.load_onnx(model=ONNX_MODEL, outputs=['378', '439', '500'])
변환 에러는 vendor에서 제공하는 librknnrt.so 바이너리 내에서 발생하는 오류입니다.
문제는 API를 바이너리 파일로만 제공합니다.
그래서 문제되는 outputs=['378','439','500']가 무엇을 의미하는지 저희로서도 알 수 있는 방법이 없습니다.

https://github.com/rockchip-linux/rknn-toolkit2
여기에 관련 내용이 업데이트 되기를 기다리거나

rknn-toolkit2/examples/pytorch/resnet18_export_onnx/test.py
이 파일을 yolov5s에 맞게 변환하여 사용 하거나 입니다.

이부분의 솔루션 제공은 시간이 좀 걸릴 것 같습니다.

감사합니다.

kimsjpk
Posts: 4
Joined: Wed May 04, 2022 4:14 pm
languages_spoken: english
ODROIDs: ODROID-M1
Has thanked: 0
Been thanked: 0
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by kimsjpk »

안녕하세요?

outputs=['378, '439', '500']에 대한 힌트가 될 만한 사이트를 발견하였습니다.

https://github.com/rockchip-linux/rknpu ... olov5_demo 여기에 보시면

중국어로 다음과 같이 나와 있습니다.

测试代码导出模型的时候指定了输出节点['378', '439', '500'],分别为原模型的第2、3、4输出节点的去掉 三个Reshape 后面的层(不包含Reshape层), 对应输出的shape是[1,255,80,80],[1,255,40,40],[1,255,20,20]。 对于自己训练的模型输出节点的顺序和shape的要求必须是[1,?,80,80],[1,?,40,40],[1,?,20,20],C代码后处理才能正确处理。

크롬으로 번역해서 보려니 번역이 되지 않아서 더 이상 접근하지 않았습니다.

구글 번역기로 번역해도 무슨 뜻인지는 잘 모르겠습니다.

문제 해결에 도움이 되길 바랍니다.

steve.jeong
Posts: 24
Joined: Wed Dec 01, 2021 10:18 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: yolov5 학습 모델 rknn 변환 후 로딩 에러

Post by steve.jeong »

안녕하세요. 이어서 답변드립니다.

저도 칩 벤더로부터 제공되는 서비스를 가져다 사용하는 입장이고, 며칠 시도해봤지만 제가 이쪽 분야의 전문가도 아니어서
npu와 관련 api에 대한 정보 없이 소스파일 수정 후 재배포는 현실적으로 어렵다고 판단했습니다.

하지만 계속 자료를 찾아보던 중에 다음과 같은 레포를 발견하게 되었습니다.

https://github.com/airockchip/yolov5

소스를 받고 requirements.txt 파일에서 export부분을 모두 살리신 뒤에

$ python3 -m pip install -r requirements.txt
$ ./2onnx.sh

스크립트를 실행하시면 output으로 yolov5s.pt, yolov5s.onnx, yolov5s.torchscipt.pt가 생성됩니다.
여기서 생성된 onnx파일을
rknpu2/examples/rknn_yolov5_demo/convert_demo/yolov5/onnx_models에 복사하고

rknpu2/examples/rknn_yolov5_demo/convert_demo/yolov5/onnx2rknn.py에서
line 14, line 23에 파일 이름에 맞게 수정해주신 뒤 실행 하시면 됩니다. (rknn-toolkit2과 동일한 환경이 필요합니다)

output으로 rknn_models/yolov5s-640-640.rknn 파일이 생성됩니다.
이 rknn모델로 yolo 프로젝트들 m1에서 정상 동작하는 것을 확인했습니다.

rknn모델의 사용은 기존 방법대로 사용하시면 됩니다.

막히는 부분이 있으시면 포럼에 답글 달아주시면 최대한 도움 드리겠습니다.

감사합니다.

Post Reply

Return to “M1”

Who is online

Users browsing this forum: No registered users and 1 guest