WIL-PDL Reference ( .NET Framework ) 1.0.6-gpu
WIL を併用するサンプルコード

WIL を併用するサンプルコードです。
ここでは、任意のフィルタ処理 ( この例では単純な平均化フィルタ ) を前処理として実施しています。


C# 版

  • 画像分類の場合: L.61- UseWithWIL()
  • アノマリー検出の場合: L.61- UseWithWIL()
  • 多視点画像分類の場合: L.148- UseWithWILMVCNN()
  • 多視点アノマリー検出の場合: L.148- UseWithWILMVCNN()
  • セマンティックセグメンテーションの場合: L.214- UseWithWILSegmentation()
  • パノプティックセグメンテーションの場合: L.214- UseWithWILSegmentation()
  • 物体検出の場合: L.384- UseWithWILObjectDetection()
  • マルチラベル画像分類の場合: L.61- UseWithWIL()
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 _predict(Model model, CFviImage targetImage)
15 {
16 switch (model.ModelCategory)
17 {
18 case ModelCategory.Classification:// 画像分類
19 {
20 // 推論実行
21 var scores = model.PredictClassification(targetImage);
22
23 // スコアをコンソール出力
24 for (var i_score = 0; i_score < scores.Length; i_score++)
25 {
26 Console.WriteLine($"label{i_score}: {scores[i_score]}");
27 }
28 }
29 break;
30 case ModelCategory.AnomalyDetection:// アノマリー検出
31 {
32 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
33 var threshold = 10.0;
34 var tuple = model.PredictAnomaly(targetImage, (float)threshold);
35
36 // コンソール出力
37 var str_is_anomaly = tuple.Item1 ? "anomaly" : "normal";
38 Console.WriteLine($"{str_is_anomaly}, max_anomaly={tuple.Item2}");
39 }
40 break;
41 case ModelCategory.MultiLabelClassification:// マルチラベル画像分類
42 {
43 // 推論実行
44 var scores = model.PredictMultiLabelClassification(targetImage);
45
46 // スコアをコンソール出力
47 for (var i_score = 0; i_score < scores.Length; i_score++)
48 {
49 Console.WriteLine($"label{i_score}: {scores[i_score]}");
50 }
51 }
52 break;
53 case ModelCategory.MultiViewCNN:
54 case ModelCategory.MultiViewAD:
55 case ModelCategory.SemanticSegmentation:
56 case ModelCategory.PanopticSegmentation:
57 case ModelCategory.Unknown:
58 default: throw new NotImplementedException($"unknwon model-category={model.ModelCategory}");
59 }
60 }
61 static void UseWithWIL(String modelPath, String imagePath)
62 {
63 try
64 {
65 var has_license = Model.CheckLicense();
66 if (false == has_license) { throw new Exception("no license"); }
67
68 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
69 Model model = new Model(modelPath);
70
71 // 推論対象画像の読込
72 CFviImage image = new CFviImage(imagePath);
73
74 // 推論対象画像の有効性確認
75 var is_valid_img = model.IsValidImage(image);
76 if (false == is_valid_img) { throw new Exception("invalid image"); }
77
78 // 元画像での推論
79 Console.WriteLine("original image");
80 _predict(model, image);
81
82 // 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
83 var filtered_image = new CFviImage(image, false);
84 var parser = new FVIL.Filter.CFviAverageFilter();
85 parser.SrcImages[0] = image;
86 parser.DstImages[0] = filtered_image;
87 if (!parser.IsValid())
88 {
89 parser.Validate();
90 }
91 parser.Execute();
92
93 // 処理画像での推論
94 Console.WriteLine("filtered image");
95 _predict(model, filtered_image);
96 }
97 catch (CFviException ex)
98 {
99 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
100 Console.WriteLine(ex.StackTrace);
101 }
102 catch (Exception ex)
103 {
104 Console.WriteLine($"Message={ex.Message}");
105 Console.WriteLine(ex.StackTrace);
106 }
107 }
108
109 static void _predictMultiView(Model model, IEnumerable<CFviImage> targetImages)
110 {
111 // モデル種別のエラーチェック
112 switch (model.ModelCategory)
113 {
114 case ModelCategory.MultiViewCNN:
115 {
116 // 推論実行
117 var scores = model.PredictMultiViewCNN(targetImages);
118
119 // スコアをコンソール出力
120 for (var i_score = 0; i_score < scores.Length; i_score++)
121 {
122 Console.WriteLine($"label{i_score}: {scores[i_score]}");
123 }
124 }
125 break;
126 case ModelCategory.MultiViewAD:
127 {
128 {
129 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
130 var threshold = 10.0;
131 var tuple = model.PredictMultiViewAD(targetImages, (float)threshold);
132
133 // コンソール出力
134 var str_is_anomaly = tuple.Item1 ? "anomaly" : "normal";
135 Console.WriteLine($"{str_is_anomaly}, max_anomaly={tuple.Item2}");
136 }
137 }
138 break;
139 case ModelCategory.Unknown:
140 case ModelCategory.Classification:
141 case ModelCategory.AnomalyDetection:
142 case ModelCategory.SemanticSegmentation:
143 case ModelCategory.PanopticSegmentation:
144 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
145 }
146
147 }
148 static void UseWithWILMultiImage(String modelPath, String imageFolder)
149 {
150 try
151 {
152 var has_license = Model.CheckLicense();
153 if (false == has_license) { throw new Exception("no license"); }
154
155 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
156 Model model = new Model(modelPath);
157
158 // 推論対象画像の読込と有効性の確認
159 List<CFviImage> original_images = new List<CFviImage>();
160 for (var i_img = 0; i_img < model.NumViews; i_img++)
161 {
162 // imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
163 var img_path = System.IO.Path.Combine(imageFolder, String.Format("{0}.bmp", i_img));
164 var image = new CFviImage(img_path);
165
166 // 推論対象画像の有効性確認
167 var is_valid_img = model.IsValidImage(image);
168 if (false == is_valid_img) { throw new Exception("invalid image"); }
169
170 // 推論対象画像のリストに追加
171 original_images.Add(image);
172 }
173
174 // 元画像での推論
175 Console.WriteLine("original image");
176 _predictMultiView(model, original_images);
177
178 // 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
179 List<CFviImage> filtered_images = new List<CFviImage>();
180 using (var parser = new FVIL.Filter.CFviAverageFilter())
181 {
182 foreach (var src_image in original_images)
183 {
184 var dst_image = new CFviImage(src_image.HorzSize, src_image.VertSize, src_image.ImageType, src_image.Channel);
185
186 parser.SrcImages[0] = src_image;
187 parser.DstImages[0] = dst_image;
188 if (!parser.IsValid())
189 {
190 parser.Validate();
191 }
192 parser.Execute();
193
194 filtered_images.Add(dst_image);
195 }
196 }
197
198 // 処理画像での推論
199 Console.WriteLine("filtered image");
200 _predictMultiView(model, filtered_images);
201 }
202 catch (CFviException ex)
203 {
204 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
205 Console.WriteLine(ex.StackTrace);
206 }
207 catch (Exception ex)
208 {
209 Console.WriteLine($"Message={ex.Message}");
210 Console.WriteLine(ex.StackTrace);
211 }
212 }
213
214 static void UseWithWILSegmentation(String modelPath, String imagePath, Double blobAreaMinThreshold, Double blobAreaMaxThreshold)
215 {
216 try
217 {
218 var has_license = Model.CheckLicense();
219 if (false == has_license) { throw new Exception("no license"); }
220
221 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
222 Model model = new Model(modelPath);
223
224 // 推論対象画像の読込
225 CFviImage image = new CFviImage(imagePath);
226
227 // 推論対象画像の有効性確認
228 var is_valid_img = model.IsValidImage(image);
229 if (false == is_valid_img) { throw new Exception("invalid image"); }
230
231
232 switch (model.ModelCategory)
233 {
234 case ModelCategory.SemanticSegmentation:// セマンティックセグメンテーション
235 {
236 // 推論実行
237 var segm_result_image = model.PredictSemanticSegmentation(image);
238
239 // 濃度値の最大が領域を検出できたカテゴリたちの中での最大の番号に相当
240 var max_posi = segm_result_image.FindMaxValue(0, 0);
241 var max_value = segm_result_image.GetPixelI32(0, (Int32)max_posi.X, (Int32)max_posi.Y);
242 if (0 == max_value)
243 {// 0 が最大値ということは 1 以上のピクセルが無い。つまり画像の全てが背景と判定されたとき
244 Console.WriteLine("all pixels are background");
245 }
246
247 // カテゴリの個数: 既知であればここで取得する必要は無い
248 var n_category = model.GetLabelList().Count();
249
250 // 各カテゴリ ( ラベル ) の情報を取得: 0 番は背景に対応し、カテゴリ番号は 1-index であることに注意
251 for (var category_id = 1; category_id <= n_category; category_id++)
252 {
253 // カテゴリ番号に一致するピクセルのみを 1 に、その他を 0 にすることで、そのカテゴリとして検出された領域の二値画像を取得
254 // ※ PredictSemanticSegmentation(CFviImage targetImage, Dictionary<UInt32, CFviImage> categoryMaskImages) にて categoryMaskImages で取得できる二値画像に相当
255 var bin_mask = new CFviImage(segm_result_image.HorzSize, segm_result_image.VertSize, ImageType.BIN, 1, 1);
256 bin_mask.Window = segm_result_image.Window;
257 var ret = fvalgcli.api.fnFIE_band_threshold(segm_result_image.GetFIEChild(), bin_mask.GetFIEChild(), category_id, category_id);
258 if ((Int32)fvalgcli.f_err.F_ERR_NONE != ret) { throw new fvalgcli.FvException(ret); }
259
260 // 検出した領域の二値画像に対してブローブ解析を実行
261 var blob_result = new FVIL.Blob.CFviBlobResult();
262 var blob_param = new FVIL.Blob.CFviBlobParam();
263 blob_param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG;
264 blob_param.Neighborhood = FVIL.Blob.Neighborhood.Eight;
265 var blob_parser = new FVIL.Blob.CFviBlob(bin_mask, blob_result, blob_param);
266 if (!blob_parser.IsValid()) { blob_parser.Validate(); }
267 blob_parser.Execute();
268
269 // ブローブ解析の結果に対して、さらにフィルタリング ( ここでは面積 )
270 var filters = new List<FVIL.Blob.CFviBlobFilterRange>();
271 filters.Add(new FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, blobAreaMinThreshold, blobAreaMaxThreshold));
272 var blob_list = blob_result.GetBlobList(filters);
273 Console.WriteLine($"category_id={category_id}: blob count={blob_list.Count}");
274 foreach(var kv in blob_list)
275 {
276 var blob_data = new FVIL.Blob.CFviBlobData(kv);
277 // 以下、ブローブ特徴量に基づく解析も可能
278 }
279
280 // 検出した領域の二値画像をリージョンに変換
281 var region_mask = new CFviRegion(bin_mask);
282 // リージョン特徴量に基づく解析や、画像に対するリージョン内の特徴量の取得が可能
283 //var mean = FVIL.Region.Measure.MeanPixel(image, region_mask);// 例: 元画像のリージョン内の平均濃度値の取得
284 }
285 }
286 break;
287 case ModelCategory.PanopticSegmentation:
288 {
289 // 推論実行
290 var segm_result_image = model.PredictPanopticSegmentation(image);
291
292 // カテゴリ番号の格納された画像とインスタンス番号の格納された画像に分離
293 var category_map = new CFviImage(fvalgcli.api.fnFIE_img_child_alloc_single_ch(segm_result_image.GetFIERoot(), 0, 0, 0, segm_result_image.HorzSize, segm_result_image.VertSize), true);
294 var instance_map = new CFviImage(fvalgcli.api.fnFIE_img_child_alloc_single_ch(segm_result_image.GetFIERoot(), 1, 0, 0, segm_result_image.HorzSize, segm_result_image.VertSize), true);
295 category_map.Window = segm_result_image.Window;
296 instance_map.Window = segm_result_image.Window;
297
298 // 濃度値の最大が検出した領域の個数に相当
299 var max_posi = instance_map.FindMaxValue(0, 0);
300 var max_value = instance_map.GetPixelI32(0, (Int32)max_posi.X, (Int32)max_posi.Y);
301 if (0 == max_value)
302 {// 0 が最大値ということは 1 以上のピクセルが無い。つまり画像の全てが背景と判定されたとき
303 Console.WriteLine("all pixels are background");
304 }
305
306 // 各検出領域の取得と、その領域に対する画像処理
307 for (var instance_id = 1; instance_id <= max_value; instance_id++)
308 {
309 // 検出した領域の通し番号に一致するピクセルのみを 1 に、その他を 0 にすることで、その領域の二値画像を取得
310 var bin_mask = new CFviImage(instance_map.HorzSize, instance_map.VertSize, ImageType.BIN, 1, 1);
311 bin_mask.Window = instance_map.Window;
312 var ret = fvalgcli.api.fnFIE_band_threshold(instance_map.GetFIEChild(), bin_mask.GetFIEChild(), instance_id, instance_id);
313 if ((Int32)fvalgcli.f_err.F_ERR_NONE != ret) { throw new fvalgcli.FvException(ret); }
314
315 // 検出した領域の二値画像に対してブローブ解析を実行 ( 物体毎に分離できているはずなので、各インスタンスの領域がそれ以上に分割されることはほとんど無いはず )
316 var blob_result = new FVIL.Blob.CFviBlobResult();
317 var blob_param = new FVIL.Blob.CFviBlobParam();
318 blob_param.ColorMode = FVIL.Blob.ObjectColor.WhiteFG_BlackBG;
319 blob_param.Neighborhood = FVIL.Blob.Neighborhood.Eight;
320 var blob_parser = new FVIL.Blob.CFviBlob(bin_mask, blob_result, blob_param);
321 if (!blob_parser.IsValid()) { blob_parser.Validate(); }
322 blob_parser.Execute();
323
324 // ブローブ解析の結果に対して、さらにフィルタリング ( ここでは面積 )
325 var filters = new List<FVIL.Blob.CFviBlobFilterRange>();
326 filters.Add(new FVIL.Blob.CFviBlobFilterRange(FVIL.Blob.FeatureType.AREA, blobAreaMinThreshold, blobAreaMaxThreshold));
327 var blob_list = blob_result.GetBlobList(filters);
328 Console.WriteLine($"instance_id={instance_id}: blob count={blob_list.Count}");
329 foreach (var kv in blob_list)
330 {
331 var blob_data = new FVIL.Blob.CFviBlobData(kv);
332
333 var region = blob_data.GetRegion();
334 var category_id = (UInt32)FVIL.Region.Measure.MaxPixel(category_map, region, OriginMode.Window);// max=min のはずで、領域をすべて見なくても 1 ピクセルを確認するのみでも良い
335
336 Console.WriteLine($"instance_id={instance_id}: category_id={category_id}, blob no={blob_data.BlobNo}");
337
338 // 以下、ブローブ特徴量に基づく解析も可能
339 }
340
341 // 検出した領域の二値画像を直接リージョンに変換
342 var region_mask = new CFviRegion(bin_mask);
343 // リージョン特徴量に基づく解析や、画像に対するリージョン内の特徴量の取得が可能
344 //var mean = FVIL.Region.Measure.MeanPixel(image, region_mask);// 例: 元画像のリージョン内の平均濃度値の取得
345 }
346 }
347 break;
348 case ModelCategory.Classification:
349 case ModelCategory.AnomalyDetection:
350 case ModelCategory.MultiViewCNN:
351 case ModelCategory.MultiViewAD:
352 case ModelCategory.Unknown:
353 default: throw new NotImplementedException($"unknwon model-category={model.ModelCategory}");
354 }
355 }
356 catch (CFviException ex)
357 {
358 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
359 Console.WriteLine(ex.StackTrace);
360 }
361 catch (Exception ex)
362 {
363 Console.WriteLine($"Message={ex.Message}");
364 Console.WriteLine(ex.StackTrace);
365 }
366 }
367
368 static void _predictObjectDetection(Model model, CFviImage targetImage)
369 {
370 switch (model.ModelCategory)
371 {
372 case ModelCategory.ObjectDetection:// 物体検出
373 {
374 // 推論実行
375 var detections = model.PredictObjectDetection(targetImage);
376
377 // 検出数をコンソール出力
378 Console.WriteLine($"number of detections: {detections.Count()}");
379 }
380 break;
381 default: throw new NotImplementedException($"unknwon model-category={model.ModelCategory}");
382 }
383 }
384 static void UseWithWILObjectDetection(String modelPath, String imagePath)
385 {
386 try
387 {
388 var has_license = Model.CheckLicense();
389 if (false == has_license) { throw new Exception("no license"); }
390
391 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
392 Model model = new Model(modelPath);
393
394 // 推論対象画像の読込
395 CFviImage image = new CFviImage(imagePath);
396
397 // 推論対象画像の有効性確認
398 var is_valid_img = model.IsValidImage(image);
399 if (false == is_valid_img) { throw new Exception("invalid image"); }
400
401 // 元画像での推論
402 Console.WriteLine("original image");
403 _predictObjectDetection(model, image);
404
405 // 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
406 var filtered_image = new CFviImage(image, false);
407 var parser = new FVIL.Filter.CFviAverageFilter();
408 parser.SrcImages[0] = image;
409 parser.DstImages[0] = filtered_image;
410 if (!parser.IsValid())
411 {
412 parser.Validate();
413 }
414 parser.Execute();
415
416 // 処理画像での推論
417 Console.WriteLine("filtered image");
418 _predictObjectDetection(model, filtered_image);
419 }
420 catch (CFviException ex)
421 {
422 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
423 Console.WriteLine(ex.StackTrace);
424 }
425 catch (Exception ex)
426 {
427 Console.WriteLine($"Message={ex.Message}");
428 Console.WriteLine(ex.StackTrace);
429 }
430 }
431
432 }
433}
推論するモデルを扱うクラス
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
IEnumerable< String > GetLabelList()
ラべル一覧の取得
Definition: PredictionCS.cs:611
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
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
WIL-PDL モジュールの名前空間
Definition: PredictionCS.cs:21
ModelCategory
モデルの種別
Definition: PredictionCS.cs:32
FVILの最上位ネームスペース
Definition: PredictionCS.cs:16

