WIL-PDL Reference ( .NET Framework ) 1.0.4-gpu
複数のモデルを並列実行するサンプルコード

複数のモデルを並列実行するサンプルコードです。

modelNamesimageSizes に指定されるモデルで iterNum 回推論を行うタスクをそれぞれ作成します。
作成したタスクたちを一斉に開始して並列実行し、すべてのタスクの完了を待ちます。


C# 版

  • ModelDirectory (L.27): モデルファイルたちが格納されたフォルダ ( 事前定義 )
  • ImageDirectory (L.28): 画像ファイルたちが格納されたフォルダ ( 事前定義 )
  • 引数 imageSizes: 画像サイズ
    • 対応する画像: test_img_{img_size}.PNGImageDirectory に格納されているものとします
    • ※ 多視点画像分類と多視点アノマリー検出では本来異なる複数枚の画像を入力しますが、ここでは簡単のため test_img_{img_size}.PNG を視点数と同じ枚数だけ複製した画像を入力します
  • 引数 modelNames: モデル名称
    • 対応するモデル: {model_name}_{img_size}.wilpdlModelDirectory に格納されているものとします
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using System.IO;
7using System.Diagnostics;
8using FVIL;
9using FVIL.Data;
10using FVIL.PDL;
11
12namespace SamplesCS
13{
14 partial class Program
15 {
16 static void UseMultiModel(List<String> modelNames, List<Int32> imageSizes, Int32 iterNum)
17 {
18 var has_license = Model.CheckLicense();
19 if (false == has_license) { throw new Exception("no license"); }
20
21 // それぞれのモデルと画像を準備してタスクのリストに格納
22 List<Task> tasks = new List<Task>();
23 foreach (var model_name in modelNames)
24 {
25 foreach (var img_size in imageSizes)
26 {
27 var model_path = Path.Combine(ModelDirectory, $"{model_name}_{img_size}.wilpdl");
28 var image_path = Path.Combine(ImageDirectory, $"test_img_{img_size}.PNG");
29
30 // 匿名関数でタスクを作成
31 var task = new Task(() =>
32 {
33 var str_id = $"{model_name}_{img_size}";
34 var sw = new Stopwatch();
35
36 // アノマリー検出のときのみ使用
37 var threshold = 10.0;
38 CFviImage anomaly_map = null;
39
40 // MVCNN のときのみ使用
41 List<CFviImage> images = null;
42
43 var contents = str_id + ", initializing...";
44 try
45 {
47 // 準備
49 Console.WriteLine(contents);
50
51 // モデルファイルの読込
52 Model model = new Model(model_path);
53
54 // 推論対象画像の読込
55 CFviImage image = new CFviImage(image_path);
56
57 // 推論対象画像の有効性確認
58 var is_valid_img = model.IsValidImage(image);
59 if (false == is_valid_img) { throw new Exception("invalid image"); }
60
61 // モデル種別に応じた準備
62 switch (model.ModelCategory)
63 {
64 case ModelCategory.Classification:
65 break;
66 case ModelCategory.AnomalyDetection:
67 anomaly_map = new CFviImage(image.HorzSize, image.VertSize, ImageType.UC8, 1);
68 break;
69 case ModelCategory.MultiViewCNN:
70 images = new List<CFviImage>();
71 for(var i_img=0; i_img < model.NumViews; i_img++)
72 {
73 images.Add(new CFviImage(image, false));
74 }
75 break;
76 case ModelCategory.MultiViewAD:
77 images = new List<CFviImage>();
78 for (var i_img = 0; i_img < model.NumViews; i_img++)
79 {
80 images.Add(new CFviImage(image, false));
81 }
82 break;
83 case ModelCategory.SemanticSegmentation:
84 case ModelCategory.PanopticSegmentation:
85 break;
86 case ModelCategory.Unknown:
87 default: throw new NotImplementedException($"unknown model-category={model.ModelCategory}");
88 }
89
91 // ループ実行開始
93
94 contents = str_id + ", start";
95 Console.WriteLine(contents);
96 // 本体
97 for (var i = 0; i < iterNum; i++)
98 {
99 contents = str_id + $", {i:000}";
100 switch (model.ModelCategory)
101 {
102 case ModelCategory.Classification:// 画像分類
103 {
104 // 計測開始
105 sw.Start();
106
107 // 推論実行
108 var scores = model.PredictClassification(image);
109
110 // 計測終了
111 sw.Stop();
112
113 // 結果の文字列
114 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
115 for (var i_score = 0; i_score < scores.Length; i_score++)
116 {
117 contents += $", {scores[i_score]}";
118 }
119 }
120 break;
121 case ModelCategory.AnomalyDetection:// アノマリー検出
122 {
123 // 計測開始
124 sw.Start();
125
126 // 推論実行
127 var tuple = model.PredictAnomaly(image, (float)threshold, anomaly_map);
128
129 // 計測終了
130 sw.Stop();
131
132 // 結果の文字列
133 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
134 contents += ", " + (tuple.Item1 ? "anomaly" : "normal") + $", {tuple.Item2}";
135 }
136 break;
137 case ModelCategory.MultiViewCNN:// 多視点画像分類
138 {
139 // 計測開始
140 sw.Start();
141
142 // 推論実行
143 var scores = model.PredictMultiViewCNN(images);
144
145 // 計測終了
146 sw.Stop();
147
148 // 結果の文字列
149 //contents += $", {sw.ElapsedMilliseconds:000}";
150 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
151 for (var i_score = 0; i_score < scores.Length; i_score++)
152 {
153 contents += $", {scores[i_score]}";
154 }
155 }
156 break;
157 case ModelCategory.MultiViewAD:// 多視点アノマリー検出
158 {
159 // 計測開始
160 sw.Start();
161
162 // 推論実行
163 var tuple = model.PredictMultiViewAD(images, (float)threshold, anomaly_map);
164
165 // 計測終了
166 sw.Stop();
167
168 // 結果の文字列
169 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
170 contents += ", " + (tuple.Item1 ? "anomaly" : "normal") + $", {tuple.Item2}";
171 }
172 break;
173 case ModelCategory.SemanticSegmentation:// セマンティックセグメンテーション
174 {
175 // 計測開始
176 sw.Start();
177
178 // 推論実行
179 var segm_result_image = model.PredictSemanticSegmentation(image);
180
181 // 計測終了
182 sw.Stop();
183
184 // 結果の文字列
185 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
186 }
187 break;
188 case ModelCategory.PanopticSegmentation:// パノプティックセグメンテーション
189 {
190 // 計測開始
191 sw.Start();
192
193 // 推論実行
194 var segm_result_image = model.PredictPanopticSegmentation(image);
195
196 // 計測終了
197 sw.Stop();
198
199 // 結果の文字列
200 contents = $"{(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}";
201 }
202 break;
203 case ModelCategory.Unknown:
204 default: throw new NotImplementedException($"unknown model-category={model.ModelCategory}");
205 }
206
207 Console.WriteLine(contents);
208 sw.Reset();
209 }
210 }
211 catch (Exception ex)
212 {
213 contents = str_id + ", error" + ex.Message;
214 Console.WriteLine(contents);
215 Console.WriteLine(ex.StackTrace);
216 return;
217 }
218
219 contents = str_id + ", finish";
220 Console.WriteLine(contents);
221 });
222
223 tasks.Add(task);
224 }
225 }
226
227 // 全てのタスクの開始
228 foreach(var task in tasks)
229 {
230 task.Start();
231 }
232 // 全てのタスクの終了待ち
233 Task.WaitAll(tasks.ToArray());
234 }
235 }
236}
推論するモデルを扱うクラス
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
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 版

  • ModelDirectory (L.22): モデルファイルたちが格納されたフォルダ ( 事前定義 )
  • ImageDirectory (L.23): 画像ファイルたちが格納されたフォルダ ( 事前定義 )
  • 引数 imageSizes: 画像サイズ
    • 対応する画像: test_img_{img_size}.PNGImageDirectory に格納されているものとします
    • ※ 多視点画像分類と多視点アノマリー検出 では本来異なる複数枚の画像を入力しますが、ここでは簡単のため test_img_{img_size}.PNG を視点数と同じ枚数だけ複製した画像を入力します
  • 引数 modelNames: モデル名称
    • 対応するモデル: {model_name}_{img_size}.wilpdlModelDirectory に格納されているものとします
