WIL-PDL Reference ( .NET Framework ) 1.0.4-gpu
ユーティリティ機能のサンプルコード

ユーティリティ機能のサンプルコードです。


C# 版

  • CPU 推論のデバイス切り替え: L.14- ChangeOVDevice()
  • 読み込み済みモデルの最適化済みモデルとしての保存: L.153- SaveOptimizedModel()
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 public partial class Program
13 {
14 static void ChangeOVDevice(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
22 // 準備
24
25 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
26 Model model = new Model(modelPath);
27
28 // モデルの推論バックエンドの確認
29 Console.WriteLine($"backend: {model.ModelBackend}");
30
31 // デバイス変更は CPU 推論のみの対応なので、それ以外であれば抜ける
32 if(ModelBackend.OpenVINO != model.ModelBackend)
33 {
34 Console.WriteLine("not support device-change");
35 return;
36 }
37
38 // 推論対象画像の読込
39 CFviImage image = new CFviImage(imagePath);
40
41 // 多視点のモデルの入力画像
42 List<CFviImage> images = null;
43
44 // 推論対象画像の有効性確認
45 // 多視点の場合、入力画像配列を準備
46 switch (model.ModelCategory)
47 {
48 case ModelCategory.Classification:
49 case ModelCategory.AnomalyDetection:
50 case ModelCategory.SemanticSegmentation:
51 case ModelCategory.PanopticSegmentation:
52 {
53 var is_valid_img = model.IsValidImage(image);
54 if (false == is_valid_img) { throw new Exception("invalid image"); }
55 }
56 break;
57 case ModelCategory.MultiViewCNN:
58 case ModelCategory.MultiViewAD:
59 {
60 images = new List<CFviImage>();
61 for (var i_image = 0; i_image < model.NumViews; i_image++)
62 {
63 images.Add(image);
64 }
65 var is_valid_img = model.IsValidImages(images);
66 if (false == is_valid_img) { throw new Exception("invalid image"); }
67 }
68 break;
69 case ModelCategory.Unknown:
70 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
71 }
72
74 // CPU 推論のデバイスを切り替えて実行、処理速度を出力
76
77 // 計測用のストップウォッチ
78 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
79
80 // 列挙体に定義された全てのデバイスを切り替え
81 foreach (OVDevice device in Enum.GetValues(typeof(OVDevice)))
82 {
83 // モデル読み込み時にデバイスを選択: 読み込み済みのもののデバイスのみを変更することはできない
84 model.LoadModel(modelPath, device);
85
86 // 種別にあわせた実行と処理時間の計測: 初回は遅いので空打ちして 2 回目を計測
87 for (var i = 0; i < 2; i++)
88 {
89 var is_sw_enable = (1 == i);
90
91 if (is_sw_enable) { sw.Start(); }
92 switch (model.ModelCategory)
93 {
94 case ModelCategory.Classification:// 画像分類
95 {
96 // 推論実行
97 var scores = model.PredictClassification(image);
98 }
99 break;
100 case ModelCategory.AnomalyDetection:// アノマリー検出
101 {
102 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
103 var threshold = 10.0;
104 var tuple = model.PredictAnomaly(image, (float)threshold);
105 }
106 break;
107 case ModelCategory.MultiViewCNN:// 多視点画像分類
108 {
109 // 推論実行
110 var scores = model.PredictMultiViewCNN(images);
111 }
112 break;
113 case ModelCategory.MultiViewAD:// 多視点アノマリー検出
114 {
115 // 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
116 var threshold = 10.0;
117 var tuple = model.PredictMultiViewAD(images, (float)threshold);
118 }
119 break;
120 case ModelCategory.SemanticSegmentation:// セマンティックセグメンテーション
121 {
122 var segm_result_image = model.PredictSemanticSegmentation(image);
123 }
124 break;
125 case ModelCategory.PanopticSegmentation:
126 {
127 var segm_result_iamge = model.PredictPanopticSegmentation(image);
128 }
129 break;
130 case ModelCategory.Unknown:
131 default: throw new NotImplementedException($"unmatch model-category={model.ModelCategory}");
132 }
133 if (!is_sw_enable) { continue; }
134
135 sw.Stop();
136
137 Console.WriteLine($"device={device}: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
138 }
139 }
140 }
141 catch (CFviException ex)
142 {
143 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
144 Console.WriteLine(ex.StackTrace);
145 }
146 catch (Exception ex)
147 {
148 Console.WriteLine($"Message={ex.Message}");
149 Console.WriteLine(ex.StackTrace);
150 }
151 }
152
153 static void SaveOptimizedModel(String loadModelPath, String saveModelPath)
154 {
155 try
156 {
157 var has_license = Model.CheckLicense();
158 if (false == has_license) { throw new Exception("no license"); }
159
160 // モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
161 Model model = new Model(loadModelPath);
162
163 // モデルの推論バックエンドの確認
164 Console.WriteLine($"backend: {model.ModelBackend}");
165
166 // 動作環境に最適化されたモデルを保存する機能はは GPU 推論のみの対応なので、それ以外であれば抜ける
167 if (ModelBackend.TensorRT != model.ModelBackend)
168 {
169 Console.WriteLine("not support optimized-model-save");
170 return;
171 }
172
173 // 読み込み済み ( 動作環境に最適化された ) モデルの保存
174 model.SaveOptimizedModel(saveModelPath);
175
176 // モデル読み込み時間の比較
177 var sw = new System.Diagnostics.Stopwatch();
178
179 // 元のモデルファイル
180 sw.Start();
181 model.LoadModel(loadModelPath);
182 sw.Stop();
183 Console.WriteLine($"original model: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
184
185 // 最適化済みとして保存したモデルファイル
186 sw.Start();
187 model.LoadModel(saveModelPath);
188 sw.Stop();
189 Console.WriteLine($"optimized model: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
190 }
191 catch (CFviException ex)
192 {
193 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
194 Console.WriteLine(ex.StackTrace);
195 }
196 catch (Exception ex)
197 {
198 Console.WriteLine($"Message={ex.Message}");
199 Console.WriteLine(ex.StackTrace);
200 }
201 }
202 }
203}
推論するモデルを扱うクラス
Definition: PredictionCS.cs:146
ModelCategory ModelCategory
読み込んだモデルの種別
Definition: PredictionCS.cs:167
float[] PredictClassification(CFviImage targetImage)
推論の実行(画像分類)
Definition: PredictionCS.cs:888
Boolean IsValidImages(IEnumerable< CFviImage > targetImages)
推論画像の有効性の確認 ( 多視点版 )
Definition: PredictionCS.cs:616
Boolean IsValidImage(CFviImage targetImage)
推論画像の有効性の確認
Definition: PredictionCS.cs:571
static Boolean CheckLicense()
ライセンスを確認します。
Definition: PredictionCS.cs:321
void LoadModel(String modelPath)
モデルの読込
Definition: PredictionCS.cs:337
CFviImage PredictSemanticSegmentation(CFviImage targetImage)
推論の実行(セマンティックセグメンテーション)
Definition: PredictionCS.cs:1336
Tuple< Boolean, float > PredictMultiViewAD(IEnumerable< CFviImage > targetImages, float threshold)
推論の実行(多視点アノマリー検出)
Definition: PredictionCS.cs:1201
ModelBackend ModelBackend
読み込んだモデルの推論バックエンド
Definition: PredictionCS.cs:174
void SaveOptimizedModel(String saveModelPath)
読込中のモデルの保存
Definition: PredictionCS.cs:488
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
ModelBackend
モデルの推論バックエンド
Definition: PredictionCS.cs:55
ModelCategory
モデルの種別
Definition: PredictionCS.cs:31
OVDevice
CPU 推論のデバイス
Definition: PredictionCS.cs:76
FVILの最上位ネームスペース
Definition: PredictionCS.cs:15

VB 版

  • CPU 推論のデバイス切り替え: L.9- ChangeOVDevice()
  • 読み込み済みモデルの最適化済みモデルとしての保存: L.119- SaveOptimizedModel()
1Imports System
2Imports System.Collections.Generic
3Imports FVIL
4Imports FVIL.Data
5Imports FVIL.PDL
6
7Namespace SamplesCS
8 Public Partial Class Program
9 Private Shared Sub ChangeOVDevice(modelPath As String, imagePath As String)
10 Try
11 Dim has_license = PDL.Model.CheckLicense()
12 If False = has_license Then
13 Throw New Exception("no license")
14 End If
15
16 ''' ------------
17 ' 準備
18 ''' ------------
19
20 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
21 Dim model As Model = New Model(modelPath)
22
23 ' モデルの推論バックエンドの確認
24 Console.WriteLine($"backend: {model.ModelBackend}")
25
26 ' デバイス変更は CPU 推論のみの対応なので、それ以外であれば抜ける
27 If ModelBackend.OpenVINO <> model.ModelBackend Then
28 Console.WriteLine("not support device-change")
29 Return
30 End If
31
32 ' 推論対象画像の読込
33 Dim image As CFviImage = New CFviImage(imagePath)
34
35 ' 多視点のモデルの入力画像
36 Dim images As List(Of CFviImage) = Nothing
37
38 ' 推論対象画像の有効性確認
39 ' 多視点の場合、入力画像配列を準備
40 Select Case model.ModelCategory
41 Case ModelCategory.Classification, ModelCategory.AnomalyDetection, ModelCategory.SemanticSegmentation, ModelCategory.PanopticSegmentation
42 Dim is_valid_img = model.IsValidImage(image)
43 If False = is_valid_img Then
44 Throw New Exception("invalid image")
45 End If
46 Case ModelCategory.MultiViewCNN, ModelCategory.MultiViewAD
47 images = New List(Of CFviImage)()
48 For i_image = 0 To model.NumViews - 1
49 images.Add(image)
50 Next
51 Dim is_valid_img = model.IsValidImages(images)
52 If False = is_valid_img Then
53 Throw New Exception("invalid image")
54 End If
55
56 Case Else
57 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
58 End Select
59
60 ''' ------------
61 ' CPU 推論のデバイスを切り替えて実行、処理速度を出力
62 ''' ------------
63
64 ' 計測用のストップウォッチ
65 Dim sw As Stopwatch = New Stopwatch()
66
67 ' 列挙体に定義された全てのデバイスを切り替え
68 For Each device As OVDevice In [Enum].GetValues(GetType(OVDevice))
69 ' モデル読み込み時にデバイスを選択: 読み込み済みのもののデバイスのみを変更することはできない
70 model.LoadModel(modelPath, device)
71
72 ' 種別にあわせた実行と処理時間の計測: 初回は遅いので空打ちして 2 回目を計測
73 For i = 0 To 1
74 Dim is_sw_enable = 1 = i
75
76 If is_sw_enable Then
77 sw.Start()
78 End If
79 Select Case model.ModelCategory
80 Case ModelCategory.Classification ' 画像分類
81 ' 推論実行
82 Dim scores = model.PredictClassification(image)
83 Case ModelCategory.AnomalyDetection ' アノマリー検出
84 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
85 Dim threshold = 10.0
86 Dim tuple = model.PredictAnomaly(image, threshold)
87 Case ModelCategory.MultiViewCNN ' 多視点画像分類
88 ' 推論実行
89 Dim scores = model.PredictMultiViewCNN(images)
90 Case ModelCategory.MultiViewAD ' 多視点アノマリー検出
91 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
92 Dim threshold = 10.0
93 Dim tuple = model.PredictMultiViewAD(images, threshold)
94 Case ModelCategory.SemanticSegmentation ' セマンティックセグメンテーション
95 Dim segm_result_image = model.PredictSemanticSegmentation(image)
96 Case ModelCategory.PanopticSegmentation
97 Dim segm_result_iamge = model.PredictPanopticSegmentation(image)
98 Case Else
99 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
100 End Select
101 If Not is_sw_enable Then
102 Continue For
103 End If
104
105 sw.Stop()
106
107 Console.WriteLine($"device={device}: {sw.ElapsedTicks / Stopwatch.Frequency * 1000}msec")
108 Next
109 Next
110 Catch ex As CFviException
111 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
112 Console.WriteLine(ex.StackTrace)
113 Catch ex As Exception
114 Console.WriteLine($"Message={ex.Message}")
115 Console.WriteLine(ex.StackTrace)
116 End Try
117 End Sub
118
119 Private Shared Sub SaveOptimizedModel(loadModelPath As String, saveModelPath As String)
120 Try
121 Dim has_license = PDL.Model.CheckLicense()
122 If False = has_license Then
123 Throw New Exception("no license")
124 End If
125
126 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
127 Dim model As Model = New Model(loadModelPath)
128
129 ' モデルの推論バックエンドの確認
130 Console.WriteLine($"backend: {model.ModelBackend}")
131
132 ' 動作環境に最適化されたモデルを保存する機能はは GPU 推論のみの対応なので、それ以外であれば抜ける
133 If ModelBackend.TensorRT <> model.ModelBackend Then
134 Console.WriteLine("not support optimized-model-save")
135 Return
136 End If
137
138 ' 読み込み済み ( 動作環境に最適化された ) モデルの保存
139 model.SaveOptimizedModel(saveModelPath)
140
141 ' モデル読み込み時間の比較
142 Dim sw = New Stopwatch()
143
144 ' 元のモデルファイル
145 sw.Start()
146 model.LoadModel(loadModelPath)
147 sw.Stop()
148 Console.WriteLine($"original model: {sw.ElapsedTicks / Stopwatch.Frequency * 1000}msec")
149
150 ' 最適化済みとして保存したモデルファイル
151 sw.Start()
152 model.LoadModel(saveModelPath)
153 sw.Stop()
154 Console.WriteLine($"optimized model: {sw.ElapsedTicks / Stopwatch.Frequency * 1000}msec")
155 Catch ex As CFviException
156 Console.WriteLine($"ErrorCode={ex.ErrorCode}, Message={ex.Message}")
157 Console.WriteLine(ex.StackTrace)
158 Catch ex As Exception
159 Console.WriteLine($"Message={ex.Message}")
160 Console.WriteLine(ex.StackTrace)
161 End Try
162 End Sub
163 End Class
164End 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.