88using System . Collections . Generic ;
99using System . IO ;
1010using System . Linq ;
11+ using System . Runtime . CompilerServices ;
1112using System . Threading ;
1213using System . Threading . Tasks ;
1314
@@ -58,29 +59,9 @@ public async Task UnloadAsync()
5859 public async Task < OnnxImage > RunAsync ( OnnxImage inputImage , CancellationToken cancellationToken = default )
5960 {
6061 var timestamp = _logger ? . LogBegin ( "Extracting image feature..." ) ;
61- var controlImage = await inputImage . GetImageTensorAsync ( _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize , ImageNormalizeType . ZeroToOne ) ;
62- var metadata = await _featureExtractorModel . GetMetadataAsync ( ) ;
63- cancellationToken . ThrowIfCancellationRequested ( ) ;
64- using ( var inferenceParameters = new OnnxInferenceParameters ( metadata ) )
65- {
66- inferenceParameters . AddInputTensor ( controlImage ) ;
67- inferenceParameters . AddOutputBuffer ( new [ ] { 1 , _featureExtractorModel . Channels , _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize } ) ;
68-
69- var results = await _featureExtractorModel . RunInferenceAsync ( inferenceParameters ) ;
70- using ( var result = results . First ( ) )
71- {
72- cancellationToken . ThrowIfCancellationRequested ( ) ;
73-
74- var resultTensor = result . ToDenseTensor ( ) ;
75- if ( _featureExtractorModel . Normalize )
76- resultTensor . NormalizeMinMax ( ) ;
77-
78- var maskImage = resultTensor . ToImageMask ( ) ;
79- //await maskImage.SaveAsPngAsync("D:\\Mask.png");
80- _logger ? . LogEnd ( "Extracting image feature complete." , timestamp ) ;
81- return maskImage ;
82- }
83- }
62+ var result = await RunInternalAsync ( inputImage , cancellationToken ) ;
63+ _logger ? . LogEnd ( "Extracting image feature complete." , timestamp ) ;
64+ return result ;
8465 }
8566
8667
@@ -92,34 +73,61 @@ public async Task<OnnxImage> RunAsync(OnnxImage inputImage, CancellationToken ca
9273 public async Task < OnnxVideo > RunAsync ( OnnxVideo video , CancellationToken cancellationToken = default )
9374 {
9475 var timestamp = _logger ? . LogBegin ( "Extracting video features..." ) ;
76+ var featureFrames = new List < OnnxImage > ( ) ;
77+ foreach ( var videoFrame in video . Frames )
78+ {
79+ featureFrames . Add ( await RunAsync ( videoFrame , cancellationToken ) ) ;
80+ }
81+ _logger ? . LogEnd ( "Extracting video features complete." , timestamp ) ;
82+ return new OnnxVideo ( video . Info , featureFrames ) ;
83+ }
84+
85+
86+ /// <summary>
87+ /// Generates the feature extractor video stream
88+ /// </summary>
89+ /// <param name="imageFrames">The image frames.</param>
90+ /// <param name="cancellationToken">The cancellation token.</param>
91+ /// <returns></returns>
92+ public async IAsyncEnumerable < OnnxImage > RunAsync ( IAsyncEnumerable < OnnxImage > imageFrames , [ EnumeratorCancellation ] CancellationToken cancellationToken = default )
93+ {
94+ var timestamp = _logger ? . LogBegin ( "Extracting video stream features..." ) ;
95+ await foreach ( var imageFrame in imageFrames )
96+ {
97+ yield return await RunInternalAsync ( imageFrame , cancellationToken ) ;
98+ }
99+ _logger ? . LogEnd ( "Extracting video stream features complete." , timestamp ) ;
100+ }
101+
102+
103+ /// <summary>
104+ /// Runs the pipeline
105+ /// </summary>
106+ /// <param name="inputImage">The input image.</param>
107+ /// <param name="cancellationToken">The cancellation token.</param>
108+ /// <returns></returns>
109+ private async Task < OnnxImage > RunInternalAsync ( OnnxImage inputImage , CancellationToken cancellationToken = default )
110+ {
111+ var controlImage = await inputImage . GetImageTensorAsync ( _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize , ImageNormalizeType . ZeroToOne ) ;
95112 var metadata = await _featureExtractorModel . GetMetadataAsync ( ) ;
96113 cancellationToken . ThrowIfCancellationRequested ( ) ;
97-
98- var frames = new List < OnnxImage > ( ) ;
99- foreach ( var videoFrame in video . Frames )
114+ using ( var inferenceParameters = new OnnxInferenceParameters ( metadata ) )
100115 {
101- var controlImage = await videoFrame . GetImageTensorAsync ( _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize , ImageNormalizeType . ZeroToOne ) ;
102- using ( var inferenceParameters = new OnnxInferenceParameters ( metadata ) )
103- {
104- inferenceParameters . AddInputTensor ( controlImage ) ;
105- inferenceParameters . AddOutputBuffer ( new [ ] { 1 , _featureExtractorModel . Channels , _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize } ) ;
116+ inferenceParameters . AddInputTensor ( controlImage ) ;
117+ inferenceParameters . AddOutputBuffer ( new [ ] { 1 , _featureExtractorModel . Channels , _featureExtractorModel . SampleSize , _featureExtractorModel . SampleSize } ) ;
106118
107- var results = await _featureExtractorModel . RunInferenceAsync ( inferenceParameters ) ;
108- using ( var result = results . First ( ) )
109- {
110- cancellationToken . ThrowIfCancellationRequested ( ) ;
119+ var results = await _featureExtractorModel . RunInferenceAsync ( inferenceParameters ) ;
120+ using ( var result = results . First ( ) )
121+ {
122+ cancellationToken . ThrowIfCancellationRequested ( ) ;
111123
112- var resultTensor = result . ToDenseTensor ( ) ;
113- if ( _featureExtractorModel . Normalize )
114- resultTensor . NormalizeMinMax ( ) ;
124+ var resultTensor = result . ToDenseTensor ( ) ;
125+ if ( _featureExtractorModel . Normalize )
126+ resultTensor . NormalizeMinMax ( ) ;
115127
116- var maskImage = resultTensor . ToImageMask ( ) ;
117- frames . Add ( maskImage ) ;
118- }
128+ return resultTensor . ToImageMask ( ) ;
119129 }
120130 }
121- _logger ? . LogEnd ( "Extracting video features complete." , timestamp ) ;
122- return new OnnxVideo ( video . Info , frames ) ;
123131 }
124132
125133
0 commit comments