2using System.Collections.Generic;
5using System.Threading.Tasks;
12 public partial class Program
14 static void ChangeOVDevice(String modelPath, String imagePath)
19 if (
false == has_license) {
throw new Exception(
"no license"); }
29 Console.WriteLine($
"backend: {model.ModelBackend}");
34 Console.WriteLine(
"not support device-change");
39 CFviImage image =
new CFviImage(imagePath);
42 List<CFviImage> images =
null;
54 if (
false == is_valid_img) {
throw new Exception(
"invalid image"); }
60 images =
new List<CFviImage>();
61 for (var i_image = 0; i_image < model.
NumViews; i_image++)
66 if (
false == is_valid_img) {
throw new Exception(
"invalid image"); }
70 default:
throw new NotImplementedException($
"unmatch model-category={model.ModelCategory}");
78 System.Diagnostics.Stopwatch sw =
new System.Diagnostics.Stopwatch();
87 for (var i = 0; i < 2; i++)
89 var is_sw_enable = (1 == i);
91 if (is_sw_enable) { sw.Start(); }
103 var threshold = 10.0;
116 var threshold = 10.0;
131 default:
throw new NotImplementedException($
"unmatch model-category={model.ModelCategory}");
133 if (!is_sw_enable) {
continue; }
137 Console.WriteLine($
"device={device}: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
141 catch (CFviException ex)
143 Console.WriteLine($
"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
144 Console.WriteLine(ex.StackTrace);
148 Console.WriteLine($
"Message={ex.Message}");
149 Console.WriteLine(ex.StackTrace);
153 static void SaveOptimizedModel(String loadModelPath, String saveModelPath)
158 if (
false == has_license) {
throw new Exception(
"no license"); }
164 Console.WriteLine($
"backend: {model.ModelBackend}");
169 Console.WriteLine(
"not support optimized-model-save");
177 var sw =
new System.Diagnostics.Stopwatch();
183 Console.WriteLine($
"original model: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
189 Console.WriteLine($
"optimized model: {(Double)sw.ElapsedTicks / (Double)System.Diagnostics.Stopwatch.Frequency * 1000}msec");
191 catch (CFviException ex)
193 Console.WriteLine($
"ErrorCode={ex.ErrorCode}, Message={ex.Message}");
194 Console.WriteLine(ex.StackTrace);
198 Console.WriteLine($
"Message={ex.Message}");
199 Console.WriteLine(ex.StackTrace);
推論するモデルを扱うクラス
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
2Imports System.Collections.Generic
8 Public Partial Class Program
9 Private Shared Sub ChangeOVDevice(modelPath As String, imagePath As String)
11 Dim has_license = PDL.Model.CheckLicense()
12 If False = has_license Then
13 Throw New Exception("no license")
20 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
21 Dim model As Model = New Model(modelPath)
24 Console.WriteLine($"backend: {model.ModelBackend}")
26 ' デバイス変更は CPU 推論のみの対応なので、それ以外であれば抜ける
27 If ModelBackend.OpenVINO <> model.ModelBackend Then
28 Console.WriteLine("not support device-change")
33 Dim image As CFviImage = New CFviImage(imagePath)
36 Dim images As List(Of CFviImage) = Nothing
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")
46 Case ModelCategory.MultiViewCNN, ModelCategory.MultiViewAD
47 images = New List(Of CFviImage)()
48 For i_image = 0 To model.NumViews - 1
51 Dim is_valid_img = model.IsValidImages(images)
52 If False = is_valid_img Then
53 Throw New Exception("invalid image")
57 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
61 ' CPU 推論のデバイスを切り替えて実行、処理速度を出力
65 Dim sw As Stopwatch = New Stopwatch()
67 ' 列挙体に定義された全てのデバイスを切り替え
68 For Each device As OVDevice In [Enum].GetValues(GetType(OVDevice))
69 ' モデル読み込み時にデバイスを選択: 読み込み済みのもののデバイスのみを変更することはできない
70 model.LoadModel(modelPath, device)
72 ' 種別にあわせた実行と処理時間の計測: 初回は遅いので空打ちして 2 回目を計測
74 Dim is_sw_enable = 1 = i
79 Select Case model.ModelCategory
80 Case ModelCategory.Classification ' 画像分類
82 Dim scores = model.PredictClassification(image)
83 Case ModelCategory.AnomalyDetection ' アノマリー検出
84 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
86 Dim tuple = model.PredictAnomaly(image, threshold)
87 Case ModelCategory.MultiViewCNN ' 多視点画像分類
89 Dim scores = model.PredictMultiViewCNN(images)
90 Case ModelCategory.MultiViewAD ' 多視点アノマリー検出
91 ' 閾値を任意に設定して推論実行 ( double から float キャストに注意 )
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)
99 Throw New NotImplementedException($"unmatch model-category={model.ModelCategory}")
101 If Not is_sw_enable Then
107 Console.WriteLine($"device={device}: {sw.ElapsedTicks / Stopwatch.Frequency * 1000}msec")
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)
119 Private Shared Sub SaveOptimizedModel(loadModelPath As String, saveModelPath As String)
121 Dim has_license = PDL.Model.CheckLicense()
122 If False = has_license Then
123 Throw New Exception("no license")
126 ' モデルファイルの読込を含むコンストラクタ ( インスタンスを作成して LoadModel() をする場合と同等 )
127 Dim model As Model = New Model(loadModelPath)
130 Console.WriteLine($"backend: {model.ModelBackend}")
132 ' 動作環境に最適化されたモデルを保存する機能はは GPU 推論のみの対応なので、それ以外であれば抜ける
133 If ModelBackend.TensorRT <> model.ModelBackend Then
134 Console.WriteLine("not support optimized-model-save")
138 ' 読み込み済み ( 動作環境に最適化された ) モデルの保存
139 model.SaveOptimizedModel(saveModelPath)
142 Dim sw = New Stopwatch()
146 model.LoadModel(loadModelPath)
148 Console.WriteLine($"original model: {sw.ElapsedTicks / Stopwatch.Frequency * 1000}msec")
150 ' 最適化済みとして保存したモデルファイル
152 model.LoadModel(saveModelPath)
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)