Ultra Fast车道线检测C++实现

【车道线】Ultra Fast With NCNN

  • 前言
  • 关键解码部分

前言

如何获取模型,请参考前文链接。
基于C/C++基本编程语言,NCNN推理框架实现Ultra Fast车道线检测算法,github求赞,效果图如下:
Ultra Fast车道线检测C++实现_第1张图片
Ultra Fast车道线检测C++实现_第2张图片

关键解码部分

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<
    //     }
    //     std::cout<
    // }

    delete [] loc;
    delete [] prob;
    delete [] prob_sum;
    ex.clear();
    ncnnMatOUT.release();
}

你可能感兴趣的:(车道线检测,c++,自动驾驶,深度学习)