跳转至

ObjectDetection.h

Go to the source code of this file.

Object Detection是在图像中查找对象并将对象的位置显示为Bounding Box的功能。

SAIGE VISION将Object Detection的检查结果作为SaigeDetectedObject结构返回。 该结构包括类ID、Score和表示矩形Bounding Box的结构。 在SaigeDetectedObject内部,Bounding Box表示为SaigeRotatedBox,其中包括中心点、顶点、宽度、高度和旋转角度等信息。

Note

Object Detection不表示旋转角度。

推理选项

Object Detection具有以下推理选项。

以下示例显示如何设置选项值。

134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// ExampleDetRuntime.cpp:136

SaigeInferenceOption* options = new SaigeInferenceOption;
retval = SaigeGetInferenceOption(handle, options);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}

// 옵션 수정
options->objectScoreThresholdPerClass[1] = 80;
options->objectScoreThresholdPerClass[2] = 80;

options->objectAreaThresholdPerClass[1] = 0;
options->objectAreaThresholdPerClass[2] = 0;

options->maxNumOfDetectedObjects[1] = -1;
options->maxNumOfDetectedObjects[2] = -1;

retval = SaigeSetInferenceOption(handle, options,
                                 SAIGE_SET_MAX_NUM_OF_DETECTED_OBJECTS |
                                     SAIGE_SET_OBJECT_SCORE_THRESHOLD |
                                     SAIGE_SET_OBJECT_AREA_THRESHOLD);
if (retval < 0) {
    std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
    if (modelInfo->numOfClasses != 3) {
        std::cerr << "이 예제는 3개의 클래스를 가지는 모델을 사용합니다." << std::endl;
    }
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}

Note

Object Detection从类ID 1开始。这是因为在缺陷检查中排除了表示未检测到任何对象的类ID 0(OK)。这里需要注意的重要一点是, SaigeModelInfo::numOfClasses值表示包括类ID 0在内的所有类的总数。

推理结果

要获取检测到的对象,首先获取对象的数量,然后使用++ STL vector 处理vector中的内存分配/释放。

246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
// ExampleDetRuntime.cpp:248

retval = SaigeGetInferenceResultNumOfDetectedObjects(result, &nObject);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultNumOfDetectedObjects() failed - "
              << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}

// Detection은 nObject에 따라 struct SaigeDetectedObject의 메모리를 할당해야합니다.
// 본 예제에서는 c++ vector를 이용해서 메모리 해제를 따로 하지않도록 합니다.
std::vector<SaigeDetectedObject> objects;
objects.resize(nObject);

retval = SaigeGetInferenceResultDetectedObjects(result, objects.data());
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultDetectedObjects() failed - "
                << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}