콘텐츠로 이동

Segmentation.h

Go to the source code of this file.

Segmentation은 이미지에 유저가 지정한 클래스에 해당하는 영역을 찾아내는 기능입니다.

SAIGE VISION에서는 Segmentation의 검사 결과를 SaigeSegmentedObject 구조체로 반환합니다. 검출된 영역을 Contour라는 자유형 곡선 형태로 나타내며 점의 배열로 표현됩니다.

추론 옵션

Inspection Size Width, Height

SaigeHandleConfig 구조체를 사용하여 핸들 생성 시 설정할 수 있는 옵션 중 하나입니다. SaigeInferenceOption::batchSize 와 마찬가지로, 핸들 생성 시 메모리 설정 등에 영향을 주는 옵션으로, 핸들 생성 이후 값을 변경할 수 없습니다.

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// ExampleSegRuntime.cpp:64

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

retval = SaigeCreateInferenceHandle(&handle2, kProjectTypeSEG, trainedModelPath.c_str(),
                                    0, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

retval = SaigeCreateInferenceHandle(&handle3, kProjectTypeSEG, trainedModelPath.c_str(), 1,
                                    &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로 설정하여, 아무 값도 계산하지 않도록 설정할 수는 없습니다.

190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// ExampleSegRuntime.cpp:192

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
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    // ExampleSegRuntime.cpp:211
    
    // 추론옵션 변경
    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에서 처리하도록 하였습니다.