#include "detect_model.h" namespace trt_vehicle{ DetectModel::DetectModel(const std::string& modelPath,float scoreThres,float iouThres) { auto ret = m_predictor.init(modelPath); assert(ret == 0); setSize(); m_score = new float[m_batch*m_outputNum*m_classNum]; m_box = new float[m_batch*m_outputNum*m_boxNum]; m_scoreCuda = nullptr; cudaMalloc(&m_scoreCuda,m_batch*m_outputNum*m_classNum*sizeof(float)); m_boxCuda = nullptr; cudaMalloc(&m_boxCuda,m_batch*m_outputNum*m_boxNum*sizeof(float)); m_imageDataCuda= nullptr; cudaMalloc(&m_imageDataCuda, m_batch*m_inputSizeW*m_inputSizeH*m_inputSizeC*sizeof(float)); m_scoreThres = scoreThres; m_iouThres = iouThres; } DetectModel::~DetectModel(){ if(m_score){ delete [] m_score; } if(m_box){ delete [] m_box; } if(m_scoreCuda){ cudaFree(m_scoreCuda); } if(m_boxCuda){ cudaFree(m_boxCuda); } if(m_imageDataCuda){ cudaFree(m_imageDataCuda); } } int DetectModel::setSize(){ m_predictor.getSizeYolo(m_batch,m_inputSizeC,m_inputSizeH,m_inputSizeW,m_outputNum,m_classNum,m_boxNum); return 0; } int DetectModel::extractFeature(std::vector imgs) { vector imageData; for(int i=0;i buffers = { m_imageDataCuda, m_scoreCuda, m_boxCuda}; m_predictor.infer(buffers, imgs.size()); return 0; } int DetectModel::predict(std::vector imgs,std::vector>& outBoxes){ outBoxes.clear(); // infer img extractFeature(imgs); //Transfer data and score from gpu to cpu cudaMemcpy(m_score, m_scoreCuda,m_batch*m_outputNum*m_classNum*sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy(m_box, m_boxCuda,m_batch*m_outputNum*m_boxNum*sizeof(float), cudaMemcpyDeviceToHost); //save the boxes which's score more than scoreThres for(int b=0;b boxes; std::vector scores,outScores; int boxLen = 4; for(int i=0;im_scoreThres){ ObjBox box; int bStart = b*m_outputNum*m_boxNum; xyxy2objBox((m_box[bStart+boxLen*i]-m_wStarts[b])/m_ratioW,(m_box[bStart+boxLen*i+1]-m_hStarts[b])/m_ratioH,(m_box[bStart+boxLen*i+2]-m_wStarts[b])/m_ratioW,(m_box[bStart+boxLen*i+3]-m_hStarts[b])/m_ratioH,box); box.score = scoreMax; box.class_ = index; boxes.push_back(box); scores.push_back(scoreMax); } } std::vector outBox; nonMaximumSuppression(boxes, scores, m_iouThres,outBox); outBoxes.push_back(outBox); } return 0; } int DetectModel::predictPadding(std::vector imgs,std::vector>& outBoxes, int paddingValue){ std::vector imgPaddings; m_hStarts.clear(); m_wStarts.clear(); for(int i=0;i0){ predict(imgPaddings,outBoxes); } return 0; } }