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

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

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

Documentation copyright © 2008 FAST Corporation. https://www.fast-corp.co.jp/
Generated on Fri Sep 6 2024 10:40:36 for WIL-PDL Reference ( C++ ) 1.0.4 by Doxygen 1.9.5.