WIL-PDL Reference ( C++ ) 1.0.4
サンプルコード ( ユーティリティ関数 )

ユーティリティ関数のサンプルコードです

  • CPU 推論でデバイスを切り替える関数のサンプルコード: L.5- smp_save_optimized_model()
  • モデル読み込み時間短縮のために動作環境に最適化されたモデルを保存する関数のサンプルコード: L.138- smp_change_cpu_device
1#pragma once
2#include "samples.h"
3#include "oal_aloc.h"
4
5int smp_change_cpu_device(const char* model_name, const char* img_name)
6{
7 INT ret = F_ERR_NONE;
8 FHANDLE hsrc = NULL;
9 H_MODEL hmodel = NULL;
10 MODEL_CATEGORY model_category;
11
12 // 対象デバイスの配列
13 INT n_target_device = 2;
14 OV_DEVICE* target_devices = (OV_DEVICE*)fnOAL_calloc(sizeof(OV_DEVICE), n_target_device);
15 target_devices[0] = OV_DEVICE_CPU;
16 target_devices[1] = OV_DEVICE_GPU;
17
18 // FIEライブラリの使用前に必ずコールする必要があります。
19 fnFIE_setup();
20
21 // 画像読込
22 ret = fnFIE_load_img_file(img_name, &hsrc, F_COLOR_IMG_TYPE_UC8);
23 printf_s("img: %d\r\n", ret);
24 if (F_ERR_NONE != ret) { goto finally; }
25
26 // ライセンスチェック
27 ret = fnPDL_check_license();
28 printf_s("lic : %d\r\n", ret);
29
30 // ハンドルの生成
31 hmodel = fnPDL_create_handle();
32 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); }
33 else { printf_s("handle created\r\n"); }
34
35 // CPU 推論
36 for(auto i_device=0; i_device<n_target_device; i_device++)
37 {
38 OV_DEVICE device = target_devices[i_device];
39 std::chrono::system_clock::time_point start, end;
40 double elapsed;
41
42 // デバイスの選択
43 printf_s("set device=%s", device);
44 ret = fnPDL_set_cpu_device(hmodel, device);
45 if (F_ERR_NONE != ret) { printf_s("device set error=%d\r\n", ret); goto finally; }
46
47 // モデル読込
48 ret = fnPDL_load_model(model_name, hmodel);
49 if (F_ERR_NONE != ret) { printf_s("load error=%d\r\n", ret); goto finally; }
50
51 // モデルの種別の確認
52 ret = fnPDL_get_model_category(hmodel, &model_category);
53 printf_s("par : %d category=%d\r\n", ret, model_category);
54
55 // モデルの種別に応じて推論関数、出力データを分岐
56 switch (model_category)
57 {
58 case UNKNOWN:
59 break;
60 case CLASSIFICATION:
62 {
63 FLOAT* scores = NULL;
64 size_t n_scores;
65
66 // 開始時刻
67 start = std::chrono::system_clock::now();
68
69 // 推論実行
70 ret = fnPDL_predict(hmodel, hsrc, &scores, &n_scores);
71
72 // 完了時刻
73 end = std::chrono::system_clock::now();
74
75 if (NULL != scores) { fnOAL_free(scores); }
76 break;
77 }
78 case MULTI_VIEW_CNN:
79 case MULTI_VIEW_AD:
80 {
81 INT n_views = 0;
82 FHANDLE *hsrcs = NULL;
83 FLOAT* scores = NULL;
84 size_t n_scores;
85
86 // 視点数を取得して入力画像配列を作成
87 ret = fnPDL_get_how_many_views(hmodel, &n_views);
88 if (F_ERR_NONE != ret) { printf_s("get how many view error=%d\r\n", ret); goto finally; }
89 hsrcs = (FHANDLE*)fnOAL_calloc(sizeof(FHANDLE), n_views);
90 for (auto i_view = 0; i_view < n_views; i_view++) { hsrcs[i_view] = hsrc; }
91
92 // 開始時刻
93 start = std::chrono::system_clock::now();
94
95 // 推論実行
96 ret = fnPDL_predict_multi_images(hmodel, n_views, hsrcs, &scores, &n_scores);
97
98 // 完了時刻
99 end = std::chrono::system_clock::now();
100
101 if (NULL != hsrcs) { fnOAL_free(hsrcs); }
102 if (NULL != scores) { fnOAL_free(scores); }
103 break;
104 }
106 {
107 FHANDLE hdst = fnFIE_img_root_alloc(F_IMG_US16, 1, fnFIE_img_get_width(hsrc), fnFIE_img_get_height(hsrc));
108
109 // 開始時刻
110 start = std::chrono::system_clock::now();
111
112 // 推論実行
113 ret = fnPDL_predict_segmentation(hmodel, hsrc, hdst);
114
115 // 完了時刻
116 end = std::chrono::system_clock::now();
117
118 if (NULL != hdst) { fnFIE_free_object(hdst); }
119 break;
120 }
121 default:
122 break;
123 }
124
125 // 推論時間をコンソールに出力
126 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
127 printf_s("%.3e [msec]\r\n", elapsed);
128 }
129
130finally: // 終了処理
131 fnPDL_dispose(hmodel);
132 if (NULL != hsrc) { fnFIE_free_object(hsrc); }
133 fnFIE_teardown();
134
135 return ret;
136}
137
138int smp_save_optimized_model(const char* original_model_name, const char* save_model_name)
139{
140 INT ret = F_ERR_NONE;
141 H_MODEL hmodel = NULL;
142
143 // FIEライブラリの使用前に必ずコールする必要があります。
144 fnFIE_setup();
145
146 // WIL-PDL のライセンスチェック
147 ret = fnPDL_check_license();
148 printf_s("lic : %d\r\n", ret);
149
150 //------- ここから -------//
151
152 // ハンドルの生成
153 hmodel = fnPDL_create_handle();
154 if (NULL == hmodel) { printf_s("failed to create handle\r\n"); goto finally; }
155 else { printf_s("handle created\r\n"); }
156
157 // FV-AID で変換した元となるモデルの読み込み: この処理には時間が掛かります
158 {
159 std::chrono::system_clock::time_point start, end;
160 double elapsed;
161
162 // 開始時刻
163 start = std::chrono::system_clock::now();
164
165 // モデル読み込み
166 ret = fnPDL_load_model(original_model_name, hmodel);
167
168 // 完了時刻
169 end = std::chrono::system_clock::now();
170
171 // 読み込みに掛かった時間 [msec]
172 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
173
174 // コンソールに出力
175 printf_s("load time ( original ) = %.3e msec ( return code = %d )\r\n", elapsed, ret);
176 if (F_ERR_NONE != ret) { goto finally; }
177 }
178
179 // モデルを読み込んだ環境に最適化されたモデルの保存: CPU 推論のときには何も行いません
180 ret = fnPDL_save_optimized_model(save_model_name, hmodel);
181 if (F_ERR_NONE != ret) { printf_s("error = %d\r\n", ret); goto finally; }
182
183 // 最適化されたモデルの読み込み: 元となるモデルと比較して読み込み時間が短縮されます
184 {
185 std::chrono::system_clock::time_point start, end;
186 double elapsed;
187
188 // 開始時刻
189 start = std::chrono::system_clock::now();
190
191 // モデル読み込み
192 ret = fnPDL_load_model(save_model_name, hmodel);
193
194 // 完了時刻
195 end = std::chrono::system_clock::now();
196
197 // 読み込みに掛かった時間 [msec]
198 elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / (double)1000;
199
200 // コンソールに出力
201 printf_s("load time ( original ) = %.3e msec ( return code = %d )\r\n", elapsed, ret);
202 if (F_ERR_NONE != ret) { goto finally; }
203 }
204
205 finally:
206 if (NULL != hmodel) { fnPDL_dispose(hmodel); }
207}
OV_DEVICE
CPU 推論のデバイス種別
Definition: fv_pdl.h:71
MODEL_CATEGORY
モデルの種別
Definition: fv_pdl.h:46
INT fnPDL_check_license()
ライセンス確認
Definition: check_licence.cpp:158
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_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
INT FVALGAPI fnPDL_set_cpu_device(H_MODEL hmodel, OV_DEVICE cpu_device)
CPU 推論デバイスの設定
Definition: prediction_cpp.cpp:1474
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
INT FVALGAPI fnPDL_save_optimized_model(const CHAR *filename, H_MODEL hmodel)
動作環境に最適化されたモデルの保存
Definition: prediction_cpp.cpp:1534
H_MODEL *FVALGAPI fnPDL_create_handle()
モデルハンドルの生成
Definition: prediction_cpp.cpp:1446
@ OV_DEVICE_CPU
Definition: fv_pdl.h:73
@ OV_DEVICE_GPU
Definition: fv_pdl.h:75
@ MULTI_VIEW_AD
Definition: fv_pdl.h:56
@ UNKNOWN
Definition: fv_pdl.h:48
@ SEMANTIC_SEGMENTATION
Definition: fv_pdl.h:58
@ CLASSIFICATION
Definition: fv_pdl.h:50
@ ANOMALY_DETECTION
Definition: fv_pdl.h:52
@ 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 by Doxygen 1.9.5.