WIL-PDL Reference ( C++ ) 1.0.4-gpu
サンプルコード ( 多視点画像分類 )

多視点画像分類のサンプルコードです

  • 最も単純なサンプルコード: L.6- smp_mvcnn_simple()
  • ベンチマークを計測するサンプルコード: L.100: smp_mvcnn_benchmark()
  • FIE の関数を前処理として行うサンプルコード: L.212: smp_mvcnn_with_fie()
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4#include <string>
5
6int smp_mvcnn_simple(const char*model_name, const char* img_folder)
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* scores = NULL;
16 size_t n_scores;
17
18 // FIEライブラリの使用前に必ずコールする必要があります。
19 fnFIE_setup();
20
21
22 //------- ここから -------//
23
24 // ライセンスチェック
25 ret = fnPDL_check_license();
26 printf_s("lic : %d\r\n", ret);
27
28 // ハンドルの生成
29 hmodel = fnPDL_create_handle();
30 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
31 else { printf_s("handle created\r\n"); }
32
33 // モデル読込
34 ret = fnPDL_load_model(model_name, hmodel);
35 printf_s("load: %d\r\n", ret);
36
37 // モデルの種別の確認
38 ret = fnPDL_get_model_category(hmodel, &model_category);
39 printf_s("par : %d category=%d\r\n", ret, model_category);
40 if (MULTI_VIEW_CNN != model_category) { printf_s("unmatch model"); }
41
42 // モデルの推論バックエンドの確認
43 ret = fnPDL_get_model_backend(hmodel, &model_backend);
44 printf_s("ret : %d backend=%d\r\n", ret, model_backend);
45
46 // モデルの期待する画像パラメータの確認
47 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
48 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
49
50 // モデルの視点数の取得
51 ret = fnPDL_get_how_many_views(hmodel, &n_views);
52 printf_s("# of views=%d", n_views);
53
54 // 入力画像配列のメモリ確保と画像読込
55 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
56 if (NULL == hsrcs) {
57 ret = F_ERR_NOMEMORY;
58 printf_s("malloc error");
59 }
60 else {
61 INT i_img = 0;
62 for (i_img = 0; i_img < n_views; i_img++) {
63 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
64 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
65 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
66 }
67 }
68
69 // 推論実行
70 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &scores, &n_scores);
71 printf_s("pred: %d\r\n", ret);
72 if (NULL != scores && 0 < n_scores) {
73 INT i_score;
74 printf_s(" # of scores = %zd\r\n", n_scores);
75 for (i_score = 0; i_score < n_scores; i_score++) {
76 printf_s(" label%d: %.6e\r\n", i_score, scores[i_score]);
77 }
78 }
79
80 // ハンドルの破棄
81 fnPDL_dispose(hmodel);
82
83 //------- ここまで -------//
84
85
86 // 終了処理
87 if (NULL != hsrcs) {
88 INT i_img = 0;
89 for (i_img = 0; i_img < n_views; i_img++) {
90 fnFIE_free_object(hsrcs[i_img]);
91 }
92 fnOAL_free(hsrcs);
93 }
94 if (NULL != scores) { fnOAL_free(scores); }
95 fnFIE_teardown();
96
97 return ret;
98}
99
100int smp_mvcnn_benchmark(const char*model_name, const char* img_folder, const int bench_iter)
101{
102 // benchmark 用
103 std::chrono::system_clock::time_point start, end;
104
105 INT ret = F_ERR_NONE;
106 H_MODEL hmodel = NULL;
107 MODEL_CATEGORY model_category;
108 INT n_views = 0;
109 FHANDLE* hsrcs = NULL;
110 INT ch, w, h;
111 FLOAT* scores = NULL;
112 size_t n_scores;
113
114 // FIEライブラリの使用前に必ずコールする必要があります。
115 fnFIE_setup();
116
117 // ライセンスチェック
118 ret = fnPDL_check_license();
119 printf_s("lic : %d\r\n", ret);
120
121 // ハンドルの生成
122 hmodel = fnPDL_create_handle();
123 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
124 else { printf_s("handle created\r\n"); }
125
126 // モデル読込
127 ret = fnPDL_load_model(model_name, hmodel);
128 printf_s("load: %d\r\n", ret);
129
130 // モデルの種別の確認
131 ret = fnPDL_get_model_category(hmodel, &model_category);
132 printf_s("par : %d category=%d\r\n", ret, model_category);
133 if (MULTI_VIEW_CNN != model_category) { printf_s("unmatch model"); }
134
135 // モデルの期待する画像パラメータの確認
136 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
137 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
138
139 // モデルの視点数の取得
140 ret = fnPDL_get_how_many_views(hmodel, &n_views);
141 printf_s("# of views=%d", n_views);
142
143 // 入力画像配列のメモリ確保と画像読込
144 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
145 if (NULL == hsrcs) {
146 ret = F_ERR_NOMEMORY;
147 printf_s("malloc error");
148 }
149 else {
150 INT i_img = 0;
151 for (i_img = 0; i_img < n_views; i_img++) {
152 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
153 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
154 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
155 }
156 }
157
158
159 //------- 計測ループ ここから -------//
160
161 printf_s("--- start ---\r\n");
162 printf_s("ret, elapsed[msec], scores\r\n");
163 for (int i = 0; i < bench_iter, F_ERR_NONE == ret; i++) {
164 double elapsed;
165
166 // 開始時刻
167 start = std::chrono::system_clock::now();
168
169 // 推論実行
170 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &scores, &n_scores);
171
172 // 完了時刻
173 end = std::chrono::system_clock::now();
174
175 if (F_ERR_NONE != ret) {
176 printf_s("pred. err: %d\r\n", ret);
177 break;
178 }
179
180 // 推論時間 [msec]
181 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
182
183 // コンソールに出力
184 printf_s("%04d, %.3e", i, elapsed);
185 for (int i_score = 0; i_score < n_scores; i_score++) {
186 printf_s(", %.6e", scores[i_score]);
187 }
188 printf_s("\r\n");
189 }
190 printf_s("--- finish ---\r\n");
191
192 //------- 計測ループ ここまで -------//
193
194
195 // ハンドルの破棄
196 fnPDL_dispose(hmodel);
197
198 // 終了処理
199 if (NULL != hsrcs) {
200 INT i_img = 0;
201 for (i_img = 0; i_img < n_views; i_img++) {
202 fnFIE_free_object(hsrcs[i_img]);
203 }
204 fnOAL_free(hsrcs);
205 }
206 if (NULL != scores) { fnOAL_free(scores); }
207 fnFIE_teardown();
208
209 return ret;
210}
211
212int smp_mvcnn_with_fie(const char*model_name, const char* img_folder)
213{
214 INT ret = F_ERR_NONE;
215 H_MODEL hmodel = NULL;
216 MODEL_CATEGORY model_category;
217 INT n_views = 0;
218 FHANDLE* hsrcs = NULL;
219 FHANDLE* hfiltereds = NULL;
220 INT ch, w, h;
221 FLOAT* scores = NULL;
222 size_t n_scores;
223
224 // FIEライブラリの使用前に必ずコールする必要があります。
225 fnFIE_setup();
226
227 // ライセンスチェック
228 ret = fnPDL_check_license();
229 printf_s("lic : %d\r\n", ret);
230
231 // ハンドルの生成
232 hmodel = fnPDL_create_handle();
233 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
234 else { printf_s("handle created\r\n"); }
235
236 // モデル読込
237 ret = fnPDL_load_model(model_name, hmodel);
238 printf_s("load: %d\r\n", ret);
239
240 // モデルの種別の確認
241 ret = fnPDL_get_model_category(hmodel, &model_category);
242 printf_s("par : %d category=%d\r\n", ret, model_category);
243 if (MULTI_VIEW_CNN != model_category) { printf_s("unmatch model"); }
244
245 // モデルの期待する画像パラメータの確認
246 ret = fnPDL_get_input_image_size(hmodel, &ch, &w, &h);
247 printf_s("par : %d ch=%d w=%d h=%d\r\n", ret, ch, w, h);
248
249 // モデルの視点数の取得
250 ret = fnPDL_get_how_many_views(hmodel, &n_views);
251 printf_s("# of views=%d", n_views);
252
253 // 入力画像配列のメモリ確保と画像読込
254 hsrcs = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
255 if (NULL == hsrcs) {
256 ret = F_ERR_NOMEMORY;
257 printf_s("malloc error");
258 }
259 else {
260 INT i_img = 0;
261 for (i_img = 0; i_img < n_views; i_img++) {
262 std::string image_path = std::string(img_folder) + std::to_string(i_img) + ".bmp";
263 ret = fnFIE_load_bmp(image_path.c_str(), &(hsrcs[i_img]), F_COLOR_IMG_TYPE_UC8);
264 printf_s("img ( #=%d ): %d\r\n", i_img, ret);
265 }
266 }
267
269 // 読み込んだ画像をそのまま推論する
271
272 // 推論実行
273 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &scores, &n_scores);
274 printf_s("pred: %d\r\n", ret);
275 if (NULL != scores && 0 < n_scores) {
276 INT i_score;
277 printf_s(" # of scores = %zd\r\n", n_scores);
278 for (i_score = 0; i_score < n_scores; i_score++) {
279 printf_s(" label%d: %.6e\r\n", i_score, scores[i_score]);
280 }
281 }
282
284 // フィルタをかけた画像を推論する
286
287 // ここでは単純な平均化フィルタ
288 hfiltereds = (FHANDLE*)fnOAL_calloc(n_views, sizeof(FHANDLE));
289 if (NULL == hsrcs) {
290 ret = F_ERR_NOMEMORY;
291 printf_s("malloc error ( filtered images )");
292 }
293 else {
294 INT i_img = 0;
295 for (i_img = 0; i_img < n_views; i_img++) {
296 FHANDLE hsrc = hsrcs[i_img];
297 FHANDLE hdst = hfiltereds[i_img];
298 ret = fnFIE_average(hsrc, hdst, 0, 0);
299 if (F_ERR_NONE != ret) { goto finally; }
300 }
301 }
302
303 // 推論実行
304 ret = fnPDL_predict_multi_images(hmodel, n_views, hfiltereds, &scores, &n_scores);
305 printf_s("pred(average): %d\r\n", ret);
306 if (F_ERR_NONE != ret) { goto finally; }
307 if (NULL != scores && 0 < n_scores) {
308 INT i_score;
309 printf_s(" # of scores = %zd\r\n", n_scores);
310 for (i_score = 0; i_score < n_scores; i_score++) {
311 printf_s(" label%d: %.6e\r\n", i_score, scores[i_score]);
312 }
313 }
314
315
316 finally:
317 // ハンドルの破棄
318 fnPDL_dispose(hmodel);
319
320 // メモリの破棄
321 if (NULL != hsrcs) {
322 INT i_img = 0;
323 for (i_img = 0; i_img < n_views; i_img++) {
324 fnFIE_free_object(hsrcs[i_img]);
325 }
326 fnOAL_free(hsrcs);
327 }
328 if (NULL != hfiltereds) {
329 INT i_img = 0;
330 for (i_img = 0; i_img < n_views; i_img++) {
331 fnFIE_free_object(hfiltereds[i_img]);
332 }
333 fnOAL_free(hfiltereds);
334 }
335 if (NULL != scores) { fnOAL_free(scores); }
336
337 // 終了処理
338 fnFIE_teardown();
339
340 return ret;
341
342}
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_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_CNN
Definition: fv_pdl.h:54

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.