@@ -11,12 +11,16 @@ namespace YoloV5
11
11
internal class Program
12
12
{
13
13
14
- #if YOLOV5_V60
14
+ #region Fields
15
+
16
+ #if YOLOV5_V60 || YOLOV5_V62
15
17
private const int MaxStride = 64 ;
16
18
#else
17
19
private const int MaxStride = 32 ;
18
20
#endif
19
21
22
+ #endregion
23
+
20
24
private sealed class YoloV5Focus : CustomLayer
21
25
{
22
26
@@ -38,12 +42,13 @@ protected override unsafe int OnForward(Mat bottomBlob, Mat topBlob, Option opt)
38
42
topBlob . Create ( outW , outH , outC , 4u , 1 , opt . BlobAllocator ) ;
39
43
if ( topBlob . IsEmpty )
40
44
return - 100 ;
41
-
45
+
46
+ // ToDo: parallel
42
47
for ( var p = 0 ; p < outC ; p ++ )
43
48
{
44
49
using var bottom = bottomBlob . Channel ( p % channels ) ;
45
50
using var top = topBlob . Channel ( p ) ;
46
- var ptr = ( float * ) ( bottom . Row ( ( p / channels ) % 2 ) . Data + ( ( p / channels ) / 2 ) ) ;
51
+ var ptr = ( float * ) ( bottom . Row ( ( p / channels ) % 2 ) . Data ) + ( ( p / channels ) / 2 ) ;
47
52
var outPtr = ( float * ) top . Data ;
48
53
49
54
for ( var i = 0 ; i < outH ; i ++ )
@@ -90,14 +95,14 @@ private static int Main(string[] args)
90
95
return - 1 ;
91
96
}
92
97
93
- if ( Ncnn . IsSupportVulkan )
94
- Ncnn . CreateGpuInstance ( ) ;
98
+ // if (Ncnn.IsSupportVulkan)
99
+ // Ncnn.CreateGpuInstance();
95
100
96
101
var objects = new List < Object > ( ) ;
97
102
DetectYoloV5 ( m , objects ) ;
98
103
99
- if ( Ncnn . IsSupportVulkan )
100
- Ncnn . DestroyGpuInstance ( ) ;
104
+ // if (Ncnn.IsSupportVulkan)
105
+ // Ncnn.DestroyGpuInstance();
101
106
102
107
DrawObjects ( m , objects ) ;
103
108
}
@@ -223,61 +228,61 @@ private static void GenerateProposals(Mat anchors, int stride, Mat inPad, Mat fe
223
228
for ( var j = 0 ; j < numGridX ; j ++ )
224
229
{
225
230
var featPtr = feat . Row ( i * numGridX + j ) ;
226
-
227
- // find class index with max class score
228
- var classIndex = 0 ;
229
- var classScore = - float . MaxValue ;
230
- for ( var k = 0 ; k < numClass ; k ++ )
231
+ var boxConfidence = Sigmoid ( featPtr [ 4 ] ) ;
232
+ if ( boxConfidence >= probThreshold )
231
233
{
232
- var score = featPtr [ 5 + k ] ;
233
- if ( score > classScore )
234
+ // find class index with max class score
235
+ var classIndex = 0 ;
236
+ var classScore = - float . MaxValue ;
237
+ for ( var k = 0 ; k < numClass ; k ++ )
234
238
{
235
- classIndex = k ;
236
- classScore = score ;
239
+ var score = featPtr [ 5 + k ] ;
240
+ if ( score > classScore )
241
+ {
242
+ classIndex = k ;
243
+ classScore = score ;
244
+ }
237
245
}
238
- }
239
-
240
- var box_score = featPtr [ 4 ] ;
241
246
242
- var confidence = Sigmoid ( box_score ) * Sigmoid ( classScore ) ;
243
-
244
- if ( confidence >= probThreshold )
245
- {
246
- // yolov5/models/yolo.py Detect forward
247
- // y = x[i].Sigmoid()
248
- // y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i].to(x[i].device)) * self.stride[i] # xy
249
- // y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
247
+ var confidence = boxConfidence * Sigmoid ( classScore ) ;
248
+ if ( confidence >= probThreshold )
249
+ {
250
+ // yolov5/models/yolo.py Detect forward
251
+ // y = x[i].Sigmoid()
252
+ // y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i].to(x[i].device)) * self.stride[i] # xy
253
+ // y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
250
254
251
- var dx = Sigmoid ( featPtr [ 0 ] ) ;
252
- var dy = Sigmoid ( featPtr [ 1 ] ) ;
253
- var dw = Sigmoid ( featPtr [ 2 ] ) ;
254
- var dh = Sigmoid ( featPtr [ 3 ] ) ;
255
+ var dx = Sigmoid ( featPtr [ 0 ] ) ;
256
+ var dy = Sigmoid ( featPtr [ 1 ] ) ;
257
+ var dw = Sigmoid ( featPtr [ 2 ] ) ;
258
+ var dh = Sigmoid ( featPtr [ 3 ] ) ;
255
259
256
- var pbCx = ( dx * 2.0f - 0.5f + j ) * stride ;
257
- var pbCy = ( dy * 2.0f - 0.5f + i ) * stride ;
260
+ var pbCx = ( dx * 2.0f - 0.5f + j ) * stride ;
261
+ var pbCy = ( dy * 2.0f - 0.5f + i ) * stride ;
258
262
259
- var pbW = ( float ) Math . Pow ( dw * 2.0f , 2 ) * anchorW ;
260
- var pbH = ( float ) Math . Pow ( dh * 2.0f , 2 ) * anchorH ;
263
+ var pbW = ( float ) Math . Pow ( dw * 2.0f , 2 ) * anchorW ;
264
+ var pbH = ( float ) Math . Pow ( dh * 2.0f , 2 ) * anchorH ;
261
265
262
- var x0 = pbCx - pbW * 0.5f ;
263
- var y0 = pbCy - pbH * 0.5f ;
264
- var x1 = pbCx + pbW * 0.5f ;
265
- var y1 = pbCy + pbH * 0.5f ;
266
+ var x0 = pbCx - pbW * 0.5f ;
267
+ var y0 = pbCy - pbH * 0.5f ;
268
+ var x1 = pbCx + pbW * 0.5f ;
269
+ var y1 = pbCy + pbH * 0.5f ;
266
270
267
- var obj = new Object
268
- {
269
- Rect =
271
+ var obj = new Object
272
+ {
273
+ Rect =
270
274
{
271
275
X = x0 ,
272
276
Y = y0 ,
273
277
Width = x1 - x0 ,
274
278
Height = y1 - y0
275
279
} ,
276
- Label = classIndex ,
277
- Prob = confidence
278
- } ;
280
+ Label = classIndex ,
281
+ Prob = confidence
282
+ } ;
279
283
280
- objects . Add ( obj ) ;
284
+ objects . Add ( obj ) ;
285
+ }
281
286
}
282
287
}
283
288
}
@@ -294,7 +299,10 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
294
299
295
300
// original pretrained model from https://github.com/ultralytics/yolov5
296
301
// the ncnn model https://github.com/nihui/ncnn-assets/tree/master/models
297
- #if YOLOV5_V60
302
+ #if YOLOV5_V62
303
+ yolov5 . LoadParam ( "yolov5s_6.2.param" ) ;
304
+ yolov5 . LoadModel ( "yolov5s_6.2.bin" ) ;
305
+ #elif YOLOV5_V60
298
306
yolov5 . LoadParam ( "yolov5s_6.0.param" ) ;
299
307
yolov5 . LoadModel ( "yolov5s_6.0.bin" ) ;
300
308
#else
@@ -371,7 +379,9 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
371
379
// stride 16
372
380
{
373
381
using var @out = new Mat ( ) ;
374
- #if YOLOV5_V60
382
+ #if YOLOV5_V62
383
+ ex . Extract ( "353" , @out ) ;
384
+ #elif YOLOV5_V60
375
385
ex . Extract ( "376" , @out ) ;
376
386
#else
377
387
ex . Extract ( "781" , @out ) ;
@@ -394,7 +404,9 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
394
404
// stride 32
395
405
{
396
406
using var @out = new Mat ( ) ;
397
- #if YOLOV5_V60
407
+ #if YOLOV5_V62
408
+ ex . Extract ( "367" , @out ) ;
409
+ #elif YOLOV5_V60
398
410
ex . Extract ( "401" , @out ) ;
399
411
#else
400
412
ex . Extract ( "801" , @out ) ;
0 commit comments