WIL-PDL Reference ( .NET Framework ) 1.0.6
最も単純なサンプルコード

ファイルからモデルを読み込み、推論を実行する最も単純なサンプルコードです。


C# 版

  • 画像分類の場合: L.14- SimpleSample()
  • アノマリー検出の場合: L.14- SimpleSample()
  • 多視点画像分類の場合: L.110- SimpleSampleMultiView()
  • 多視点アノマリー検出の場合: L.110- SimpleSampleMultiView()
  • セマンティックセグメンテーションの場合: L.192- SimpleSampleSegmentation()
  • パノプティックセグメンテーションの場合: L.192- SimpleSampleSegmentation()
  • 物体検出の場合: L.284- SimpleSampleObjectDetection()
  • マルチラベル画像分類の場合: L.14- SimpleSample()
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using FVIL;
7using FVIL.Data;
8using FVIL.PDL;
9
10namespace SamplesCS
11{
12 partial class Program
13 {
14 static void SimpleSample(String modelPath, String imagePath)
15 {
16 try
17 {
18 var has_license = Model.CheckLicense();
19 if (false == has_license) { throw new Exception("no license"); }
20
21 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
22 Model model = new Model(modelPath);
23
24 // 推論対象画像の読込
25 CFviImage image = new CFviImage(imagePath);
26
27 // モデルの推論バックエンドの確認
28 Console.WriteLine($"backend: {model.ModelBackend}");
29
30 // 推論対象画像の有効性確認
31 var is_valid_img = model.IsValidImage(image);
32 if (false == is_valid_img) { throw new Exception("invalid image"); }
33
34 switch (model.ModelCategory)
35 {
36 case ModelCategory.Classification:// 画像分類
37 {
38 // 推論実行
39 var scores = model.PredictClassification(image);
40
41 // スコアをコンソール出力
42 for (var i_score = 0; i_score < scores.Length; i_score++)
43 {
44 Console.WriteLine($"label{i_score}: {scores[i_score]}");
45 }
46
47 // 推論実行 ( 最大スコアのみを取得 )
48 var top_score_pair = model.PredictClassification(image, ref scores);
49 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}");
50 }
51 break;
52 case ModelCategory.AnomalyDetection:// アノマリー検出
53 {
54 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
55 var threshold = 10.0;
56 var tuple = model.PredictAnomaly(image, (float)threshold);
57
58 // タプルで受け取った結果をアンパック
59 var is_anomaly = tuple.Item1;
60 var max_anomaly = tuple.Item2;
61
62 // コンソール出力
63 var str_is_anomaly = is_anomaly ? "anomaly" : "normal";
64 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}");
65 }
66 break;
67 case ModelCategory.MultiLabelClassification:// マルチラベル画像分類
68 {
69 // 推論実行
70 var scores = model.PredictMultiLabelClassification(image);
71
72 // スコアをコンソール出力
73 for (var i_score = 0; i_score< scores.Length; i_score++)
74 {
75 Console.WriteLine($"label{i_score}: {scores[i_score]}");
76 }
77
78 // 推論実行 ( スコア閾値を満たすラベルのインデックスとそのスコアの取得 )
79 float score_threshold = 0.5f;// 省略可能、省略されたときは 0.5f で実行される
80 var dict = model.PredictMultiLabelClassification(image, ref scores, score_threshold);
81
82 // スコア閾値を満たしたものだけをコンソール出力
83 foreach(var kv in dict)
84 {
85 Console.WriteLine($"label{kv.Key}: {kv.Value}");
86 }
87 }
88 break;
89 case ModelCategory.MultiViewCNN:
90 case ModelCategory.MultiViewAD:
91 case ModelCategory.SemanticSegmentation:
92 case ModelCategory.PanopticSegmentation:
93 case ModelCategory.ObjectDetection:
94 case ModelCategory.Unknown:
95 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
96 }
97 }
98 catch (CFviException ex)
99 {
100 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
101 Console.WriteLine(ex.StackTrace);
102 }
103 catch (Exception ex)
104 {
105 Console.WriteLine($"Message={ex.Message}");
106 Console.WriteLine(ex.StackTrace);
107 }
108 }
109
110 static void SimpleSampleMultiView(String modelPath, String imageFolder)
111 {
112 try
113 {
114 var has_license = Model.CheckLicense();
115 if (false == has_license) { throw new Exception("no license"); }
116
117 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
118 Model model = new Model(modelPath);
119
120 // モデルの推論バックエンドの確認
121 Console.WriteLine($"backend: {model.ModelBackend}");
122
123 // 推論対象画像の読込と有効性の確認
124 List<CFviImage> target_images = new List<CFviImage>();
125 for (var i_img = 0; i_img < model.NumViews; i_img++)
126 {
127 // imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
128 var img_path = System.IO.Path.Combine(imageFolder, String.Format("{0}.bmp", i_img));
129 var image = new CFviImage(img_path);
130
131 // 推論対象画像の有効性確認
132 var is_valid_img = model.IsValidImage(image);
133 if (false == is_valid_img) { throw new Exception("invalid image"); }
134
135 // 推論対象画像のリストに追加
136 target_images.Add(image);
137 }
138
139 // モデル種別のエラーチェック
140 switch (model.ModelCategory)
141 {
142 case ModelCategory.MultiViewCNN:// 多視点画像分類
143 {
144 // 推論実行
145 var scores = model.PredictMultiViewCNN(target_images);
146 // スコアをコンソール出力
147 for (var i_score = 0; i_score < scores.Length; i_score++)
148 {
149 Console.WriteLine($"label{i_score}: {scores[i_score]}");
150 }
151
152 // 推論実行 ( 最大スコアのみを取得 )
153 var top_score_pair = model.PredictMultiViewCNN(target_images, ref scores);
154 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}");
155 }
156 break;
157 case ModelCategory.MultiViewAD:// 多視点アノマリー検出
158 {
159 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
160 var threshold = 10.0;
161 var tuple = model.PredictMultiViewAD(target_images, (float)threshold);
162
163 // タプルで受け取った結果をアンパック
164 var is_anomaly = tuple.Item1;
165 var max_anomaly = tuple.Item2;
166
167 // コンソール出力
168 var str_is_anomaly = is_anomaly ? "anomaly" : "normal";
169 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}");
170 }
171 break;
172 case ModelCategory.Classification:
173 case ModelCategory.AnomalyDetection:
174 case ModelCategory.SemanticSegmentation:
175 case ModelCategory.PanopticSegmentation:
176 case ModelCategory.Unknown:
177 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
178 }
179 }
180 catch (CFviException ex)
181 {
182 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
183 Console.WriteLine(ex.StackTrace);
184 }
185 catch (Exception ex)
186 {
187 Console.WriteLine($"Message={ex.Message}");
188 Console.WriteLine(ex.StackTrace);
189 }
190 }
191
192 static void SimpleSampleSegmentation(String modelPath, String imagePath)
193 {
194 try
195 {
196 var has_license = Model.CheckLicense();
197 if (false == has_license) { throw new Exception("no license"); }
198
199 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
200 Model model = new Model(modelPath);
201
202 // 推論対象画像の読込
203 CFviImage image = new CFviImage(imagePath);
204
205 // モデルの推論バックエンドの確認
206 Console.WriteLine($"backend: {model.ModelBackend}");
207
208 // 推論対象画像の有効性確認
209 var is_valid_img = model.IsValidImage(image);
210 if (false == is_valid_img) { throw new Exception("invalid image"); }
211
212 switch (model.ModelCategory)
213 {
214 case ModelCategory.SemanticSegmentation:// セマンティックセグメンテーション
215 {
216 // 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
217 var category_masks = new Dictionary<UInt32, CFviImage>();
218 category_masks.Add(1, new CFviImage(image.HorzSize, image.VertSize, ImageType.BIN, 1));// 0 は背景なので、1 が最初のカテゴリ ( ラベル )
219 category_masks.Add(2, new CFviImage());// ペアとなる値には画像サイズやチャネル数、型の異なる画像を入力することが可能 ( 内部で自動調整されるため )
220 category_masks.Add(5, new CFviImage());// 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
221
222 // 推論実行
223 var segm_result_image = model.PredictSemanticSegmentation(image, category_masks);
224 //var segm_result_image = model.PredictSemanticSegmentation(image);
225
226 // ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
227 foreach (var kv in category_masks)
228 {
229 var category_id = kv.Key;
230 var category_image = kv.Value;
231 var region = new CFviRegion(category_image);
232 Console.WriteLine($"No.{category_id}: area={region.Area}");
233 }
234 }
235 break;
236 case ModelCategory.PanopticSegmentation:
237 {
238 // パノプティックセグメンテーション固有の検出パラメータの設定 ( ここではデフォルト値と同じ値を設定 )
239 model.SetPanopticSegmentationParams(1024, 0.1, 32, 0);
240
241 // 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
242 var category_masks = new Dictionary<UInt32, List<CFviImage>>();
243 category_masks.Add(1, new List<CFviImage>());// 0 は背景なので、1 が最初のカテゴリ ( ラベル )
244 category_masks.Add(2, new List<CFviImage>() { new CFviImage() });// ペアとなる値のリストには既に画像が存在しているリストを入力することも可能 ( 内部でリストはクリアされるため )
245 category_masks.Add(5, new List<CFviImage>());// 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
246
247 // 推論実行
248 var segm_result_image = model.PredictPanopticSegmentation(image, category_masks);
249 //var segm_result_image = model.PredictPanopticSegmentation(image);
250
251 // ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
252 foreach (var kv in category_masks)
253 {
254 var category_id = kv.Key;
255 var mask_images = kv.Value;
256 for(var i=0;i<mask_images.Count; i++)
257 {
258 var region = new CFviRegion(mask_images[i]);
259 Console.WriteLine($"category={category_id}: no.={i}, area={region.Area}");
260 }
261 }
262 }
263 break;
264 case ModelCategory.Classification:
265 case ModelCategory.AnomalyDetection:
266 case ModelCategory.MultiViewCNN:
267 case ModelCategory.MultiViewAD:
268 case ModelCategory.Unknown:
269 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
270 }
271 }
272 catch (CFviException ex)
273 {
274 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
275 Console.WriteLine(ex.StackTrace);
276 }
277 catch (Exception ex)
278 {
279 Console.WriteLine($"Message={ex.Message}");
280 Console.WriteLine(ex.StackTrace);
281 }
282 }
283
284 static void SimpleSampleObjectDetection(String modelPath, String imagePath)
285 {
286 try
287 {
288 var has_license = Model.CheckLicense();
289 if (false == has_license) { throw new Exception("no license"); }
290
291 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
292 Model model = new Model(modelPath);
293
294 // 推論対象画像の読込
295 CFviImage image = new CFviImage(imagePath);
296
297 // モデルの推論バックエンドの確認
298 Console.WriteLine($"backend: {model.ModelBackend}");
299
300 // 推論対象画像の有効性確認
301 var is_valid_img = model.IsValidImage(image);
302 if (false == is_valid_img) { throw new Exception("invalid image"); }
303
304 switch (model.ModelCategory)
305 {
306 case ModelCategory.ObjectDetection:// 物体検出
307 {
308 // 推論実行
309 var detections = model.PredictObjectDetection(image);
310
311 // 検出結果をコンソール出力
312 foreach (ObjectDetectionData detection in detections)
313 {
314 CFviRectangle box = detection.Box;
315 Console.WriteLine($"ClassId: {detection.ClassId}, Score: {detection.Score:0.000}, " +
316 $"Box: (({box.Left:0.0},{box.Top:0.0}),({box.Right:0.0},{box.Bottom:0.0}))");
317 }
318 }
319 break;
320 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
321 }
322 }
323 catch (CFviException ex)
324 {
325 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
326 Console.WriteLine(ex.StackTrace);
327 }
328 catch (Exception ex)
329 {
330 Console.WriteLine($"Message={ex.Message}");
331 Console.WriteLine(ex.StackTrace);
332 }
333 }
334 }
335}
推論するモデルを扱うクラス
Definition: PredictionCS.cs:250
ModelCategory ModelCategory
読み込んだモデルの種別
Definition: PredictionCS.cs:271
float[] PredictClassification(CFviImage targetImage)
推論の実行(画像分類)
Definition: PredictionCS.cs:992
Boolean IsValidImage(CFviImage targetImage)
推論画像の有効性の確認
Definition: PredictionCS.cs:675
static Boolean CheckLicense()
ライセンスを確認します。
Definition: PredictionCS.cs:425
IEnumerable< ObjectDetectionData > PredictObjectDetection(CFviImage targetImage)
推論の実行(物体検出)
Definition: PredictionCS.cs:1729
CFviImage PredictSemanticSegmentation(CFviImage targetImage)
推論の実行(セマンティックセグメンテーション)
Definition: PredictionCS.cs:1440
Tuple< Boolean, float > PredictMultiViewAD(IEnumerable< CFviImage > targetImages, float threshold)
推論の実行(多視点アノマリー検出)
Definition: PredictionCS.cs:1305
float[] PredictMultiLabelClassification(CFviImage targetImage)
推論の実行(マルチラベル画像分類)
Definition: PredictionCS.cs:1760
Int32 NumViews
読み込んだモデルが期待する視点数
Definition: PredictionCS.cs:314
void SetPanopticSegmentationParams(UInt32 stuffArea=1024, Double threshold=0.1, Int32 nmsKernel=31, UInt16 requestInstanceNum=0)
パノプティックセグメンテーションの検出パラメータの設定
Definition: PredictionCS.cs:752
Tuple< Boolean, float > PredictAnomaly(CFviImage targetImage, float threshold)
推論の実行(アノマリー検出)
Definition: PredictionCS.cs:1083
CFviImage PredictPanopticSegmentation(CFviImage targetImage)
推論の実行(パノプティックセグメンテーション)
Definition: PredictionCS.cs:1540
float[] PredictMultiViewCNN(IEnumerable< CFviImage > targetImages)
推論の実行(MVCNN)
Definition: PredictionCS.cs:1213
物体検出結果データ構造クラス
Definition: PredictionCS.cs:106
FVIL.Data.CFviRectangle Box
物体の位置を表すバウンディングボックス
Definition: PredictionCS.cs:120
WIL-PDL モジュールの名前空間
Definition: PredictionCS.cs:21
ModelCategory
モデルの種別
Definition: PredictionCS.cs:32
FVILの最上位ネームスペース
Definition: PredictionCS.cs:16

