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

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

  • 最も単純なサンプルコード: L.5- smp_semseg_simple()
  • ベンチマークを計測するサンプルコード: L.87: smp_semseg_benchmark()
  • 推論結果画像から FIE の関数を使用して各カテゴリのマスク画像 ( 二値画像 ) を取得するサンプルコード: L.168: smp_semseg_with_fie()
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4
5int smp_semseg_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 // セグメンテーション結果画像の確保 ( セマンティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 1 )
51 hdst = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
52 if (NULL == hdst) { printf_s("hdst allocation error"); }
53
54 // 推論実行
55 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
56 printf_s("pred: %d\r\n", ret);
57 if (F_ERR_NONE == ret) {
58 // 各ピクセルにカテゴリ番号が格納されているので、その最大値を取得
59 DOUBLE* maxs = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 1);
60 DOUBLE* mins = (DOUBLE*)fnOAL_calloc(sizeof(DOUBLE), 1);
61 INT max_cate_id = 0;
62
63 // 画像全体のリージョンに対して fnFIE_img_maxpixel() を使用することも可
64 ret = fnFIE_img_minmaxdens(hdst,mins, maxs);
65 max_cate_id = (INT)maxs[0];
66 // 最大値が 0 となるのは、全てのピクセルが背景と判定されたとき
67 if (0 == max_cate_id) { printf_s("all pixels are background"); }
68 // 1 以上となるのは、いずれかのカテゴリと判定されたピクセルが存在するとき ( 元が US16 なので負の値になることは無い )
69 else { printf_s("there are some masks, largest category id = %d\r\n", max_cate_id); }
70 if (NULL != maxs) { fnOAL_free(maxs); }
71 if (NULL != mins) { fnOAL_free(mins); }
72 }
73
74 // ハンドルの破棄
75 fnPDL_dispose(hmodel);
76
77 //------- ここまで -------//
78
79 // 終了処理
80 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
81 if (NULL != hdst) { fnFIE_free_object(hdst); }
82 fnFIE_teardown();
83
84 return ret;
85}
86
87int smp_semseg_benchmark(const char* model_name, const char* img_name, const int bench_iter)
88{
89 // benchmark 用
90 std::chrono::system_clock::time_point start, end;
91
92 INT ret = F_ERR_NONE;
93 FHANDLE hsrc = NULL;
94 FHANDLE hdst = NULL;
95 H_MODEL hmodel = NULL;
96 MODEL_CATEGORY model_category;
97
98 // FIEライブラリの使用前に必ずコールする必要があります。
99 fnFIE_setup();
100
101 // 画像読込
102 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
103 printf_s("img: %d\r\n", ret);
104 if (F_ERR_NONE != ret) { goto finally; }
105
106 // ライセンスチェック
107 ret = fnPDL_check_license();
108 printf_s("lic : %d\r\n", ret);
109
110 // ハンドルの生成
111 hmodel = fnPDL_create_handle();
112 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
113 else { printf_s("handle created\r\n"); }
114
115 // モデル読込
116 ret = fnPDL_load_model(model_name, hmodel);
117 printf_s("load: %d\r\n", ret);
118
119 // モデルの種別の確認
120 ret = fnPDL_get_model_category(hmodel, &model_category);
121 printf_s("par : %d category=%d\r\n", ret, model_category);
122 if (SEMANTIC_SEGMENTATION != model_category) { printf_s("unmatch model"); }
123
124 // セグメンテーション結果画像の確保 ( セマンティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 1 )
125 hdst = fnFIE_img_root_alloc(F_IMG_US16, 1, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc));
126 if (NULL == hdst) { printf_s("hdst allocation error"); }
127
128 printf_s("--- start ---\r\n");
129 printf_s("ret, elapsed[msec], scores\r\n");
130 // 本体ループ
131 for (int i = 0; i < bench_iter; i++) {
132 double elapsed;
133
134 // 開始時刻
135 start = std::chrono::system_clock::now();
136
137 // 推論実行
138 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
139
140 // 完了時刻
141 end = std::chrono::system_clock::now();
142
143 if (F_ERR_NONE != ret) {
144 printf_s("pred. err: %d\r\n", ret);
145 goto finally;
146 }
147
148 // 推論時間 [msec]
149 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
150
151 // コンソールに出力
152 printf_s("%04d, %.3e\r\n", i, elapsed);
153 }
154 printf_s("--- finish ---\r\n");
155
156 // ハンドルの破棄
157 fnPDL_dispose(hmodel);
158
159 finally:
160 // 終了処理
161 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
162 if (NULL != hdst) { fnFIE_free_object(hdst); }
163 fnFIE_teardown();
164
165 return ret;
166}
167
168int smp_semseg_with_fie(const char* model_name, const char* img_name, const INT category_num)
169{
170 INT ret = F_ERR_NONE;
171 FHANDLE hsrc = NULL;
172 FHANDLE hdst = NULL;
173 FHANDLE hmask = NULL;
174 H_MODEL hmodel = NULL;
175 MODEL_CATEGORY model_category;
176
177 INT ch, w, h, type;
178 INT_PTR step;
179
180 // FIEライブラリの使用前に必ずコールする必要があります。
181 fnFIE_setup();
182
183 // 画像読込
184 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
185 printf_s("img: %d\r\n", ret);
186
187 //------- ここから -------//
188
189 // ライセンスチェック
190 ret = fnPDL_check_license();
191 printf_s("lic : %d\r\n", ret);
192
193 // ハンドルの生成
194 hmodel = fnPDL_create_handle();
195 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); goto finally; }
196 else { printf_s("handle created\r\n"); }
197
198 // モデル読込
199 ret = fnPDL_load_model(model_name, hmodel);
200 printf_s("load: %d\r\n", ret);
201 if (F_ERR_NONE != ret) { goto finally; }
202
203 // モデルの種別の確認
204 ret = fnPDL_get_model_category(hmodel, &model_category);
205 printf_s("par : %d category=%d\r\n", ret, model_category);
206 if (SEMANTIC_SEGMENTATION != model_category) { printf_s("unmatch model"); goto finally; }
207
208 // セグメンテーション結果画像の確保 ( セマンティックセグメンテーションでは、元画像と同じサイズで画像型は US16、チャネル数は 1 )
209 hdst = fnFIE_img_root_alloc(F_IMG_US16, 1, w, h);
210 if (NULL == hdst) { printf_s("hdst allocation error"); goto finally; }
211
212 // 推論実行
213 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
214 printf_s("pred(original): %d\r\n", ret);
215 if (F_ERR_NONE != ret) { goto finally; }
216
217 // 各カテゴリのマスク画像の確保 ( 元画像・結果画像と同じサイズで画像型は BIN、チャネル数は 1 )
218 hmask = fnFIE_img_root_alloc(F_IMG_BIN, 1, w, h);
219 if (NULL == hmask) { printf_s("hmask allocation error"); goto finally; }
220
221 // 結果画像から各カテゴリのマスク画像を取得 ( カテゴリ番号は 1 始まり )
222 for (int i_cate = 1; i_cate <= category_num; i_cate++) {
223 // カテゴリ番号に一致するピクセルを取得することで、そのカテゴリのマスク画像を取得することが可能です
224 ret = fnFIE_band_threshold(hdst, hmask, (DOUBLE)i_cate, (DOUBLE)i_cate);
225 if (F_ERR_NONE != ret) { continue; }
226
227 // hmask に対して、ブローブ解析やリージョンへの変換などの後処理を行うことが可能です
228 }
229
230 finally:
231 // ハンドルの破棄
232 fnPDL_dispose(hmodel);
233
234 //------- ここまで -------//
235
236 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
237 if (NULL != hdst) { fnFIE_free_object(hdst); }
238 if (NULL != hmask) { fnFIE_free_object(hmask); }
239
240 // 終了処理
241 fnFIE_teardown();
242
243 return ret;
244}
245
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_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.