Train_Identify/nvidia_ascend_engine/common/AppCommon.h

931 lines
34 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef APP_COMMON_H
#define APP_COMMON_H
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>
#include <string.h>
#include <vector>
#include <memory>
#include "CommonDataType/CommonDataType.h"
//#include "DvppCommon/DvppCommon.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <assert.h>
#include <vector>
#include <numeric>
#include <algorithm>
#include <math.h>
#include <ctime>
#include <math.h>
#include <chrono>
#include <cmath>
#include <functional>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <NvInfer.h>
#include "logging.h"
#include <NvInferPlugin.h>
#include <NvOnnxParser.h>
#include <NvCaffeParser.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cuda_runtime_api.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "preprocess.h"
#ifdef ASCEND
#include "DvppCommon.h"
#else
#include "nvidia_acl_datatype.h"
#include "cuda_utils.h"
#include "logging.h"
#include "yolov5_common.h"
#include "utils.h"
#include "calibrator.h"
#include "preprocess.h"
#include "yololayer.h"
using namespace Yolo;
#endif
using namespace std;
using namespace cv;
using namespace nvinfer1;
using namespace nvcaffeparser1;
#define USE_FP16 // set USE_INT8 or USE_FP16 or USE_FP32
#define DEVICE 0 // GPU id
#define BATCH_SIZE 1 //batch size
#define MAX_WORKSPAXE_SIZE (16 * (1 << 20)) //工作空间大小
#define MAX_IMAGE_INPUT_SIZE_THRESH 3000*3000
#define INPUT_CHANNEL 3 //输入通道数
//NVIDIA NX YOLOV5模型推理相关宏(因不与ASCEND冲突放到这)
#define NMS_THRESH 0.4
#define CONF_THRESH 0.5
#define GET_INPUT_SIZE(w, h) (INPUT_CHANNEL * w *h)
#define GET_OUTPUT_SIZE(w, h, cr , ca) (INPUT_CHANNEL * (((h / 32) * ( h / 32)) + ((h / 16) * ( h / 16)) + ((h / 8) * ( h / 8))) * (STEP1_POS_CONF + cr + ca))
//STEP0
#define STEP0_MAX_IMAGE_INPUT_SIZE_THRESH 3000*3000
#define STEP0_BATCH_SIZE 1 //batch size
#define STEP0_NMS_THRESH 0.5 //step1 非极大值抑制阈值
#define STEP0_SCORE_THRESH 0.4 //step1 置信度(得分)阈值
#define STEP0_INPUT_CHANNEL 3 //输入通道数
#define STEP0_INPUT_H 640 //step0 输入图像高
#define STEP0_INPUT_W 640 //step0 输入图像宽
//STEP1
#define STEP1_POS_CONF 5
#define STEP1_NMS_THRESH 0.5 //step1 非极大值抑制阈值
#define STEP1_SCORE_THRESH 0.4 //step1 置信度(得分)阈值
#define STEP1_CLASS_NUM 19 //step1 7分类
#define STEP1_CLEAR_NUM 21 //step1 21个清晰度
#define STEP1_INPUT_H 960 //step1 输入图像高
#define STEP1_INPUT_W 960 //step1 输入图像宽
#define STEP1_BATCH_SIZE 1
#define STEP1_OUTPUT_HISTOGRAM_N 5 //不能超过139167
#define STEP1_BBOX_SIZE1 (STEP1_INPUT_H/32)
#define STEP1_BBOX_SIZE2 (STEP1_INPUT_H/16)
#define STEP1_BBOX_SIZE3 (STEP1_INPUT_H/8)
#define STEP1_INPUT_SIZE INPUT_CHANNEL*STEP1_INPUT_H*STEP1_INPUT_W //input
#define STEP1_OUTPUT_SIZE INPUT_CHANNEL*(STEP1_BBOX_SIZE1*STEP1_BBOX_SIZE1+STEP1_BBOX_SIZE2*STEP1_BBOX_SIZE2+STEP1_BBOX_SIZE3*STEP1_BBOX_SIZE3)*(STEP1_CLEAR_NUM+STEP1_CLASS_NUM+STEP1_POS_CONF) //output
//STEP1
#define STEP1_CLASS_NUM_DATE 8
#define STEP1_CLASS_NUM_CON 7
//STEP2
#define STEP2_POS_CONF 5
#define STEP2_NMS_THRESH 0.5 //step2 非极大值抑制阈值
#define STEP2_SCORE_THRESH 0.4 //step2 置信度(得分)阈值
#define STEP2_CLASS_NUM 47 //step2 31分类
#define STEP2_CLEAR_NUM 5 //step2 5个清晰度
#define STEP2_INPUT_H 608 //step2 输入图像高
#define STEP2_INPUT_W 608 //step2 输入图像宽
#define STEP2_BATCH_SIZE 1
#define STEP2_OUTPUT_HISTOGRAM_N 5 //step2 不能超过22743
#define STEP2_BBOX_SIZE1 (STEP2_INPUT_H/32)
#define STEP2_BBOX_SIZE2 (STEP2_INPUT_H/16)
#define STEP2_BBOX_SIZE3 (STEP2_INPUT_H/8)
#define STEP2_INPUT_SIZE INPUT_CHANNEL*STEP2_INPUT_H*STEP2_INPUT_W //input
#define STEP2_OUTPUT_SIZE INPUT_CHANNEL*(STEP2_BBOX_SIZE1*STEP2_BBOX_SIZE1+STEP2_BBOX_SIZE2*STEP2_BBOX_SIZE2+STEP2_BBOX_SIZE3*STEP2_BBOX_SIZE3)*(STEP2_CLEAR_NUM+STEP2_CLASS_NUM+STEP2_POS_CONF) //output
#define CONVERT_TO_ODD(NUM) (NUM) // Convert the input to odd num
#define CONVERT_TO_EVEN(NUM) (NUM) // Convert the input to even num
#define CHECK_ODD(num) (NUM)
#define CHECK_EVEN(num) (NUM)
//模型参数
typedef struct _YoloV5ModelParam{
unsigned int uiClassNum;
unsigned int uiDetSize;
float fScoreThreshold;
float fNmsThreshold;
}YoloV5ModelParam;
typedef struct _YoloV5ClearityModelParam{
unsigned int uiClassNum;
unsigned int uiClearNum;
unsigned int uiDetSize;
float fScoreThreshold;
float fNmsThreshold;
}YoloV5ClearityModelParam;
typedef struct _ModelCommonInfo{
unsigned int uiModelWidth;
unsigned int uiModelHeight;
unsigned int uiInputSize;
unsigned int uiOutputSize;
unsigned int uiChannel;
unsigned int uiBatchSize;
std::string strInputBlobName;
std::string strOutputBlobName;
}ModelCommonInfo;
typedef struct _YoloV5ModelInfo{
YoloV5ModelParam yolov5ModelParam;
ModelCommonInfo modelCommonInfo;
}YoloV5ModelInfo;
typedef struct _YoloV5ClearityModelInfo{
YoloV5ClearityModelParam yolov5ClearityModelParam;
ModelCommonInfo modelCommonInfo;
}YoloV5ClearityModelInfo;
struct ModelConfig
{
std::string strAnchorPath; //锚框文件路径
std::string strClassPath; //类别名称集合
std::string strOmPath; //om文件路径
int iModelWidth; //模型输入宽度
int iModelHeight; //模型输入高度
float fScoreThreshold; //得分阈值
float fNMSTreshold; //nms阈值
int iClassNum; //类别个数
int iLineNum; //字段代号
};
typedef struct
{
float fLTX = 0; //左上X坐标
float fLTY = 0; //左上y坐标
float fRBX = 0; //右下y坐标
float fRBY = 0; //右下y坐标
}Location;
//耗时宏
// #define CUDA_MALLOC_TIME_CONSUMING_TEST //CUDA内存分配耗时
// #define CUDA_MEMCPY_TIME_CONSUMING_TEST //CUDA内存拷贝耗时
#define INFERENCE_MODEL_TIME_CONSUMING_TEST //模型推理耗时
// #define OPENCV_CVTCOLOR_YUV2RGB_TIME_CONSUMING_TEST //OpenCV YUV2RGB耗时
// #define OPENCV_CVTCOLOR_RGB2YUV_TIME_CONSUMING_TEST //OpenCV RGB2YUV耗时
// #define OPENCV_CVTCOLOR_BGR2RGB_TIME_CONSUMING_TEST //OpenCV BGR2RGB耗时
#define ENCODE_H264_STREAM //编码H264
#define PACKAGE_VIDEO_STREAM //封装视频(MP4,FLV)
#define RTSP_PUSH_VIDEO_STREAM //RTSP推流(推送H264)
#define IMAGE_WIDTH 1920 //1920 2560
#define IMAGE_HEIGHT 1080 //1080 1440
//////////基础画像////////////////////////////////////
//来车检测功能ID 包含:来车,行车方向,停车,停车启动
#define METHOD_BASE_WIDTH 1280
//车厢划分功能ID///////////////////////////////////////
#define METHOD_BASE_HEIGHT 720
//相机帧率////////////////////////////////////////////
#define FRAME_RATE 25
//////////功能ID///////////////////////////////////////
//来车检测功能ID 包含:来车,行车方向,停车,停车启动
#define TRAIN_ACTION 1
//车厢划分功能ID///////////////////////////////////////
#define TRAIN_PARTION 2
#define DIRECTION 0
//////////算法配置//////////
//算法参数数量
#define IMAGEANALYSE_NUM 17
//图像优化处理
#define IMAGE_GRAY 0x00000001 //灰度处理
#define IMAGE_EQUALIZE 0x00000002 //直方图均衡化处理
#define IMAGE_GAMMA 0x00000004 //gamma变化
#define IMAGE_SPEC 0x00000008 //自定义处理
//图像对比标准
#define IMAGE_COMP_BY_TEMPLE 0x00000001 //物体形状
#define IMAGE_COMP_BY_HIST 0x00000002 //图像直方图
#define IMAGE_COMP_BY_SPEC 0x00000004 //
//////////车厢状态////////////////////////////////////
#define TRAIN_INIT_STATUS 0x01 //无车
#define TRAIN_LEFT_RUN 0x02 //左侧来车
#define TRAIN_RIGHT_RUN 0x03 //右侧来车
#define TRAIN_UNKOWN_RUN 0x04 //来车(无法确认方向)
#define TRAIN_PAUSE 0x05 //停车
#define TRAIN_RESTART 0x06 //列车重新启动
#define TRAIN_PASSED 0x07 //列车完全通过
#define TRAIN_WAIT_INIT 0x08 //列车完全通过等待重新初始化
//////////标准值(估算)////////////////////////////////////
//车厢长度
#define TRAIN_WIDTH 14.5
//车钩在画面正中央时单个车厢所在图像中的长度
#define TRAIN_IN_CAMERA_WIDTH 10
//初始速度
#define TRAIN_DEFAULT_SPEED (((TRAIN_WIDTH) / 5.0))
enum cmd_enum : unsigned char
{
//开始识别
//value[0]代表识别最大次数,识别不出来就返回"fail"
cmd_start_recognize = 0x01,
cmd_end_recognize = 0x02,
};
//识别目标
enum Target
{
NUM = 0, // 编号 (包含 2:煤炭漏斗车(兖矿自备,枣矿自备); 3:敞车; 4:棚车; 5:罐车; 6:平车; 8:牲畜车; 15:毒品车)
PRO = 1, // 属性
HEAD = 2, // 车头
CHKDATE = 3, // 定检期
CONTAINER = 4, // 集装箱
SPACE = 5, // 连接轴间隔 (包含 18:连接轴通用间隔)
TRAINSPACE = 6, // 车厢间隔 (包含 9:敞车间隔; 10:自备车间隔; 11:平车间隔; 12:罐车间隔; 13:棚车车间隔; 14:牲畜车间隔; 16: 毒品车间隔; 17:混合车厢间隔;)
TOPSPACE = 7 // 顶部间隔
};
//编号在前 或 属性在前
enum FirstTarget
{
AUTO_FIRST = 0, //自动判断
NUM_FIRST = 1, //编号在前
PRO_FIRST = 2 //属性在前
};
//行驶方向
enum RunDirection
{
DIRECTION_UNKNOWN = 0, //未知
DIRECTION_LEFT = 1, //向左行驶
DIRECTION_RIGHT = 2 //向右行驶
};
//车辆状态
enum TrainStatus
{
TRAINSTATUS_NO = 0, //无车
TRAINSTATUS_RUN = 1, //行驶
TRAINSTATUS_STOP = 2, //停止
TRAINSTATUS_BACK = 3 //倒车
};
enum RunDirectionAndFirst
{
// -1-不知道行驶方向和哪个框在前
DO_NOT_KNOW_DIRECTION = -1,
// 0-向左行驶,编号在前
LEFT_RUN_AND_NUM_FIRST = 0,
// 1-向左行驶,属性在前
LEFT_RUN_AND_PRO_FIRST = 1,
// 2-向右行驶,编号在前
RIGHT_RUN_AND_NUM_FIRST = 2,
// 3-向右行驶,属性在前
RIGHT_RUN_AND_PRO_FIRST = 3
};
//模型识别种类
enum ModelTarget
{
//车头上的编号
TRAIN_HEAD = 0,
//属性
TRAIN_PRO = 1,
//编号 矿车、煤炭漏斗车(兖矿自备、枣矿自备)
K_TRAIN_NUM = 2,
//编号 敞车
C_TRAIN_NUM = 3,
//编号 棚车
P_TRAIN_NUM = 4,
//编号 罐车
G_TRAIN_NUM = 5,
//编号 平车
NX_TRAIN_NUM = 6,
//定检期
TRAIN_CHECK = 7,
//编号 牲畜车
J_TRAIN_NUM = 8,
//车厢间隔 敞车
C_TRAIN_SPACE = 9,
//车厢间隔 矿车、煤炭漏斗车(兖矿自备、枣矿自备)
K_TRAIN_SPACE = 10,
//车厢间隔 平车
NX_TRAIN_SPACE = 11,
//车厢间隔 罐车
G_TRAIN_SPACE = 12,
//车厢间隔 棚车
P_TRAIN_SPACE = 13,
//车厢间隔 牲畜车
J_TRAIN_SPACE = 14,
//毒品车
W_TRAIN_NUM = 15,
//毒品车间隔
W_TRAIN_SPACE = 16,
//混合车厢间隔
M_TRAIN_SPACE = 17,
//连接轴通用间隔
U_TRAIN_SPACE = 18
};
//识别区域
enum IdentifyAreas
{
//不在识别区
NO_THING = -1,
//非平车识别区
NOT_FLATCAR = 0,
//平车识别区
FLATCAR = 1
};
//选优模式
enum SelectBestMode
{
FREQUENCY = 0, //频率优先
LENGTH //长度优先
};
enum TargetMaxLen
{
TYPE_MAXLEN = 7, //车型
NUM_MAXLEN = 7, //编号
LOAD_MAXLEN = 3, //载重 KM98车型载重为100
SELF_MAXLEN = 3, //自重
VOLUME_MAXLEN = 3, //容积
CHANGE_MAXLEN = 2, //换长
VOLUMESURFACE_MAXLEN = 7, //罐车容量记表
CHKDATE_MAXLEN = 8 //定检期
};
enum ModelType
{
MODELTYPE_NUM = 1, //车号模型
MODELTYPE_CHKDATE = 2, //定检期模型
MODELTYPE_CONTAINER = 3 //集装箱模型
};
enum ValidType
{
VALID_ALL = 0, //画面信息全部有效
VALID_LEFT = 1, //画面间隔左边有效
VALID_RIGHT = 2 //画面间隔右边有效
};
//来车检测模型结果
enum MonitorModelState
{
//初始化状态
MONITOR_MODEL_INIT_STATE = -1,
//车头部分
MONITOR_MODEL_TRAIN_HEAD = 0,
//无车
MONITOR_MODEL_NO_TRAIN = 1,
//车尾部分
MONITOR_MODEL_TRAIN_TAIL = 2,
//车体部分
MONITOR_MODEL_TRAIN_BODY = 3
};
//帧基本信息
typedef struct
{
uint32_t iWidth = 0;
uint32_t iHeight = 0;
acldvppStreamFormat format;
int iRate = 0; //帧率
} FrameInfo;
//原图上大框坐标(第二步还原坐标时用)
typedef struct
{
float fLTX = 0; //左上X坐标
float fLTY = 0; //左上y坐标
float fRBX = 0; //右下y坐标
float fRBY = 0; //右下y坐标
}Step1Location;
//推理数据(NVIDIA)
typedef struct
{
int iDataSource = 0; //数据来源标识
uint32_t iFrameId = 0;
FrameInfo frameInfo;
uint32_t iSize = 0; // Size of memory, bytes
uint32_t iSrcSize = 0; // Size of memory, bytes
std::shared_ptr<void> pData; // Smart pointer of data
std::shared_ptr<void> pSrcData; // Smart pointer of data(源数据) 推理时,RGB数据会拷贝一份,源数据不变用于传送到后处理引擎画框,另一份数据用于resize成640x640并归一化到0-1
uint64_t i64TimeStamp = 0; //帧数据时间戳
Step1Location step1Location; //step2 use
int iTargetType; //目标类别 (0:车号; 1:属性; 2:车头; 3:定检期; 4:集装箱)
int iBigClassId = -1; //大框id (给第二步用 1-属性 23456-编号)
int iCarXH = 0; //当前大框所属车厢
} InferenceData;
//帧数据
typedef struct
{
int iDataSource = 0; //数据来源标识
uint32_t iFrameId = 0;
FrameInfo frameInfo;
uint32_t iSize = 0; // Size of memory, bytes
std::shared_ptr<void> pData; // Smart pointer of data
uint64_t i64TimeStamp = 0; //帧数据时间戳
} FrameData;
//帧解码后数据
typedef struct
{
int iDataSource = 0; //数据来源标识
uint32_t iFrameId = 0;
uint32_t iWidth = 0; // Width of image
uint32_t iHeight = 0; // Height of image
uint32_t iWidthStride = 0; // Width after align up
uint32_t iHeightStride = 0; // Height after align up
acldvppPixelFormat format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; // Format of image
uint32_t iSize = 0; // Size of data in byte
std::shared_ptr<void> pData = nullptr; // Smart pointer of data
uint64_t i64TimeStamp = 0; //帧数据时间戳
bool bHostMemory = false; //数据解码后内存是否在Host侧
std::string strPicFilePath;
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
bool bIsEnd = false; //列车结束标识
int iStatus = 0; //0-无车; 1-有车行驶; 2-有车停止
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
int iRate = 0; //帧率
} DecodedData;
//存图数据
typedef struct
{
uint32_t iFrameId = 0;
uint32_t iWidth = 0; //Width of image
uint32_t iHeight = 0; //Height of image
std::string strImgPath;
std::string strImgName;
uint32_t iSize = 0; // Size of memory, bytes
std::shared_ptr<void> pData = nullptr; // Smart pointer of data
bool bIsEnd = false; //列车结束标识
bool bSaveToFtp = false; //是否保存至ftp服务器
uint64_t i64TimeStamp = 0; //帧数据时间戳
std::shared_ptr<DecodedData> pDecodeData = nullptr;
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
int nMonitorState = MONITOR_MODEL_INIT_STATE;
} SaveImgData;
//识别处理数据
typedef struct
{
int iDataSource = 0; //数据来源标识
uint32_t iFrameId = 0; //帧号
uint64_t i64TimeStamp = 0; //帧数据时间戳
uint32_t iDataNO = 0; //数据编号
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
int iStatus = 0; //车辆状态(0-无车; 1-有车行驶; 2-有车停止)
std::shared_ptr<DecodedData> pDecodeData = nullptr;
std::shared_ptr<void> pVoidData = nullptr;
std::shared_ptr<void> pData = nullptr;
uint32_t iSize = 0; // Size of memory, bytes
uint32_t iWidth = 0; //Width of image
uint32_t iHeight = 0; //Height of image
int iRate = 0; //帧率
int iTrainIndex = 0;
bool bIsEnd = false; //车厢结束标识
bool bIsTrainEnd = false; //列车结束标识
std::string strOrigTrainDate; //原过车日期 (格式YYYY-MM-DD)
std::string strOrigTrainName; //原车次 (格式HH-MM-SS)
uint32_t iOrigFrameId = 0; //原帧号
int nMonitorState = MONITOR_MODEL_INIT_STATE;
std::string strPicFilePath;
}ProcessData;
//预处理子数据
typedef struct
{
int iBigClassId = -1; //类别大类 (第二步用 1-属性 23456-编号)
int iCarXH = 0; //所属车厢序号 (第二步用)
uint32_t iWidth = 0;
uint32_t iHeight = 0;
uint32_t iWidthStride = 0; // Width after align up
uint32_t iHeightStride = 0; // Height after align up
acldvppPixelFormat format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; // Format of image
uint32_t iSize = 0; // Size of memory, bytes
std::shared_ptr<void> pData = nullptr; // Smart pointer of data
std::string strPicFilePath;
Step1Location step1Location;
} PreSubData;
//预处理数据
typedef struct
{
std::vector<PreSubData> vecPreSubData;
} PreData;
//推理子数据
typedef struct
{
int iBigClassId = -1; //类别大类 (第二步用 1-属性 23456-编号)
int iCarXH = 0; //图像所属车厢序号(第二步用)
std::vector<RawData> vecInferOutput;
Step1Location step1Location;
} AclSubData;
typedef struct
{
int iBigClassId = -1; //类别大类 (第二步用 1-属性 23456-编号)
int iCarXH = 0; //图像所属车厢序号(第二步用)
std::vector<stDetection> vecInferOutput;
Step1Location step1Location;
} CudaAclSubData;
//推理数据
typedef struct
{
std::vector<AclSubData> vecAclSubData;
} AclData;
//推理数据(Cuda)
typedef struct
{
std::vector<InferenceData> vecAclSubData;
} CudaAclData;
//动态检测结果
typedef struct
{
uint32_t iFrameId = 0; //帧号
uint64_t i64TimeStamp = 0; //帧数据时间戳
bool bHasTrain = false; //有无车标志
bool bIsEnd = false; //列车结束标识
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
int nMonitorState = MONITOR_MODEL_INIT_STATE;
} MoveData;
//模型具体结果
typedef struct
{
int iLine = -1; //字段代号(仅第二步使用)
int iClassId = -1; //大小框的类别
float fScore = 0; //分数
int iAnchorId = -1; //暂时仅记录
float fLTX = 0; //左上X坐标 Left Top x
float fLTY = 0; //左上y坐标 Left Top y
float fRBX = 0; //右下y坐标 Right Bottom x
float fRBY = 0; //右下y坐标 Right Bottom y
float fClear = 0; //清晰度
} SingleData;
//后处理子数据
typedef struct
{
int iTargetType; //目标类别 (0:车号; 1:属性; 2:车头; 3:定检期; 4:集装箱)
int iBigClassId = -1; //大框id (给第二步用 1-属性 23456-编号)
int iCarXH = 0; //当前大框所属车厢
std::vector<SingleData> vecSingleData; //模型具体结果
Step1Location step1Location; //原图上大框坐标(第二步坐标还原时用)
} PostSubData;
//后处理数据
typedef struct
{
int iModelType = -1; //(0:车号模型1:定检期模型2:集装箱模型)
std::vector<PostSubData> vecPostSubData; //模型后处理结果
uint32_t iFrameId = 0;
int nMonitorState = MONITOR_MODEL_INIT_STATE;
} PostData;
//转换具体内容
typedef struct
{
int iLine = -1; //字段代号
bool IsChkFlag = false; //是否符合基本数据校验
std::vector<std::string> vecValue; //转换后的每个字符内容
std::vector<float> vecScore; //每个字符对应的分数
} TransInfo;
//转换后子数据
typedef struct
{
int iBigClassId = -1; //类别大类(1-属性; 23456-编号; 7-定检期)
int iCarXH = 0; //当前大框所属车厢
float fScoreSum = 0; //大框内各个字符总得分, 取最优帧用
std::string strAllValue; //大框内所有字符, 集装箱校验,选优用
std::vector<TransInfo> vecTransInfo;//具体的转换信息
Step1Location step1Location; //原图上大框坐标
} TransSubData;
//转换后数据
typedef struct
{
std::vector<TransSubData> vecTransSubData;
} TransData;
//火车车号信息
typedef struct
{
int iDataSource = 0; //数据来源标识
int iCarXH = 0; //车厢序号
bool bIsEnd = false; //列车结束标识
uint64_t i64TrainEndTimeStamp = 0; //列车结束帧号时间戳(bIsEnd=true该参数才有值)
std::string strTrainType; //车厢类型
std::string strTrainNum; //车厢编号
std::string strBestImg; //最优图片名称
float fScoreSum = 0; //车号最优图字符总得分
uint64_t i64TimeStamp = 0; //最优图片时间戳
Step1Location step1Location; //原图上大框坐标
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
uint32_t iStartFrameId = 0; //当前车厢车号的开始帧号
uint32_t iEndFrameId = 0; //当前车厢车号的结束帧号
uint64_t i64StartTimeStamp = 0; //当前车厢车号的开始帧号时间戳
uint64_t i64EndTimeStamp = 0; //当前车厢车号的结束帧号时间戳
int iTrainTypeId = -1; //车厢类型ID(标识哪种类型的车)
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
} TrainNum;
//火车属性信息
typedef struct
{
int iDataSource = 0; //数据来源标识
int iCarXH = 0; //车厢序号
bool bIsEnd = false; //列车结束标识
uint64_t i64TrainEndTimeStamp = 0; //列车结束帧号时间戳(bIsEnd=true该参数才有值)
std::string strLoad; //载重
std::string strSelf; //自重
std::string strVolume; //容积
std::string strChange; //换长
std::string strVolumeSurface; //罐车容量记表
std::string strBestImg; //最优图片名称
float fScoreSum = 0; //属性最优图字符总得分
uint64_t i64TimeStamp = 0; //最优图片时间戳
Step1Location step1Location; //原图上大框坐标
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
uint32_t iStartFrameId = 0; //当前车厢属性的开始帧号
uint32_t iEndFrameId = 0; //当前车厢属性的结束帧号(即下节车厢属性的开始帧号)
uint64_t i64StartTimeStamp = 0; //当前车厢属性的开始帧号时间戳
uint64_t i64EndTimeStamp = 0; //当前车厢属性的结束帧号时间戳
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
} TrainPro;
//火车定检期信息
typedef struct
{
int iDataSource = 0; //数据来源标识
int iCarXH = 0; //车厢序号
bool bIsEnd = false; //列车结束标识
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
std::string strChkDate1; //定检期第一行
std::string strChkDate2; //定检期第二行
std::string strBestImg; //定检期最优图
float fScoreSum = 0; //定检期最优图字符总得分
uint64_t i64TimeStamp = 0; //最优图片时间戳
Step1Location step1Location; //原图上大框坐标
uint32_t iStartFrameId = 0; //当前车厢定检期的开始帧号
uint32_t iEndFrameId = 0; //当前车厢定检期的结束帧号
uint64_t i64StartTimeStamp = 0; //当前车厢定检期的开始帧号时间戳
uint64_t i64EndTimeStamp = 0; //当前车厢定检期的结束帧号时间戳
std::string strChkDate1DeadLine;//定检期1截至日期
} ChkDate;
//火车集装箱信息
typedef struct
{
int iDataSource = 0; //数据来源标识
int iCarXH = 0; //车厢序号
bool bIsEnd = false; //列车结束标识
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
std::string strContainerNo; //集装箱号
std::string strBestImg; //集装箱最优图
float fScoreSum = 0; //集装箱最优图总得分, 取最优帧用
uint64_t i64TimeStamp = 0; //集装箱最优图时间戳
Step1Location step1Location; //原图上大框坐标
uint32_t iStartFrameId = 0; //当前车厢集装箱的开始帧号
uint32_t iEndFrameId = 0; //当前车厢集装箱的结束帧号
bool bChkFlag = false; //集装箱是否校验通过
} Container;
//车厢的2个集装箱信息
typedef struct
{
Container container1;
Container container2;
} TrainContainer;
//火车信息
typedef struct
{
int iDataSource = 0; //数据来源标识
bool bIsEnd = false; //列车结束标识
uint64_t i64TrainEndTimeStamp = 0; //列车结束帧号时间戳(bIsEnd=true该参数才有值)
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
int iCarXH = 0; //车厢序号
uint64_t i64TimeStamp = 0; //当前车厢时间戳 = ((车号时间戳+属性时间戳) / 2)
TrainNum trainNum; //车厢车号信息
TrainPro trainPro; //车厢属性信息
ChkDate chkDate; //车厢定检期信息
Container container1; //车厢集装箱1信息
Container container2; //车厢集装箱2信息
uint32_t iStartFrameId = 0; //当前车厢开始帧号
uint32_t iEndFrameId = 0; //当前车厢结束帧号
uint64_t i64StartTimeStamp = 0; //当前车厢开始帧号时间戳(集装箱合并使用)
uint64_t i64EndTimeStamp = 0; //当前车厢结束帧号时间戳(集装箱合并使用)
bool bMergerFlag = false; //定检期集装箱合并完成
int iDirection = 0; //行驶方向(0-未知; 1-向左; 2-向右)
} Train;
//ftp上传数据
typedef struct
{
std::string strLocalFile; //本地文件
std::string strFtpFilePath; //上传路径
std::string strFtpFileName; //上传文件名
bool bIsEnd = false; //列车结束标识
} FtpData;
typedef struct
{
float fLTX = 0; //左上X坐标
float fLTY = 0; //左上y坐标
float fRBX = 0; //右下y坐标
float fRBY = 0; //右下y坐标
}Coordinates;
typedef struct
{
std::string strTrainDate; //过车日期 (格式YYYY-MM-DD)
std::string strTrainName; //车次 (格式HH-MM-SS)
uint32_t iStartFrameId = 0; //当前车厢开始帧号
uint64_t i64StartTimeStamp = 0; //当前车厢开始帧时间戳
uint32_t iEndFrameId = 0; //当前车厢结束帧号
uint64_t i64EndTimeStamp = 0; //当前车厢结束帧时间戳
int iTrainIndex = 0; //第几节车厢
bool bIsEnd = false; //是否最后一节
bool bmodelconfirmed; //是否是间隔模型切分的车厢
} TrainRange;
//模型识别配置结构体
//包含文件配置部分和内部处理变量
typedef struct imganalyse
{
// from file
/////////下述设定取自csv文件
int nType; //算法目的 0:动态检测 1:车厢划分
int nAreaX1; //算法监测区域 开始位置x坐标
int nAreaY1; //算法监测区域 开始位置y坐标
int nAreaX2; //算法监测区域 结束位置x坐标
int nAreaY2; //算法监测区域 结束位置y坐标
int bOrLevel; //算法结果融合等级 相同值进行与运算 不同值进行或运算
bool bDiff; //是否以不同作为判断条件 false:以匹配度相同作为判定条件 true以匹配度不同作为判定条件
bool bOn; //是否启用改区域匹配监测(该算法是否有效) false不启用(无效) true:启用(有效)
double dSameThresholdVal; //判定匹配相同的阈值
double dDiffThresholdVal; //判定匹配不同的阈值
int nPauseMaxCoumt; //判定为停车的最大计量(超过设定值判定为停车)
int npicimprovetype; //图像改善处理(包含 灰度化/均衡化直方图/gamma变换/自定义)
int templemethod; //模型比对模式
int histmethod; //直方图比对模式
int specmethod; //自定义比对模式
int compmethod; //对比类型(模型比对/模型比对/自定义比对,可多选)
std::string baseImagePath; //基准图片路径
/////////下述设定为处理识别变量
double dComparePoint; //比对值
double dPreComparePoint; //比对值
bool bChanged; //与基准图对比值 是否发生变化 true:发生变化 false:没有发生变化
bool bPreChanged; //上一帧与基准图对比值
bool fluctuationFlag; //最近100帧的最大值与最小值的波动标志
int nSameCount; //比对值没有发生变化的计数
int iIndex; //第几个配置项
}AnalyseInfo;
//车厢划分信息结构体
//文件配置
typedef struct trainpartion
{
std::string strTrainDate;
std::string strTrainName;
int nindex; //车厢顺位
uint64_t i64StartTimeStamp; //当节车厢出现的开始帧时间
uint64_t i64EndTimeStamp; //当节车厢出现的结束帧时间
float fspeed; //当节车厢的车速
int startframe; //当节车厢出现的开始帧帧号
int endframe; //当节车厢出现的结束帧帧号
int modelSpaceFrame;
bool bfuncconfirmed; //是否算法划分完成 true:是 false:否
bool bmodelconfirmed; //是否根据第一次识别结果确认完成 true:是 false:否
float fLTX; //车钩开始位置X值
float fLTY; //车钩开始位置y值
float fRBX; //车钩结束位置X值
float fRBY; //车钩结束位置y值
bool bIsEnd = false; //是否最后一节
int nStatus; //方向(0:未知1:向左行驶2:向右行驶)
int iRate; //帧率
}PartionInfo;
typedef struct
{
std::shared_ptr<ProcessData> processData;
std::string strAllClassType;
}TrainBackInfo;
//方向计算
typedef struct
{
int iBigClassId = -1; //大框id (给第二步用 1-属性 23456-编号)
uint32_t iFrameId = 0; //帧号
float fCenterX; //第一步识别目标中心点X坐标
} CalculateInfo;
typedef struct
{
int iDataSource = 0; //数据来源标识
uint32_t iFrameId = 0;
FrameInfo frameInfo;
uint32_t iSize = 0; // Size of memory, bytes
uint32_t iSrcSize = 0; // Size of memory, bytes
std::shared_ptr<void> pData; // Smart pointer of data
std::shared_ptr<void> pSrcData; // Smart pointer of data(源数据) 推理时,RGB数据会拷贝一份,源数据不变用于传送到后处理引擎画框,另一份数据用于resize成640x640并归一化到0-1
uint64_t i64TimeStamp = 0; //帧数据时间戳
} YoloModelInfo;
template<typename _T>
std::string join_dims(const std::vector<_T>& dims){
std::stringstream output;
char buf[64];
const char* fmts[] = {"%d", " x %d"};
for(int i = 0; i < dims.size(); ++i){
snprintf(buf, sizeof(buf), fmts[i != 0], dims[i]);
output << buf;
}
return output.str();
}
inline unsigned int getElementSize(nvinfer1::DataType t);
inline int64_t volume(const nvinfer1::Dims& d);
#endif