ObjectDetection.h
Go to the source code of this file.
Object Detection은 이미지에서 객체를 찾아내고, 객체의 위치를 Bounding Box로 표시하는 기능입니다.
SAIGE VISION에서는 Object Detection의 검사 결과를 SaigeDetectedObject 구조체로 반환합니다. 이는 직사각형 Bounding Box 를 나타내는 구조체와 클래스 ID, Score를 포함합니다. 또한, SaigeDetectedObject 내부에는 SaigeRotatedBox 형태로 Bounding Box를 표현하는데, 여기에는 중심점, 꼭지점, 너비, 높이, 회전 각도 등의 정보가 포함됩니다.
Note
Object Detection 에서 회전 각도는 표현하지 않습니다.
추론 옵션
Object Detection 기능에는 다음과 같은 추론 옵션들이 존재합니다.
다음 예제는 해당 옵션 값을 설정하는 방법을 보여줍니다.
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 | // ExampleDetRuntime.cpp:120
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 기능은 class id가 1부터 시작합니다. 이는 결함 검사에서 아무런 객체가 검출되지 않았을 때를 나타내는 class id 0 (OK)을 제외한 것입니다. 이 때 유의할 점은 SaigeModelInfo::numOfClasses 값은 class id 0을 포함한 전체 클래스의 개수를 나타낸다는 점 입니다.
추론 결과
검출된 객체를 받아오기 위해서 아래와 같이 객체의 개수를 먼저 받아온 후, SaigeDetectedObject 구조체 배열을 사용하여 객체 정보를 받아옵니다. 여기서는 C++의 STL vector를 사용하여 메모리 할당/해제를 vector 에서 처리하도록 하였습니다.
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253 | // ExampleDetRuntime.cpp:232
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;
}
|