focus模块的含义就是每隔一个正方形编号1,2,3,4;然后在每个图片上分别提取1或者2或者3或者4,分别追加到channel上。
python实现:
image[::2, ::2, :]表示::2
第0个开始,以2为步长
# focus模块
img_focus = np.concatnate([image[::2, ::2, :], image[1::2, ::2, :], image[::2, 1::2, :], image[1::2, 1::2, :]], axis=-1)
c++实现:
其实接收的矩阵宽高应该是原来的1/4,这里设置为模型的1/2。当然也可以对应起来
Mat focusImage(vector<Mat> srcChannels) {
//这里宽高也可以设置为原来的1/4
Mat focusMat(YOLOArgs::modelHeight/2, YOLOArgs::modelWidth/2, CV_32FC(12), 0.0);
int startPt[4][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, startX, startY;
for (size_t i = 0; i < YOLOArgs::modelHeight / 2; i++)
{
for (size_t j = 0; j < YOLOArgs::modelWidth / 2; j++)
{
for (size_t k = 0; k < 4; k++)
{
for (size_t s = 0; s < srcChannels.size(); s++)
{
startX = startPt[k][0];
startY = startPt[k][1];
focusMat.at<Vec<float, 12>>(i, j)[4 * s + k] = srcChannels[s].at<float>(2 * i + startY, 2 * j + startX);
}
}
}
}
return focusMat;
}