C ++ время работы увеличивается - PullRequest
1 голос
/ 11 февраля 2020

Я сделал оценщик изображений, используя CNTK. Я загрузил модель и оценил 4000 изображений за цикл и повторил несколько раз.

Однако время выполнения этой программы увеличивается с повторением циклов. Я проверил каждое время выполнения с помощью std :: clock (). Затем функции обработки изображений, которые преобразуют Mat в вектор, а противоположные функции все больше используют время. Я проверил размер входных и выходных переменных, но они не изменились. Кроме того, в классе отсутствуют переменные-члены, которые выполняют функции обработки изображений. Поэтому мне любопытно, что этот код может создать эту проблему или нет.

Это функция преобразования.

Mat ImageProcessing::getMatFromData(const NDShape imageDims, const vector<float> & data, double min, double max, bool inversechannel)
{
    auto maxval = max < 0 ? (double)(*max_element(data.begin(), data.end())) : max;
    auto minval = min < 0 ? (double)(*min_element(data.begin(), data.end())) : min;

    if (maxval == minval)
    {
        minval = 0;
        maxval = 1;
    }

    int offset = imageDims[0] * imageDims[1];
    auto ratio = 255.0f / (maxval - minval);

    auto vmSplit = vector<Mat>(imageDims[2], Mat(imageDims[0], imageDims[1], CV_32FC1));
    auto mat = Mat(imageDims[0], imageDims[1], CV_8U);

    try {
        uchar* output = mat.data;

        if (imageDims[2] == 1)
        {
            parallel_for(0, offset, [&](auto i)
            {
                float p = data[i];
                output[i] = (uchar)((p - minval) * ratio);
            });
        }
        else if (imageDims[2] == 3)
        {
            parallel_for(0, offset, [&](auto i)
            {
                float b = data[offset * 0 + i];
                float g = data[offset * 1 + i];
                float r = data[offset * 2 + i];
                output[i] = (uchar)((((r + g + b) / 3.0) - minval) * ratio);
            });
        }
        else
        {
            cout << "getMatFromData - channels error" << endl;
            throw;
        }
    }
    catch (exception e)
    {
    }
    return mat;
}

vector<float> ImageProcessing::getDataFromMat(vector<int> imageDims, Mat org, float weight, float bias, bool noise)
{
    auto imageHeight = org.rows;
    auto imageWidth = org.cols;
    auto offset = imageHeight * imageWidth;

    Mat mat = Mat();
    Mat matSplit[3];
    auto features = vector<float>(offset * org.channels());

    try
    {
        if (noise)
        {
            auto noise_mat = Mat(Size(org.cols, org.rows), org.type());
            randn(noise_mat, Scalar::all(0), Scalar::all(30));
            add(org, noise_mat, mat);
        }
        else
        {
            mat = org;
        }

        split(mat, matSplit);

        parallel_for(0, mat.channels(), [&](auto i)
        {
            matSplit[i].convertTo(matSplit[i], CV_32F);
            copy((float*)matSplit[i].datastart, (float*)matSplit[i].dataend, features.begin() + offset * i);
        });
    }
    catch (exception e)
    {
    }

    return features;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...