VB 版

  • 画像分類の場合: L.9- SimpleSample()
  • アノマリー検出の場合: L.9- SimpleSample()
  • 多視点画像分類の場合: L.87- SimpleSampleMultiView()
  • 多視点アノマリー検出の場合: L.87- SimpleSampleMultiView()
  • セマンティックセグメンテーションの場合: L.154- SimpleSampleSegmentation()
  • パノプティックセグメンテーションの場合: L.154- SimpleSampleSegmentation()
  • 物体検出の場合: L.233- SimpleSampleObjectDetection()
  • マルチラベル画像分類の場合: L.9- SimpleSample()
1Imports System
2Imports System.Collections.Generic
3Imports System.IO
4Imports FVIL
5Imports FVIL.Data
6Imports FVIL.PDL
7
8Namespace SamplesCS
9 Partial Class Program
10 Private Shared Sub SimpleSample(modelPath As String, imagePath As String)
11 Try
12 Dim has_license = PDL.Model.CheckLicense()
13 If False = has_license Then
14 Throw New Exception("no license")
15 End If
16
17 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
18 Dim model As Model = New Model(modelPath)
19
20 ' 推論対象画像の読込
21 Dim image As CFviImage = New CFviImage(imagePath)
22
23 ' モデルの推論バックエンドの確認
24 Console.WriteLine($"backend: {model.ModelBackend}")
25
26 ' 推論対象画像の有効性確認
27 Dim is_valid_img = model.IsValidImage(image)
28 If False = is_valid_img Then
29 Throw New Exception("invalid image")
30 End If
31
32 Select Case model.ModelCategory
33 Case ModelCategory.Classification ' 画像分類
34 ' 推論実行
35 Dim scores = model.PredictClassification(image)
36
37 ' スコアをコンソール出力
38 For i_score = 0 To scores.Length - 1
39 Console.WriteLine($"label{i_score}: {scores(i_score)}")
40 Next
41
42 ' 推論実行 ( 最大スコアのみを取得 )
43 Dim top_score_pair = model.PredictClassification(image, scores)
44 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}")
45 Case ModelCategory.AnomalyDetection ' アノマリー検出
46 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
47 Dim threshold = 10.0
48 Dim tuple = model.PredictAnomaly(image, threshold)
49
50 ' タプルで受け取った結果をアンパック
51 Dim is_anomaly = tuple.Item1
52 Dim max_anomaly = tuple.Item2
53
54 ' コンソール出力
55 Dim str_is_anomaly = If(is_anomaly, "anomaly", "normal")
56 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}")
57 Case ModelCategory.MultiLabelClassification ' マルチラベル画像分類
58 ' 推論実行
59 Dim scores = model.PredictMultiLabelClassification(image)
60
61 ' スコアをコンソール出力
62 For i_score = 0 To scores.Length - 1
63 Console.WriteLine($"label{i_score}: {scores(i_score)}")
64 Next
65
66 ' 推論実行 ( スコア閾値を満たすラベルのインデックスとそのスコアの取得 )
67 Dim score_threshold = 0.5F ' 省略可能、省略されたときは 0.5f で実行される
68 Dim dict = model.PredictMultiLabelClassification(image, scores, score_threshold)
69
70 ' スコア閾値を満たしたものだけをコンソール出力
71 For Each kv In dict
72 Console.WriteLine($"label{kv.Key}: {kv.Value}")
73 Next
74
75 Case Else
76 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
77 End Select
78 Catch ex As CFviException
79 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
80 Console.WriteLine(ex.StackTrace)
81 Catch ex As Exception
82 Console.WriteLine($"Message={ex.Message}")
83 Console.WriteLine(ex.StackTrace)
84 End Try
85 End Sub
86
87 Private Shared Sub SimpleSampleMultiView(modelPath As String, imageFolder As String)
88 Try
89 Dim has_license = PDL.Model.CheckLicense()
90 If False = has_license Then
91 Throw New Exception("no license")
92 End If
93
94 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
95 Dim model As Model = New Model(modelPath)
96
97 ' モデルの推論バックエンドの確認
98 Console.WriteLine($"backend: {model.ModelBackend}")
99
100 ' 推論対象画像の読込と有効性の確認
101 Dim target_images As List(Of CFviImage) = New List(Of CFviImage)()
102 For i_img = 0 To model.NumViews - 1
103 ' imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
104 Dim img_path = Path.Combine(imageFolder, String.Format("{0}.bmp", i_img))
105 Dim image = New CFviImage(img_path)
106
107 ' 推論対象画像の有効性確認
108 Dim is_valid_img = model.IsValidImage(image)
109 If False = is_valid_img Then
110 Throw New Exception("invalid image")
111 End If
112
113 ' 推論対象画像のリストに追加
114 target_images.Add(image)
115 Next
116
117 ' モデル種別のエラーチェック
118 Select Case model.ModelCategory
119 Case ModelCategory.MultiViewCNN ' 多視点画像分類
120 ' 推論実行
121 Dim scores = model.PredictMultiViewCNN(target_images)
122 ' スコアをコンソール出力
123 For i_score = 0 To scores.Length - 1
124 Console.WriteLine($"label{i_score}: {scores(i_score)}")
125 Next
126
127 ' 推論実行 ( 最大スコアのみを取得 )
128 Dim top_score_pair = model.PredictMultiViewCNN(target_images, scores)
129 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}")
130 Case ModelCategory.MultiViewAD ' 多視点アノマリー検出
131 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
132 Dim threshold = 10.0
133 Dim tuple = model.PredictMultiViewAD(target_images, threshold)
134
135 ' タプルで受け取った結果をアンパック
136 Dim is_anomaly = tuple.Item1
137 Dim max_anomaly = tuple.Item2
138
139 ' コンソール出力
140 Dim str_is_anomaly = If(is_anomaly, "anomaly", "normal")
141 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}")
142 Case Else
143 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
144 End Select
145 Catch ex As CFviException
146 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
147 Console.WriteLine(ex.StackTrace)
148 Catch ex As Exception
149 Console.WriteLine($"Message={ex.Message}")
150 Console.WriteLine(ex.StackTrace)
151 End Try
152 End Sub
153
154 Private Shared Sub SimpleSampleSegmentation(modelPath As String, imagePath As String)
155 Try
156 Dim has_license = PDL.Model.CheckLicense()
157 If False = has_license Then
158 Throw New Exception("no license")
159 End If
160
161 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
162 Dim model As Model = New Model(modelPath)
163
164 ' 推論対象画像の読込
165 Dim image As CFviImage = New CFviImage(imagePath)
166
167 ' モデルの推論バックエンドの確認
168 Console.WriteLine($"backend: {model.ModelBackend}")
169
170 ' 推論対象画像の有効性確認
171 Dim is_valid_img = model.IsValidImage(image)
172 If False = is_valid_img Then
173 Throw New Exception("invalid image")
174 End If
175
176 Select Case model.ModelCategory
177 Case ModelCategory.SemanticSegmentation ' セマンティックセグメンテーション
178 ' 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
179 Dim category_masks = New Dictionary(Of UInteger, CFviImage)()
180 category_masks.Add(1, New CFviImage(image.HorzSize, image.VertSize, ImageType.BIN, 1)) ' 0 は背景なので、1 が最初のカテゴリ ( ラベル )
181 category_masks.Add(2, New CFviImage()) ' ペアとなる値には画像サイズやチャネル数、型の異なる画像を入力することが可能 ( 内部で自動調整されるため )
182 category_masks.Add(5, New CFviImage()) ' 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
183
184 ' 推論実行
185 Dim segm_result_image = model.PredictSemanticSegmentation(image, category_masks)
186 'var segm_result_image = model.PredictSemanticSegmentation(image);
187
188 ' ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
189 For Each kv In category_masks
190 Dim category_id = kv.Key
191 Dim category_image = kv.Value
192 Dim region = New CFviRegion(category_image)
193 Console.WriteLine($"No.{category_id}: area={region.Area}")
194 Next
195 Case ModelCategory.PanopticSegmentation
196 ' パノプティックセグメンテーション固有の検出パラメータの設定 ( ここではデフォルト値と同じ値を設定 )
197 model.SetPanopticSegmentationParams(1024, 0.1, 32, 0)
198
199 ' 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
200 Dim category_masks = New Dictionary(Of UInteger, List(Of CFviImage))()
201 category_masks.Add(1, New List(Of CFviImage)()) ' 0 は背景なので、1 が最初のカテゴリ ( ラベル )
202 category_masks.Add(2, New List(Of CFviImage)() From {
203 New CFviImage()
204 }) ' ペアとなる値のリストには既に画像が存在しているリストを入力することも可能 ( 内部でリストはクリアされるため )
205 category_masks.Add(5, New List(Of CFviImage)()) ' 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
206
207 ' 推論実行
208 Dim segm_result_image = model.PredictPanopticSegmentation(image, category_masks)
209 'var segm_result_image = model.PredictPanopticSegmentation(image);
210
211 ' ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
212 For Each kv In category_masks
213 Dim category_id = kv.Key
214 Dim mask_images = kv.Value
215 For i = 0 To mask_images.Count - 1
216 Dim region = New CFviRegion(mask_images(i))
217 Console.WriteLine($"category={category_id}: no.={i}, area={region.Area}")
218 Next
219 Next
220
221 Case Else
222 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
223 End Select
224 Catch ex As CFviException
225 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
226 Console.WriteLine(ex.StackTrace)
227 Catch ex As Exception
228 Console.WriteLine($"Message={ex.Message}")
229 Console.WriteLine(ex.StackTrace)
230 End Try
231 End Sub
232
233 Private Shared Sub SimpleSampleObjectDetection(modelPath As String, imagePath As String)
234 Try
235 Dim has_license = PDL.Model.CheckLicense()
236 If False = has_license Then
237 Throw New Exception("no license")
238 End If
239
240 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
241 Dim model As Model = New Model(modelPath)
242
243 ' 推論対象画像の読込
244 Dim image As CFviImage = New CFviImage(imagePath)
245
246 ' モデルの推論バックエンドの確認
247 Console.WriteLine($"backend: {model.ModelBackend}")
248
249 ' 推論対象画像の有効性確認
250 Dim is_valid_img = model.IsValidImage(image)
251 If False = is_valid_img Then
252 Throw New Exception("invalid image")
253 End If
254
255 Select Case model.ModelCategory
256 Case ModelCategory.ObjectDetection ' 物体検出
257 ' 推論実行
258 Dim detections = model.PredictObjectDetection(image)
259
260 ' 検出結果をコンソール出力
261 For Each detection In detections
262 Dim box = detection.Box
263 Console.WriteLine($"ClassId: {detection.ClassId}, Score: {detection.Score:0.000}, " & $"Box: (({box.Left:0.0},{box.Top:0.0}),({box.Right:0.0},{box.Bottom:0.0}))")
264 Next
265
266 Case Else
267 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
268 End Select
269 Catch ex As CFviException
270 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
271 Console.WriteLine(ex.StackTrace)
272 Catch ex As Exception
273 Console.WriteLine($"Message={ex.Message}")
274 Console.WriteLine(ex.StackTrace)
275 End Try
276 End Sub
277 End Class
278End Namespace

Documentation copyright © 2026 TOKYO ELECTRON DEVICE LIMITED https://www.teldevice.co.jp/
Generated on Fri Jun 19 2026 14:08:07 for WIL-PDL Reference ( .NET Framework ) 1.0.6 by Doxygen 1.9.5.