1Imports System
2Imports System.Collections.Generic
3Imports System.Threading.Tasks
4Imports System.IO
5Imports System.Diagnostics
6Imports FVIL
7Imports FVIL.Data
8Imports FVIL.PDL
9
10Namespace SamplesCS
11 Partial Class Program
12 Private Shared Sub UseMultiModel(modelNames As List(Of String), imageSizes As List(Of Integer), iterNum As Integer)
13 Dim has_license = Model.CheckLicense()
14 If False = has_license Then
15 Throw New Exception("no license")
16 End If
17
18 ' それぞれのモデルと画像を準備してタスクのリストに格納
19 Dim tasks As List(Of Task) = New List(Of Task)()
20 For Each model_name In modelNames
21 For Each img_size In imageSizes
22 Dim model_path = Path.Combine(Program.ModelDirectory, $"{model_name}_{img_size}.wilpdl")
23 Dim image_path = Path.Combine(Program.ImageDirectory, $"test_img_{img_size}.PNG")
24
25 ' 匿名関数でタスクを作成
26 Dim task = New Task(Sub()
27 Dim str_id = $"{model_name}_{img_size}"
28 Dim sw = New Stopwatch()
29
30 ' アノマリー検出のときのみ使用
31 Dim threshold = 10.0
32 Dim anomaly_map As CFviImage = Nothing
33
34 ' MVCNN のときのみ使用
35 Dim images As List(Of CFviImage) = Nothing
36
37 Dim contents = str_id & ", initializing..."
38 Try
39 '''''''''''
40 ' 準備
41 '''''''''''
42 Console.WriteLine(contents)
43
44 ' モデルファイルの読込
45 Dim model As Model = New Model(model_path)
46
47 ' 推論対象画像の読込
48 Dim image As CFviImage = New CFviImage(image_path)
49
50 ' 推論対象画像の有効性確認
51 Dim is_valid_img = model.IsValidImage(image)
52 If False = is_valid_img Then
53 Throw New Exception("invalid image")
54 End If
55
56 ' モデル種別に応じた準備
57 Select Case model.ModelCategory
58 Case ModelCategory.Classification
59 Case ModelCategory.AnomalyDetection
60 anomaly_map = New CFviImage(image.HorzSize, image.VertSize, ImageType.UC8, 1)
61 Case ModelCategory.MultiViewCNN
62 images = New List(Of CFviImage)()
63 For i_img = 0 To model.NumViews - 1
64 images.Add(New CFviImage(image, False))
65 Next
66 Case ModelCategory.MultiViewAD
67 images = New List(Of CFviImage)()
68 For i_img = 0 To model.NumViews - 1
69 images.Add(New CFviImage(image, False))
70 Next
71 Case ModelCategory.SemanticSegmentation, ModelCategory.PanopticSegmentation
72 Case Else
73 Throw New NotImplementedException($"unknown model-category={model.ModelCategory}")
74 End Select
75
76 '''''''''''
77 ' ループ実行開始
78 '''''''''''
79
80 contents = str_id & ", start"
81 Console.WriteLine(contents)
82 ' 本体
83 For i = 0 To iterNum - 1
84 contents = str_id & $", {i:000}"
85 Select Case model.ModelCategory
86 Case ModelCategory.Classification ' 画像分類
87 ' 計測開始
88 sw.Start()
89
90 ' 推論実行
91 Dim scores = model.PredictClassification(image)
92
93 ' 計測終了
94 sw.Stop()
95
96 ' 結果の文字列
97 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
98 For i_score = 0 To scores.Length - 1
99 contents += $", {scores(i_score)}"
100 Next
101 Case ModelCategory.AnomalyDetection ' アノマリー検出
102 ' 計測開始
103 sw.Start()
104
105 ' 推論実行
106 Dim tuple = model.PredictAnomaly(image, threshold, anomaly_map)
107
108 ' 計測終了
109 sw.Stop()
110
111 ' 結果の文字列
112 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
113 contents += ", " & If(tuple.Item1, "anomaly", "normal") & $", {tuple.Item2}"
114 Case ModelCategory.MultiViewCNN ' 多視点画像分類
115 ' 計測開始
116 sw.Start()
117
118 ' 推論実行
119 Dim scores = model.PredictMultiViewCNN(images)
120
121 ' 計測終了
122 sw.Stop()
123
124 ' 結果の文字列
125 'contents += $", {sw.ElapsedMilliseconds:000}";
126 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
127 For i_score = 0 To scores.Length - 1
128 contents += $", {scores(i_score)}"
129 Next
130 Case ModelCategory.MultiViewAD ' 多視点アノマリー検出
131 ' 計測開始
132 sw.Start()
133
134 ' 推論実行
135 Dim tuple = model.PredictMultiViewAD(images, threshold, anomaly_map)
136
137 ' 計測終了
138 sw.Stop()
139
140 ' 結果の文字列
141 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
142 contents += ", " & If(tuple.Item1, "anomaly", "normal") & $", {tuple.Item2}"
143 Case ModelCategory.SemanticSegmentation ' セマンティックセグメンテーション
144 ' 計測開始
145 sw.Start()
146
147 ' 推論実行
148 Dim segm_result_image = model.PredictSemanticSegmentation(image)
149
150 ' 計測終了
151 sw.Stop()
152
153 ' 結果の文字列
154 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
155 Case ModelCategory.PanopticSegmentation ' パノプティックセグメンテーション
156 ' 計測開始
157 sw.Start()
158
159 ' 推論実行
160 Dim segm_result_image = model.PredictPanopticSegmentation(image)
161
162 ' 計測終了
163 sw.Stop()
164
165 ' 結果の文字列
166 contents = $"{sw.ElapsedTicks / Stopwatch.Frequency * 1000}"
167 Case Else
168 Throw New NotImplementedException($"unknown model-category={model.ModelCategory}")
169 End Select
170
171 Console.WriteLine(contents)
172 sw.Reset()
173 Next
174 Catch ex As Exception
175 contents = str_id & ", error" & ex.Message
176 Console.WriteLine(contents)
177 Console.WriteLine(ex.StackTrace)
178 Return
179 End Try
180
181 contents = str_id & ", finish"
182 Console.WriteLine(contents)
183 End Sub)
184
185 tasks.Add(task)
186 Next
187 Next
188
189 ' 全てのタスクの開始
190 For Each task In tasks
191 task.Start()
192 Next
193 ' 全てのタスクの終了待ち
194 Call Task.WaitAll(tasks.ToArray())
195 End Sub
196 End Class
197End 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.