WIL-PDL Reference ( C++ ) 1.0.4
サンプルコード ( パノプティックセグメンテーション )

パノプティックセグメンテーションのサンプルコードです

  • 最も単純なサンプルコード: L.5- smp_panseg_simple()
  • ベンチマークを計測するサンプルコード: L.94: smp_panseg_benchmark()
  • 推論結果画像から FIE の関数を使用して各カテゴリのマスク画像 ( 二値画像 ) を取得するサンプルコード: L.175: smp_panseg_with_fie()
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4
5int smp_panseg_simple(const char* model_name, const char* img_name)
6{
7 INT ret = F_ERR_NONE;
8 FHANDLE hsrc = NULL;
9 FHANDLE hdst = NULL;
10 H_MODEL hmodel = NULL;
11 MODEL_CATEGORY model_category;
12 MODEL_BACKEND model_backend;
13 INT ch, w, h;
14
15 // FIEライブラリの使用前に必ずコールする必要があります。
16 fnFIE_setup();
17
18 // 画像読込
19 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
20 printf_s("img: %d\r\n", ret);
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 (SEMANTIC_SEGMENTATION != 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 // パノプティックセグメンテーションに固有の検出パラメータの設定
52 1024, // デフォルト値: 物でないクラスとして検出された領域の面積に対する閾値
53 0.1, // デフォルト値: 物体として検出する閾値、感度に相当
54 32, // デフォルト値: 近接する検出に対する非極大抑制のカーネルの大きさ
55 0 // デフォルト値: 0 の場合には上限を設けない ( 0 より大きく入力画像サイズ以下のときに有効 )
56 );
57
58 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
59 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, w, h);
60 if (NULL == hdst) { printf_s("hdst allocation error"); }
61
62 // 推論実行
63 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
64 printf_s("pred: %d\r\n", ret);
65 if (F_ERR_NONE == ret) {
66 // 各ピクセルにカテゴリ番号とインスタンス番号が格納されているので、その最大値を取得
67 DOUBLE* maxs = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 2);
68 DOUBLE* mins = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 2);
69 INT max_cate_id = 0;
70 INT instance_num = 0;
71
72 // 画像全体のリージョンに対して fnFIE_img_maxpixel() を使用することも可
73 ret = fnFIE_img_minmaxdens(hdst, mins, maxs);
74
75 // カテゴリ番号の最大値
76 max_cate_id = (INT)maxs[0];
77 // 最大値が 0 となるのは、全てのピクセルが背景と判定されたとき
78 if (0 == max_cate_id) { printf_s("all pixels are background"); }
79 // 1 以上となるのは、いずれかのカテゴリと判定されたピクセルが存在するとき ( 元が US16 なので負の値になることは無い )
80 else { printf_s("there are some masks, largest category id = %d\r\n", max_cate_id); }
81 if (NULL != maxs) { fnOAL_free(maxs); }
82 if (NULL != mins) { fnOAL_free(mins); }
83
84 // インスタンス番号の最大値 = 見つかったマスクの個数
85 instance_num = (INT)maxs[1];
86 printf_s("there are %d masks", instance_num);
87 }
88
89 // ハンドルの破棄
90 fnPDL_dispose(hmodel);
91
92 //------- ここまで -------//
93
94 // 終了処理
95 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
96 if (NULL != hdst) { fnFIE_free_object(hdst); }
97 fnFIE_teardown();
98
99 return ret;
100}
101
102int smp_panseg_benchmark(const char* model_name, const char* img_name, const int bench_iter)
103{
104 // benchmark 用
105 std::chrono::system_clock::time_point start, end;
106
107 INT ret = F_ERR_NONE;
108 FHANDLE hsrc = NULL;
109 FHANDLE hdst = NULL;
110 H_MODEL hmodel = NULL;
111 MODEL_CATEGORY model_category;
112
113 // FIEライブラリの使用前に必ずコールする必要があります。
114 fnFIE_setup();
115
116 // 画像読込
117 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
118 printf_s("img: %d\r\n", ret);
119 if (F_ERR_NONE != ret) { goto finally; }
120
121 // ライセンスチェック
122 ret = fnPDL_check_license();
123 printf_s("lic : %d\r\n", ret);
124
125 // ハンドルの生成
126 hmodel = fnPDL_create_handle();
127 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
128 else { printf_s("handle created\r\n"); }
129
130 // モデル読込
131 ret = fnPDL_load_model(model_name, hmodel);
132 printf_s("load: %d\r\n", ret);
133
134 // モデルの種別の確認
135 ret = fnPDL_get_model_category(hmodel, &model_category);
136 printf_s("par : %d category=%d\r\n", ret, model_category);
137 if (SEMANTIC_SEGMENTATION != model_category) { printf_s("unmatch model"); }
138
139 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
140 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc));
141 if (NULL == hdst) { printf_s("hdst allocation error"); }
142
143 printf_s("--- start ---\r\n");
144 printf_s("ret, elapsed[msec], scores\r\n");
145 // 本体ループ
146 for (int i = 0; i < bench_iter; i++) {
147 double elapsed;
148
149 // 開始時刻
150 start = std::chrono::system_clock::now();
151
152 // 推論実行
153 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
154
155 // 完了時刻
156 end = std::chrono::system_clock::now();
157
158 if (F_ERR_NONE != ret) {
159 printf_s("pred. err: %d\r\n", ret);
160 goto finally;
161 }
162
163 // 推論時間 [msec]
164 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
165
166 // コンソールに出力
167 printf_s("%04d, %.3e\r\n", i, elapsed);
168 }
169 printf_s("--- finish ---\r\n");
170
171 // ハンドルの破棄
172 fnPDL_dispose(hmodel);
173
174 finally:
175 // 終了処理
176 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
177 if (NULL != hdst) { fnFIE_free_object(hdst); }
178 fnFIE_teardown();
179
180 return ret;
181}
182
183int smp_panseg_with_fie(const char* model_name, const char* img_name, const INT category_num)
184{
185 INT ret = F_ERR_NONE;
186 FHANDLE hsrc = NULL;
187 FHANDLE hdst = NULL;
188 FHANDLE hdst_cate = NULL;
189 FHANDLE hdst_inst = NULL;
190 FHANDLE hdst_cate_tmp = NULL;
191 FHANDLE hdst_inst_tmp = NULL;
192 INT instance_num = 0;
193 FHANDLE hmask = NULL;
194 H_MODEL hmodel = NULL;
195 MODEL_CATEGORY model_category;
196
197 INT ch, w, h, type;
198 INT_PTR step;
199
200 DOUBLE* maxs = NULL;
201 DOUBLE* mins = NULL;
202
203 // FIEライブラリの使用前に必ずコールする必要があります。
204 fnFIE_setup();
205
206 // 画像読込
207 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
208 printf_s("img: %d\r\n", ret);
209
210 //------- ここから -------//
211
212 // ライセンスチェック
213 ret = fnPDL_check_license();
214 printf_s("lic : %d\r\n", ret);
215
216 // ハンドルの生成
217 hmodel = fnPDL_create_handle();
218 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); goto finally; }
219 else { printf_s("handle created\r\n"); }
220
221 // モデル読込
222 ret = fnPDL_load_model(model_name, hmodel);
223 printf_s("load: %d\r\n", ret);
224 if (F_ERR_NONE != ret) { goto finally; }
225
226 // モデルの種別の確認
227 ret = fnPDL_get_model_category(hmodel, &model_category);
228 printf_s("par : %d category=%d\r\n", ret, model_category);
229 if (SEMANTIC_SEGMENTATION != model_category) { printf_s("unmatch model"); goto finally; }
230
231 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
232 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, w, h);
233 if (NULL == hdst) { printf_s("hdst allocation error"); goto finally; }
234
235 // 推論実行
236 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
237 printf_s("pred(original): %d\r\n", ret);
238 if (F_ERR_NONE != ret) { goto finally; }
239
240 // カテゴリ番号の格納された画像 ( 0ch ) とインスタンス番号の格納された画像 ( 1ch ) の確保
241 hdst_cate = fnFIE_img_child_alloc_single_ch(hdst, 0, 0, 0, w, h);
242 hdst_inst = fnFIE_img_child_alloc_single_ch(hdst, 1, 0, 0, w, h);
243
244 // 検出インスタンス数の取得
245 {
246 maxs = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 1);
247 mins = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 1);
248 ret = fnFIE_img_minmaxdens(hdst_inst, mins, maxs);
249 if (F_ERR_NONE != ret) { goto finally; }
250 instance_num = (INT)maxs[0];
251 }
252
253 // 各カテゴリのマスク画像の確保 ( 元画像・結果画像と同じサイズで画像型は BIN、チャネル数は 1 )
254 hmask = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
255 if (NULL == hdst) { printf_s("hmask allocation error"); goto finally; }
256
257 // カテゴリ基準でマスクを取得する場合
258 {
259 hdst_cate_tmp = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
260 if (NULL == hdst_cate_tmp) { printf_s("hcate_tmp allocation error"); goto finally; }
261 hdst_inst_tmp = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
262 if (NULL == hdst_inst_tmp) { printf_s("hinst_tmp allocation error"); goto finally; }
263
264 // 全てのカテゴリを走査
265 for (int i_cate = 1; i_cate <= category_num; i_cate++) {
266 // カテゴリ番号に一致するピクセルを取得
267 ret = fnFIE_band_threshold(hdst_cate, hdst_cate_tmp, (DOUBLE)i_cate, (DOUBLE)i_cate);
268 if (F_ERR_NONE != ret) { continue; }
269
270 // 0 クリアして、そのカテゴリ領域のインスタンス画像をマスク転送
271 ret = fnFIE_img_clear(hdst_inst_tmp, 0);
272 if (F_ERR_NONE != ret) { continue; }
273 ret = fnFIE_img_mask(hdst_inst, hdst_cate_tmp, hdst_inst_tmp);
274 if (F_ERR_NONE != ret) { continue; }
275
276 // ここでは単純にインスタンス数を全て走査
277 for (int i_inst = 0; i_inst <= instance_num; i_inst++) {
278 ret = fnFIE_band_threshold(hdst_inst_tmp, hmask, (DOUBLE)i_inst, (DOUBLE)i_inst);
279 if (F_ERR_NONE != ret) { continue; }
280
281 // hmask の全面 ( 最大値 ) が 0 であれば、そのインスタンスはそのカテゴリではないのでスキップ ( リージョンに変換して面積で判定しても可 )
282 ret = fnFIE_img_minmaxdens(hmask, mins, maxs);
283 if (F_ERR_NONE != ret) { goto finally; }
284 if (0 == maxs[0]) { continue; }
285
286 // hmask に対する任意の処理 ( ブロブ特徴量の取得やリージョン特徴量の取得など )
287 //
288 }
289 }
290 }
291
292 // インスタンス基準でマスクを取得する場合
293 {
294 hdst_cate_tmp = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
295 if (NULL == hdst_cate_tmp) { printf_s("hcate_tmp allocation error"); goto finally; }
296 // ここではインスタンス番号の領域で直接インスタンスの領域を取得できるの確保不要
297 //hinst_tmp = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
298 //if (NULL == hinst_tmp) { printf_s("hinst_tmp allocation error"); goto finally; }
299
300 // 全てのインスタンスを走査
301 for (int i_inst = 0; i_inst <= instance_num; i_inst++) {
302 // インスタンス番号に一致するピクセルを取得
303 ret = fnFIE_band_threshold(hdst_inst, hmask, (DOUBLE)i_inst, (DOUBLE)i_inst);
304 if (F_ERR_NONE != ret) { continue; }
305
306 // 0 クリアして、そのインスタンス領域のカテゴリ画像をマスク転送 ( 先にインスタンス画像をリージョンに変換してそのリージョン内の濃度値を取得しても可 )
307 ret = fnFIE_img_clear(hdst_cate_tmp, 0);
308 if (F_ERR_NONE != ret) { continue; }
309 ret = fnFIE_img_mask(hdst_cate, hmask, hdst_cate_tmp);
310 if (F_ERR_NONE != ret) { continue; }
311
312 // maxs[0] でカテゴリ番号を取得
313 ret = fnFIE_img_minmaxdens(hdst_cate_tmp, mins, maxs);
314 if (F_ERR_NONE != ret) { goto finally; }
315 if (0 == maxs[0]) { continue; }// カテゴリ番号が 0 のときは背景
316 if (category_num < maxs[0]) { continue; }// カテゴリ番号が与えられたカテゴリ数よりも大きいのは不合理
317
318 // hmask に対する任意の処理 ( ブロブ特徴量の取得やリージョン特徴量の取得など )
319 //
320 }
321 }
322
323 finally:
324 // ハンドルの破棄
325 fnPDL_dispose(hmodel);
326
327 //------- ここまで -------//
328
329 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
330 if (NULL != hdst) { fnFIE_free_object(hdst); }
331 if (NULL != hdst_cate) { fnFIE_free_object(hdst_cate); }
332 if (NULL != hdst_inst) { fnFIE_free_object(hdst_inst); }
333 if (NULL != hdst_cate_tmp) { fnFIE_free_object(hdst_cate); }
334 if (NULL != hdst_inst_tmp) { fnFIE_free_object(hdst_inst); }
335 if (NULL != hmask) { fnFIE_free_object(hmask); }
336 if (NULL != maxs) { fnOAL_free(maxs); }
337 if (NULL != mins) { fnOAL_free(mins); }
338
339 // 終了処理
340 fnFIE_teardown();
341
342 return ret;
343}
344
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
VOID FVALGAPI fnPDL_dispose(H_MODEL hmodel)
モデルハンドルの解放
Definition: prediction_cpp.cpp:2110
INT FVALGAPI fnPDL_set_panoptic_deeplab_infer_params(const H_MODEL hmodel, UINT stuff_area, DOUBLE threshold, INT nms_kernel, USHORT request_instance_num)
Panoptic Segmentation の推論パラメータの設定
Definition: prediction_cpp.cpp:1837
INT FVALGAPI fnPDL_load_model(const CHAR *filename, H_MODEL hmodel)
モデルの読み込み
Definition: prediction_cpp.cpp:1501
INT FVALGAPI fnPDL_predict_segmentation(const H_MODEL hmodel, const FHANDLE hsrc, FHANDLE hdst)
推論の実行 ( セグメンテーション )
Definition: prediction_cpp.cpp:1989
VOID * H_MODEL
モデルハンドル
Definition: fv_pdl.h:18
H_MODEL *FVALGAPI fnPDL_create_handle()
モデルハンドルの生成
Definition: prediction_cpp.cpp:1446
@ SEMANTIC_SEGMENTATION
Definition: fv_pdl.h:58

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.