/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DNN_STRUCT_BASE_HPP__ #define DNN_STRUCT_BASE_HPP__ #include "cce/cce_def.hpp" namespace cce { /** * @ingroup dnn * @brief max number of dimensions */ #define CC_DIM_MAX (8) /** * @ingroup dnn * @brief max number of dimensions when use NC1HWC0 format */ #define CC_REALDIM_MAX (4) /** * @ingroup dnn * @brief max input count of MscnnBoxOutput */ #define CC_MAX_INPUT_CNT (10) /** * @ingroup dnn * @brief image dimensions of aipp input */ #define CC_AIPP_IMG_DIM (2) /** * @ingroup dnn * @brief image channel number of aipp input */ #define CC_AIPP_IMG_CHN_NUM (4) /** * @ingroup dnn * @brief element number of aipp color space convertion matrix */ #define CC_AIPP_CSC_MATRIX_DIM (9) /** * @ingroup dnn * @brief element number of aipp color space convertion bias */ #define CC_AIPP_CSC_BIAS_DIM (3) /** * @ingroup dnn * @brief parameter number of op exp/log/pow */ #define PARAM_CNT_THREE (3) /** * @ingroup dnn * @brief parameter number of op nonmaxsuppression */ #define PARAM_CNT_TWO (2) #define DIMCNT_NUMBER_ONE (1) #define DIMCNT_NUMBER_TWO (2) #define DIMCNT_NUMBER_FOUR (4) #define COMMON_FORMAT_NCHW_N_INDEX (0) #define COMMON_FORMAT_NCHW_C_INDEX (1) #define COMMON_FORMAT_NCHW_H_INDEX (2) #define COMMON_FORMAT_NCHW_W_INDEX (3) /** * @ingroup dnn * @brief parameter number of op upsample */ #define UPSAMPLE_SCAL_DEFAULT_TWO (2) #define UPSAMPLE_ILLEGAL_VALUE_1 (1) /** * @ingroup dnn * @brief struct define of StridedSlice required params. */ typedef struct tagCcStridedSlice { uint32_t dimCnt; int32_t begin[CC_DIM_MAX]; int32_t end[CC_DIM_MAX]; int32_t strides[CC_DIM_MAX]; } ccStridedSlice_t; /** * @ingroup dnn * @brief struct define of Strided_slice attrs */ typedef struct tagCcStridedSliceAttrs { uint32_t beginMask; uint32_t endMask; uint32_t ellipsisMask; uint32_t newAxisMask; uint32_t shrinkAxisMask; } ccStridedSliceAttrs_t; /** * @ingroup dnn * @brief params of batchToSpace */ typedef struct tagCcBatchToSpace { int32_t blockShapeLength; int32_t blockShape[CC_DIM_MAX]; int32_t crops[2 * CC_DIM_MAX]; } ccBatchToSpace_t; /** * @ingroup dnn * @brief params of spaceToBatch */ typedef struct tagCcSpaceToBatch { int32_t blockShapeLength; int32_t blockShape[CC_DIM_MAX]; int32_t paddings[2 * CC_DIM_MAX]; } ccSpaceToBatch_t; /** * @ingroup dnn * @brief struct define of tensor */ typedef struct tagCcTensor { ccTensorFormat_t format; ccDataType_t dataType; int32_t dimCnt; int32_t realDimCnt; uint32_t dataSize; int32_t dim[CC_DIM_MAX]; int32_t stride[CC_DIM_MAX]; ccVecQuantizePara_t vecQuantizePara; } ccTensor_t; /** * @ingroup dnn * @brief struct define of filter tensor */ typedef struct tagCcFilter { ccTensorFormat_t format; ccDataType_t dataType; int32_t dimCnt; uint32_t dataSize; int32_t dim[CC_DIM_MAX]; } ccFilter_t; /** * @ingroup dnn * @brief struct define of convolution operator */ typedef struct tagCcConvolution { ccConvolutionMode_t mode; ccPaddingMode_t padMode; int32_t dimCnt; int32_t padding[2 * (CC_DIM_MAX - 2)]; int32_t filterStride[CC_DIM_MAX - 2]; int32_t dilation[CC_DIM_MAX - 2]; int32_t group; ccQuantizeDescriptor_t quantInfo; ccConvolutionAipp_t aippInfo; int32_t adj[CC_DIM_MAX - 2]; int32_t targetShape[CC_DIM_MAX - 2]; int32_t beforePadding[2 * (CC_DIM_MAX - 2)]; // pad before conv uint32_t reluFlag; int64_t concatBatchSize; } ccConvolution_t; #define ccCorrelation_t ccConvolution_t typedef struct tagCcFullConnection_t { ccQuantizeDescriptor_t quantInfo; uint32_t infoTabSize; const void *infoTab; bool reluFlag; ccFullConnectFwdAlgo_t algo; } ccFullConnection_t; typedef struct tagCcConcatFour2Five_t { uint32_t branchNum; // how many branch for box or class uint32_t classNum; // box branch's classNum is four, class branch's classNum is class number } ccConcatFour2Five_t; typedef struct tagCcTransdata_t { uint64_t scaleQAddr; uint8_t scaleQValueMode; uint64_t offsetQAddr; uint8_t quantAlgo; uint8_t quantize8bitFlag; } ccTransdata_t; /** * @ingroup dnn * @brief struct define of pooling operator */ typedef struct tagCcPooling { ccPoolingMode_t mode; ccPaddingMode_t padMode; ccNanPropagation_t maxpoolingNanOpt; int32_t dimCnt; int32_t windowDim[CC_DIM_MAX - 2]; int32_t padding[CC_DIM_MAX - 2]; int32_t stride[CC_DIM_MAX - 2]; int32_t dataMode; int32_t ceilMode; ccQuantizeDescriptor_t quantInfo; ccPooingFwdAlgo_t algo; } ccPooling_t; /** * @ingroup dnn * @brief struct define of activation operator */ typedef struct tagCcActivation { ccActivationMode_t mode; ccNanPropagation_t reluNanOpt; double coef; /* ceiling for clipped RELU, alpha for ELU */ ccActivationPara_u activationPara; } ccActivation_t; /** * @ingroup dnn * @brief struct define of svdf operator */ typedef struct tagCcSvdf { ccTensorFormat_t format; ccDataType_t dataType; uint32_t batches; uint32_t features; uint32_t rank; uint32_t inputSize; uint32_t memorySize; } ccSvdf_t; /** * @ingroup dnn * @brief struct define of svdf operator */ typedef struct tagCcHashTableLookup { ccTensorFormat_t format; ccDataType_t lookupType; ccDataType_t keyType; ccDataType_t valueType; ccDataType_t outputType; ccDataType_t hitsType; uint32_t lookups; uint32_t keys; uint32_t rows; uint32_t features; uint16_t valueScale; uint16_t outputScale; uint16_t valueOffset; uint16_t outputOffset; } ccHashTableLookup_t; /** * @ingroup dnn * @brief struct define of prelu operator */ typedef struct tagCcPRelu { ccNanPropagation_t reluNanOpt; int32_t slopeCount; bool channelShared; } ccPRelu_t; /** * @ingroup dnn * @brief struct define of crop operator */ typedef struct tagCcCrop { int32_t startAxis; int32_t offset[CC_DIM_MAX]; int32_t offsetCnt; } ccCrop_t; /** * @ingroup dnn * @brief struct define of SpatialTransformer operator */ typedef struct tagCcSpatialTransformer { ccSamplerType_t samplerType; ccDataType_t dataType; int32_t dimCnt; uint64_t dim[CC_DIM_MAX]; uint64_t alignCorner; } ccSpatialTransformer_t; /** * @ingroup dnn * @brief struct define of ShiftTransformer operator */ typedef struct tagCcShiftTransformer { ccSamplerType_t samplerType; double xPreDefined; double yPreDefined; bool xShift; bool yShift; int32_t gridH; int32_t gridW; } ccShiftTransformer_t; /** * @ingroup dnn * @brief struct define of FasterRcnnProposal operator */ typedef struct tagCcFasterRcnnProposal { int32_t preNMStopK; int32_t postNMStopK; float nmsTresh; float minSize; float featStride; float baseSize; int32_t ratioCnt; int32_t scaleCnt; float *ratio; float *scale; int32_t imgH; int32_t imgW; } ccFasterRcnnProposal_t; /** * @ingroup dnn * @brief struct define of LRN operator */ typedef struct tagCcLRN { ccLRNMode_t lrnMode; int32_t lrnN; double lrnAlpha; double lrnBeta; double lrnK; } ccLRN_t; /** * @ingroup dnn * @brief struct define of instanceNorm */ typedef struct tagCcInstancenorm { ccInstanceNormMode_t mode; double epsilon; } ccInstancenorm_t; /** * @ingroup dnn * @brief struct define of assignOp operator */ typedef struct tagCcAssignOp { ccAssignOpMode_t assignOpMode; } ccAssignOp_t; /** * @ingroup dnn * @brief struct define of arcSinCos operator */ typedef struct tagCcArcSinCos { ccArcSinCosMode_t arcSinCosMode; } ccArcSinCos_t; /** * @ingroup dnn * @brief struct define of Detectpostprocess operator */ typedef struct tagCcDetectpostprocess { int32_t numClasses; float confThreshold; float nmsThreshold; int32_t outTopK; float bboxRegWeightsDx; float bboxRegWeightsDy; float bboxRegWeightsDw; float bboxRegWeightsDh; } ccDetectpostprocess_t; /** * @ingroup dnn * @brief struct define of FasterRcnnDetectionOutput operator */ typedef struct tagCcFasterRcnnDetectionOutput { int32_t numClasses; float nmsThreshold; float postConfThreshold; int32_t imgH; int32_t imgW; int32_t batchSize; } ccFasterRcnnDetectionOutput_t; /** * @ingroup dnn * @brief struct define of SsdDetectionOutput operator */ typedef struct tagCcSsdDetectionOutput { int32_t numClasses; int32_t backgroundLabelId; double preConfThreshold; int32_t preTopK; double nmsThreshold; double nmsEta; ccBoxCodeType_t codeType; int32_t outTopK; bool shareLocation; bool varianceEncodedInTarget; uint32_t boxTypeNum; float var[4]; uint32_t variance_num; } ccSsdDetectionOutput_t; /** * @ingroup dnn * @brief struct define of RefinedetDetectionOutput operator */ typedef struct tagCcRefinedetDetectionOutput { int32_t numClasses; int32_t backgroundLabelId; double preConfThreshold; int32_t preTopK; double nmsThreshold; double nmsEta; ccBoxCodeType_t codeType; int32_t outTopK; bool shareLocation; bool varianceEncodedInTarget; uint32_t boxTypeNum; float var[4]; uint32_t variance_num; double objectness_score; } ccRefinedetDetectionOutput_t; /** * @ingroup dnn * @brief struct define of MsrGenerateRpnProposals operator */ typedef struct tagCcMsrGenerateRpnProposals { int32_t preNmsTopK; int32_t postNmsTopK; float nmsThreshold; float rpnMiniSize; int32_t imgH; int32_t imgW; uint32_t boxTypeNum; float scoreThreshold; } ccMsrGenerateRpnProposals_t; /** * @ingroup dnn * @brief struct define of RetinaPostprocessor operator */ typedef struct tagCcRetinaPostprocessor { int32_t numClasses; int32_t maxDetections; float nmsThreshold; float scoreThreshold; int32_t imgH; int32_t imgW; uint32_t boxTypeNum; float mean[4]; int32_t meanNum; float std[4]; int32_t stdNum; int32_t outputNum; bool ocrFlag; } ccRetinaPostprocessor_t; /** * @ingroup dnn * @brief struct define of GenerateSsdAnchors operator */ typedef struct tagCcGenerateSsdAnchors { int32_t featureMapShapeList[20]; uint32_t featureMapShapeListSize; int32_t boxSpecsNum[10]; uint32_t boxSpecsNumSize; float scales[10]; uint32_t scalesNum; float aspectRatios[10]; uint32_t aspectRatiosNum; int32_t baseAnchorSize[2]; uint32_t baseAnchorSizeNum; int32_t anchorStride[2]; uint32_t anchorStrideNum; int32_t anchorOffset[2]; uint32_t anchorOffsetNum; bool reduceBoxesInLowestLayer; float minScale; float maxScale; int32_t imgH; int32_t imgW; } ccGenerateSsdAnchors_t; /** * @ingroup dnn * @brief struct define of MscnnBoxOutput operator */ typedef struct tagCcMscnnBoxOutput { double fgThreshold; double nmsThreshold; ccNmsType_t nmsType; int32_t fieldH[CC_MAX_INPUT_CNT]; int32_t fieldW[CC_MAX_INPUT_CNT]; int32_t downsampleRate[CC_MAX_INPUT_CNT]; int32_t defaultBoxCnt; double fieldWhr; double fieldXyr; int32_t maxNmsNum; int32_t maxPostNmsNum; double minSize; } ccMscnnBoxOutput_t; /** * @ingroup dnn * @brief struct define of NMS operator */ typedef struct tagCcNms { int32_t numClasses; int32_t backgroundLabelId; double preConfThreshold; int32_t preTopK; double nmsThreshold; double nmsEta; int32_t postTopK; int32_t outTopK; double postConfThreshold; bool shareLocation; } ccNms_t; /** * @ingroup dnn * @brief struct define of NMS/MultiClassNMS operator */ typedef struct tagCcMultiClassNms { uint64_t numClasses; float objThreshold; float nmsThreshold; float clsThreshold; bool normal; uint64_t coorType; } ccCcMultiClassNms_t; /** * @ingroup dnn * @brief struct define of YoloDetectionOutput operator */ typedef struct tagCcYoloDetectionOutput { ccYoloVersion_t yoloVersion; uint32_t netH; uint32_t netW; uint32_t postTopK; uint32_t classes; float nmsThreshold; float iouThreDecay; float coorScaleFactor; bool relative; float objThreshold; float clsThreshold; uint32_t biasNum; float *bias; } ccYoloDetectionOutput_t; /** * @ingroup dnn * @brief struct define of GetRegionBox operator */ #ifndef CC_MAX_YOLO_BIAS_NUM #define CC_MAX_YOLO_BIAS_NUM (16) #endif typedef struct tagCcGetRegionBox { uint32_t biasNum; uint32_t H; uint32_t W; float bias[CC_MAX_YOLO_BIAS_NUM]; } ccGetRegionBox_t; /** * @ingroup dnn * @brief struct define of CorrectBoxes operator */ typedef struct tagCorrectBoxes { uint32_t netW; uint32_t netH; bool relative; } ccCorrectBoxes_t; /** * @ingroup dnn * @brief struct define of ClsProb operator */ typedef struct tagClsProb { float objThreshold; } ccClsProb_t; /** * @ingroup dnn * @brief struct define of SsdPriorBox operator */ typedef struct tagCcSsdPriorBox { ccBoxCodeType_t codeType; double *minSize; int32_t minSizeNum; double *maxSize; int32_t maxSizeNum; double *aspectRatio; int32_t aspectRatioNum; double *variance; int32_t varianceNum; int32_t imgH; int32_t imgW; double stepH; double stepW; double offset; bool flip; bool clip; } ccSsdPriorBox_t; /** * @ingroup dnn * @brief struct define of Yolo2Region operator */ typedef struct tagCcYolo2Region { ccSoftmaxTree_t softmaxTree; bool softmax; bool background; bool treeSoftmax; } ccYolo2Region_t; /** * @ingroup dnn * @brief struct define of YoloRegion operator */ typedef struct tagCcYoloRegion { ccSoftmaxTree_t softmaxTree; bool softmax; bool background; bool treeSoftmax; int32_t classes; int32_t coords; int32_t boxes; ccYoloVersion_t yoloV; } ccYoloRegion_t; /** * @ingroup dnn * @brief struct define of power operator */ typedef struct tagCcPower { float scale; float shift; float power; } ccPower_t; /** * @ingroup dnn * @brief struct define of exp operator */ typedef struct tagCcExp { ccDataType_t dataType; uint32_t paramCnt; } ccExp_t; /** * @ingroup dnn * @brief struct define of exp operator */ typedef struct tagCcLog { ccDataType_t dataType; uint32_t paramCnt; } ccLog_t; /** * @ingroup dnn * @brief struct define of pow operator */ typedef struct tagCcPow { ccDataType_t dataType; uint32_t paramCnt; } ccPow_t; /** * @ingroup dnn * @brief struct define of padv2 operator */ typedef struct tagCcPadV2 { ccPadMode_t padMode; void *padValue; ccDataType_t padValueType; int32_t padDimCnt; int32_t padShapeLow[CC_DIM_MAX]; int32_t padShapeHigh[CC_DIM_MAX]; } ccPadV2_t; /** * @ingroup dnn * @brief struct define of psROIPooling operator */ typedef struct tagCcPsRoiPooling { ccPoolingMode_t poolingMode; int32_t pooledH; int32_t pooledW; float spatialScale; float padRatio; int32_t groupSize; int32_t outputDim; } ccPsRoiPooling_t; /** * @ingroup dnn * @brief struct define of RoIAlign operator */ typedef struct tagCcRoiAlign { int32_t pooledH; int32_t pooledW; float spatialScale; int32_t samplingRatio; } ccRoiAlign_t; /** * @ingroup dnn * @brief struct define of RoiInterpPooling operator */ typedef struct tagCcRoiInterpPooling { int32_t pooledH; int32_t pooledW; int32_t poolKernelH; int32_t poolKernelW; int32_t pooledTailH; int32_t pooledTailW; float spatialScaleH; float spatialScaleW; } ccRoiInterpPooling_t; /** * @ingroup dnn * @brief struct define of DetectionFull3DOutput operator */ typedef struct tagCcDetectionFull3DOutput { int32_t imageWidth; int32_t imageHeight; int32_t numAngleBins; float trcMarginRatioX; float trcMarginRatioY; int32_t pitchRangeD; int32_t pitchPresetD; float mountHeight; int32_t visiblenessBins; float meanVisibleness; bool discreteVisibleness; } ccDetectionFull3DOutput_t; /** * @ingroup dnn * @brief struct define of MsrFastRcnnPredictions operator */ typedef struct tagMsrFastRcnnPredictions { int32_t numClasses; // num of classes float scoreThreshold; // the threshold of the score double nmsThreshold; // the threshold of nms int32_t postTopK; int32_t outTopK; int32_t imgH; // the height of image int32_t imgW; // the width of image } ccMsrFastRcnnPredictions_t; typedef struct tagCcResizeBilinear { ccResizeOutputDimMode_t resizeOutputDimMode; bool alignCorners; int32_t zoom_factor; int32_t shrink_factor; int32_t height; int32_t width; int32_t pad_begin; int32_t pad_end; } ccResizeBilinear_t; typedef struct tagCcResizeNearestNeighbor { bool alignCorners; int32_t height; int32_t width; } ccResizeNearestNeighbor_t; typedef struct tagCcEltwise { ccQuantize_t *quantInfo; bool reluFlag; } ccEltwise_t; typedef struct tagCcBatchNorm { bool reluFlag; } ccBatchNorm_t; typedef struct tagCcPad { ccPadMode_t padMode; float padValue; int32_t htoppad; // padLow[0] int32_t hbottompad; // padHigh[0] int32_t wleftpad; // padLow[1] int32_t wrightpad; // padHigh[1] } ccPad_t; typedef struct tagCcSubCondition { uint32_t BaseCondValue[4]; ccCMPType_t condType[4]; ccResultType_t resultType; } ccSubCondition; typedef struct tagCcShapeClassifyCond { uint32_t subConditionNum; ccResultType_t resultType; uint32_t true_value; ccSubCondition subCond[2]; } ccShapeClassifyCond; #ifndef CC_SHAPE_CLASSIFY_CONDITION_NUM #define CC_SHAPE_CLASSIFY_CONDITION_NUM (8) #endif typedef struct tagCcShapeClassify { uint32_t shapeClassifyConditionNum; uint32_t defaultValue; ccShapeClassifyCond shapeClassifyCond[CC_SHAPE_CLASSIFY_CONDITION_NUM]; } ccShapeClassify_t; /** * @ingroup dnn * @bref struct define of square operator */ typedef struct tagCcSquare { ccSquareMode_t mode; } ccSquare_t; /* * @ingroup dnn * @brief operation of segment reduction */ typedef enum { CC_SEGMENT_REDUCTION_OP_SUM = 0, /**< sum */ CC_SEGMENT_REDUCTION_OP_INVALID } ccSegmentReductionOpType_t; typedef struct tagCcFillParam { // The filler type. ccFillOpType_t fillType; ccDataType_t valueDatatype; const void *value; // the value in constant fill const void *min; // the min value in uniform fill const void *max; // the max value in uniform fill const void *mean; // the mean value in Gaussian fill const void *std; // the std value in Gaussian fill // the seed used to generate data in Gaussian and uniform fill int64_t seed1; int64_t seed2; } ccFillParam_t; typedef struct tagNonMaxSuppression { ccDataType_t dataType; uint32_t paraCount; } ccNonMaxSuppression_t; typedef struct tagCcArgmaxmin { int32_t axisType; bool outMaxVal; int64_t topK; int64_t reduceSize; int64_t reduceStride; int64_t axis; bool keepDims; } ccArgmaxmin_t; typedef struct tagUpsamplePara { int32_t scale; int32_t scaleHeight; int32_t scaleWidth; int32_t upsampleHeight; int32_t upsampleWidth; bool padOutHeight; bool padOutWidth; } ccUpsamplePara_t; typedef struct tagCcConcatFive2Four_t { ccTransForLossMode_t mode; uint32_t classNum; } ccConcatFive2Four_t; }; // namespace cce #endif // DNN_STRUCT_BASE_HPP__