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

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


C# 版

  • 画像分類の場合: L.14- SimpleSample()
  • アノマリー検出の場合: L.14- SimpleSample()
  • 多視点画像分類の場合: L.87- SimpleSampleMultiView()
  • 多視点アノマリー検出の場合: L.87- SimpleSampleMultiView()
  • セマンティックセグメンテーションの場合: L.169- SimpleSampleSegmentation()
  • パノプティックセグメンテーションの場合: L.169- SimpleSampleSegmentation()
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.MultiViewCNN:
68 case ModelCategory.MultiViewAD:
69 case ModelCategory.SemanticSegmentation:
70 case ModelCategory.PanopticSegmentation:
71 case ModelCategory.Unknown:
72 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
73 }
74 }
75 catch (CFviException ex)
76 {
77 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
78 Console.WriteLine(ex.StackTrace);
79 }
80 catch (Exception ex)
81 {
82 Console.WriteLine($"Message={ex.Message}");
83 Console.WriteLine(ex.StackTrace);
84 }
85 }
86
87 static void SimpleSampleMultiView(String modelPath, String imageFolder)
88 {
89 try
90 {
91 var has_license = Model.CheckLicense();
92 if (false == has_license) { throw new Exception("no license"); }
93
94 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
95 Model model = new Model(modelPath);
96
97 // モデルの推論バックエンドの確認
98 Console.WriteLine($"backend: {model.ModelBackend}");
99
100 // 推論対象画像の読込と有効性の確認
101 List<CFviImage> target_images = new List<CFviImage>();
102 for (var i_img = 0; i_img < model.NumViews; i_img++)
103 {
104 // imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
105 var img_path = System.IO.Path.Combine(imageFolder, String.Format("{0}.bmp", i_img));
106 var image = new CFviImage(img_path);
107
108 // 推論対象画像の有効性確認
109 var is_valid_img = model.IsValidImage(image);
110 if (false == is_valid_img) { throw new Exception("invalid image"); }
111
112 // 推論対象画像のリストに追加
113 target_images.Add(image);
114 }
115
116 // モデル種別のエラーチェック
117 switch (model.ModelCategory)
118 {
119 case ModelCategory.MultiViewCNN:// 多視点画像分類
120 {
121 // 推論実行
122 var scores = model.PredictMultiViewCNN(target_images);
123 // スコアをコンソール出力
124 for (var i_score = 0; i_score < scores.Length; i_score++)
125 {
126 Console.WriteLine($"label{i_score}: {scores[i_score]}");
127 }
128
129 // 推論実行 ( 最大スコアのみを取得 )
130 var top_score_pair = model.PredictMultiViewCNN(target_images, ref scores);
131 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}");
132 }
133 break;
134 case ModelCategory.MultiViewAD:// 多視点アノマリー検出
135 {
136 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
137 var threshold = 10.0;
138 var tuple = model.PredictMultiViewAD(target_images, (float)threshold);
139
140 // タプルで受け取った結果をアンパック
141 var is_anomaly = tuple.Item1;
142 var max_anomaly = tuple.Item2;
143
144 // コンソール出力
145 var str_is_anomaly = is_anomaly ? "anomaly" : "normal";
146 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}");
147 }
148 break;
149 case ModelCategory.Classification:
150 case ModelCategory.AnomalyDetection:
151 case ModelCategory.SemanticSegmentation:
152 case ModelCategory.PanopticSegmentation:
153 case ModelCategory.Unknown:
154 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
155 }
156 }
157 catch (CFviException ex)
158 {
159 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
160 Console.WriteLine(ex.StackTrace);
161 }
162 catch (Exception ex)
163 {
164 Console.WriteLine($"Message={ex.Message}");
165 Console.WriteLine(ex.StackTrace);
166 }
167 }
168
169 static void SimpleSampleSegmentation(String modelPath, String imagePath)
170 {
171 try
172 {
173 var has_license = Model.CheckLicense();
174 if (false == has_license) { throw new Exception("no license"); }
175
176 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
177 Model model = new Model(modelPath);
178
179 // 推論対象画像の読込
180 CFviImage image = new CFviImage(imagePath);
181
182 // モデルの推論バックエンドの確認
183 Console.WriteLine($"backend: {model.ModelBackend}");
184
185 // 推論対象画像の有効性確認
186 var is_valid_img = model.IsValidImage(image);
187 if (false == is_valid_img) { throw new Exception("invalid image"); }
188
189 switch (model.ModelCategory)
190 {
191 case ModelCategory.SemanticSegmentation:// セマンティックセグメンテーション
192 {
193 // 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
194 var category_masks = new Dictionary<UInt32, CFviImage>();
195 category_masks.Add(1, new CFviImage(image.HorzSize, image.VertSize, ImageType.BIN, 1));// 0 は背景なので、1 が最初のカテゴリ ( ラベル )
196 category_masks.Add(2, new CFviImage());// ペアとなる値には画像サイズやチャネル数、型の異なる画像を入力することが可能 ( 内部で自動調整されるため )
197 category_masks.Add(5, new CFviImage());// 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
198
199 // 推論実行
200 var segm_result_image = model.PredictSemanticSegmentation(image, category_masks);
201 //var segm_result_image = model.PredictSemanticSegmentation(image);
202
203 // ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
204 foreach (var kv in category_masks)
205 {
206 var category_id = kv.Key;
207 var category_image = kv.Value;
208 var region = new CFviRegion(category_image);
209 Console.WriteLine($"No.{category_id}: area={region.Area}");
210 }
211 }
212 break;
213 case ModelCategory.PanopticSegmentation:
214 {
215 // パノプティックセグメンテーション固有の検出パラメータの設定 ( ここではデフォルト値と同じ値を設定 )
216 model.SetPanopticSegmentationParams(1024, 0.1, 32, 0);
217
218 // 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
219 var category_masks = new Dictionary<UInt32, List<CFviImage>>();
220 category_masks.Add(1, new List<CFviImage>());// 0 は背景なので、1 が最初のカテゴリ ( ラベル )
221 category_masks.Add(2, new List<CFviImage>() { new CFviImage() });// ペアとなる値のリストには既に画像が存在しているリストを入力することも可能 ( 内部でリストはクリアされるため )
222 category_masks.Add(5, new List<CFviImage>());// 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
223
224 // 推論実行
225 var segm_result_image = model.PredictPanopticSegmentation(image, category_masks);
226 //var segm_result_image = model.PredictPanopticSegmentation(image);
227
228 // ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
229 foreach (var kv in category_masks)
230 {
231 var category_id = kv.Key;
232 var mask_images = kv.Value;
233 for(var i=0;i<mask_images.Count; i++)
234 {
235 var region = new CFviRegion(mask_images[i]);
236 Console.WriteLine($"category={category_id}: no.={i}, area={region.Area}");
237 }
238 }
239 }
240 break;
241 case ModelCategory.Classification:
242 case ModelCategory.AnomalyDetection:
243 case ModelCategory.MultiViewCNN:
244 case ModelCategory.MultiViewAD:
245 case ModelCategory.Unknown:
246 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
247 }
248 }
249 catch (CFviException ex)
250 {
251 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
252 Console.WriteLine(ex.StackTrace);
253 }
254 catch (Exception ex)
255 {
256 Console.WriteLine($"Message={ex.Message}");
257 Console.WriteLine(ex.StackTrace);
258 }
259 }
260 }
261}
推論するモデルを扱うクラス
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
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
void SetPanopticSegmentationParams(UInt32 stuffArea=1024, Double threshold=0.1, Int32 nmsKernel=31, UInt16 requestInstanceNum=0)
パノプティックセグメンテーションの検出パラメータの設定
Definition: PredictionCS.cs:648
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.9- SimpleSample()
  • アノマリー検出の場合: L.9- SimpleSample()
  • 多視点画像分類の場合: L.68- SimpleSampleMultiView()
  • 多視点アノマリー検出の場合: L.68- SimpleSampleMultiView()
  • セマンティックセグメンテーションの場合: L.135- SimpleSampleSegmentation()
  • パノプティックセグメンテーションの場合: L.135- SimpleSampleSegmentation()
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 Else
58 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
59 End Select
60 Catch ex As CFviException
61 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
62 Console.WriteLine(ex.StackTrace)
63 Catch ex As Exception
64 Console.WriteLine($"Message={ex.Message}")
65 Console.WriteLine(ex.StackTrace)
66 End Try
67 End Sub
68
69 Private Shared Sub SimpleSampleMultiView(modelPath As String, imageFolder As String)
70 Try
71 Dim has_license = PDL.Model.CheckLicense()
72 If False = has_license Then
73 Throw New Exception("no license")
74 End If
75
76 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
77 Dim model As Model = New Model(modelPath)
78
79 ' モデルの推論バックエンドの確認
80 Console.WriteLine($"backend: {model.ModelBackend}")
81
82 ' 推論対象画像の読込と有効性の確認
83 Dim target_images As List(Of CFviImage) = New List(Of CFviImage)()
84 For i_img = 0 To model.NumViews - 1
85 ' imageFolder フォルダ内に、0-index の通し番号の画像が保存されていることを想定
86 Dim img_path = Path.Combine(imageFolder, String.Format("{0}.bmp", i_img))
87 Dim image = New CFviImage(img_path)
88
89 ' 推論対象画像の有効性確認
90 Dim is_valid_img = model.IsValidImage(image)
91 If False = is_valid_img Then
92 Throw New Exception("invalid image")
93 End If
94
95 ' 推論対象画像のリストに追加
96 target_images.Add(image)
97 Next
98
99 ' モデル種別のエラーチェック
100 Select Case model.ModelCategory
101 Case ModelCategory.MultiViewCNN ' 多視点画像分類
102 ' 推論実行
103 Dim scores = model.PredictMultiViewCNN(target_images)
104 ' スコアをコンソール出力
105 For i_score = 0 To scores.Length - 1
106 Console.WriteLine($"label{i_score}: {scores(i_score)}")
107 Next
108
109 ' 推論実行 ( 最大スコアのみを取得 )
110 Dim top_score_pair = model.PredictMultiViewCNN(target_images, scores)
111 Console.WriteLine($"top label{top_score_pair.Item1}, score{top_score_pair.Item2}")
112 Case ModelCategory.MultiViewAD ' 多視点アノマリー検出
113 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
114 Dim threshold = 10.0
115 Dim tuple = model.PredictMultiViewAD(target_images, threshold)
116
117 ' タプルで受け取った結果をアンパック
118 Dim is_anomaly = tuple.Item1
119 Dim max_anomaly = tuple.Item2
120
121 ' コンソール出力
122 Dim str_is_anomaly = If(is_anomaly, "anomaly", "normal")
123 Console.WriteLine($"{str_is_anomaly}, max_anomaly={max_anomaly}")
124 Case Else
125 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
126 End Select
127 Catch ex As CFviException
128 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
129 Console.WriteLine(ex.StackTrace)
130 Catch ex As Exception
131 Console.WriteLine($"Message={ex.Message}")
132 Console.WriteLine(ex.StackTrace)
133 End Try
134 End Sub
135
136 Private Shared Sub SimpleSampleSegmentation(modelPath As String, imagePath As String)
137 Try
138 Dim has_license = PDL.Model.CheckLicense()
139 If False = has_license Then
140 Throw New Exception("no license")
141 End If
142
143 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
144 Dim model As Model = New Model(modelPath)
145
146 ' 推論対象画像の読込
147 Dim image As CFviImage = New CFviImage(imagePath)
148
149 ' モデルの推論バックエンドの確認
150 Console.WriteLine($"backend: {model.ModelBackend}")
151
152 ' 推論対象画像の有効性確認
153 Dim is_valid_img = model.IsValidImage(image)
154 If False = is_valid_img Then
155 Throw New Exception("invalid image")
156 End If
157
158 Select Case model.ModelCategory
159 Case ModelCategory.SemanticSegmentation ' セマンティックセグメンテーション
160 ' 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
161 Dim category_masks = New Dictionary(Of UInteger, CFviImage)()
162 category_masks.Add(1, New CFviImage(image.HorzSize, image.VertSize, ImageType.BIN, 1)) ' 0 は背景なので、1 が最初のカテゴリ ( ラベル )
163 category_masks.Add(2, New CFviImage()) ' ペアとなる値には画像サイズやチャネル数、型の異なる画像を入力することが可能 ( 内部で自動調整されるため )
164 category_masks.Add(5, New CFviImage()) ' 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
165
166 ' 推論実行
167 Dim segm_result_image = model.PredictSemanticSegmentation(image, category_masks)
168 'var segm_result_image = model.PredictSemanticSegmentation(image);
169
170 ' ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
171 For Each kv In category_masks
172 Dim category_id = kv.Key
173 Dim category_image = kv.Value
174 Dim region = New CFviRegion(category_image)
175 Console.WriteLine($"No.{category_id}: area={region.Area}")
176 Next
177 Case ModelCategory.PanopticSegmentation
178 ' パノプティックセグメンテーション固有の検出パラメータの設定 ( ここではデフォルト値と同じ値を設定 )
179 model.SetPanopticSegmentationParams(1024, 0.1, 32, 0)
180
181 ' 検出結果の領域を表す二値画像を取得したいカテゴリ ( ラベル ) の番号をキーに持つ辞書
182 Dim category_masks = New Dictionary(Of UInteger, List(Of CFviImage))()
183 category_masks.Add(1, New List(Of CFviImage)()) ' 0 は背景なので、1 が最初のカテゴリ ( ラベル )
184 category_masks.Add(2, New List(Of CFviImage)() From {
185 New CFviImage()
186 }) ' ペアとなる値のリストには既に画像が存在しているリストを入力することも可能 ( 内部でリストはクリアされるため )
187 category_masks.Add(5, New List(Of CFviImage)()) ' 連番でなくても良いので、必要なカテゴリ ( ラベル ) のみを指定することが可能
188
189 ' 推論実行
190 Dim segm_result_image = model.PredictPanopticSegmentation(image, category_masks)
191 'var segm_result_image = model.PredictPanopticSegmentation(image);
192
193 ' ここでは単に各カテゴリの二値画像をリージョンに変換して領域の面積のみを表示
194 For Each kv In category_masks
195 Dim category_id = kv.Key
196 Dim mask_images = kv.Value
197 For i = 0 To mask_images.Count - 1
198 Dim region = New CFviRegion(mask_images(i))
199 Console.WriteLine($"category={category_id}: no.={i}, area={region.Area}")
200 Next
201 Next
202
203 Case Else
204 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
205 End Select
206 Catch ex As CFviException
207 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
208 Console.WriteLine(ex.StackTrace)
209 Catch ex As Exception
210 Console.WriteLine($"Message={ex.Message}")
211 Console.WriteLine(ex.StackTrace)
212 End Try
213 End Sub
214 End Class
215End 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.