Common.h
Go to the source code of this file.
일반적인 검사 프로그램의 진행 과정에 대해 설명합니다.
아래는 Classification 예제 코드의 일부입니다.
시작하기
먼저, 사용할 이미지 데이터와 모델 파일의 경로를 설정합니다. 이 예제에서는 SAIGE_HOME 경로에 설치된 예제 데이터와 모델 파일을 사용했습니다.
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | // ExampleClsRuntime.cpp:21
std::string dataDir =
get_env_var("SAIGE_HOME") + "/SaigeVision/engine/Examples/data/sfaw2023/images/test/";
std::string trainedModelPath = dataDir + "../../models/cls_example.saigecls";
// image paths to classify
// used filesystem library of c++17 standard.
// u8string means 8byte character string so, it doesn't support unicode system of filesystem.
std::vector<std::string> imagePaths;
for (const auto& file : std::filesystem::recursive_directory_iterator(dataDir)) {
if (file.is_regular_file() && file.path().extension() == ".png") {
imagePaths.push_back(std::string(file.path().u8string()));
}
}
|
핸들 생성
다음으로, 검사 핸들 검사 결과 핸들을 생성합니다. SaigeHandleConfig 구조체를 사용하여 핸들 생성 시 설정할 수 있는 옵션들을 설정합니다. 또한 설정한 옵션 값을 적용하기 위해서는 관련된 플래그를 적절하게 설정해줘야 합니다. 최적화 옵션을 사용하려면 SAIGE_OPTIMIZE_HANDLE 플래그를 추가해줍니다.
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 | // ExampleClsRuntime.cpp:50
SaigeInferenceHandle handle = nullptr;
SaigeHandleConfig config;
config.batchSize = 1;
unsigned int handleFlags = SAIGE_SET_BATCH_SIZE;
if (optimize) {
handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handle, kProjectTypeCLS, trainedModelPath.c_str(),
deviceIndex, &config, handleFlags);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceHandle() failed - " << SaigeStrError(retval) << std::endl;
return retval;
}
SaigeInferenceResult result = nullptr;
retval = SaigeCreateInferenceResult(&result);
if (retval < 0) {
std::cerr << "SaigeCreateInferenceResult() failed - " << SaigeStrError(retval) << std::endl;
SaigeDestroyInferenceHandle(handle);
return retval;
}
|
Result Handle의 사용
Result Handle로부터 받아온 추론 결과는 Result Handle을 파괴하거나 다음 검사에 사용될 때 자동으로 메모리가 해제됩니다. SAIGE VISION에서는 배열 형태의 추론 결과 데이터의 메모리의 관리를 Result Handle에서 자동으로 수행하도록 합니다. Result Handle이 다음 검사에 사용되거나, SaigeDestroyInferenceResult 함수를 호출할 때 할당된 메모리를 해제합니다.
모델 정보 조회
모델 정보를 조회하기 위해서는 SaigeModelInfo 구조체를 사용합니다.
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 | // ExampleClsRuntime.cpp:77
std::cout << SaigeGetModuleVersion() << std::endl;
SaigeModelInfo* modelInfo = new SaigeModelInfo;
retval = SaigeGetModelInfo(handle, modelInfo);
if (retval < 0) {
std::cerr << "SaigeGetModelInfo() failed - " << SaigeStrError(retval) << std::endl;
} else if (verbosity >= 1) {
std::cout << "[Classification Model Info]" << std::endl;
std::cout << "Network Type: " << modelInfo->networkType << std::endl;
std::cout << "Number of Classes: " << modelInfo->numOfClasses << std::endl;
for (auto i = 0; i < modelInfo->numOfClasses; ++i) {
uint8_t red, green, blue;
SaigeColorCodeToRGB(modelInfo->classColors[i], &red, &green, &blue);
std::cout << modelInfo->classNames[i] << ": color RGB(" << (int)red << ", " << (int)green
<< ", " << (int)blue << ") - " << (modelInfo->classIsNg[i] ? "NG" : "OK")
<< std::endl;
}
std::cout << "Trained Developer Version: " << modelInfo->developerVersion << std::endl;
std::cout << "Server Version: " << modelInfo->serverVersion << std::endl;
std::cout << "Module Version: " << modelInfo->moduleVersion << std::endl;
std::cout << "TrainingTimeStarted: " << modelInfo->trainingTimeStarted << std::endl;
std::cout << "TrainingTimeCompleted: " << modelInfo->trainingTimeCompleted << std::endl;
std::cout << "TrainingTimeElapsed: " << modelInfo->trainingTimeElapsed << std::endl;
std::cout << "UsedGpuName: " << modelInfo->usedGpuName << std::endl;
std::cout << "Number of Train Images: " << modelInfo->numOfTrainImages << std::endl;
std::cout << "Number of Validation Images: " << modelInfo->numOfValidationImages
<< std::endl;
std::cout << "Number of Iterations: " << modelInfo->numOfIterations << std::endl;
std::cout << "ROI Info" << std::endl
<< "- ROI Mode: " << modelInfo->roiInfo.roiMode << std::endl
<< "- ROI LTRB Ratio: " << modelInfo->roiInfo.left << ", " << modelInfo->roiInfo.top
<< ", " << modelInfo->roiInfo.right << ", " << modelInfo->roiInfo.bottom
<< std::endl;
std::cout << "Image Resize Width, Height: " << modelInfo->imageResizeWidth << ", "
<< modelInfo->imageResizeHeight << std::endl;
if (modelInfo->roiInfo.blindMask != nullptr) {
// show blind mask
SaigeShowImage(modelInfo->roiInfo.blindMask, modelInfo->roiInfo.blindMaskWidth,
modelInfo->roiInfo.blindMaskHeight, 1, SaigeImageType::SV_U8, false, true,
255.0, 0);
}
}
|
추론 옵션 설정
SaigeInferenceOption 구조체와 Get, Set 함수를 통해서 추론 시 사용할 옵션을 설정할 수 있습니다.
126
127
128
129
130
131
132
133
134
135 | // ExampleClsRuntime.cpp:128
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;
}
|
프로그램 설정에 따라 추가적인 옵션을 설정할 수 있습니다. 여기서는 bool detailedTime 값을 사용하여 SaigeInferenceOption::calcTime 값을 설정합니다. 이 때에는 반드시 어떠한 옵션 값을 설정할 것인지 SaigeSetInferenceOption 함수의 세 번째 인자인 플래그로 전달해야 합니다.
137
138
139
140
141
142
143
144
145
146
147
148
149 | // ExampleClsRuntime.cpp:139
if (detailedTime) {
options->calcTime = true;
retval = SaigeSetInferenceOption(handle, options, SAIGE_SET_CALC_TIME);
if (retval < 0) {
std::cerr << "SaigeSetInferenceOption() failed - " << SaigeStrError(retval)
<< std::endl;
SaigeDestroyInferenceHandle(handle);
SaigeDestroyInferenceResult(result);
return retval;
}
}
|
검사하기
여기서는 이미지 파일을 배열로 불러와서 검사합니다. 이미지 데이터를 불러오기 위해서는 SaigeGetImageData 함수를 사용합니다. 이 경우, 이미지 데이터를 불러오면 width, height, channles 및 type 값을 전달받습니다.
216
217
218
219
220
221
222
223 | // ExampleClsRuntime.cpp:218
// 이미지 데이터를 로드합니다.
ucImageData = (unsigned char*)SaigeGetImageData(img.c_str(), &w, &h, &c, &type);
if (ucImageData == nullptr) {
std::cerr << "SaigeGetImageData() failed - " << img << std::endl;
continue;
}
|
imageFlag 값은 이미지 데이터가 8비트 또는 16비트인지, 채널의 순서가 어떤지 등을 설정합니다. SaigeGetImageData 함수를 통해 불러온 이미지에 대해서는 imageFlag 값을 SaigeConvertImageType 함수를 통해 설정할 수 있습니다. 이후, SaigeInferFromByteArray 함수를 사용하여 추론을 수행합니다.
232
233
234
235
236
237
238
239
240 | // ExampleClsRuntime.cpp:234
unsigned int imageFlag = SaigeConvertImageType(c, type);
retval = SaigeInferFromByteArray(handle, ucImageData, w, h, imageFlag, result);
if (retval < 0) {
std::cerr << "SaigeInferFromByteArray() failed - " << SaigeStrError(retval)
<< std::endl;
continue;
}
|
추론 결과를 받아오기 위해서는 프로젝트 유형에 맞는 Get Result 함수를 사용합니다.
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275 | // ExampleClsRuntime.cpp:246
std::vector<float> score;
int classId;
score.resize(modelInfo->numOfClasses);
retval = SaigeGetInferenceResultScore(result, score.data(), true);
if (retval < 0) {
std::cerr << "SaigeGetInferenceResultScore() failed - " << SaigeStrError(retval)
<< std::endl;
SaigeDestroyInferenceHandle(handle);
SaigeDestroyInferenceResult(result);
return retval;
}
retval = SaigeGetInferenceResultClass(result, &classId);
if (retval < 0) {
std::cerr << "SaigeGetInferenceResultClass() failed - " << SaigeStrError(retval)
<< std::endl;
SaigeDestroyInferenceHandle(handle);
SaigeDestroyInferenceResult(result);
return retval;
}
retval = SaigeGetInferenceResultInspectionTime(result, &imreadTime, &inferenceTime,
&postProcessingTime);
if (retval < 0) {
std::cerr << "SaigeGetInferenceResultClass() failed - " << SaigeStrError(retval)
<< std::endl;
SaigeDestroyInferenceHandle(handle);
SaigeDestroyInferenceResult(result);
return retval;
}
|
See also: SaigeGetInferenceResultClass, SaigeGetInferenceResultScore, SaigeGetInferenceResultInspectionTime
정리하기
모델 정보, 추론 옵션 등 구조체를 메모리 할당한 경우에는 반드시 메모리를 해제해야 합니다.
333
334
335
336
337
338
339
340
341
342
343 | // ExampleClsRuntime.cpp:335
if (ucImageData != nullptr) {
retval = SaigeFreeImageData(ucImageData);
if (retval < 0) {
std::cerr << "SaigeFreeImageData() Failed - " << SaigeStrError(retval) << std::endl;
}
ucImageData = nullptr;
}
delete modelInfo;
delete options;
|
마지막으로, 검사 핸들과 결과 핸들을 파괴합니다.
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 | // ExampleClsRuntime.cpp:350
retval = SaigeDestroyInferenceResult(result);
if (retval < 0) {
std::cerr << "SaigeDestroyInferenceResult() failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
retval = SaigeDestroyInferenceHandle(handle);
if (retval < 0) {
std::cerr << "SaigeDestroyInferenceHandle() failed - " << SaigeStrError(retval)
<< std::endl;
return retval;
}
|