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

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

  • 最も単純なサンプルコード: L.5- smp_panseg_simple()
  • ベンチマークを計測するサンプルコード: L.102: smp_panseg_benchmark()
  • 推論結果画像から FIE の関数を使用して各カテゴリのマスク画像 ( 二値画像 ) を取得するサンプルコード: L.183: 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 if (F_ERR_NONE != ret) { goto finally; }
22
23 //------- ここから -------//
24
25 // ライセンスチェック
26 ret = fnPDL_check_license();
27 printf_s("lic : %d\r\n", ret);
28 if (F_ERR_NONE != ret) { goto finally; }
29
30 // ハンドルの生成
31 hmodel = fnPDL_create_handle();
32 if (NULL == hmodel) {
33 ret = F_ERR_NOMEMORY;
34 printf_s("failed to create handle\r\n");
35 goto finally;
36 }
37 else { printf_s("handle created\r\n"); }
38
39 // モデル読込
40 ret = fnPDL_load_model(model_name, hmodel);
41 printf_s("load: %d\r\n", ret);
42 if (F_ERR_NONE != ret) { goto finally; }
43
44 // モデルの種別の確認
45 ret = fnPDL_get_model_category(hmodel, &model_category);
46 printf_s("par : %d category=%d\r\n", ret, model_category);
47 if (F_ERR_NONE != ret) { goto finally; }
48 if (PANOPTIC_SEGMENTATION != model_category) {
49 ret = F_ERR_INVALID_OBJECT;
50 printf_s("unmatch model\r\n");
51 goto finally;
52 }
53
54 // モデルの推論バックエンドの確認
55 ret = fnPDL_get_model_backend(hmodel, &model_backend);
56 printf_s("ret : %d backend=%d\r\n", ret, model_backend);
57 if (F_ERR_NONE != ret) { goto finally; }
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 if (F_ERR_NONE != ret) { goto finally; }
63
64 // パノプティックセグメンテーションに固有の検出パラメータの設定
66 1024, // デフォルト値: 物でないクラスとして検出された領域の面積に対する閾値
67 0.1, // デフォルト値: 物体として検出する閾値、感度に相当
68 7, // デフォルト値: 近接する検出に対する非極大抑制のカーネルの大きさ
69 0 // デフォルト値: 0 の場合には上限を設けない ( 0 より大きく入力画像サイズ以下のときに有効 )
70 );
71 if (F_ERR_NONE != ret) { goto finally; }
72
73 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
74 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, w, h);
75 if (NULL == hdst) {
76 ret = F_ERR_NOMEMORY;
77 printf_s("hdst allocation error\r\n");
78 goto finally;
79 }
80
81 // 推論実行
82 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
83 printf_s("pred: %d\r\n", ret);
84 if (F_ERR_NONE != ret) { goto finally; }
85 {
86 // 各ピクセルにカテゴリ番号とインスタンス番号が格納されているので、その最大値を取得
87 DOUBLE maxs[2] = {0, 0};
88 DOUBLE mins[2] = {0, 0};
89 INT max_cate_id = 0;
90 INT instance_num = 0;
91
92 // 画像全体のリージョンに対して fnFIE_img_maxpixel() を使用することも可
93 ret = fnFIE_img_minmaxdens(hdst, mins, maxs);
94 if (F_ERR_NONE != ret) { goto finally; }
95
96 // カテゴリ番号の最大値
97 max_cate_id = (INT)maxs[0];
98 // 最大値が 0 となるのは、全てのピクセルが背景と判定されたとき
99 if (0 == max_cate_id) { printf_s("all pixels are background\r\n"); }
100 // 1 以上となるのは、いずれかのカテゴリと判定されたピクセルが存在するとき ( 元が US16 なので負の値になることは無い )
101 else { printf_s("there are some masks, largest category id = %d\r\n", max_cate_id); }
102
103 // インスタンス番号の最大値 = 見つかったマスクの個数
104 instance_num = (INT)maxs[1];
105 printf_s("there are %d masks\r\n", instance_num);
106 }
107 printf_s("\r\n");
108
109finally:
110 // ハンドルの破棄
111 fnPDL_dispose(hmodel);
112
113 //------- ここまで -------//
114
115 // 終了処理
116 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
117 if (NULL != hdst) { fnFIE_free_object(hdst); }
118 fnFIE_teardown();
119
120 return ret;
121}
122
123int smp_panseg_benchmark(const char* model_name, const char* img_name, const int bench_iter)
124{
125 // benchmark 用
126 std::chrono::system_clock::time_point start, end;
127
128 INT ret = F_ERR_NONE;
129 FHANDLE hsrc = NULL;
130 FHANDLE hdst = NULL;
131 H_MODEL hmodel = NULL;
132 MODEL_CATEGORY model_category;
133
134 // FIEライブラリの使用前に必ずコールする必要があります。
135 fnFIE_setup();
136
137 // 画像読込
138 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
139 printf_s("img: %d\r\n", ret);
140 if (F_ERR_NONE != ret) { goto finally; }
141
142 // ライセンスチェック
143 ret = fnPDL_check_license();
144 printf_s("lic : %d\r\n", ret);
145 if (F_ERR_NONE != ret) { goto finally; }
146
147 // ハンドルの生成
148 hmodel = fnPDL_create_handle();
149 if (NULL == hmodel) {
150 ret = F_ERR_NOMEMORY;
151 printf_s("failed to create handle\r\n");
152 goto finally;
153 }
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 if (F_ERR_NONE != ret) { goto finally; }
160
161 // モデルの種別の確認
162 ret = fnPDL_get_model_category(hmodel, &model_category);
163 printf_s("par : %d category=%d\r\n", ret, model_category);
164 if (F_ERR_NONE != ret) { goto finally; }
165 if (PANOPTIC_SEGMENTATION != model_category) {
166 ret = F_ERR_INVALID_OBJECT;
167 printf_s("unmatch model\r\n");
168 goto finally;
169 }
170
171 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
172 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc));
173 if (NULL == hdst) {
174 ret = F_ERR_NOMEMORY;
175 printf_s("hdst allocation error\r\n");
176 goto finally;
177 }
178
179 printf_s("--- start ---\r\n");
180 printf_s("ret, elapsed[msec], scores\r\n");
181 // 本体ループ
182 for (int i = 0; i < bench_iter; i++) {
183 double elapsed;
184
185 // 開始時刻
186 start = std::chrono::system_clock::now();
187
188 // 推論実行
189 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
190
191 // 完了時刻
192 end = std::chrono::system_clock::now();
193
194 if (F_ERR_NONE != ret) {
195 printf_s("pred. err: %d\r\n", ret);
196 goto finally;
197 }
198
199 // 推論時間 [msec]
200 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
201
202 // コンソールに出力
203 printf_s("%04d, %.3e\r\n", i, elapsed);
204 }
205 printf_s("--- finish ---\r\n");
206 printf_s("\r\n");
207
208finally:
209 // ハンドルの破棄
210 fnPDL_dispose(hmodel);
211
212 // 終了処理
213 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
214 if (NULL != hdst) { fnFIE_free_object(hdst); }
215 fnFIE_teardown();
216
217 return ret;
218}
219
220int smp_panseg_with_fie(const char* model_name, const char* img_name, const INT category_num)
221{
222 INT ret = F_ERR_NONE;
223 FHANDLE hsrc = NULL;
224 FHANDLE hdst = NULL;
225 FHANDLE hdst_cate = NULL;
226 FHANDLE hdst_inst = NULL;
227 FHANDLE hdst_cate_tmp = NULL;
228 FHANDLE hdst_inst_tmp = NULL;
229 INT instance_num = 0;
230 FHANDLE hmask = NULL;
231 H_MODEL hmodel = NULL;
232 MODEL_CATEGORY model_category;
233
234 INT ch, w, h, type;
235 INT_PTR step;
236
237 // FIEライブラリの使用前に必ずコールする必要があります。
238 fnFIE_setup();
239
240 // 画像読込
241 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
242 printf_s("img: %d\r\n", ret);
243 if (F_ERR_NONE != ret) { goto finally; }
244
245 //------- ここから -------//
246
247 // ライセンスチェック
248 ret = fnPDL_check_license();
249 printf_s("lic : %d\r\n", ret);
250 if (F_ERR_NONE != ret) { goto finally; }
251
252 // ハンドルの生成
253 hmodel = fnPDL_create_handle();
254 if (NULL == hmodel) {
255 ret = F_ERR_NOMEMORY;
256 printf_s("failed to create handle\r\n");
257 goto finally;
258 }
259 else { printf_s("handle created\r\n"); }
260
261 // モデル読込
262 ret = fnPDL_load_model(model_name, hmodel);
263 printf_s("load: %d\r\n", ret);
264 if (F_ERR_NONE != ret) { goto finally; }
265
266 // モデルの種別の確認
267 ret = fnPDL_get_model_category(hmodel, &model_category);
268 printf_s("par : %d category=%d\r\n", ret, model_category);
269 if (F_ERR_NONE != ret) { goto finally; }
270 if (PANOPTIC_SEGMENTATION != model_category) {
271 ret = F_ERR_INVALID_OBJECT;
272 printf_s("unmatch model\r\n");
273 goto finally;
274 }
275
276 // セグメンテーション結果画像の確保 ( パノプティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 2 )
277 ret = fnFIE_img_get_params(hsrc, &ch, &type, &step, &w, &h);
278 if (F_ERR_NONE != ret) { goto finally; }
279 hdst = fnFIE_img_root_alloc(F_IMG_US16, 2, w, h);
280 if (NULL == hdst) {
281 ret = F_ERR_NOMEMORY;
282 printf_s("hdst allocation error\r\n");
283 goto finally;
284 }
285
286 // 推論実行
287 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
288 printf_s("pred: %d\r\n", ret);
289 if (F_ERR_NONE != ret) { goto finally; }
290
291 // カテゴリ番号の格納された画像 ( 0ch ) とインスタンス番号の格納された画像 ( 1ch ) の確保
292 hdst_cate = fnFIE_img_child_alloc_single_ch(hdst, 0, 0, 0, w, h);
293 if (NULL == hdst_cate) {
294 ret = F_ERR_NOMEMORY;
295 printf_s("child image allocation error\r\n");
296 goto finally;
297 }
298 hdst_inst = fnFIE_img_child_alloc_single_ch(hdst, 1, 0, 0, w, h);
299 if (NULL == hdst_inst) {
300 ret = F_ERR_NOMEMORY;
301 printf_s("child image allocation error\r\n");
302 goto finally;
303 }
304
305 // 検出インスタンス数の取得
306 {
307 DOUBLE maxs[1] = {0};
308 DOUBLE mins[1] = {0};
309 ret = fnFIE_img_minmaxdens(hdst_inst, mins, maxs);
310 if (F_ERR_NONE != ret) { goto finally; }
311 instance_num = (INT)maxs[0];
312 }
313
314 // 各カテゴリのマスク画像の確保 ( 元画像・結果画像と同じサイズで画像型は BIN、チャネル数は 1 )
315 hmask = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
316 if (NULL == hmask) {
317 ret = F_ERR_NOMEMORY;
318 printf_s("hmask allocation error\r\n");
319 goto finally;
320 }
321
322 // カテゴリ基準でマスクを取得する場合
323 {
324 DOUBLE maxs[1] = {0};
325 DOUBLE mins[1] = {0};
326
327 hdst_cate_tmp = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
328 if (NULL == hdst_cate_tmp) {
329 ret = F_ERR_NOMEMORY;
330 printf_s("hdst_cate_tmp allocation error\r\n");
331 goto finally;
332 }
333 hdst_inst_tmp = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
334 if (NULL == hdst_inst_tmp) {
335 ret = F_ERR_NOMEMORY;
336 printf_s("hdst_inst_tmp allocation error\r\n");
337 goto finally;
338 }
339
340 // 全てのカテゴリを走査
341 for (int i_cate = 1; i_cate <= category_num; i_cate++) {
342 // カテゴリ番号に一致するピクセルを取得
343 ret = fnFIE_band_threshold(hdst_cate, hdst_cate_tmp, (DOUBLE)i_cate, (DOUBLE)i_cate);
344 if (F_ERR_NONE != ret) { continue; }
345
346 // 0 クリアして、そのカテゴリ領域のインスタンス画像をマスク転送
347 ret = fnFIE_img_clear(hdst_inst_tmp, 0);
348 if (F_ERR_NONE != ret) { continue; }
349 ret = fnFIE_img_mask(hdst_inst, hdst_cate_tmp, hdst_inst_tmp);
350 if (F_ERR_NONE != ret) { continue; }
351
352 // ここでは単純にインスタンス数を全て走査
353 for (int i_inst = 1; i_inst <= instance_num; i_inst++) {
354 ret = fnFIE_band_threshold(hdst_inst_tmp, hmask, (DOUBLE)i_inst, (DOUBLE)i_inst);
355 if (F_ERR_NONE != ret) { continue; }
356 printf_s("category=%d, instance=%d: hmask written\r\n", i_cate, i_inst);
357
358 // hmask の全面 ( 最大値 ) が 0 であれば、そのインスタンスはそのカテゴリではないのでスキップ ( リージョンに変換して面積で判定しても可 )
359 ret = fnFIE_img_minmaxdens(hmask, mins, maxs);
360 if (F_ERR_NONE != ret) { continue; }
361 if (0 == maxs[0]) { continue; }
362
363 // hmask に対する任意の処理 ( ブロブ特徴量の取得やリージョン特徴量の取得など )
364 //
365 }
366 }
367 }
368
369 // インスタンス基準でマスクを取得する場合
370 {
371 DOUBLE maxs[1] = {0};
372 DOUBLE mins[1] = {0};
373
374 hdst_cate_tmp = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
375 if (NULL == hdst_cate_tmp) {
376 ret = F_ERR_NOMEMORY;
377 printf_s("hcate_tmp allocation error\r\n");
378 goto finally;
379 }
380 // ここではインスタンス番号の領域で直接インスタンスの領域を取得できるの確保不要
381 //hinst_tmp = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
382 //if (NULL == hinst_tmp) { printf_s("hinst_tmp allocation error"); goto finally; }
383
384 // 全てのインスタンスを走査
385 for (int i_inst = 1; i_inst <= instance_num; i_inst++) {
386 // インスタンス番号に一致するピクセルを取得
387 ret = fnFIE_band_threshold(hdst_inst, hmask, (DOUBLE)i_inst, (DOUBLE)i_inst);
388 if (F_ERR_NONE != ret) { continue; }
389
390 // 0 クリアして、そのインスタンス領域のカテゴリ画像をマスク転送 ( 先にインスタンス画像をリージョンに変換してそのリージョン内の濃度値を取得しても可 )
391 ret = fnFIE_img_clear(hdst_cate_tmp, 0);
392 if (F_ERR_NONE != ret) { continue; }
393 ret = fnFIE_img_mask(hdst_cate, hmask, hdst_cate_tmp);
394 if (F_ERR_NONE != ret) { continue; }
395 printf_s("instance=%d: hmask written\r\n", i_inst);
396
397 // maxs[0] でカテゴリ番号を取得
398 ret = fnFIE_img_minmaxdens(hdst_cate_tmp, mins, maxs);
399 if (F_ERR_NONE != ret) { continue; }
400 if (0 == maxs[0]) { continue; }// カテゴリ番号が 0 のときは背景
401 if (category_num < maxs[0]) { continue; }// カテゴリ番号が与えられたカテゴリ数よりも大きいのは不合理
402
403 // hmask に対する任意の処理 ( ブロブ特徴量の取得やリージョン特徴量の取得など )
404 //
405 }
406 }
407 printf_s("\r\n");
408
409finally:
410 // ハンドルの破棄
411 fnPDL_dispose(hmodel);
412
413 //------- ここまで -------//
414
415 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
416 if (NULL != hdst) { fnFIE_free_object(hdst); }
417 if (NULL != hdst_cate) { fnFIE_free_object(hdst_cate); }
418 if (NULL != hdst_inst) { fnFIE_free_object(hdst_inst); }
419 if (NULL != hdst_cate_tmp) { fnFIE_free_object(hdst_cate_tmp); }
420 if (NULL != hdst_inst_tmp) { fnFIE_free_object(hdst_inst_tmp); }
421 if (NULL != hmask) { fnFIE_free_object(hmask); }
422
423 // 終了処理
424 fnFIE_teardown();
425
426 return ret;
427}
428
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
VOID FVALGAPI fnPDL_dispose(H_MODEL hmodel)
モデルハンドルの解放
Definition: prediction_cpp.cpp:2556
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:2146
INT FVALGAPI fnPDL_load_model(const CHAR *filename, H_MODEL hmodel)
モデルの読み込み
Definition: prediction_cpp.cpp:1810
INT FVALGAPI fnPDL_predict_segmentation(const H_MODEL hmodel, const FHANDLE hsrc, FHANDLE hdst)
推論の実行 ( セグメンテーション )
Definition: prediction_cpp.cpp:2347
VOID * H_MODEL
モデルハンドル
Definition: fv_pdl.h:18
H_MODEL *FVALGAPI fnPDL_create_handle()
モデルハンドルの生成
Definition: prediction_cpp.cpp:1755
@ PANOPTIC_SEGMENTATION
Definition: fv_pdl.h:60

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.