Я сделал оценщик изображений, используя 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;
}