VB 版

  • 画像分類の場合: L.42- UseWithWIL()
  • アノマリー検出の場合: L.42- UseWithWIL()
  • 多視点画像分類の場合: L.114- UseWithWILMVCNN()
  • 多視点アノマリー検出の場合: L.114- UseWithWILMVCNN()
  • セマンティックセグメンテーションの場合: L.174- UseWithWILSegmentation()
  • パノプティックセグメンテーションの場合: L.174- UseWithWILSegmentation()
  • 物体検出の場合: L.330- UseWithWILObjectDetection()
  • マルチラベル画像分類の場合: L.42- UseWithWIL()
1Imports System
2Imports System.Collections.Generic
3Imports System.IO
4Imports System.Linq
5Imports FVIL
6Imports FVIL.Data
7Imports FVIL.PDL
8
9Namespace SamplesCS
10 Partial Class Program
11 Private Shared Sub _predict(model As Model, targetImage As CFviImage)
12 Select Case model.ModelCategory
13 Case ModelCategory.Classification ' 画像分類
14 ' 推論実行
15 Dim scores = model.PredictClassification(targetImage)
16
17 ' スコアをコンソール出力
18 For i_score = 0 To scores.Length - 1
19 Console.WriteLine($"label{i_score}: {scores(i_score)}")
20 Next
21 Case ModelCategory.AnomalyDetection ' アノマリー検出
22 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
23 Dim threshold = 10.0
24 Dim tuple = model.PredictAnomaly(targetImage, threshold)
25
26 ' コンソール出力
27 Dim str_is_anomaly = If(tuple.Item1, "anomaly", "normal")
28 Console.WriteLine($"{str_is_anomaly}, max_anomaly={tuple.Item2}")
29 Case ModelCategory.MultiLabelClassification ' マルチラベル画像分類
30 ' 推論実行
31 Dim scores = model.PredictMultiLabelClassification(targetImage)
32
33 ' スコアをコンソール出力
34 For i_score = 0 To scores.Length - 1
35 Console.WriteLine($"label{i_score}: {scores(i_score)}")
36 Next
37
38 Case Else
39 Throw New NotImplementedException($"unknwon model-category={model.ModelCategory}")
40 End Select
41 End Sub
42 Private Shared Sub UseWithWIL(modelPath As String, imagePath As String)
43 Try
44 Dim has_license = PDL.Model.CheckLicense()
45 If False = has_license Then
46 Throw New Exception("no license")
47 End If
48
49 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
50 Dim model As Model = New Model(modelPath)
51
52 ' 推論対象画像の読込
53 Dim image As CFviImage = New CFviImage(imagePath)
54
55 ' 推論対象画像の有効性確認
56 Dim is_valid_img = model.IsValidImage(image)
57 If False = is_valid_img Then
58 Throw New Exception("invalid image")
59 End If
60
61 ' 元画像での推論
62 Console.WriteLine("original image")
63 _predict(model, image)
64
65 ' 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
66 Dim filtered_image = New CFviImage(image, False)
67 Dim parser = New Filter.CFviAverageFilter()
68 parser.SrcImages(0) = image
69 parser.DstImages(0) = filtered_image
70 If Not parser.IsValid() Then
71 parser.Validate()
72 End If
73 parser.Execute()
74
75 ' 処理画像での推論
76 Console.WriteLine("filtered image")
77 _predict(model, filtered_image)
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 _predictMultiView(model As Model, targetImages As IEnumerable(Of CFviImage))
88 ' モデル種別のエラーチェック
89 Select Case model.ModelCategory
90 Case ModelCategory.MultiViewCNN
91 ' 推論実行
92 Dim scores = model.PredictMultiViewCNN(targetImages)
93
94 ' スコアをコンソール出力
95 For i_score = 0 To scores.Length - 1
96 Console.WriteLine($"label{i_score}: {scores(i_score)}")
97 Next
98 Case ModelCategory.MultiViewAD
99 If True Then
100 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
101 Dim threshold = 10.0
102 Dim tuple = model.PredictMultiViewAD(targetImages, threshold)
103
104 ' コンソール出力
105 Dim str_is_anomaly = If(tuple.Item1, "anomaly", "normal")
106 Console.WriteLine($"{str_is_anomaly}, max_anomaly={tuple.Item2}")
107 End If
108
109 Case Else
110 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
111 End Select
112
113 End Sub
114 Private Shared Sub UseWithWILMultiImage(modelPath As String, imageFolder As String)
115 Try
116 Dim has_license = PDL.Model.CheckLicense()
117 If False = has_license Then
118 Throw New Exception("no license")
119 End If
120
121 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
122 Dim model As Model = New Model(modelPath)
123
124 ' 推論対象画像の読込と有効性の確認
125 Dim original_images As List(Of CFviImage) = New List(Of CFviImage)()
126 For i_img = 0 To model.NumViews - 1
127 ' imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
128 Dim img_path = Path.Combine(imageFolder, String.Format("{0}.bmp", i_img))
129 Dim image = New CFviImage(img_path)
130
131 ' 推論対象画像の有効性確認
132 Dim is_valid_img = model.IsValidImage(image)
133 If False = is_valid_img Then
134 Throw New Exception("invalid image")
135 End If
136
137 ' 推論対象画像のリストに追加
138 original_images.Add(image)
139 Next
140
141 ' 元画像での推論
142 Console.WriteLine("original image")
143 _predictMultiView(model, original_images)
144
145 ' 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
146 Dim filtered_images As List(Of CFviImage) = New List(Of CFviImage)()
147 Using parser = New Filter.CFviAverageFilter()
148 For Each src_image In original_images
149 Dim dst_image = New CFviImage(src_image.HorzSize, src_image.VertSize, src_image.ImageType, src_image.Channel)
150
151 parser.SrcImages(0) = src_image
152 parser.DstImages(0) = dst_image
153 If Not parser.IsValid() Then
154 parser.Validate()
155 End If
156 parser.Execute()
157
158 filtered_images.Add(dst_image)
159 Next
160 End Using
161
162 ' 処理画像での推論
163 Console.WriteLine("filtered image")
164 _predictMultiView(model, filtered_images)
165 Catch ex As CFviException
166 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
167 Console.WriteLine(ex.StackTrace)
168 Catch ex As Exception
169 Console.WriteLine($"Message={ex.Message}")
170 Console.WriteLine(ex.StackTrace)
171 End Try
172 End Sub
173
174 Private Shared Sub UseWithWILSegmentation(modelPath As String, imagePath As String, blobAreaMinThreshold As Double, blobAreaMaxThreshold As Double)
175 Try
176 Dim has_license = PDL.Model.CheckLicense()
177 If False = has_license Then
178 Throw New Exception("no license")
179 End If
180
181 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
182 Dim model As Model = New Model(modelPath)
183
184 ' 推論対象画像の読込
185 Dim image As CFviImage = New CFviImage(imagePath)
186
187 ' 推論対象画像の有効性確認
188 Dim is_valid_img = model.IsValidImage(image)
189 If False = is_valid_img Then
190 Throw New Exception("invalid image")
191 End If
192
193
194 Select Case model.ModelCategory
195 Case ModelCategory.SemanticSegmentation ' セマンティックセグメンテーション
196 ' 推論実行
197 Dim segm_result_image = model.PredictSemanticSegmentation(image)
198
199 ' 濃度値の最大が領域を検出できたカテゴリたちの中での最大の番号に相当
200 Dim max_posi = segm_result_image.FindMaxValue(0, 0)
201 Dim max_value = segm_result_image.GetPixelI32(0, max_posi.X, max_posi.Y)
202 If 0 = max_value Then ' 0 が最大値ということは 1 以上のピクセルが無い。つまり画像の全てが背景と判定されたとき
203 Console.WriteLine("all pixels are background")
204 End If
205
206 ' カテゴリの個数: 既知であればここで取得する必要は無い
207 Dim n_category = model.GetLabelList().Count()
208
209 ' 各カテゴリ ( ラベル ) の情報を取得: 0 番は背景に対応し、カテゴリ番号は 1-index であることに注意
210 For category_id = 1 To n_category
211 ' カテゴリ番号に一致するピクセルのみを 1 に、その他を 0 にすることで、そのカテゴリとして検出された領域の二値画像を取得
212 ' ※ PredictSemanticSegmentation(CFviImage targetImage, Dictionary<UInt32, CFviImage> categoryMaskImages) にて categoryMaskImages で取得できる二値画像に相当
213 Dim bin_mask = New CFviImage(segm_result_image.HorzSize, segm_result_image.VertSize, ImageType.BIN, 1, 1)
214 bin_mask.Window = segm_result_image.Window
215 Dim ret = fvalgcli.api.fnFIE_band_threshold(segm_result_image.GetFIEChild(), bin_mask.GetFIEChild(), category_id, category_id)
216 If fvalgcli.f_err.F_ERR_NONE <> ret Then
217 Throw New fvalgcli.FvException(ret)
218 End If
219
220 ' 検出した領域の二値画像に対してブローブ解析を実行
221 Dim blob_result = New Blob.CFviBlobResult()
222 Dim blob_param = New Blob.CFviBlobParam()
223 blob_param.ColorMode = Blob.ObjectColor.WhiteFG_BlackBG
224 blob_param.Neighborhood = Blob.Neighborhood.Eight
225 Dim blob_parser = New Blob.CFviBlob(bin_mask, blob_result, blob_param)
226 If Not blob_parser.IsValid() Then
227 blob_parser.Validate()
228 End If
229 blob_parser.Execute()
230
231 ' ブローブ解析の結果に対して、さらにフィルタリング ( ここでは面積 )
232 Dim filters = New List(Of Blob.CFviBlobFilterRange)()
233 filters.Add(New Blob.CFviBlobFilterRange(Blob.FeatureType.AREA, blobAreaMinThreshold, blobAreaMaxThreshold))
234 Dim blob_list = blob_result.GetBlobList(filters)
235 Console.WriteLine($"category_id={category_id}: blob count={blob_list.Count}")
236 For Each kv In blob_list
237 Dim blob_data = New Blob.CFviBlobData(kv)
238 ' 以下、ブローブ特徴量に基づく解析も可能
239 Next
240
241 ' 検出した領域の二値画像をリージョンに変換
242 Dim region_mask = New CFviRegion(bin_mask)
243 ' リージョン特徴量に基づく解析や、画像に対するリージョン内の特徴量の取得が可能
244 'var mean = FVIL.Region.Measure.MeanPixel(image, region_mask);// 例: 元画像のリージョン内の平均濃度値の取得
245 Next
246 Case ModelCategory.PanopticSegmentation
247 ' 推論実行
248 Dim segm_result_image = model.PredictPanopticSegmentation(image)
249
250 ' カテゴリ番号の格納された画像とインスタンス番号の格納された画像に分離
251 Dim category_map = New CFviImage(fvalgcli.api.fnFIE_img_child_alloc_single_ch(segm_result_image.GetFIERoot(), 0, 0, 0, segm_result_image.HorzSize, segm_result_image.VertSize), True)
252 Dim instance_map = New CFviImage(fvalgcli.api.fnFIE_img_child_alloc_single_ch(segm_result_image.GetFIERoot(), 1, 0, 0, segm_result_image.HorzSize, segm_result_image.VertSize), True)
253 category_map.Window = segm_result_image.Window
254 instance_map.Window = segm_result_image.Window
255
256 ' 濃度値の最大が検出した領域の個数に相当
257 Dim max_posi = instance_map.FindMaxValue(0, 0)
258 Dim max_value = instance_map.GetPixelI32(0, max_posi.X, max_posi.Y)
259 If 0 = max_value Then ' 0 が最大値ということは 1 以上のピクセルが無い。つまり画像の全てが背景と判定されたとき
260 Console.WriteLine("all pixels are background")
261 End If
262
263 ' 各検出領域の取得と、その領域に対する画像処理
264 For instance_id = 1 To max_value
265 ' 検出した領域の通し番号に一致するピクセルのみを 1 に、その他を 0 にすることで、その領域の二値画像を取得
266 Dim bin_mask = New CFviImage(instance_map.HorzSize, instance_map.VertSize, ImageType.BIN, 1, 1)
267 bin_mask.Window = instance_map.Window
268 Dim ret = fvalgcli.api.fnFIE_band_threshold(instance_map.GetFIEChild(), bin_mask.GetFIEChild(), instance_id, instance_id)
269 If fvalgcli.f_err.F_ERR_NONE <> ret Then
270 Throw New fvalgcli.FvException(ret)
271 End If
272
273 ' 検出した領域の二値画像に対してブローブ解析を実行 ( 物体毎に分離できているはずなので、各インスタンスの領域がそれ以上に分割されることはほとんど無いはず )
274 Dim blob_result = New Blob.CFviBlobResult()
275 Dim blob_param = New Blob.CFviBlobParam()
276 blob_param.ColorMode = Blob.ObjectColor.WhiteFG_BlackBG
277 blob_param.Neighborhood = Blob.Neighborhood.Eight
278 Dim blob_parser = New Blob.CFviBlob(bin_mask, blob_result, blob_param)
279 If Not blob_parser.IsValid() Then
280 blob_parser.Validate()
281 End If
282 blob_parser.Execute()
283
284 ' ブローブ解析の結果に対して、さらにフィルタリング ( ここでは面積 )
285 Dim filters = New List(Of Blob.CFviBlobFilterRange)()
286 filters.Add(New Blob.CFviBlobFilterRange(Blob.FeatureType.AREA, blobAreaMinThreshold, blobAreaMaxThreshold))
287 Dim blob_list = blob_result.GetBlobList(filters)
288 Console.WriteLine($"instance_id={instance_id}: blob count={blob_list.Count}")
289 For Each kv In blob_list
290 Dim blob_data = New Blob.CFviBlobData(kv)
291
292 Dim region = blob_data.GetRegion()
293 Dim category_id = CUInt(FVIL.Region.Measure.MaxPixel(category_map, region, OriginMode.Window)) ' max=min のはずで、領域をすべて見なくても 1 ピクセルを確認するのみでも良い
294
295 Console.WriteLine($"instance_id={instance_id}: category_id={category_id}, blob no={blob_data.BlobNo}")
296
297 ' 以下、ブローブ特徴量に基づく解析も可能
298 Next
299
300 ' 検出した領域の二値画像を直接リージョンに変換
301 Dim region_mask = New CFviRegion(bin_mask)
302 ' リージョン特徴量に基づく解析や、画像に対するリージョン内の特徴量の取得が可能
303 'var mean = FVIL.Region.Measure.MeanPixel(image, region_mask);// 例: 元画像のリージョン内の平均濃度値の取得
304 Next
305
306 Case Else
307 Throw New NotImplementedException($"unknwon model-category={model.ModelCategory}")
308 End Select
309 Catch ex As CFviException
310 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
311 Console.WriteLine(ex.StackTrace)
312 Catch ex As Exception
313 Console.WriteLine($"Message={ex.Message}")
314 Console.WriteLine(ex.StackTrace)
315 End Try
316 End Sub
317
318 Private Shared Sub _predictObjectDetection(model As Model, targetImage As CFviImage)
319 Select Case model.ModelCategory
320 Case ModelCategory.ObjectDetection ' 物体検出
321 ' 推論実行
322 Dim detections = model.PredictObjectDetection(targetImage)
323
324 ' 検出数をコンソール出力
325 Console.WriteLine($"number of detections: {detections.Count()}")
326 Case Else
327 Throw New NotImplementedException($"unknwon model-category={model.ModelCategory}")
328 End Select
329 End Sub
330 Private Shared Sub UseWithWILObjectDetection(modelPath As String, imagePath As String)
331 Try
332 Dim has_license = PDL.Model.CheckLicense()
333 If False = has_license Then
334 Throw New Exception("no license")
335 End If
336
337 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
338 Dim model As Model = New Model(modelPath)
339
340 ' 推論対象画像の読込
341 Dim image As CFviImage = New CFviImage(imagePath)
342
343 ' 推論対象画像の有効性確認
344 Dim is_valid_img = model.IsValidImage(image)
345 If False = is_valid_img Then
346 Throw New Exception("invalid image")
347 End If
348
349 ' 元画像での推論
350 Console.WriteLine("original image")
351 _predictObjectDetection(model, image)
352
353 ' 任意のフィルタ処理 ( ここでは例として単純な average フィルタ )
354 Dim filtered_image = New CFviImage(image, False)
355 Dim parser = New Filter.CFviAverageFilter()
356 parser.SrcImages(0) = image
357 parser.DstImages(0) = filtered_image
358 If Not parser.IsValid() Then
359 parser.Validate()
360 End If
361 parser.Execute()
362
363 ' 処理画像での推論
364 Console.WriteLine("filtered image")
365 _predictObjectDetection(model, filtered_image)
366 Catch ex As CFviException
367 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
368 Console.WriteLine(ex.StackTrace)
369 Catch ex As Exception
370 Console.WriteLine($"Message={ex.Message}")
371 Console.WriteLine(ex.StackTrace)
372 End Try
373 End Sub
374
375 End Class
376End 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-gpu by Doxygen 1.9.5.