index b3ee97bc72b0a98e2228bb8fe364cbaacc73ce53..c871bf2fa35209658084adc79d04ddfce770883c 100644 (file)
*/
/******************************************************************************/
-int appCNNSceneClassify(timlConvNeuralNetwork *cnn, timlUtilImage image, int *labelMatrix, int scale)
+int appCNNSceneClassify(timlConvNeuralNetwork *cnn, float *image, int row, int col, int channel, int *labelMatrix, int scale)
{
int i;
int j;
int m;
int k;
int err;
- int numRow;
- int numCol;
- int numChannel;
float imageMean;
float imageDeviation;
int paddedRow;
@@ -84,73 +81,76 @@ int appCNNSceneClassify(timlConvNeuralNetwork *cnn, timlUtilImage image, int *la
// init
err = 0;
- numRow = image.row;
- numCol = image.col;
- numChannel = image.channel;
paddedRow = cnn->head->row;
paddedCol = cnn->head->col;
- paddedDim = paddedRow*paddedCol*numChannel;
+ paddedDim = paddedRow*paddedCol*channel;
paddedImage = malloc(sizeof(float)*paddedDim);
- resolutionLossRow = numRow/cnn->tail->row;
- resolutionLossCol = numCol/cnn->tail->col;
+ resolutionLossRow = row/cnn->tail->row;
+ resolutionLossCol = col/cnn->tail->col;
// image normalization (per image)
- for (k = 0; k < numChannel; k++) {
+ for (k = 0; k < channel; k++) {
imageMean = 0.0;
imageDeviation = 0.0;
- for (i = 0; i < numRow * numCol; i++) {
- imageMean += image.data[i + k*numRow*numCol];
+ for (i = 0; i < row * col; i++) {
+ imageMean += image[i + k*row*col];
}
- imageMean /= numRow*numCol;
- for (i = 0; i < numRow*numCol; i++) {
- image.data[i + k*numRow*numCol] -= imageMean;
+ imageMean /= row*col;
+ for (i = 0; i < row*col; i++) {
+ image[i + k*row*col] -= imageMean;
}
- for (i = 0; i < numRow * numCol; i++) {
- imageDeviation += image.data[i + k*numRow*numCol] * image.data[i + k*numRow*numCol];
+ for (i = 0; i < row * col; i++) {
+ imageDeviation += image[i + k*row*col] * image[i + k*row*col];
}
- imageDeviation /= numRow*numCol;
+ imageDeviation /= row*col;
imageDeviation = sqrtf(imageDeviation);
- for (i = 0; i < numRow*numCol; i++) {
- image.data[i + k*numRow*numCol] /= imageDeviation;
+ for (i = 0; i < row*col; i++) {
+ image[i + k*row*col] /= imageDeviation;
}
}
// main loop over each pixel on the image
for (m = -resolutionLossRow/2; m < resolutionLossRow/2; m += scale) {
for (k = -resolutionLossCol/2; k < resolutionLossCol/2; k += scale) {
- rowStart = (paddedRow - numRow)/2 - m;
- rowEnd = rowStart + numRow - 1;
- colStart = (paddedCol - numCol)/2 - k;
- colEnd = colStart + numCol - 1;
+ rowStart = (paddedRow - row)/2 - m;
+ rowEnd = rowStart + row - 1;
+ colStart = (paddedCol - col)/2 - k;
+ colEnd = colStart + col - 1;
// zero padding
for (i = 0; i < paddedRow; i++) {
for (j = 0; j < paddedCol; j++) {
if (i < rowStart || i > rowEnd || j < colStart || j > colEnd) {
- for (p = 0; p < numChannel; p++)
+ for (p = 0; p < channel; p++)
paddedImage[j + i*paddedCol + p*paddedRow*paddedCol] = 0.0;
}
else {
- for (p = 0; p < numChannel; p++)
- paddedImage[j + i*paddedCol + p*paddedRow*paddedCol] = image.data[j - colStart + (i - rowStart)*numCol + p*numRow*numCol];
+ for (p = 0; p < channel; p++)
+ paddedImage[j + i*paddedCol + p*paddedRow*paddedCol] = image[j - colStart + (i - rowStart)*col + p*row*col];
}
}
}
// cnn Forward Propagation
- err = timlCNNForwardPropagation(cnn, paddedImage, paddedDim);
+ err = timlCNNLoadImage(cnn, paddedImage, paddedRow, paddedCol, channel, 1);
+ err = timlCNNForwardPropagation(cnn);
// labeling
- appCNNSceneLabelMatrix(cnn->tail->featureMap, cnn->tail->row, cnn->tail->col, cnn->tail->channel, m, k, labelMatrix, numRow, numCol);
+ for (i = 0; i < cnn->tail->row; i++) {
+ for (j = 0; j < cnn->tail->col; j++) {
+ labelMatrix[k + resolutionLossCol/2 + j*resolutionLossCol + (m + resolutionLossRow/2 + i*resolutionLossRow)*col] = cnn->tail->accuracyParams.label[i*cnn->tail->col + j];
+ }
+ }
+
}
}
// up-sample the label matrix
- for (i = 0; i < image.row; i++) {
- for (j = 0; j < image.col; j++) {
+ for (i = 0; i < row; i++) {
+ for (j = 0; j < col; j++) {
rowDown = i/scale;
colDown = j/scale;
- labelMatrix[j + i*image.col] = labelMatrix[colDown*scale + rowDown*scale*image.col];
+ labelMatrix[j + i*col] = labelMatrix[colDown*scale + rowDown*scale*col];
}
}