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

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


C# 版

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

VB 版

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

Documentation copyright © 2008 FAST Corporation. https://www.fast-corp.co.jp/
Generated on Fri Sep 6 2024 10:40:37 for WIL-PDL Reference ( .NET Framework ) 1.0.4-gpu by Doxygen 1.9.5.