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

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

  • 最も単純なサンプルコード: L.5- smp_ad_simple()
  • ベンチマークを計測するサンプルコード: L.101: smp_ad_benchmark()
  • FIE の関数を前処理として行うサンプルコード: L.195: smp_ad_with_fie()
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4
5int smp_ad_simple(const char* model_name, const char* img_name, const FLOAT threshold)
6{
7 INT ret = F_ERR_NONE;
8 FHANDLE hsrc = NULL;
9 H_MODEL hmodel = NULL;
10 MODEL_CATEGORY model_category;
11 MODEL_BACKEND model_backend;
12 INT ch, w, h;
13 FLOAT* anomaly_data = NULL;
14 size_t anomaly_data_len;
15
16 BOOL is_anomaly = false;
17 FHANDLE hmap = NULL;
18 FLOAT max_anomaly = .0;
19
20 // FIEライブラリの使用前に必ずコールする必要があります。
21 fnFIE_setup();
22
23 // 画像読込
24 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
25 printf_s("img: %d\r\n", ret);
26
27 //------- ここから -------//
28
29 // ライセンスチェック
30 ret = fnPDL_check_license();
31 printf_s("lic : %d\r\n", ret);
32
33 // ハンドルの生成
34 hmodel = fnPDL_create_handle();
35 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
36 else { printf_s("handle created\r\n"); }
37
38 // モデル読込
39 ret = fnPDL_load_model(model_name, hmodel);
40 printf_s("load: %d\r\n", ret);
41
42 // モデルの種別の確認
43 ret = fnPDL_get_model_category(hmodel, &model_category);
44 printf_s("ret : %d category=%d\r\n", ret, model_category);
45 if (ANOMALY_DETECTION != model_category) { printf_s("unmatch model"); }
46
47 // モデルの推論バックエンドの確認
48 ret = fnPDL_get_model_backend(hmodel, &model_backend);
49 printf_s("ret : %d backend=%d\r\n", ret, model_backend);
50
51 // モデルの期待する画像パラメータの確認
52 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
53 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
54
55 // 推論実行
56 ret = fnPDL_predict(hmodel, hsrc, &anomaly_data, &anomaly_data_len);
57 printf_s("pred: %d\r\n", ret);
58
59 // 後処理1: is_anomaly の判定のみ
60 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, NULL);
61 printf_s(" is_anomaly: %d, %s\r\n", ret, (is_anomaly ? "true" : "false"));
62
63 // 後処理2: 最大異常度
64 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, NULL, NULL, NULL, &max_anomaly);
65 printf_s(" max_anomaly: %d, %6e\r\n", ret, max_anomaly);
66
67 // 後処理3-1: 最大異常度マップ出力 ( float 版 )
68 hmap = fnFIE_img_root_alloc(F_IMG_FLOAT, 1, w, h);
69 if (NULL != hmap) {
70 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, NULL, NULL, &hmap, NULL);
71 printf_s(" calc_map: %d\r\n", ret);
72
73 ret = fnFIE_save_bmp("map_float.bmp", hmap);
74 printf_s(" save map: %d\r\n", ret);
75 }
76
77 // 後処理3-2: 最大異常度マップ出力 ( uc8 版 )
78 hmap = fnFIE_img_root_alloc(F_IMG_UC8, 1, w, h);
79 if (NULL != hmap) {
80 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, NULL, NULL, &hmap, NULL);
81 printf_s(" calc_map: %d\r\n", ret);
82
83 ret = fnFIE_save_bmp("map_uc8.bmp", hmap);
84 printf_s(" save map: %d\r\n", ret);
85 }
86
87 // ハンドルの破棄
88 fnPDL_dispose(hmodel);
89
90 //------- ここまで -------//
91
92 // 終了処理
93 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
94 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
95 if (NULL != hmap) { fnFIE_free_object(hmap); }
96 fnFIE_teardown();
97
98 return ret;
99}
100
101int smp_ad_benchmark(const char* model_name, const char* img_name, const FLOAT threshold, const int bench_iter)
102{
103 // benchmark 用
104 std::chrono::system_clock::time_point start, end;
105
106 INT ret = F_ERR_NONE;
107 FHANDLE hsrc = NULL;
108 H_MODEL hmodel = NULL;
109 MODEL_CATEGORY model_category;
110 INT ch, w, h;
111 FLOAT* anomaly_data = NULL;
112 size_t anomaly_data_len;
113
114 BOOL is_anomaly = false;
115 FHANDLE hmap = NULL;
116 FLOAT max_anomaly = .0;
117
118 // FIEライブラリの使用前に必ずコールする必要があります。
119 fnFIE_setup();
120
121 // 画像読込
122 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
123 printf_s("img: %d\r\n", ret);
124 if (F_ERR_NONE != ret) { goto finally; }
125
126 // ライセンスチェック
127 ret = fnPDL_check_license();
128 printf_s("lic : %d\r\n", ret);
129
130 // ハンドルの生成
131 hmodel = fnPDL_create_handle();
132 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
133 else { printf_s("handle created\r\n"); }
134
135 // モデル読込
136 ret = fnPDL_load_model(model_name, hmodel);
137 printf_s("load: %d\r\n", ret);
138
139 // モデルの種別の確認
140 ret = fnPDL_get_model_category(hmodel, &model_category);
141 printf_s("par : %d category=%d\r\n", ret, model_category);
142 if (ANOMALY_DETECTION != model_category) { printf_s("unmatch model"); }
143
144 // モデルの期待する画像パラメータの確認
145 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
146 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
147
148 // float で確保 ( 最も重いと思われる処理 )
149 hmap = fnFIE_img_root_alloc(F_IMG_FLOAT, 1, w, h);
150 if (NULL == hmap) { printf_s("map image: allocation error"); }
151
152 printf_s("--- start ---\r\n");
153 printf_s("ret, elapsed[msec], scores\r\n");
154 // 本体ループ
155 for (int i = 0; i < bench_iter; i++) {
156 double elapsed;
157
158 // 開始時刻
159 start = std::chrono::system_clock::now();
160
161 // 推論実行
162 ret = fnPDL_predict(hmodel, hsrc, &anomaly_data, &anomaly_data_len);
163 // 後処理: アノマリー判定、最大異常度取得、マップ画像算出の全て
164 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, &hmap, &max_anomaly);
165
166 // 完了時刻
167 end = std::chrono::system_clock::now();
168
169 if (F_ERR_NONE != ret) {
170 printf_s("pred. err: %d\r\n", ret);
171 goto finally;
172 }
173
174 // 推論時間 [msec]
175 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
176
177 // コンソールに出力
178 printf_s("%04d, %.3e, %s, %.6e\r\n", i, elapsed, (is_anomaly?"anomaly":"normal"), max_anomaly);
179 }
180 printf_s("--- finish ---\r\n");
181
182 // ハンドルの破棄
183 fnPDL_dispose(hmodel);
184
185 finally:
186 // 終了処理
187 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
188 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
189 if (NULL != hmap) { fnFIE_free_object(hmap); }
190 fnFIE_teardown();
191
192 return ret;
193}
194
195int smp_ad_with_fie(const char* model_name, const char* img_name, const FLOAT threshold)
196{
197 INT ret = F_ERR_NONE;
198 FHANDLE hsrc = NULL;
199 H_MODEL hmodel = NULL;
200 MODEL_CATEGORY model_category;
201 FLOAT* anomaly_data = NULL;
202 size_t anomaly_data_len;
203
204 BOOL is_anomaly = false;
205 FLOAT max_anomaly = .0;
206
207 FHANDLE hfiltered = NULL;
208 INT ch, w, h, type;
209 INT_PTR step;
210
211 // FIEライブラリの使用前に必ずコールする必要があります。
212 fnFIE_setup();
213
214 // 画像読込
215 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
216 printf_s("img: %d\r\n", ret);
217
218 //------- ここから -------//
219
220 // ライセンスチェック
221 ret = fnPDL_check_license();
222 printf_s("lic : %d\r\n", ret);
223
224 // ハンドルの生成
225 hmodel = fnPDL_create_handle();
226 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
227 else { printf_s("handle created\r\n"); }
228
229 // モデル読込
230 ret = fnPDL_load_model(model_name, hmodel);
231 printf_s("load: %d\r\n", ret);
232
233 // モデルの種別の確認
234 ret = fnPDL_get_model_category(hmodel, &model_category);
235 printf_s("par : %d category=%d\r\n", ret, model_category);
236 if (ANOMALY_DETECTION != model_category) { printf_s("unmatch model"); }
237
239 // 読み込んだ画像をそのまま推論する
241
242 // 推論実行
243 ret = fnPDL_predict(hmodel, hsrc, &anomaly_data, &anomaly_data_len);
244 printf_s("pred(original): %d\r\n", ret);
245 // 後処理
246 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, &max_anomaly);
247 printf_s("postproc(original): %d %s, %.6e\r\n", ret, (is_anomaly ? "anomaly" : "normal"), max_anomaly);
248
250 // フィルタをかけた画像を推論する
252
253 // ここでは単純な平均化フィルタ
254 ret = fnFIE_img_get_params(hsrc, &ch, &type, &step, &w, &h);
255 if (F_ERR_NONE != ret) { goto finally; }
256 hfiltered = fnFIE_img_root_alloc(type, ch, w, h);
257 if (NULL == hfiltered) { ret = F_ERR_NOMEMORY; goto finally; }
258 ret = fnFIE_average(hsrc, hfiltered, 0, 0);
259 if (F_ERR_NONE != ret) { goto finally; }
260
261 // 推論実行
262 ret = fnPDL_predict(hmodel, hfiltered, &anomaly_data, &anomaly_data_len);
263 printf_s("pred(original): %d\r\n", ret);
264 // 後処理
265 ret = fnPDL_postproc_ad(hmodel, anomaly_data, anomaly_data_len, threshold, &is_anomaly, NULL, &max_anomaly);
266 printf_s("postproc(original): %d %s, %.6e\r\n", ret, (is_anomaly ? "anomaly" : "normal"), max_anomaly);
267
268 // ハンドルの破棄
269 fnPDL_dispose(hmodel);
270
271 //------- ここまで -------//
272
273 finally:
274 // 終了処理
275 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
276 if (NULL != anomaly_data) { fnOAL_free(anomaly_data); }
277 if (NULL != hfiltered) { fnFIE_free_object(hfiltered); }
278 fnFIE_teardown();
279
280 return ret;
281}
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_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
VOID FVALGAPI fnPDL_dispose(H_MODEL hmodel)
モデルハンドルの解放
Definition: prediction_cpp.cpp:2110
INT FVALGAPI fnPDL_predict(const H_MODEL hmodel, const FHANDLE hsrc, FLOAT **scores, size_t *num_scores)
推論の実行
Definition: prediction_cpp.cpp:1881
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
@ ANOMALY_DETECTION
Definition: fv_pdl.h:52

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-gpu by Doxygen 1.9.5.