Train_Identify/nvidia_ascend_engine/common/AppCommon.h

930 lines
34 KiB
C
Raw Normal View History

2024-01-23 02:46:26 +00:00
#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-向右)
} 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