#pragma once #define RET_OK nullptr #ifdef _WIN32 #include <Windows.h> #include <direct.h> #include <io.h> #endif #include <string> #include <vector> #include <cstdio> #include <opencv2/opencv.hpp> #include "onnxruntime_cxx_api.h" #ifdef USE_CUDA #include <cuda_fp16.h> #endif enum MODEL_TYPE { //FLOAT32 MODEL YOLO_DETECT_V8 = 1, YOLO_POSE = 2, YOLO_CLS = 3, //FLOAT16 MODEL YOLO_DETECT_V8_HALF = 4, YOLO_POSE_V8_HALF = 5, }; typedef struct _DL_INIT_PARAM { std::string modelPath; MODEL_TYPE modelType = YOLO_DETECT_V8; std::vector<int> imgSize = { 640, 640 }; float rectConfidenceThreshold = 0.6; float iouThreshold = 0.5; int keyPointsNum = 2;//Note:kpt number for pose bool cudaEnable = false; int logSeverityLevel = 3; int intraOpNumThreads = 1; } DL_INIT_PARAM; typedef struct _DL_RESULT { int classId; float confidence; cv::Rect box; std::vector<cv::Point2f> keyPoints; } DL_RESULT; class YOLO_V8 { public: YOLO_V8(); ~YOLO_V8(); public: char* CreateSession(DL_INIT_PARAM& iParams); char* RunSession(cv::Mat& iImg, std::vector<DL_RESULT>& oResult); char* WarmUpSession(); template<typename N> char* TensorProcess(clock_t& starttime_1, cv::Mat& iImg, N& blob, std::vector<int64_t>& inputNodeDims, std::vector<DL_RESULT>& oResult); char* PreProcess(cv::Mat& iImg, std::vector<int> iImgSize, cv::Mat& oImg); std::vector<std::string> classes{}; private: Ort::Env env; Ort::Session* session; bool cudaEnable; Ort::RunOptions options; std::vector<const char*> inputNodeNames; std::vector<const char*> outputNodeNames; MODEL_TYPE modelType; std::vector<int> imgSize; float rectConfidenceThreshold; float iouThreshold; float resizeScales;//letterbox scale };