Skip to content

Commit 9952bf3

Browse files
committed
Cleanup postprocess method
1 parent 0eb1cdd commit 9952bf3

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

ios/RnExecutorch/models/image_segmentation/ImageSegmentationModel.mm

+31-19
Original file line numberDiff line numberDiff line change
@@ -37,50 +37,43 @@ - (NSArray *)preprocess:(cv::Mat &)input {
3737
return modelInput;
3838
}
3939

40-
- (NSDictionary *)postprocess:(NSArray *)output
41-
returnClasses:(NSArray *)classesOfInterest{
42-
cv::Size modelImageSize = [self getModelImageSize];
43-
44-
std::size_t numLabels = deeplabv3_resnet50_labels.size();
40+
std::vector<cv::Mat> rescaleResults(NSArray *result, std::size_t numLabels,
41+
cv::Size modelImageSize, cv::Size originalSize) {
4542
std::size_t numModelPixels = modelImageSize.height * modelImageSize.width;
46-
std::size_t numOriginalPixels = originalSize.height * originalSize.width;
47-
std::size_t outputSize = (std::size_t)output.count;
48-
49-
NSAssert(outputSize == numLabels * numModelPixels,
50-
@"Model generated unexpected output size.");
5143

52-
// For each label extract it's matrix and rescale it to the original size
5344
std::vector<cv::Mat> resizedLabelScores(numLabels);
5445
for (std::size_t label = 0; label < numLabels; ++label) {
5546
cv::Mat labelMat = cv::Mat(modelImageSize, CV_64F);
5647

5748
for(std::size_t pixel = 0; pixel < numModelPixels; ++pixel){
5849
int row = pixel / modelImageSize.width;
5950
int col = pixel % modelImageSize.width;
60-
labelMat.at<double>(row, col) = [output[label * numModelPixels + pixel] doubleValue];
51+
labelMat.at<double>(row, col) = [result[label * numModelPixels + pixel] doubleValue];
6152
}
6253

6354
cv::resize(labelMat, resizedLabelScores[label], originalSize);
6455
}
56+
return resizedLabelScores;
57+
}
6558

66-
cv::Mat maxArg = cv::Mat(originalSize, CV_32S);
67-
68-
// For each pixel apply softmax across all the labels
59+
void adjustScoresPerPixel(std::vector<cv::Mat>& labelScores, cv::Mat& maxArg,
60+
cv::Size originalSize, std::size_t numLabels) {
61+
std::size_t numOriginalPixels = originalSize.height * originalSize.width;
6962
for (std::size_t pixel = 0; pixel < numOriginalPixels; ++pixel) {
7063
int row = pixel / originalSize.width;
7164
int col = pixel % originalSize.width;
7265
std::vector<double> scores;
7366
scores.reserve(numLabels);
74-
for (const cv::Mat& mat : resizedLabelScores) {
67+
for (const cv::Mat& mat : labelScores) {
7568
scores.push_back(mat.at<double>(row, col));
7669
}
77-
70+
7871
std::vector<double> adjustedScores = softmax(scores);
79-
72+
8073
std::size_t maxArgIndex = 0;
8174
double maxArgVal = 0;
8275
for (std::size_t label = 0; label < numLabels; ++label) {
83-
resizedLabelScores[label].at<double>(row, col) = adjustedScores[label];
76+
labelScores[label].at<double>(row, col) = adjustedScores[label];
8477
if (adjustedScores[label] > maxArgVal) {
8578
maxArgIndex = label;
8679
maxArgVal = adjustedScores[label];
@@ -89,6 +82,25 @@ - (NSDictionary *)postprocess:(NSArray *)output
8982

9083
maxArg.at<int>(row, col) = maxArgIndex;
9184
}
85+
}
86+
87+
- (NSDictionary *)postprocess:(NSArray *)output
88+
returnClasses:(NSArray *)classesOfInterest{
89+
cv::Size modelImageSize = [self getModelImageSize];
90+
91+
std::size_t numLabels = deeplabv3_resnet50_labels.size();
92+
93+
NSAssert((std::size_t)output.count == numLabels * modelImageSize.height * modelImageSize.width,
94+
@"Model generated unexpected output size.");
95+
96+
// For each label extract it's matrix and rescale it to the original size
97+
std::vector<cv::Mat> resizedLabelScores =
98+
rescaleResults(output, numLabels, modelImageSize, originalSize);
99+
100+
cv::Mat maxArg = cv::Mat(originalSize, CV_32S);
101+
102+
// For each pixel apply softmax across all the labels and calculate the maxArg
103+
adjustScoresPerPixel(resizedLabelScores, maxArg, originalSize, numLabels);
92104

93105
std::unordered_set<std::string> labelSet;
94106

0 commit comments

Comments
 (0)