跳转至

Segmentation.h

Go to the source code of this file.

Segmentation是在图像中查找用户指定类别的区域的功能。

SAIGE VISION将Segmentation的检查结果作为SaigeSegmentedObject结构返回。 检测到的区域以自由形式的曲线形式表示为Contour,并表示为点数组。

推断选项

检查尺寸宽度, 高度

这是使用SaigeHandleConfig结构创建句柄时可以设置的选项之一。 与SaigeInferenceOption::batchSize一样,这是在创建句柄时影响内存设置的选项,创建句柄后无法更改。

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// ExampleSegRuntime.cpp:52

SaigeInferenceHandle handle = nullptr;
SaigeHandleConfig config;
config.inspectionSizeHeight = 2496;
config.inspectionSizeWidth = 2496;
unsigned int handleFlags = SAIGE_SET_INSPECTION_SIZE;
if (optimize) {
    handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handle, kProjectTypeSEG, trainedModelPath.c_str(),
                                    deviceIndex, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

calcMask, calcScoremap, calcObject

Segmentation功能不仅可以计算由类别指定的Contour区域信息SaigeSegmentedObject,还可以计算指示图像中每个像素属于哪个类别的Mask和 指示每个类别的Score值的Scoremap。

要计算这些检查结果,请设置以下选项。 此外,如果calcObject选项为true,则可以通过为每个类别应用Score和Area Threshold值来过滤检测到的对象。

Note

三个选项都不能设置为false以计算没有值。

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// ExampleSegRuntime.cpp:164

options->calcMask = true;
options->calcScoremap = true;
options->calcObjectAreaAndApplyThreshold = true;
options->calcObjectScoreAndApplyThreshold = true;
unsigned int flags = SAIGE_SET_CALC_SCOREMAP | SAIGE_SET_CALC_MASK |
                     SAIGE_SET_CALC_OBJECT_AREA_AND_APPLY_THRESHOLD |
                     SAIGE_SET_CALC_OBJECT_SCORE_AND_APPLY_THRESHOLD;
retval = SaigeSetInferenceOption(handle, options, flags);
if (retval < 0) {
    std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval)
              << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}

Score, Area Thresholds

与Object Detection一样,Segmentation可以为每个类别设置Score和Area Threshold值。 此外,Segmentation可以设置Object Boundary Threshold值。 所有Threshold选项不能为第0个OK类设置。第0类的默认值如下。

  • objectBoundaryThreshold[0] = 100
  • objectScoreThreshold[0] = 0
  • objectAreaThreshold[0] = 0
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    // ExampleSegRuntime.cpp:183
    
    // 추론옵션 변경
    options->objectAreaThresholdPerClass[1] = 500;
    options->objectAreaThresholdPerClass[2] = 500;
    flags = SAIGE_SET_OBJECT_AREA_THRESHOLD;
    retval = SaigeSetInferenceOption(handle, options, flags);
    if (retval < 0) {
        std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval)
                  << std::endl;
        SaigeDestroyInferenceHandle(handle);
        SaigeDestroyInferenceResult(result);
        return retval;
    }
    options->objectScoreThresholdPerClass[1] = 200.0;
    options->objectScoreThresholdPerClass[2] = 200.0;
    flags = SAIGE_SET_OBJECT_SCORE_THRESHOLD;
    retval = SaigeSetInferenceOption(handle, options, flags);
    if (retval < 0) {
        std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval)
                  << std::endl;
        SaigeDestroyInferenceHandle(handle);
        SaigeDestroyInferenceResult(result);
        return retval;
    }
    options->objectBoundaryThresholdPerClass[1] = 150;
    options->objectBoundaryThresholdPerClass[2] = 150;
    flags = SAIGE_SET_OBJECT_BOUNDARY_THRESHOLD;
    retval = SaigeSetInferenceOption(handle, options, flags);
    if (retval < 0) {
        std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval)
                  << std::endl;
        SaigeDestroyInferenceHandle(handle);
        SaigeDestroyInferenceResult(result);
        return retval;
    }
    

推断结果

Segmentation的检查结果分为Mask、Scoremap和Segmented Object。

Mask和Scoremap以unsigned char*指针变量的数组形式接收。

Segmented Object首先在int numSegObj变量中接收检测到的对象的数量,然后使用SaigeSegmentedObject结构数组接收对象信息。 在这里,我们使用C++的STL vector来处理vector中的内存分配/释放。