1
1
using Microsoft . Extensions . Logging ;
2
2
using Microsoft . ML . OnnxRuntime . Tensors ;
3
- using Newtonsoft . Json . Linq ;
4
3
using OnnxStack . Core ;
5
4
using OnnxStack . Core . Config ;
6
5
using OnnxStack . Core . Image ;
11
10
using System . Collections . Generic ;
12
11
using System . IO ;
13
12
using System . Linq ;
14
- using System . Numerics . Tensors ;
15
13
using System . Runtime . CompilerServices ;
16
14
using System . Threading ;
17
15
using System . Threading . Tasks ;
@@ -73,9 +71,9 @@ public async Task UnloadAsync()
73
71
/// <returns></returns>
74
72
public async Task < DenseTensor < float > > RunAsync ( DenseTensor < float > inputImage , CancellationToken cancellationToken = default )
75
73
{
76
- var timestamp = _logger ? . LogBegin ( "Upscale image .." ) ;
74
+ var timestamp = _logger ? . LogBegin ( "Upscale DenseTensor .." ) ;
77
75
var result = await UpscaleTensorAsync ( inputImage , cancellationToken ) ;
78
- _logger ? . LogEnd ( "Upscale image complete." , timestamp ) ;
76
+ _logger ? . LogEnd ( "Upscale DenseTensor complete." , timestamp ) ;
79
77
return result ;
80
78
}
81
79
@@ -88,9 +86,9 @@ public async Task<DenseTensor<float>> RunAsync(DenseTensor<float> inputImage, Ca
88
86
/// <returns></returns>
89
87
public async Task < OnnxImage > RunAsync ( OnnxImage inputImage , CancellationToken cancellationToken = default )
90
88
{
91
- var timestamp = _logger ? . LogBegin ( "Upscale image .." ) ;
89
+ var timestamp = _logger ? . LogBegin ( "Upscale OnnxImage .." ) ;
92
90
var result = await UpscaleImageAsync ( inputImage , cancellationToken ) ;
93
- _logger ? . LogEnd ( "Upscale image complete." , timestamp ) ;
91
+ _logger ? . LogEnd ( "Upscale OnnxImage complete." , timestamp ) ;
94
92
return result ;
95
93
}
96
94
@@ -103,7 +101,7 @@ public async Task<OnnxImage> RunAsync(OnnxImage inputImage, CancellationToken ca
103
101
/// <returns></returns>
104
102
public async Task < OnnxVideo > RunAsync ( OnnxVideo inputVideo , CancellationToken cancellationToken = default )
105
103
{
106
- var timestamp = _logger ? . LogBegin ( "Upscale video .." ) ;
104
+ var timestamp = _logger ? . LogBegin ( "Upscale OnnxVideo .." ) ;
107
105
var upscaledFrames = new List < OnnxImage > ( ) ;
108
106
foreach ( var videoFrame in inputVideo . Frames )
109
107
{
@@ -117,7 +115,7 @@ public async Task<OnnxVideo> RunAsync(OnnxVideo inputVideo, CancellationToken ca
117
115
Height = firstFrame . Height ,
118
116
} ;
119
117
120
- _logger ? . LogEnd ( "Upscale video complete." , timestamp ) ;
118
+ _logger ? . LogEnd ( "Upscale OnnxVideo complete." , timestamp ) ;
121
119
return new OnnxVideo ( videoInfo , upscaledFrames ) ;
122
120
}
123
121
@@ -130,16 +128,15 @@ public async Task<OnnxVideo> RunAsync(OnnxVideo inputVideo, CancellationToken ca
130
128
/// <returns></returns>
131
129
public async IAsyncEnumerable < OnnxImage > RunAsync ( IAsyncEnumerable < OnnxImage > imageFrames , [ EnumeratorCancellation ] CancellationToken cancellationToken = default )
132
130
{
133
- var timestamp = _logger ? . LogBegin ( "Upscale video stream.." ) ;
131
+ var timestamp = _logger ? . LogBegin ( "Upscale OnnxImage stream.." ) ;
134
132
await foreach ( var imageFrame in imageFrames )
135
133
{
136
134
yield return await UpscaleImageAsync ( imageFrame , cancellationToken ) ;
137
135
}
138
- _logger ? . LogEnd ( "Upscale video stream complete." , timestamp ) ;
136
+ _logger ? . LogEnd ( "Upscale OnnxImage stream complete." , timestamp ) ;
139
137
}
140
138
141
139
142
-
143
140
/// <summary>
144
141
/// Upscales the OnnxImage.
145
142
/// </summary>
@@ -149,23 +146,25 @@ public async IAsyncEnumerable<OnnxImage> RunAsync(IAsyncEnumerable<OnnxImage> im
149
146
private async Task < OnnxImage > UpscaleImageAsync ( OnnxImage inputImage , CancellationToken cancellationToken = default )
150
147
{
151
148
var inputTensor = inputImage . GetImageTensor ( _upscaleModel . NormalizeType , _upscaleModel . Channels ) ;
152
- var outputTensor = await RunInternalAsync ( inputTensor , cancellationToken ) ;
149
+ var outputTensor = await RunInternalAsync ( inputTensor , inputImage . Height , inputImage . Width , cancellationToken ) ;
153
150
return new OnnxImage ( outputTensor , _upscaleModel . NormalizeType ) ;
154
151
}
155
152
156
153
157
154
/// <summary>
158
155
/// Upscales the DenseTensor
159
156
/// </summary>
160
- /// <param name="inputImage ">The input image .</param>
157
+ /// <param name="inputTensor ">The input Tensor .</param>
161
158
/// <param name="cancellationToken">The cancellation token.</param>
162
159
/// <returns></returns>
163
- public async Task < DenseTensor < float > > UpscaleTensorAsync ( DenseTensor < float > inputImage , CancellationToken cancellationToken = default )
160
+ public async Task < DenseTensor < float > > UpscaleTensorAsync ( DenseTensor < float > inputTensor , CancellationToken cancellationToken = default )
164
161
{
165
162
if ( _upscaleModel . NormalizeInput && _upscaleModel . NormalizeType == ImageNormalizeType . ZeroToOne )
166
- inputImage . NormalizeOneOneToZeroOne ( ) ;
163
+ inputTensor . NormalizeOneOneToZeroOne ( ) ;
167
164
168
- var result = await RunInternalAsync ( inputImage , cancellationToken ) ;
165
+ var height = inputTensor . Dimensions [ 2 ] ;
166
+ var width = inputTensor . Dimensions [ 3 ] ;
167
+ var result = await RunInternalAsync ( inputTensor , height , width , cancellationToken ) ;
169
168
170
169
if ( _upscaleModel . NormalizeInput && _upscaleModel . NormalizeType == ImageNormalizeType . ZeroToOne )
171
170
result . NormalizeZeroOneToOneOne ( ) ;
@@ -180,9 +179,9 @@ public async Task<DenseTensor<float>> UpscaleTensorAsync(DenseTensor<float> inpu
180
179
/// <param name="inputTensor">The input tensor.</param>
181
180
/// <param name="cancellationToken">The cancellation token.</param>
182
181
/// <returns></returns>
183
- private async Task < DenseTensor < float > > RunInternalAsync ( DenseTensor < float > inputTensor , CancellationToken cancellationToken = default )
182
+ private async Task < DenseTensor < float > > RunInternalAsync ( DenseTensor < float > inputTensor , int height , int width , CancellationToken cancellationToken = default )
184
183
{
185
- if ( inputTensor . Dimensions [ 2 ] <= _upscaleModel . TileSize && inputTensor . Dimensions [ 3 ] <= _upscaleModel . TileSize )
184
+ if ( height <= _upscaleModel . TileSize && width <= _upscaleModel . TileSize )
186
185
{
187
186
return await RunInferenceAsync ( inputTensor , cancellationToken ) ;
188
187
}
@@ -193,10 +192,10 @@ private async Task<DenseTensor<float>> RunInternalAsync(DenseTensor<float> input
193
192
inputTiles . Width * _upscaleModel . ScaleFactor ,
194
193
inputTiles . Height * _upscaleModel . ScaleFactor ,
195
194
inputTiles . Overlap * _upscaleModel . ScaleFactor ,
196
- await RunInternalAsync ( inputTiles . Tile1 , cancellationToken ) ,
197
- await RunInternalAsync ( inputTiles . Tile2 , cancellationToken ) ,
198
- await RunInternalAsync ( inputTiles . Tile3 , cancellationToken ) ,
199
- await RunInternalAsync ( inputTiles . Tile4 , cancellationToken )
195
+ await RunInternalAsync ( inputTiles . Tile1 , inputTiles . Height , inputTiles . Width , cancellationToken ) ,
196
+ await RunInternalAsync ( inputTiles . Tile2 , inputTiles . Height , inputTiles . Width , cancellationToken ) ,
197
+ await RunInternalAsync ( inputTiles . Tile3 , inputTiles . Height , inputTiles . Width , cancellationToken ) ,
198
+ await RunInternalAsync ( inputTiles . Tile4 , inputTiles . Height , inputTiles . Width , cancellationToken )
200
199
) ;
201
200
return outputTiles . JoinImageTiles ( ) ;
202
201
}
0 commit comments