Darknet 预测分类中的图像预处理优化
在构建基于 Darknet 的预测分类系统时,将采集到的原始 OCT 数据转换为模型所需的存储格式是至关重要的一环。这不仅涉及内存布局的调整,还关系到推理前的预处理效率。下面结合实际代码,梳理从数据采集到 GPU 加速的完整流程。
原始数据采集与缓冲
首先,我们需要将采集到的原始数据拷贝到临时缓冲区中。这一步通常涉及二维数组的线性化映射,确保数据在内存中连续且对齐。
for (int j = 0; j < nHeight; j++) {
for (int i = 0; i < nWidth; i++) {
buff[j*nWidth + i] = pOCTData[j * nRealWidth + i];
}
}
这段逻辑看似简单,但要注意 nRealWidth 和 nWidth 可能存在的差异,避免越界访问。
格式转换与通道扩展
Darknet 模型通常要求特定的输入格式,包括通道顺序(如 RGB)和图像方向。在实际处理中,我们往往需要将单通道数据扩展为三通道,并进行垂直翻转以匹配模型预期。
初始实现通常会分步进行:先读取数据到中间矩阵,再写入目标格式。这种写法逻辑清晰,但在高吞吐场景下会多次遍历内存。
// 第一步:读取并暂存
for (int i = 0; i < m_wid; ++i) {
for (int j = 0; j < m_height; ++j) {
if (isSimulate) {
num++;
m_tmpImgData[i][j] = num;
} else {
m_tmpImgData[i][j] = (int)(pOctdata->_pbyOCTDataBuffer[i * m_height + j]);
}
}
}
// 第二步:转换并写入
for (int i = 0; i < m_height; ++i) {
for (int j = 0; j < m_wid; ++j) {
int iPos = j * c;
int k = i * m_wid * c + iPos;
if (c == 3) {
mImgData[h][k] = (unsigned char)m_tmpImgData[j][m_height - i - 1];
mImgData[h][k + 1] = (unsigned )m_tmpImgData[j][m_height - i - ];
mImgData[h][k + ] = ( )m_tmpImgData[j][m_height - i - ];
} {
mImgData[h][k] = ( )m_tmpImgData[j][m_height - i - ];
}
}
}

