如何获取模型,请参考。
基于C/C++基本编程语言,NCNN推理框架实现Ultra Fast车道线检测算法,,效果图如下:
ncnn框架把模型输出写入了一整块内存,不像python的numpy矩阵那样直观,举个例子大家就能快速了解,以2X2矩阵为例:在C++中可以定义int a1[2][2]来表示2X2矩阵,但这样的方式不适用于维度过高的矩阵(这种定义变量存于栈区);转而通过int * a2 = new int[2*2]这种方式来定义;a1[0][0]=a2[0]、a1[0][1] = a2[2]、a1[1][0] = a2[2]、a1[1][1]=a2[3]。
我按照原作者的解码方式重写了C/C++版,具体原理可以去看原作者的。
void clModel::GetModelRslt(cv::Mat cvMatImg)
{
int iTemp;
ncnn::Extractor ex = ncnnModel.create_extractor();
ncnnMatIN = ncnn::Mat::from_pixels_resize(cvMatImg.data, ncnn::Mat::PIXEL_BGR2RGB, cvMatImg.cols, cvMatImg.rows, iInputImgW, iInputImgH);
ncnnMatIN.substract_mean_normalize(afMean, afNorm);
startTime = clock();
ex.input("input", ncnnMatIN);
ex.extract("output", ncnnMatOUT);
int c = ncnnMatOUT.c;
int w = ncnnMatOUT.w;
int h = ncnnMatOUT.h;
float *prob = new float[h*w*c];
float *prob_sum = new float[h*w];
memset(prob, 0, h*w*c*sizeof(float));
memset(prob_sum, 0, h*w*sizeof(float));
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
for(int k = 0; k < c-1; k++)
{
prob_sum[i*w+j] += std::exp(ncnnMatOUT[k*h*w + i*w + j]);
}
}
}
for(int i = 0; i < c-1; i++)
{
for(int j = 0; j < h; j++)
{
for(int k = 0; k < w; k++)
{
prob[i*h*w + j*w + k] = std::exp(ncnnMatOUT[i*h*w + j*w + k]) / prob_sum[j * w + k];
}
}
}
for(int i = 0; i < c-1; i++)
{
for(int j = 0; j < h; j++)
{
for(int k = 0; k < w; k++)
{
prob[i*h*w + j*w + k] = prob[i*h*w + j*w + k] * (float)(i+1);
}
}
}
float *loc = new float[h*w];
memset(loc, 0, h*w*sizeof(float));
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
for(int k = 0; k < c - 1; k++)
{
loc[i*w + j] += prob[k*h*w + i*w + j];
}
}
}
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
iTemp = 0;
for(int k = 1; k < c; k++)
{
if(ncnnMatOUT[k*h*w + i*w + j] > ncnnMatOUT[iTemp*h*w + i*w + j])
{
iTemp = k;
}
else
{
continue;
}
}
if(iTemp == (c-1))
{
loc[i*w + j] = 0;
stLaneRslt.afLaneRslt[i][j] = 0;
}
else
{
//stLaneRslt.afLaneRslt[i][j] = ((float)iTemp + 1) * flColSampleW;
stLaneRslt.afLaneRslt[i][j] = loc[i*w + j] * flColSampleW;
}
}
}
endTime = clock();
std::cout<<"time is: "<<(double)(endTime - startTime) / CLOCKS_PER_SEC<<"s"<<std::endl;
// for(int i = 0; i < h; i++)
// {
// for(int j = 0; j < w; j++)
// {
// std::cout<<stLaneRslt.afLaneRslt[i][j]<<" ";
// }
// std::cout<<std::endl;
// }
delete [] loc;
delete [] prob;
delete [] prob_sum;
ex.clear();
ncnnMatOUT.release();
}
因篇幅问题不能全部显示,请点此查看更多更全内容