Paddle

PaddlePaddle 추론 모델은 model.pdiparams 가중치 파일 옆의 model.pdmodel 그래프입니다. LibreYOLO는 정적 opset-15 ONNX 그래프를 내보내고, 이를 X2Paddle로 변환한 다음 metadata.yaml로 결과를 패키지하여 다른 모든 런타임과 동일한 팩토리를 통해 불러올 수 있도록 합니다.

깃발
export(format="paddle")
쓴다
model.pdmodel, model.pdiparams 및 metadata.yaml가 있는 디렉터리
추가
pip install "libreyolo[paddle]"
다시 로드
LibreYOLO("weights/LibreYOLO9t_paddle", device="cpu")
백엔드
libreyolo.backends.paddle.PaddleBackend
모양
정적, 배치 1, opset 15. 세 가지 모두 적용됩니다.
정확성
FP32만, CPU만.
툴체인
PaddlePaddle 2.6.2, X2Paddle 1.6.0, ONNX 1.17 또는 이전, 정확히 확인됨

설치

설치
# Python 3.10에서 3.12까지. WSL2와 Ubuntu 22.04가 검증된 Windows 경로입니다.pip install "libreyolo[paddle]"
고정된 버전을 확인하십시오
python -c "from importlib.metadata import version; print(version('paddlepaddle'), version('x2paddle'), version('onnx'))"

정확한 스택에서 여분의 핀은 패리티 작업 측정을 위해 다음과 같습니다: PaddlePaddle 2.6.2, X2Paddle 1.6.0 및 ONNX 1.17 이하. 이러한 핀은 설치 시뿐만 아니라 내보낼 때에도 확인되며, 다른 버전은 예상된 핀의 이름을 ImportError로 변경합니다. 최신 Paddle 릴리스는 X2Paddle 1.6.0이 생성한 정적 코드의 일부를 거부하므로, 누구도 검증하지 않은 아티팩트를 생성하는 것보다 미리 실패하는 것이 더 낫습니다.

