Skip to content

Commit d7d8c6c

Browse files
0.0.0.20230101
1 parent 69a2914 commit d7d8c6c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2440
-158
lines changed

NcnnDotNet.sln

+30-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.29613.14
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.4.33110.190
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{65E02C5F-4C5C-4444-AC3C-63CBBE76C4B5}"
77
EndProject
@@ -59,6 +59,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YoloV5", "examples\YoloV5\Y
5959
EndProject
6060
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SCRFD ", "examples\SCRFD\SCRFD .csproj", "{6180B1EC-0A2F-428B-8F0B-F0E115312DA2}"
6161
EndProject
62+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YoloX", "examples\YoloX\YoloX.csproj", "{FE80D21C-6F31-45C3-9F8D-5AF536010D86}"
63+
EndProject
64+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YoloV7", "examples\YoloV7\YoloV7.csproj", "{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84}"
65+
EndProject
66+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NcnnDotNet.Extensions.Drawing", "src\NcnnDotNet.Extensions.Drawing\NcnnDotNet.Extensions.Drawing.csproj", "{E2E458FD-FC02-46CD-A5FF-48E96D31701D}"
67+
EndProject
68+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NcnnDotNet.Extensions.Drawing.Tests", "tests\NcnnDotNet.Extensions.Drawing.Tests\NcnnDotNet.Extensions.Drawing.Tests.csproj", "{29C27F58-DD9C-44AF-AB38-DDD5A6943834}"
69+
EndProject
6270
Global
6371
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6472
Debug|Any CPU = Debug|Any CPU
@@ -161,6 +169,22 @@ Global
161169
{6180B1EC-0A2F-428B-8F0B-F0E115312DA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
162170
{6180B1EC-0A2F-428B-8F0B-F0E115312DA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
163171
{6180B1EC-0A2F-428B-8F0B-F0E115312DA2}.Release|Any CPU.Build.0 = Release|Any CPU
172+
{FE80D21C-6F31-45C3-9F8D-5AF536010D86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
173+
{FE80D21C-6F31-45C3-9F8D-5AF536010D86}.Debug|Any CPU.Build.0 = Debug|Any CPU
174+
{FE80D21C-6F31-45C3-9F8D-5AF536010D86}.Release|Any CPU.ActiveCfg = Release|Any CPU
175+
{FE80D21C-6F31-45C3-9F8D-5AF536010D86}.Release|Any CPU.Build.0 = Release|Any CPU
176+
{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
177+
{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84}.Debug|Any CPU.Build.0 = Debug|Any CPU
178+
{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84}.Release|Any CPU.ActiveCfg = Release|Any CPU
179+
{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84}.Release|Any CPU.Build.0 = Release|Any CPU
180+
{E2E458FD-FC02-46CD-A5FF-48E96D31701D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
181+
{E2E458FD-FC02-46CD-A5FF-48E96D31701D}.Debug|Any CPU.Build.0 = Debug|Any CPU
182+
{E2E458FD-FC02-46CD-A5FF-48E96D31701D}.Release|Any CPU.ActiveCfg = Release|Any CPU
183+
{E2E458FD-FC02-46CD-A5FF-48E96D31701D}.Release|Any CPU.Build.0 = Release|Any CPU
184+
{29C27F58-DD9C-44AF-AB38-DDD5A6943834}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
185+
{29C27F58-DD9C-44AF-AB38-DDD5A6943834}.Debug|Any CPU.Build.0 = Debug|Any CPU
186+
{29C27F58-DD9C-44AF-AB38-DDD5A6943834}.Release|Any CPU.ActiveCfg = Release|Any CPU
187+
{29C27F58-DD9C-44AF-AB38-DDD5A6943834}.Release|Any CPU.Build.0 = Release|Any CPU
164188
EndGlobalSection
165189
GlobalSection(SolutionProperties) = preSolution
166190
HideSolutionNode = FALSE
@@ -190,6 +214,10 @@ Global
190214
{26CC3A91-3ADE-4EB7-A55F-61BD8E9A98A2} = {43124B0A-942F-479D-B5AF-B928D6FD59D7}
191215
{D1B00D23-B0AA-45B4-B222-73587BA15E1E} = {65E02C5F-4C5C-4444-AC3C-63CBBE76C4B5}
192216
{6180B1EC-0A2F-428B-8F0B-F0E115312DA2} = {65E02C5F-4C5C-4444-AC3C-63CBBE76C4B5}
217+
{FE80D21C-6F31-45C3-9F8D-5AF536010D86} = {65E02C5F-4C5C-4444-AC3C-63CBBE76C4B5}
218+
{F2B5374A-B4C8-40AC-B1D4-42C9BDC23B84} = {65E02C5F-4C5C-4444-AC3C-63CBBE76C4B5}
219+
{E2E458FD-FC02-46CD-A5FF-48E96D31701D} = {8E8E8DD9-0547-4E5E-AC68-F84FACE8C492}
220+
{29C27F58-DD9C-44AF-AB38-DDD5A6943834} = {43124B0A-942F-479D-B5AF-B928D6FD59D7}
193221
EndGlobalSection
194222
GlobalSection(ExtensibilityGlobals) = postSolution
195223
SolutionGuid = {C7789377-10BC-434A-87CC-8001AE7F93C6}

examples/WindowsDeployBinary.ps1

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Param
1919
)
2020

2121
# configuration
22-
$targetDir = "netcoreapp3.1"
22+
$targetDir = "netcoreapp2.1"
2323
$configurations =
2424
@(
2525
"Debug",
@@ -41,7 +41,9 @@ $examples =
4141
"SqueezeNetSSD",
4242
"YoloV2",
4343
"YoloV3",
44-
"YoloV5"
44+
"YoloV5",
45+
"YoloV7",
46+
"YoloX"
4547
)
4648

4749
# build path

examples/YoloV5/.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
yolov5s.bin
22
yolov5s.param
33
yolov5s_6.0.bin
4-
yolov5s_6.0.param
4+
yolov5s_6.0.param
5+
yolov5s_6.2.bin
6+
yolov5s_6.2.param

examples/YoloV5/Program.cs

+61-49
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ namespace YoloV5
1111
internal class Program
1212
{
1313

14-
#if YOLOV5_V60
14+
#region Fields
15+
16+
#if YOLOV5_V60 || YOLOV5_V62
1517
private const int MaxStride = 64;
1618
#else
1719
private const int MaxStride = 32;
1820
#endif
1921

22+
#endregion
23+
2024
private sealed class YoloV5Focus : CustomLayer
2125
{
2226

@@ -38,12 +42,13 @@ protected override unsafe int OnForward(Mat bottomBlob, Mat topBlob, Option opt)
3842
topBlob.Create(outW, outH, outC, 4u, 1, opt.BlobAllocator);
3943
if (topBlob.IsEmpty)
4044
return -100;
41-
45+
46+
// ToDo: parallel
4247
for (var p = 0; p < outC; p++)
4348
{
4449
using var bottom = bottomBlob.Channel(p % channels);
4550
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);
4752
var outPtr = (float*)top.Data;
4853

4954
for (var i = 0; i < outH; i++)
@@ -90,14 +95,14 @@ private static int Main(string[] args)
9095
return -1;
9196
}
9297

93-
if (Ncnn.IsSupportVulkan)
94-
Ncnn.CreateGpuInstance();
98+
//if (Ncnn.IsSupportVulkan)
99+
// Ncnn.CreateGpuInstance();
95100

96101
var objects = new List<Object>();
97102
DetectYoloV5(m, objects);
98103

99-
if (Ncnn.IsSupportVulkan)
100-
Ncnn.DestroyGpuInstance();
104+
//if (Ncnn.IsSupportVulkan)
105+
// Ncnn.DestroyGpuInstance();
101106

102107
DrawObjects(m, objects);
103108
}
@@ -223,61 +228,61 @@ private static void GenerateProposals(Mat anchors, int stride, Mat inPad, Mat fe
223228
for (var j = 0; j < numGridX; j++)
224229
{
225230
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)
231233
{
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++)
234238
{
235-
classIndex = k;
236-
classScore = score;
239+
var score = featPtr[5 + k];
240+
if (score > classScore)
241+
{
242+
classIndex = k;
243+
classScore = score;
244+
}
237245
}
238-
}
239-
240-
var box_score = featPtr[4];
241246

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
250254

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]);
255259

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;
258262

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;
261265

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;
266270

267-
var obj = new Object
268-
{
269-
Rect =
271+
var obj = new Object
272+
{
273+
Rect =
270274
{
271275
X = x0,
272276
Y = y0,
273277
Width = x1 - x0,
274278
Height = y1 - y0
275279
},
276-
Label = classIndex,
277-
Prob = confidence
278-
};
280+
Label = classIndex,
281+
Prob = confidence
282+
};
279283

280-
objects.Add(obj);
284+
objects.Add(obj);
285+
}
281286
}
282287
}
283288
}
@@ -294,7 +299,10 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
294299

