WIL-PDL Reference ( C++ ) 1.0.6
サンプルコード ( 多視点アノマリー検出 )

多視点アノマリー検出のサンプルコードです

  • 最も単純なサンプルコード: L.6- smp_mvad_simple()
  • ベンチマークを計測するサンプルコード: L.126: smp_mvad_benchmark()
  • FIE の関数を前処理として行うサンプルコード: L.246: smp_mvad_with_fie()
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4#include <string>
5
6int smp_mvad_simple(const char* model_name, const char* img_folder, const FLOAT threshold)
7{
8 INT ret = F_ERR_NONE;
9 H_MODEL hmodel = NULL;
10 MODEL_CATEGORY model_category;
11 MODEL_BACKEND model_backend;
12 INT n_views = 0;
13 FHANDLE* hsrcs = NULL;
14 INT ch, w, h;
15 FLOAT* anomaly_data = NULL;
16 size_t anomaly_data_len;
17
18 BOOL is_anomaly = false;
19 FHANDLE hmap = NULL;
20 FLOAT max_anomaly = .0;
21
22 // FIEライブラリの使用前に必ずコールする必要があります。
23 fnFIE_setup();
24
25
26 //------- ここから -------//
27
28 // ライセンスチェック
29 ret = fnPDL_check_license();
30 printf_s("lic : %d\r\n", ret);
31 if (F_ERR_NONE != ret) { goto finally; }
32
33 // ハンドルの生成
34 hmodel = fnPDL_create_handle();
35 if (NULL == hmodel) {
36 ret = F_ERR_NOMEMORY;
37 printf_s("failed to create handle\r\n");
38 goto finally;
39 }
40 else { printf_s("handle created\r\n"); }
41
42 // モデル読込
43 ret = fnPDL_load_model(model_name, hmodel);
44 printf_s("load: %d\r\n", ret);
45
46 // モデルの種別の確認
47 ret = fnPDL_get_model_category(hmodel, &model_category);
48 printf_s("par : %d category=%d\r\n", ret, model_category);
49 if (MULTI_VIEW_AD != model_category) {
50 ret = F_ERR_INVALID_OBJECT;
51 printf_s("unmatch model\r\n");
52 goto finally;
53 }
54
55 // モデルの推論バックエンドの確認
56 ret = fnPDL_get_model_backend(hmodel, &model_backend);
57 printf_s("ret : %d backend=%d\r\n", ret, model_backend);
58
59 // モデルの期待する画像パラメータの確認
60 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
61 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
62
63 // モデルの視点数の取得
64 ret = fnPDL_get_how_many_views(hmodel, &n_views);
65 printf_s("# of views=%d\r\n", n_views);
66
67 // 入力画像配列のメモリ確保と画像読込
68 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
69 if (NULL == hsrcs) {
70 ret = F_ERR_NOMEMORY;
71 printf_s("malloc error\r\n");
72 goto finally;
73 }
74 else {
75 INT i_img = 0;
76 for (i_img = 0; i_img < n_views; i_img++) {
77 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
78 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
79 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
80 }
81 }
82
83 // 推論実行
84 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &anomaly_data, &anomaly_data_len);
85 printf_s("pred: %d\r\n", ret);
86
87 // 後処理1: is_anomaly の判定のみ
88 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, NULL);
89 printf_s(" is_anomaly: %d, %s\r\n", ret, (is_anomaly ? "true" : "false"));
90
91 // 後処理2: 最大異常度
92 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, NULL, NULL, NULL, &max_anomaly);
93 printf_s(" max_anomaly: %d, %6e\r\n", ret, max_anomaly);
94
95 // 後処理3: 最大異常度マップ出力 ( uc8 版 )
96 hmap = fnFIE_img_root_alloc(F_IMG_UC8, 1, w, h);
97 if (NULL != hmap) {
98 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, NULL, NULL, &hmap, NULL);
99 printf_s(" calc_map: %d\r\n", ret);
100
101 ret = fnFIE_save_bmp("map_uc8.bmp", hmap);
102 printf_s(" save map: %d\r\n", ret);
103 }
104 printf_s("\r\n");
105
106finally:
107 // ハンドルの破棄
108 fnPDL_dispose(hmodel);
109
110 //------- ここまで -------//
111
112 // 終了処理
113 if (NULL != hsrcs) {
114 INT i_img = 0;
115 for (i_img = 0; i_img < n_views; i_img++) {
116 fnFIE_free_object(hsrcs[i_img]);
117 }
118 fnOAL_free(hsrcs);
119 }
120 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
121 if (NULL != hmap) { fnFIE_free_object(hmap); }
122
123 fnFIE_teardown();
124
125 return ret;
126}
127int smp_mvad_benchmark(const char* model_name, const char* img_folder, const FLOAT threshold, const int bench_iter)
128{
129 // benchmark 用
130 std::chrono::system_clock::time_point start, end;
131
132 INT ret = F_ERR_NONE;
133 H_MODEL hmodel = NULL;
134 MODEL_CATEGORY model_category;
135 INT n_views = 0;
136 FHANDLE* hsrcs = NULL;
137 INT ch, w, h;
138 FLOAT* anomaly_data = NULL;
139 size_t anomaly_data_len;
140
141 BOOL is_anomaly = false;
142 FHANDLE hmap = NULL;
143 FLOAT max_anomaly = .0;
144
145 // FIEライブラリの使用前に必ずコールする必要があります。
146 fnFIE_setup();
147
148 // ライセンスチェック
149 ret = fnPDL_check_license();
150 printf_s("lic : %d\r\n", ret);
151
152 // ハンドルの生成
153 hmodel = fnPDL_create_handle();
154 if (NULL == hmodel) {
155 ret = F_ERR_NOMEMORY;
156 printf_s("failed to create handle\r\n");
157 goto finally;
158 }
159 else { printf_s("handle created\r\n"); }
160
161 // モデル読込
162 ret = fnPDL_load_model(model_name, hmodel);
163 printf_s("load: %d\r\n", ret);
164
165 // モデルの種別の確認
166 ret = fnPDL_get_model_category(hmodel, &model_category);
167 printf_s("par : %d category=%d\r\n", ret, model_category);
168 if (MULTI_VIEW_AD != model_category) {
169 ret = F_ERR_INVALID_OBJECT;
170 printf_s("unmatch model\r\n");
171 goto finally;
172 }
173
174 // モデルの期待する画像パラメータの確認
175 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
176 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
177
178 // モデルの視点数の取得
179 ret = fnPDL_get_how_many_views(hmodel, &n_views);
180 printf_s("# of views=%d\r\n", n_views);
181
182 // 入力画像配列のメモリ確保と画像読込
183 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
184 if (NULL == hsrcs) {
185 ret = F_ERR_NOMEMORY;
186 printf_s("malloc error\r\n");
187 goto finally;
188 }
189 else {
190 INT i_img = 0;
191 for (i_img = 0; i_img < n_views; i_img++) {
192 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
193 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
194 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
195 }
196 }
197
198 // uc8 で確保
199 hmap = fnFIE_img_root_alloc(F_IMG_UC8, 1, w, h);
200 if (NULL == hmap) {
201 ret = F_ERR_NOMEMORY;
202 printf_s("map image: allocation error\r\n");
203 goto finally;
204 }
205
206 //------- 計測ループ ここから -------//
207
208 printf_s("--- start ---\r\n");
209 printf_s("ret, elapsed[msec], scores\r\n");
210 // 本体ループ
211 for (int i = 0; i < bench_iter; i++) {
212 double elapsed;
213
214 // 開始時刻
215 start = std::chrono::system_clock::now();
216
217 // 推論実行
218 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &anomaly_data, &anomaly_data_len);
219 // 後処理: アノマリー判定、最大異常度取得、マップ画像算出の全て
220 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, &hmap, &max_anomaly);
221
222 // 完了時刻
223 end = std::chrono::system_clock::now();
224
225 if (F_ERR_NONE != ret) {
226 printf_s("pred. err: %d\r\n", ret);
227 goto finally;
228 }
229
230 // 推論時間 [msec]
231 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
232
233 // コンソールに出力
234 printf_s("%04d, %.3e, %s, %.6e\r\n", i, elapsed, (is_anomaly ? "anomaly" : "normal"), max_anomaly);
235 }
236 printf_s("--- finish ---\r\n");
237 printf_s("\r\n");
238
239 //------- 計測ループ ここまで -------//
240
241finally:
242 // ハンドルの破棄
243 fnPDL_dispose(hmodel);
244
245 // 終了処理
246 if (NULL != hsrcs) {
247 INT i_img = 0;
248 for (i_img = 0; i_img < n_views; i_img++) {
249 fnFIE_free_object(hsrcs[i_img]);
250 }
251 fnOAL_free(hsrcs);
252 }
253 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
254 if (NULL != hmap) { fnFIE_free_object(hmap); }
255 fnFIE_teardown();
256
257 return ret;
258}
259
260int smp_mvad_with_fie(const char* model_name, const char* img_folder, const FLOAT threshold)
261{
262 INT ret = F_ERR_NONE;
263
264 // モデルとその情報
265 H_MODEL hmodel = NULL;
266 MODEL_CATEGORY model_category;
267 INT n_views = 0;
268
269 // 推論画像とその情報、フィルタをかけた画像
270 FHANDLE* hsrcs = NULL;
271 FHANDLE* hfiltereds = NULL;
272 INT ch, w, h, type;
273 INT_PTR step;
274
275 // 推論結果
276 FLOAT* anomaly_data = NULL;
277 size_t anomaly_data_len;
278 BOOL is_anomaly = false;
279 FLOAT max_anomaly = .0;
280
281
282 // FIEライブラリの使用前に必ずコールする必要があります。
283 fnFIE_setup();
284
285 // ライセンスチェック
286 ret = fnPDL_check_license();
287 printf_s("lic : %d\r\n", ret);
288
289 // ハンドルの生成
290 hmodel = fnPDL_create_handle();
291 if (NULL == hmodel) {
292 ret = F_ERR_NOMEMORY;
293 printf_s("failed to create handle\r\n");
294 goto finally;
295 }
296 else { printf_s("handle created\r\n"); }
297
298 // モデル読込
299 ret = fnPDL_load_model(model_name, hmodel);
300 printf_s("load: %d\r\n", ret);
301
302 // モデルの種別の確認
303 ret = fnPDL_get_model_category(hmodel, &model_category);
304 printf_s("par : %d category=%d\r\n", ret, model_category);
305 if (MULTI_VIEW_AD != model_category) {
306 ret = F_ERR_INVALID_OBJECT;
307 printf_s("unmatch model\r\n");
308 goto finally;
309 }
310
311 // モデルの期待する画像パラメータの確認
312 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
313 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
314
315 // モデルの視点数の取得
316 ret = fnPDL_get_how_many_views(hmodel, &n_views);
317 printf_s("# of views=%d\r\n", n_views);
318
319 // 入力画像配列のメモリ確保と画像読込
320 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
321 if (NULL == hsrcs) {
322 ret = F_ERR_NOMEMORY;
323 printf_s("malloc error\r\n");
324 goto finally;
325 }
326 else {
327 INT i_img = 0;
328 for (i_img = 0; i_img < n_views; i_img++) {
329 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
330 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
331 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
332 }
333 }
334
336 // 読み込んだ画像をそのまま推論する
338
339 // 推論実行
340 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &anomaly_data, &anomaly_data_len);
341 printf_s("pred(original): %d\r\n", ret);
342 // 後処理
343 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, &max_anomaly);
344 printf_s("postproc(original): %d %s, %.6e\r\n", ret, (is_anomaly ? "anomaly" : "normal"), max_anomaly);
345
347 // フィルタをかけた画像を推論する
349
350 // ここでは単純な平均化フィルタ
351 hfiltereds = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
352 if (NULL == hsrcs) {
353 ret = F_ERR_NOMEMORY;
354 printf_s("malloc error ( filtered images )\r\n");
355 goto finally;
356 }
357 else {
358 INT i_img = 0;
359 for (i_img = 0; i_img < n_views; i_img++) {
360 hfiltereds[i_img] = fnFIE_img_root_alloc(F_IMG_UC8, ch, w, h);
361 if (NULL == hfiltereds[i_img]) {
362 ret = F_ERR_NOMEMORY;
363 printf_s("malloc error ( filtered images )\r\n");
364 goto finally;
365 }
366 }
367 }
368 {
369 INT i_img = 0;
370 for (i_img = 0; i_img < n_views; i_img++) {
371 FHANDLE hsrc = hsrcs[i_img];
372 FHANDLE hdst = hfiltereds[i_img];
373 ret = fnFIE_average(hsrc, hdst, 0, 0);
374 if (F_ERR_NONE != ret) { goto finally; }
375 }
376 }
377
378 // 推論実行
379 ret = fnPDL_predict_multi_images(hmodel, n_views, hfiltereds, &anomaly_data, &anomaly_data_len);
380 printf_s("pred(average): %d\r\n", ret);
381 // 後処理
382 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, &max_anomaly);
383 printf_s("postproc(average): %d %s, %.6e\r\n", ret, (is_anomaly ? "anomaly" : "normal"), max_anomaly);
384 printf_s("\r\n");
385
386finally:
387 // ハンドルの破棄
388 fnPDL_dispose(hmodel);
389
390 // メモリの破棄
391 if (NULL != hsrcs) {
392 INT i_img = 0;
393 for (i_img = 0; i_img < n_views; i_img++) {
394 fnFIE_free_object(hsrcs[i_img]);
395 }
396 fnOAL_free(hsrcs);
397 }
398 if (NULL != hfiltereds) {
399 INT i_img = 0;
400 for (i_img = 0; i_img < n_views; i_img++) {
401 fnFIE_free_object(hfiltereds[i_img]);
402 }
403 fnOAL_free(hfiltereds);
404 }
405 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
406
407 // 終了処理
408 fnFIE_teardown();
409
410 return ret;
411}
INT FVALGAPI fnPDL_get_input_image_size(const H_MODEL hmodel, INT *channels, INT *width, INT *height)
モデルパラメータの取得
Definition: prediction_cpp.cpp:1989
INT FVALGAPI fnPDL_get_model_backend(const H_MODEL hmodel, MODEL_BACKEND *model_backend)
モデルのバックエンドの取得
Definition: prediction_cpp.cpp:1968
MODEL_CATEGORY
モデルの種別
Definition: fv_pdl.h:46
INT fnPDL_check_license()
ライセンス確認
Definition: check_licence.cpp:160
MODEL_BACKEND
推論バックエンド
Definition: fv_pdl.h:30
INT FVALGAPI fnPDL_get_model_category(const H_MODEL hmodel, MODEL_CATEGORY *model_category)
モデルの種別の取得
Definition: prediction_cpp.cpp:1937
INT FVALGAPI fnPDL_get_how_many_views(const H_MODEL hmodel, INT *num_views)
モデルパラメータの取得
Definition: prediction_cpp.cpp:2013
INT FVALGAPI fnPDL_postproc_ad(const H_MODEL hmodel, const FLOAT *anomaly_data, const size_t num_scores, const FLOAT threshold, BOOL *is_anomaly, FHANDLE *hmap, FLOAT *max_anomaly)
推論結果の加工 ( アノマリー検出 )
Definition: prediction_cpp.cpp:2530
INT FVALGAPI fnPDL_predict_multi_images(const H_MODEL hmodel, INT num_images, FHANDLE *hsrcs, FLOAT **scores, size_t *num_scores)
推論の実行 ( 多視点画像分類、多視点アノマリー検出 )
Definition: prediction_cpp.cpp:2295
VOID FVALGAPI fnPDL_dispose(H_MODEL hmodel)
モデルハンドルの解放
Definition: prediction_cpp.cpp:2556
INT FVALGAPI fnPDL_load_model(const CHAR *filename, H_MODEL hmodel)
モデルの読み込み
Definition: prediction_cpp.cpp:1810
VOID * H_MODEL
モデルハンドル
Definition: fv_pdl.h:18
H_MODEL *FVALGAPI fnPDL_create_handle()
モデルハンドルの生成
Definition: prediction_cpp.cpp:1755
@ MULTI_VIEW_AD
Definition: fv_pdl.h:56

Documentation copyright © 2026 TOKYO ELECTRON DEVICE LIMITED https://www.teldevice.co.jp/
Generated on Fri Jun 19 2026 14:08:06 for WIL-PDL Reference ( C++ ) 1.0.6 by Doxygen 1.9.5.