——最近有C++实现mxnet的需求,网络为MTCNN。
输入数据为opencv的Mat,则需要对其进行预处理,才能送入网络进行推理。
由于这里没有处理好,导致推理结果不对,浪费了大量的时间。
——MTCNN的数据输入格式为NCHW,比如(1, 3, 12, 12),表示输入为一张图像,通道数为3,高度12,宽度12;
那么,我们要做的就是将Mat转化为此形式。
——这里说一下Mat中的data,它的类型为uchar;
对于一个12*12的3通道图像img,img.data指向首地址;
将img打印出来,将是一个12行,36列的矩阵;
36列表示每行有12个像素,每个像素有3个通道;
img的第i行,第j列,第c个通道的灰度值分别为( img.data+i*img.cols+j ) *3+c ;
——因此,如果输入的数据形式为NHWC,那么我们可以按行,列,通道的顺序,依次读取data的值
vector<float> array;
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
for (int c = 0; c < channel; ++c)
{
array.push_back(static_cast<float>(img.data[(i * width + j) * 3 + c]));
}
}
}
但是这里是NCHW,因此一个通道一个通道的读取
for (int c = 0; c < channel; ++c)
{
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
array.push_back(static_cast<float>(img.data[(i * width + j) * 3 + c]);
}
}
}