// SSD检测器 #ifndef __DETECTOR_SSD_H__ #define __DETECTOR_SSD_H__ #include #include #include #include #include #include "Decoder.h" using namespace std; using namespace cv; using namespace migraphx; namespace migraphxSamples { class DetectorSSD { public: DetectorSSD(); ~DetectorSSD(); ErrorCode Initialize(InitializationParameterOfDetector initializationParameterOfDetector); ErrorCode Detect(const cv::Mat &srcImage,std::vector &resultsOfDetection); ErrorCode Detect(DCU_Frame &srcImage, std::vector &resultsOfDetection); float* preprocess_Image = NULL; private: ErrorCode DoCommonInitialization(InitializationParameterOfDetector initializationParameterOfDetector); void GetSSDParameter(); void GetResult(const std::vector> &classification,const std::vector> ®ression,std::vector &resultsOfDetection); // 添加4个新层:PermuteLayer,PriorBoxLayer,SoftmaxLayer,DetectionOutputLayer std::vector PermuteLayer(const std::vector &data,int width,int height,int channels); void PriorBoxLayer(int indexOfLayer,int* priorboxOutputData); void SoftmaxLayer(int softMaxWidth[],int* softMaxInputData[], int* softMaxOutputData); void DetectionOutputLayer(int* allLocPreds[], int* allPriorBoxes[],int* confScores, int* assistMemPool); void ComputeSoftMax(int* src, int size, int* dst); void QuickSort(int* src,int low, int high, QuickSortStack *stack,int maxNum); void NonMaxSuppression( int* proposals, int anchorsNum,int NMSThresh,int maxRoiNum); void Swap(int* src1, int* src2); void ComputeOverlap(int xMin1, int yMin1, int xMax1, int yMax1, int xMin2,int yMin2, int xMax2, int yMax2, int* areaSum, int* areaInter); void CreateDetectionResults(std::vector &resultsOfDetection); private: cv::FileStorage configurationFile; InitializationParameterOfDetector initializationParameter; FILE *logFile; // net migraphx::program net; cv::Size inputSize; string inputName; migraphx::shape inputShape; float scale; cv::Scalar meanValue; bool swapRB; bool crop; bool useInt8; bool useFP16; SSDParameter ssdParameter; migraphx::parameter_map ParameterMap; }; } #endif