반응형
4주차 인턴 중, 쿠버네티스 이외의 새로운 업무를 추가로 진행하게 되어 지식을 학습하며 작성한 글입니다.
ONNX 란?
Open Neural Network Exchange 이며 딥러닝 모델의 상호 운용성을 위해 개발된 오픈 소스 포맷형식이다.
즉, 다양한 딥러닝 프레임워크 (Tensorflow, Pytorch, Tensor RT) 사이에서 모델을 공유하기 위한 중간 포맷이다.
ONNX는 딥러닝 모델의 생태계를 보다 개방적이고 협력적으로 만들어주는 중요한 역할을 한다.
- 진행 과정
- 첫 번째
- PyTorch 모델과 Sample input 을 인자로 하여, torch.onnx.export 함수를 호출한다
- PyTorch 의 JIT 컴파일러를 통해서, Trace 혹은 Script 를 생성한다.
- PyTorch 모델의 forward propagation 시에 호출되는, 함수 및 연산들에 대한 최적화된 그래프인 Torch IR 을 만든다
- Trace 나 Script 는, PyTorch 의 nn.Module 을 상속하는 모델의 forward 함수에서 실행되는 코드들에 대한 IR(Intermediate Representation)을 담고 있습니다.
- 두 번째
- 생성된 trace / script (Torch IR)는, ONNX Exporter 를 통해서 ONNX IR 로 변환된다
- 한 번 더 Graph Optimization 이 이루어진다.
- 세 번째
- 최종적으로 생성된 ONNX 그래프는 .onnx 포맷으로 저장됩니다.
- 첫 번째
객체 탐지 알고리즘의 YOLO v7 에서 사용하기
여러 프레임 워크에서 가중치의 성능을 테스트하기 위해, 기존 torch 가중치를 onnx로 변환하여 다시 tensor RT 에 맞게 바꾸는 과정을 진행 해보았다.
그전에 기존에 제작자가 업로드한 모델를 이용하거나, 프레임워크에서 직접 학습시킨 모델 파일이 있어야한다.
다음은 export를 하기 위한 명령어이다. (pytorch -> onnx )
python export.py --weights yolov7-e6.pt --grid --end2end --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640 --max-wh 640
간단하게 옵션에 대한 설명은 다음과 같다.
- --grid: 객체 탐지 과정에서 그리드-스트라이드(grid-stride) 방식을 사용할지 여부
- --end2end: 엔드 투 엔드(end-to-end) 객체 탐지 과정을 활성화하는 것으로 탐지 파이프라인 전체가 한 번에 실행된다.
- --simplify: 이 인자는 모델 또는 출력을 더 간결하거나 효율적으로 만들기 위한 단순화 과정.
- --topk-all 100:모든 클래스에 걸쳐 상위 점수를 가진 탐지 박스의 수를 설정합니다. 이 경우 상위 100개의 박스를 유지한다.
- --iou-thres 0.65: 비 최대 억제(non-maximum suppression)에 대한 IoU(Intersection over Union) 임계값을 설정합니다. 이는 후처리 과정에서 두 박스가 동일한 객체로 간주되기 위해 필요한 겹침을 제어한다.
- --conf-thres 0.35: 이 인자는 객체 탐지의 신뢰도 임계값을 설정. 이 임계값 이하의 탐지 신뢰도를 가진 박스는 제거됩니다.
- --img-size 640 640: 객체 탐지 모델의 입력 이미지 크기를 설정. 이 경우 스크립트는 640x640 픽셀 크기의 이미지를 사용한다.
- --max-wh 640: 출력 박스의 최대 너비와 높이를 설정한다.
결과
이후 해당 디렉토리에 yolov7.pt 에 대한 변환 파일이 생성된다.
- yolov7.torchscript.pt
- yolov7.torchscript.ptl
- yolov7.onnx
반응형
'ML & AI & DL 맛보며 친해지기' 카테고리의 다른 글
Jetson Nano 사용기 (0) | 2023.08.30 |
---|---|
NVIDIA Tensor RT 에 대해 알아보기 (0) | 2023.08.28 |