295300
// original pretrained model from https://github.com/ultralytics/yolov5
296301
// 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
298306
yolov5.LoadParam("yolov5s_6.0.param");
299307
yolov5.LoadModel("yolov5s_6.0.bin");
300308
#else
@@ -371,7 +379,9 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
371379
// stride 16
372380
{
373381
using var @out = new Mat();
374-
#if YOLOV5_V60
382+
#if YOLOV5_V62
383+
ex.Extract("353", @out);
384+
#elif YOLOV5_V60
375385
ex.Extract("376", @out);
376386
#else
377387
ex.Extract("781", @out);
@@ -394,7 +404,9 @@ private static void DetectYoloV5(NcnnDotNet.OpenCV.Mat bgr, List<Object> objects
394404
// stride 32
395405
{
396406
using var @out = new Mat();
397-
#if YOLOV5_V60
407+
#if YOLOV5_V62
408+
ex.Extract("367", @out);
409+
#elif YOLOV5_V60
398410
ex.Extract("401", @out);
399411
#else
400412
ex.Extract("801", @out);

examples/YoloV7/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
yolov7-tiny.bin
2+
yolov7-tiny.param

examples/YoloV7/Object.cs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using NcnnDotNet.OpenCV;
2+
3+
namespace YoloV7
4+
{
5+
6+
internal sealed class Object
7+
{
8+
9+
#region Constructors
10+
11+
public Object()
12+
{
13+
this.Rect = new Rect<float>();
14+
}
15+
16+
#endregion
17+
18+
#region Properties
19+
20+
public Rect<float> Rect
21+
{
22+
get;
23+
set;
24+
}
25+
26+
public int Label
27+
{
28+
get;
29+
set;
30+
}
31+
32+
public float Prob
33+
{
34+
get;
35+
set;
36+
}
37+
38+
#endregion
39+
40+
}
41+
42+
}

0 commit comments

Comments
 (0)