내보내기

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # 디렉터리 weights/LibreYOLO9t_paddle를 작성합니다path = model.export(format="paddle")print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format paddle
논쟁
model.export(    format="paddle",    imgsz=640,        # int; 이 계열의 사각 캔버스    batch=1,          # 다른 어떤 값도 ValueError를 발생시킵니다    dynamic=False,    # True가 ValueError를 발생시킵니다    simplify=True,    # False는 ValueError를 발생시킵니다    opset=15,         # 다른 어떤 값도 ValueError를 발생시킵니다    output_path=None, # 아무도 weights/<stem>_paddle를 쓰지 않습니다)

네 개의 인수는 기본값이 아니라 고정되어 있습니다. dynamicFalse여야 하고, batch는 1이어야 하며, simplify는 완전히 정적인 변환 그래프를 위해 True여야 하고, opset는 15여야 하는데, 이는 X2Paddle 1.6.0이 허용하는 최대값입니다. 다른 값을 전달하면 추적 전에 오류가 발생합니다.

중간 그래프에서 한 번의 정규화가 실행됩니다. ONNX는 생략된 MaxPool 확장을 1로 정의하고, PyTorch는 명시적으로 모두 1인 속성을 작성하며, X2Paddle 1.6.0은 이를 거부하므로, 익스포터는 해당 불필요한 기본값을 제거하고 지정된 연산을 변경하지 않고 그대로 둡니다.

해당 아티팩트는 디렉토리입니다: model.pdmodel, model.pdiparamsmetadata.yaml. X2Paddle이 변환 중 생성하는 파이썬은 그 일부가 아닙니다.

아티팩트를 실행

LibreYOLO를 통해
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t_paddle", device="cpu")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
CLI
libreyolo predict --model weights/LibreYOLO9t_paddle \  --source https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg --device cpu --save
백엔드가 직접
from libreyolo.backends.paddle import PaddleBackend # Paddle 디렉토리에 대해 LibreYOLO()가 생성하는 것. 동일한 결과# 객체, 그 사이에 팩토리 라우팅 없음.backend = PaddleBackend("weights/LibreYOLO9t_paddle", device="cpu")result = backend.predict("parkour.jpg")print(result.boxes.xyxy[:3])
맨 노
import numpy as npimport paddle.inference as paddle_inferimport yaml directory = "weights/LibreYOLO9t_paddle"config = paddle_infer.Config(    f"{directory}/model.pdmodel", f"{directory}/model.pdiparams")config.disable_gpu()config.disable_mkldnn()config.switch_ir_optim(False) predictor = paddle_infer.create_predictor(config)handle = predictor.get_input_handle(predictor.get_input_names()[0])handle.reshape([1, 3, 640, 640])handle.copy_from_cpu(np.zeros((1, 3, 640, 640), dtype=np.float32))predictor.run()for name in predictor.get_output_names():    print(name, predictor.get_output_handle(name).copy_to_cpu().shape) meta = yaml.safe_load(open(f"{directory}/metadata.yaml"))print(meta["model_family"], meta["task"], meta["names"]) # 이 경로에서는 전처리와 후처리를 직접 처리해야 함.

LibreYOLO()model.pdmodelmodel.pdiparams를 모두 포함하는 디렉토리를 인식하고, metadata.yaml를 읽으며, 체크포인트로 동일한 Results 객체를 반환합니다. autocpu가 아닌 장치는 다음 오류를 발생시킵니다: 이 백엔드는 CPU 전용입니다.

팩토리가 구성하는 것은 PaddleBackend이며, libreyolo에서 내보내기되고 libreyolo.backends.paddle.PaddleBackend로 가져올 수 있습니다. 팩토리의 접미사 라우팅 없이 백엔드를 원할 때 직접 구성하십시오. 예를 들어, 작성하지 않은 metadata.yaml의 디렉터리에 대해 task=를 명시적으로 전달하고자 할 때 그렇습니다. 그 predict()는 동일한 소스를 사용하고 동일한 결과를 반환합니다.

베어 런타임 스니펫은 백엔드에서 구성한 것을 그대로 반영하며, 세 가지 비활성화된 옵션은 의도된 것입니다. Paddle 2.6 CPU 퓨전 파이프라인은 변형된 어텐션을 위해 생성된 큰 gather 및 scatter 그래프를 최적화하는 동안 충돌할 수 있으므로, 포터블 비퓨전 정적 그래프가 패리티가 측정된 대상입니다. 전처리, 디코딩, NMS 및 좌표 재스케일링은 그 경로에서 직접 처리해야 합니다.

제약

동적 형태 없음, FP16 없음, INT8 없음, 내장 NMS 없음, GPU 런타임 없음.

검증된 조합은 YOLO9 검출, YOLO9-E2E 및 YOLO9-P2 검출, EC 검출, 포즈 및 세그먼테이션, RT-DETRv4, D-FINE, DEIM 및 DEIMv2 검출, 그리고 YOLO-NAS 검출 및 포즈입니다. 각각은 변환, CPU 런타임 재로드, 원시 출력 일치 및 일치된 공개 결과로 다루어집니다.

차단되었으며, 조합별로 사유가 기록됨:

조합
RF-DETR, 모든 작업ONNX opset 17과 GridSample이 필요합니다; X2Paddle 1.6.0은 opset 15 이하만 지원하며 GridSample 매퍼가 없습니다
RT-DETR 및 RT-DETRv2 탐지학습된 그래프는 opset 16 이상에서 GridSample이 필요합니다
D-FINE 세분화변환 및 재로드하지만, 마스크-로짓 상대 RMS 오차는 3.52%이고 최소 일치 마스크 IoU는 0.582입니다
YOLO9 세분화YOLO9는 LibreYOLO에서 탐지만 가능합니다
RTMDet-Ins 분할동적 커널 마스크 디코드는 내보낸 런타임 계약이 없습니다

검증되었거나 차단된 것으로 나열되지 않은 모든 항목은 ONNX-투-패들 변환 경로를 통해 검증되지 않았다는 메모와 함께 거부됩니다.

전체 계열 및 작업 그리드는 내보내기 매트릭스를 참조하십시오. 한 가지 조합의 경우:

내보내기 전에 하나의 계열와 작업을 확인하십시오
libreyolo formats --family yolo9 --task detect

개발 브랜치에서 libreyolo/export/paddle.py, libreyolo/export/exporter.py, libreyolo/export/support.py, libreyolo/backends/paddle.py, docs/paddle.md 및 pyproject.toml를 읽으십시오.