From 611134d8550acdca74e50a387e34568d08b0a9d3 Mon Sep 17 00:00:00 2001 From: Takuya Takeuchi Date: Sat, 28 Nov 2020 23:36:31 +0900 Subject: [PATCH 1/6] Add ASP.NET example (#225) * Add ASP.NET server app * Add client app to communicate with server app --- DlibDotNet.sln | 45 +++++++++- .../ASP.NET/FaceDetection.Client/.gitignore | 3 + .../FaceDetection.Client.csproj | 23 +++++ .../ASP.NET/FaceDetection.Client/Program.cs | 71 +++++++++++++++ .../UpdateApiDefinition.ps1 | 68 ++++++++++++++ .../.config/dotnet-tools.json | 12 +++ .../Controllers/FaceDetectionController.cs | 85 ++++++++++++++++++ .../FaceDetection.Server.csproj | 27 ++++++ .../FaceDetection.Server.xml | 53 +++++++++++ .../FaceDetection.Server/Models/FaceArea.cs | 52 +++++++++++ .../FaceDetection.Server/Models/Image.cs | 28 ++++++ .../ASP.NET/FaceDetection.Server/Program.cs | 34 +++++++ .../ASP.NET/FaceDetection.Server/Startup.cs | 75 ++++++++++++++++ .../appsettings.Development.json | 9 ++ .../FaceDetection.Server/appsettings.json | 10 +++ .../FaceDetection.Server/images/swagger.png | Bin 0 -> 60398 bytes examples/ASP.NET/README.md | 48 ++++++++++ 17 files changed, 641 insertions(+), 2 deletions(-) create mode 100644 examples/ASP.NET/FaceDetection.Client/.gitignore create mode 100644 examples/ASP.NET/FaceDetection.Client/FaceDetection.Client.csproj create mode 100644 examples/ASP.NET/FaceDetection.Client/Program.cs create mode 100644 examples/ASP.NET/FaceDetection.Client/UpdateApiDefinition.ps1 create mode 100644 examples/ASP.NET/FaceDetection.Server/.config/dotnet-tools.json create mode 100644 examples/ASP.NET/FaceDetection.Server/Controllers/FaceDetectionController.cs create mode 100644 examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.csproj create mode 100644 examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.xml create mode 100644 examples/ASP.NET/FaceDetection.Server/Models/FaceArea.cs create mode 100644 examples/ASP.NET/FaceDetection.Server/Models/Image.cs create mode 100644 examples/ASP.NET/FaceDetection.Server/Program.cs create mode 100644 examples/ASP.NET/FaceDetection.Server/Startup.cs create mode 100644 examples/ASP.NET/FaceDetection.Server/appsettings.Development.json create mode 100644 examples/ASP.NET/FaceDetection.Server/appsettings.json create mode 100644 examples/ASP.NET/FaceDetection.Server/images/swagger.png create mode 100644 examples/ASP.NET/README.md diff --git a/DlibDotNet.sln b/DlibDotNet.sln index ea773eca..e957d763 100644 --- a/DlibDotNet.sln +++ b/DlibDotNet.sln @@ -39,7 +39,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "3DPointCloud", "examples\3D EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Surf", "examples\Surf\Surf.csproj", "{6E027771-5500-4555-822C-C7FE6AC8709D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DlibDotNet.Extensions", "src\DlibDotNet.Extensions\DlibDotNet.Extensions.csproj", "{D3BFF103-53CB-46DC-A0E8-05A01E11099B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DlibDotNet.Extensions", "src\DlibDotNet.Extensions\DlibDotNet.Extensions.csproj", "{D3BFF103-53CB-46DC-A0E8-05A01E11099B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinForms", "WinForms", "{4082257D-FC8E-4D37-8489-89AAFC9D4A38}" EndProject @@ -53,7 +53,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceLandmarkDetection", "ex EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceLandmarkDetection", "examples\WPF\FaceLandmarkDetection\FaceLandmarkDetection.csproj", "{9575AC94-3760-483F-9403-A77E7CFE8F47}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DlibDotNet.Extensions.Tests", "test\DlibDotNet.Extensions.Tests\DlibDotNet.Extensions.Tests.csproj", "{2A75C8B3-5122-4E7E-A0CF-A0AD5FFA60B2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DlibDotNet.Extensions.Tests", "test\DlibDotNet.Extensions.Tests\DlibDotNet.Extensions.Tests.csproj", "{2A75C8B3-5122-4E7E-A0CF-A0AD5FFA60B2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DnnFaceRecognition", "examples\DnnFaceRecognition\DnnFaceRecognition.csproj", "{C6EFE2AC-63BD-4574-B4A1-9AC80CA5AD2E}" EndProject @@ -141,6 +141,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Svm", "examples\Svm\Svm.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SvmPegasos", "examples\SvmPegasos\SvmPegasos.csproj", "{BF95F4C0-67F0-426A-945C-DD38348F4A4C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASP.NET", "ASP.NET", "{D2D6D0D7-7544-4730-A34E-DAE2588B55D8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FaceDetection.Client", "examples\ASP.NET\FaceDetection.Client\FaceDetection.Client.csproj", "{EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FaceDetection.Server", "examples\ASP.NET\FaceDetection.Server\FaceDetection.Server.csproj", "{DCD4F84F-91D6-4936-AD45-890127D9EF54}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1085,6 +1091,38 @@ Global {BF95F4C0-67F0-426A-945C-DD38348F4A4C}.Release|x64.Build.0 = Release|Any CPU {BF95F4C0-67F0-426A-945C-DD38348F4A4C}.Release|x86.ActiveCfg = Release|Any CPU {BF95F4C0-67F0-426A-945C-DD38348F4A4C}.Release|x86.Build.0 = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|ARM.ActiveCfg = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|ARM.Build.0 = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|x64.ActiveCfg = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|x64.Build.0 = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|x86.ActiveCfg = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Debug|x86.Build.0 = Debug|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|Any CPU.Build.0 = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|ARM.ActiveCfg = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|ARM.Build.0 = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|x64.ActiveCfg = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|x64.Build.0 = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|x86.ActiveCfg = Release|Any CPU + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37}.Release|x86.Build.0 = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|ARM.ActiveCfg = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|ARM.Build.0 = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|x64.ActiveCfg = Debug|x64 + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|x64.Build.0 = Debug|x64 + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|x86.ActiveCfg = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Debug|x86.Build.0 = Debug|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|Any CPU.Build.0 = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|ARM.ActiveCfg = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|ARM.Build.0 = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|x64.ActiveCfg = Release|x64 + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|x64.Build.0 = Release|x64 + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|x86.ActiveCfg = Release|Any CPU + {DCD4F84F-91D6-4936-AD45-890127D9EF54}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1154,6 +1192,9 @@ Global {F5C085BB-3525-40B5-B619-74BC2C229104} = {19C83FDC-2BC9-42D6-9F51-3A0B822FABAD} {2CD4DF53-113C-4859-82BE-E0173A12B3D4} = {19C83FDC-2BC9-42D6-9F51-3A0B822FABAD} {BF95F4C0-67F0-426A-945C-DD38348F4A4C} = {19C83FDC-2BC9-42D6-9F51-3A0B822FABAD} + {D2D6D0D7-7544-4730-A34E-DAE2588B55D8} = {19C83FDC-2BC9-42D6-9F51-3A0B822FABAD} + {EBACC7C9-4376-4D04-BFBB-12D5E7ABCD37} = {D2D6D0D7-7544-4730-A34E-DAE2588B55D8} + {DCD4F84F-91D6-4936-AD45-890127D9EF54} = {D2D6D0D7-7544-4730-A34E-DAE2588B55D8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9D3A508A-1F0B-4364-9FEC-16AF376DA11D} diff --git a/examples/ASP.NET/FaceDetection.Client/.gitignore b/examples/ASP.NET/FaceDetection.Client/.gitignore new file mode 100644 index 00000000..e811ebc6 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Client/.gitignore @@ -0,0 +1,3 @@ +Server +*.jar +result.jpg \ No newline at end of file diff --git a/examples/ASP.NET/FaceDetection.Client/FaceDetection.Client.csproj b/examples/ASP.NET/FaceDetection.Client/FaceDetection.Client.csproj new file mode 100644 index 00000000..87beb0ba --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Client/FaceDetection.Client.csproj @@ -0,0 +1,23 @@ + + + + Exe + netcoreapp3.1 + FaceDetection.Client + FaceDetection.Client + + + + Server/src/FaceDetection.Server.Test/*/*.cs;$(DefaultItemExcludes) + + + + + + + + + + + + diff --git a/examples/ASP.NET/FaceDetection.Client/Program.cs b/examples/ASP.NET/FaceDetection.Client/Program.cs new file mode 100644 index 00000000..adbece3c --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Client/Program.cs @@ -0,0 +1,71 @@ +using System; +using System.Drawing; +using System.IO; +using FaceDetection.Server.Api; +using Image = FaceDetection.Server; + +namespace FaceDetection.Client +{ + + internal class Program + { + + #region Methods + + private static void Main(string[] args) + { + if (args.Length != 2) + { + Console.WriteLine("[Error] FaceDetectionClient "); + return; + } + + var url = args[0]; + var file = args[1]; + if (!File.Exists(file)) + { + Console.WriteLine($"[Error] '{file}' does not exist"); + return; + } + + var api = new FaceDetectionApi(url); + try + { + var image = new Server.Model.Image(File.ReadAllBytes(file)); + var result = api.ApiFaceDetectionLocationsPostWithHttpInfo(image); + if (result.StatusCode != System.Net.HttpStatusCode.OK) + { + Console.WriteLine($"[Error] API returns {result.StatusCode}"); + return; + } + + Console.WriteLine($"[Info] Find {result.Data.Count} faces"); + + using (var ms = new MemoryStream(image.Data)) + using (var bitmap = (Bitmap)System.Drawing.Image.FromStream(ms)) + using(var g = Graphics.FromImage(bitmap)) + using (var pen = new Pen(Color.Red, 2)) + { + foreach (var area in result.Data) + { + var x = area.Left; + var y = area.Top; + var w = area.Right - x; + var h = area.Bottom - y; + g.DrawRectangle(pen, x, y, w, h); + } + + bitmap.Save("result.jpg"); + } + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + + #endregion + + } + +} diff --git a/examples/ASP.NET/FaceDetection.Client/UpdateApiDefinition.ps1 b/examples/ASP.NET/FaceDetection.Client/UpdateApiDefinition.ps1 new file mode 100644 index 00000000..8d84b754 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Client/UpdateApiDefinition.ps1 @@ -0,0 +1,68 @@ +if (!(Test-Path ${env:JAVA_HOME})) +{ + Write-Host "[Error] env JAVA_HOME is empty or does not exist" -Foreground Red + return +} + +$java = Join-Path ${env:JAVA_HOME} "bin" | ` + Join-Path -Child "java" +if ($global:IsWindows) +{ + $java = $java + ".exe" +} + +if (!(Test-Path ${java})) +{ + Write-Host "[Error] ${java} does not exist" -Foreground Red + return +} + +if ((Test-Path swagger.json)) +{ + Write-Host "[Info] delete existing swagger.json" -Foreground Yellow + Remove-Item swagger.json +} + +# $openapiUrl = "https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/5.0.0-SNAPSHOT/openapi-generator-cli-5.0.0-20201128.073749-892.jar" +$openapiUrl = "https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/5.0.0-beta3/openapi-generator-cli-5.0.0-beta3.jar" +if (!(Test-Path "openapi-generator-cli.jar")) +{ + Write-Host "[Info] Download openapi-generator-cli.jar" -Foreground Yellow + Invoke-WebRequest -Uri "${openapiUrl}" ` + -outfile openapi-generator-cli.jar +} + +Invoke-WebRequest -Uri "http://localhost:5000/swagger/v1/swagger.json" ` + -outfile swagger.json + +if (!(Test-Path swagger.json)) +{ + Write-Host "[Error] swagger.json does not exist" -Foreground Red + return +} + +Write-Host "[Info] Succeed to get swagger.json" -Foreground Green + +$current = Get-Location +$executable = Join-Path $current "openapi-generator-cli.jar" +$arguments = "generate " + + "-i swagger.json " + + "-g csharp-netcore " + + "-o Server " + + "--additional-properties=netCoreProjectFile=true," + + "targetFramework=netstandard2.0," + + "packageName=FaceDetection.Server" +Invoke-Expression "& '${java}' -jar ${executable} ${arguments}" +Remove-Item swagger.json + +# $source = Join-Path "Server" "src" | ` +# Join-Path -Child "IO.Swagger" + +# if (!(Test-Path $source)) +# { +# Write-Host "[Error] Failed to generate client lib" -Foreground Red +# return +# } + +# Set-Location $source +# Invoke-Expression "& dotnet build -c Release" \ No newline at end of file diff --git a/examples/ASP.NET/FaceDetection.Server/.config/dotnet-tools.json b/examples/ASP.NET/FaceDetection.Server/.config/dotnet-tools.json new file mode 100644 index 00000000..dbc4a5f2 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "5.0.0", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/examples/ASP.NET/FaceDetection.Server/Controllers/FaceDetectionController.cs b/examples/ASP.NET/FaceDetection.Server/Controllers/FaceDetectionController.cs new file mode 100644 index 00000000..88a5a6ff --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/Controllers/FaceDetectionController.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using DlibDotNet; +using FaceDetection.Models; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Image = FaceDetection.Models.Image; + +namespace FaceDetection.Controllers +{ + + /// + /// Get rectangles of face area from specified image + /// + [ApiController] + [Route("api/[controller]")] + public class FaceDetectionController : ControllerBase + { + + #region Fields + + private readonly ILogger _Logger; + + #endregion + + #region Constructors + + public FaceDetectionController(ILogger logger) + { + this._Logger = logger; + } + + #endregion + + #region Properties + #endregion + + #region Methods + + /// + /// Returns an enumerable collection of face location correspond to all faces in specified image. + /// + [Route("~/api/[controller]/Locations")] + [HttpPost] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public ActionResult> Locations([FromBody] Image image) + { + try + { + var areas = new List(); + + using (var ms = new MemoryStream(image.Data)) + using (var bitmap = (Bitmap)System.Drawing.Image.FromStream(ms)) + using (var png = new MemoryStream()) + { + bitmap.Save(png, ImageFormat.Png); + using (var matrix = Dlib.LoadPng(png.ToArray())) + using (var faceDetector = Dlib.GetFrontalFaceDetector()) + { + var dets = faceDetector.Operator(matrix); + foreach (var r in dets) + areas.Add(new FaceArea { Left = r.Left, Top = r.Top, Right = r.Right, Bottom = r.Bottom }); + } + } + + return Ok(areas.ToArray()); + } + catch (Exception e) + { + this._Logger.LogError($"[{nameof(this.Locations)}] {e.Message}"); + return new StatusCodeResult(StatusCodes.Status500InternalServerError); + } + } + + #endregion + + } + +} diff --git a/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.csproj b/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.csproj new file mode 100644 index 00000000..2bed9031 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.csproj @@ -0,0 +1,27 @@ + + + + netcoreapp3.1 + 03874267-b444-4eea-8dbd-f82ab63ec9f4 + AnyCPU;x64 + + + + FaceDetection.Server.xml + bin\x64\Debug + + + + FaceDetection.Server.xml + bin\x64\Release + + + + + + + + + + + diff --git a/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.xml b/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.xml new file mode 100644 index 00000000..fde165b0 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/FaceDetection.Server.xml @@ -0,0 +1,53 @@ + + + + FaceDetection.Server + + + + + Get rectangles of face area from specified image + + + + + Returns an enumerable collection of face location correspond to all faces in specified image. + + + + + Describes the left, top, right and bottom location of a face. + + + + + The y-axis value of the bottom of the rectangle of face. + + + + + The x-axis value of the left side of the rectangle of face. + + + + + The x-axis value of the right side of the rectangle of face. + + + + + The y-axis value of the top of the rectangle of face. + + + + + Represents a image data. + + + + + The image data. + + + + diff --git a/examples/ASP.NET/FaceDetection.Server/Models/FaceArea.cs b/examples/ASP.NET/FaceDetection.Server/Models/FaceArea.cs new file mode 100644 index 00000000..9558cd44 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/Models/FaceArea.cs @@ -0,0 +1,52 @@ +namespace FaceDetection.Models +{ + + /// + /// Describes the left, top, right and bottom location of a face. + /// + public class FaceArea + { + + #region Properties + + /// + /// The y-axis value of the bottom of the rectangle of face. + /// + public int Bottom + { + get; + set; + } + + /// + /// The x-axis value of the left side of the rectangle of face. + /// + public int Left + { + get; + set; + } + + /// + /// The x-axis value of the right side of the rectangle of face. + /// + public int Right + { + get; + set; + } + + /// + /// The y-axis value of the top of the rectangle of face. + /// + public int Top + { + get; + set; + } + + #endregion + + } + +} diff --git a/examples/ASP.NET/FaceDetection.Server/Models/Image.cs b/examples/ASP.NET/FaceDetection.Server/Models/Image.cs new file mode 100644 index 00000000..54ff1aa3 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/Models/Image.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; + +namespace FaceDetection.Models +{ + + /// + /// Represents a image data. + /// + public class Image + { + + #region Properties + + /// + /// The image data. + /// + [Required] + public byte[] Data + { + get; + set; + } + + #endregion + + } + +} diff --git a/examples/ASP.NET/FaceDetection.Server/Program.cs b/examples/ASP.NET/FaceDetection.Server/Program.cs new file mode 100644 index 00000000..504cfb3d --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/Program.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace FaceDetection +{ + + public class Program + { + + #region Methods + + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) + { + var urls = args.Length == 0 ? new []{ "http://localhost:5000", "https://localhost:5001" } : args; + + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup() + .UseUrls(urls) + .UseKestrel(); + }); + } + + #endregion + + } + +} diff --git a/examples/ASP.NET/FaceDetection.Server/Startup.cs b/examples/ASP.NET/FaceDetection.Server/Startup.cs new file mode 100644 index 00000000..5ec2a0ed --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/Startup.cs @@ -0,0 +1,75 @@ +using System; +using System.IO; +using System.Reflection; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.OpenApi.Models; + +namespace FaceDetection +{ + + public class Startup + { + + #region Constructors + + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + #endregion + + #region Properties + + public IConfiguration Configuration { get; } + + #endregion + + #region Methods + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo { Title = "FaceDetection", Version = "v1" }); + + var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + var filePath = Path.Combine(AppContext.BaseDirectory, xmlFile); + c.IncludeXmlComments(filePath); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseSwagger(); + app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "FaceDetection v1")); + } + + //app.UseHttpsRedirection(); + app.UseStaticFiles(); + + app.UseRouting(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + + #endregion + + } + +} \ No newline at end of file diff --git a/examples/ASP.NET/FaceDetection.Server/appsettings.Development.json b/examples/ASP.NET/FaceDetection.Server/appsettings.Development.json new file mode 100644 index 00000000..dba68eb1 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/examples/ASP.NET/FaceDetection.Server/appsettings.json b/examples/ASP.NET/FaceDetection.Server/appsettings.json new file mode 100644 index 00000000..81ff8777 --- /dev/null +++ b/examples/ASP.NET/FaceDetection.Server/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/examples/ASP.NET/FaceDetection.Server/images/swagger.png b/examples/ASP.NET/FaceDetection.Server/images/swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..d884deb8ccb8ebd7ed47ed924c087f68d3e52abe GIT binary patch literal 60398 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 Date: Sun, 24 Jan 2021 19:00:24 +0900 Subject: [PATCH 2/6] Fix docker build error for CentOS CUDA 11 (#231) --- docker/base/centos/7/cuda/11.0/Dockerfile | 2 +- docker/base/centos/7/cuda/11.1/Dockerfile | 2 +- docker/devel/centos/7/cuda/11.0/Dockerfile | 2 +- docker/devel/centos/7/cuda/11.1/Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/base/centos/7/cuda/11.0/Dockerfile b/docker/base/centos/7/cuda/11.0/Dockerfile index 40595c3b..44bdb9b0 100644 --- a/docker/base/centos/7/cuda/11.0/Dockerfile +++ b/docker/base/centos/7/cuda/11.0/Dockerfile @@ -1,4 +1,4 @@ -FROM nvidia/cuda:11.0-cudnn8-devel-centos7 +FROM nvidia/cuda:11.0.3-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build diff --git a/docker/base/centos/7/cuda/11.1/Dockerfile b/docker/base/centos/7/cuda/11.1/Dockerfile index 06a2e64c..1843f80f 100644 --- a/docker/base/centos/7/cuda/11.1/Dockerfile +++ b/docker/base/centos/7/cuda/11.1/Dockerfile @@ -1,4 +1,4 @@ -FROM nvidia/cuda:11.1-cudnn8-devel-centos7 +FROM nvidia/cuda:11.1.1-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build diff --git a/docker/devel/centos/7/cuda/11.0/Dockerfile b/docker/devel/centos/7/cuda/11.0/Dockerfile index 69d6de0d..9d5410be 100644 --- a/docker/devel/centos/7/cuda/11.0/Dockerfile +++ b/docker/devel/centos/7/cuda/11.0/Dockerfile @@ -1,4 +1,4 @@ -FROM nvidia/cuda:11.0-cudnn8-devel-centos7 +FROM nvidia/cuda:11.0.3-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build diff --git a/docker/devel/centos/7/cuda/11.1/Dockerfile b/docker/devel/centos/7/cuda/11.1/Dockerfile index 70526a8b..99921676 100644 --- a/docker/devel/centos/7/cuda/11.1/Dockerfile +++ b/docker/devel/centos/7/cuda/11.1/Dockerfile @@ -1,4 +1,4 @@ -FROM nvidia/cuda:11.1-cudnn8-devel-centos7 +FROM nvidia/cuda:11.1.1-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build From 5dbf68b29058d4dd4c8be46a0f464f440875c894 Mon Sep 17 00:00:00 2001 From: Takuya Takeuchi Date: Wed, 27 Jan 2021 00:36:08 +0900 Subject: [PATCH 3/6] Fix yum update on container (#234) * fix: disable cuda and nvidia-ml repo --- docker/base/centos/7/cuda/10.0/Dockerfile | 4 ++-- docker/base/centos/7/cuda/10.1/Dockerfile | 4 ++-- docker/base/centos/7/cuda/10.2/Dockerfile | 4 ++-- docker/base/centos/7/cuda/11.0/Dockerfile | 4 ++-- docker/base/centos/7/cuda/11.1/Dockerfile | 4 ++-- docker/base/centos/7/cuda/9.2/Dockerfile | 4 ++-- docker/devel/centos/7/cuda/10.0/Dockerfile | 8 ++++---- docker/devel/centos/7/cuda/10.1/Dockerfile | 8 ++++---- docker/devel/centos/7/cuda/10.2/Dockerfile | 8 ++++---- docker/devel/centos/7/cuda/11.0/Dockerfile | 8 ++++---- docker/devel/centos/7/cuda/11.1/Dockerfile | 8 ++++---- docker/devel/centos/7/cuda/9.2/Dockerfile | 8 ++++---- docker/runtime/centos/7/Dockerfile | 2 +- nuget/docker/build/centos/7/Dockerfile | 2 +- 14 files changed, 38 insertions(+), 38 deletions(-) diff --git a/docker/base/centos/7/cuda/10.0/Dockerfile b/docker/base/centos/7/cuda/10.0/Dockerfile index 045283ae..155e86bf 100644 --- a/docker/base/centos/7/cuda/10.0/Dockerfile +++ b/docker/base/centos/7/cuda/10.0/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.0-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/base/centos/7/cuda/10.1/Dockerfile b/docker/base/centos/7/cuda/10.1/Dockerfile index 7e8ec29c..00aad887 100644 --- a/docker/base/centos/7/cuda/10.1/Dockerfile +++ b/docker/base/centos/7/cuda/10.1/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.1-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/base/centos/7/cuda/10.2/Dockerfile b/docker/base/centos/7/cuda/10.2/Dockerfile index 916787d4..9aa6661e 100644 --- a/docker/base/centos/7/cuda/10.2/Dockerfile +++ b/docker/base/centos/7/cuda/10.2/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.2-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/base/centos/7/cuda/11.0/Dockerfile b/docker/base/centos/7/cuda/11.0/Dockerfile index 44bdb9b0..1351b75c 100644 --- a/docker/base/centos/7/cuda/11.0/Dockerfile +++ b/docker/base/centos/7/cuda/11.0/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:11.0.3-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/base/centos/7/cuda/11.1/Dockerfile b/docker/base/centos/7/cuda/11.1/Dockerfile index 1843f80f..8ca4adc3 100644 --- a/docker/base/centos/7/cuda/11.1/Dockerfile +++ b/docker/base/centos/7/cuda/11.1/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:11.1.1-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/base/centos/7/cuda/9.2/Dockerfile b/docker/base/centos/7/cuda/9.2/Dockerfile index 1d3ace1a..c3657b54 100644 --- a/docker/base/centos/7/cuda/9.2/Dockerfile +++ b/docker/base/centos/7/cuda/9.2/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:9.2-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ diff --git a/docker/devel/centos/7/cuda/10.0/Dockerfile b/docker/devel/centos/7/cuda/10.0/Dockerfile index 250c8883..231cdc3f 100644 --- a/docker/devel/centos/7/cuda/10.0/Dockerfile +++ b/docker/devel/centos/7/cuda/10.0/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.0-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/devel/centos/7/cuda/10.1/Dockerfile b/docker/devel/centos/7/cuda/10.1/Dockerfile index 32b35c9f..862c285b 100644 --- a/docker/devel/centos/7/cuda/10.1/Dockerfile +++ b/docker/devel/centos/7/cuda/10.1/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.1-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/devel/centos/7/cuda/10.2/Dockerfile b/docker/devel/centos/7/cuda/10.2/Dockerfile index 47f68182..37f6fe54 100644 --- a/docker/devel/centos/7/cuda/10.2/Dockerfile +++ b/docker/devel/centos/7/cuda/10.2/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:10.2-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/devel/centos/7/cuda/11.0/Dockerfile b/docker/devel/centos/7/cuda/11.0/Dockerfile index 9d5410be..43dad143 100644 --- a/docker/devel/centos/7/cuda/11.0/Dockerfile +++ b/docker/devel/centos/7/cuda/11.0/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:11.0.3-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/devel/centos/7/cuda/11.1/Dockerfile b/docker/devel/centos/7/cuda/11.1/Dockerfile index 99921676..788bffde 100644 --- a/docker/devel/centos/7/cuda/11.1/Dockerfile +++ b/docker/devel/centos/7/cuda/11.1/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:11.1.1-cudnn8-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/devel/centos/7/cuda/9.2/Dockerfile b/docker/devel/centos/7/cuda/9.2/Dockerfile index dd94dfe2..b1c6e1b2 100644 --- a/docker/devel/centos/7/cuda/9.2/Dockerfile +++ b/docker/devel/centos/7/cuda/9.2/Dockerfile @@ -2,10 +2,10 @@ FROM nvidia/cuda:9.2-cudnn7-devel-centos7 LABEL maintainer "Takuya Takeuchi " # install package to build -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ ca-certificates RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ libX11-devel \ lapack-devel \ openblas-devel \ @@ -27,10 +27,10 @@ ENV LD_LIBRARY_PATH $NCCL_ROOT/lib/:$LD_LIBRARY_PATH ENV LIBRARY_PATH $NCCL_ROOT/lib/:$LIBRARY_PATH # Register Microsoft key and feed -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ curl RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/microsoft.repo -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ powershell \ && yum clean all diff --git a/docker/runtime/centos/7/Dockerfile b/docker/runtime/centos/7/Dockerfile index 41a83557..1de78d8c 100644 --- a/docker/runtime/centos/7/Dockerfile +++ b/docker/runtime/centos/7/Dockerfile @@ -10,7 +10,7 @@ RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-p # Install the .NET SDK ENV DOTNET_SDK_VERSION 2.1.802 -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ dotnet-sdk-2.1 \ && yum clean all diff --git a/nuget/docker/build/centos/7/Dockerfile b/nuget/docker/build/centos/7/Dockerfile index eddae22c..bab19c7f 100644 --- a/nuget/docker/build/centos/7/Dockerfile +++ b/nuget/docker/build/centos/7/Dockerfile @@ -14,7 +14,7 @@ RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364 # Verify that the binary works && gosu nobody true -RUN yum update -y && yum install -y \ +RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ git \ && yum clean all From 728763968262062b9db495513c310cc2584c6921 Mon Sep 17 00:00:00 2001 From: Takuya Takeuchi Date: Wed, 27 Jan 2021 02:21:54 +0900 Subject: [PATCH 4/6] Fix install libgdiplus for centos container (#235) --- docker/runtime/centos/7/Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker/runtime/centos/7/Dockerfile b/docker/runtime/centos/7/Dockerfile index 1de78d8c..501fd7e8 100644 --- a/docker/runtime/centos/7/Dockerfile +++ b/docker/runtime/centos/7/Dockerfile @@ -14,5 +14,10 @@ RUN yum update -y --disablerepo=cuda,nvidia-ml && yum install -y \ dotnet-sdk-2.1 \ && yum clean all +# Install gdi++ +RUN yum install -y \ + libgdiplus \ + && yum clean all + # Trigger first run experience by running arbitrary cmd to populate local package cache RUN dotnet help From 1cced7e81166893f8ba295a6a0f033b5731c086b Mon Sep 17 00:00:00 2001 From: Takuya Takeuchi Date: Thu, 28 Jan 2021 01:40:21 +0900 Subject: [PATCH 5/6] Add new interface to get confidence (#236) * faet: add test * feat: add new interface of object_detector --- examples/FHogObjectDetector/Program.cs | 2 +- .../object_detector/scan_fhog_pyramid.h | 105 ++++ .../ImageProcessing/ObjectDetector.cs | 59 ++- src/DlibDotNet/PInvoke/Dlib.cs | 34 +- test/DlibDotNet.Tests/DlibDotNet.Tests.csproj | 501 ++++++++++++++++++ .../ImageProcessing/ObjectDetectorTest.cs | 69 +++ test/DlibDotNet.Tests/data/face_detector.svm | Bin 0 -> 44695 bytes 7 files changed, 750 insertions(+), 20 deletions(-) create mode 100644 test/DlibDotNet.Tests/ImageProcessing/ObjectDetectorTest.cs create mode 100644 test/DlibDotNet.Tests/data/face_detector.svm diff --git a/examples/FHogObjectDetector/Program.cs b/examples/FHogObjectDetector/Program.cs index 4f2a7aa4..d004af70 100644 --- a/examples/FHogObjectDetector/Program.cs +++ b/examples/FHogObjectDetector/Program.cs @@ -156,7 +156,7 @@ private static void Main(string[] args) for (var i = 0; i < imageTest.Count; ++i) { // Run the detector and get the face detections. - var dets = detector.Operator(imageTest[i]); + detector.Operator(imageTest[i], out IEnumerable dets); win.ClearOverlay(); win.SetImage(imageTest[i]); win.AddOverlay(dets, new RgbPixel(255, 0, 0)); diff --git a/src/DlibDotNet.Native/dlib/image_processing/object_detector/scan_fhog_pyramid.h b/src/DlibDotNet.Native/dlib/image_processing/object_detector/scan_fhog_pyramid.h index 2a96d032..66695b2b 100644 --- a/src/DlibDotNet.Native/dlib/image_processing/object_detector/scan_fhog_pyramid.h +++ b/src/DlibDotNet.Native/dlib/image_processing/object_detector/scan_fhog_pyramid.h @@ -212,6 +212,58 @@ do { \ *ret = tmp;\ } while (0) +#define object_detector_scan_fhog_pyramid_operator_with_confidences_template(__TYPE__, error, __ELEMENT_TYPE__, __ROWS__, __COLUMNS__, ...) \ +do { \ + auto& in_image = *(static_cast*>(image));\ +\ + std::vector> dets;\ + switch(pyramid_rate)\ + {\ + case 1:\ + {\ + auto& detector = *(static_cast, EXTRACTOR_TYPE>>*>(obj));\ + detector(in_image, dets);\ + }\ + break;\ + case 2:\ + {\ + auto& detector = *(static_cast, EXTRACTOR_TYPE>>*>(obj));\ + detector(in_image, dets);\ + }\ + break;\ + case 3:\ + {\ + auto& detector = *(static_cast, EXTRACTOR_TYPE>>*>(obj));\ + detector(in_image, dets);\ + }\ + break;\ + case 4:\ + {\ + auto& detector = *(static_cast, EXTRACTOR_TYPE>>*>(obj));\ + detector(in_image, dets);\ + }\ + break;\ + case 6:\ + {\ + auto& detector = *(static_cast, EXTRACTOR_TYPE>>*>(obj));\ + detector(in_image, dets);\ + }\ + break;\ + default:\ + error = ERR_PYRAMID_NOT_SUPPORT_RATE;\ + break;\ + }\ + auto tmp1 = new std::vector();\ + auto tmp2 = new std::vector();\ + for (auto i = 0; i < dets.size(); i++)\ + {\ + tmp1->push_back(new rectangle(dets[i].second));\ + tmp2->push_back(dets[i].first);\ + }\ + *ret_rects = tmp1;\ + *ret_confidences = tmp2;\ +} while (0) + #pragma endregion template DLLEXPORT int object_detector_scan_fhog_pyramid_new(const pyramid_type pyramid_type, @@ -400,6 +452,59 @@ DLLEXPORT int object_detector_scan_fhog_pyramid_operator(const pyramid_type pyra return error; } +DLLEXPORT int object_detector_scan_fhog_pyramid_operator_with_confidence(const pyramid_type pyramid_type, + const unsigned int pyramid_rate, + const fhog_feature_extractor_type extractor_type, + void* obj, + const matrix_element_type type, + void* image, + void** ret_rects, + void** ret_confidences) +{ + int error = ERR_OK; + + #define ELEMENT_OUT dlib::rectangle + + switch(pyramid_type) + { + case ::pyramid_type::Down: + { + #define PYRAMID_TYPE pyramid_down + switch(extractor_type) + { + case fhog_feature_extractor_type::Default: + #define EXTRACTOR_TYPE default_fhog_feature_extractor + { + matrix_nonalpha_template(type, + error, + matrix_template_size_template, + object_detector_scan_fhog_pyramid_operator_with_confidences_template, + 0, + 0, + pyramid_rate, + obj, + image, + ret_rects, + ret_confidences); + } + #undef EXTRACTOR_TYPE + break; + default: + error = ERR_FHOG_NOT_SUPPORT_EXTRACTOR; + break; + } + #undef PYRAMID_TYPE + } + break; + default: + error = ERR_PYRAMID_NOT_SUPPORT_TYPE; + break; + } + + #undef ELEMENT_OUT + + return error; +} #pragma endregion operator diff --git a/src/DlibDotNet/ImageProcessing/ObjectDetector.cs b/src/DlibDotNet/ImageProcessing/ObjectDetector.cs index 1877747c..e2c00894 100644 --- a/src/DlibDotNet/ImageProcessing/ObjectDetector.cs +++ b/src/DlibDotNet/ImageProcessing/ObjectDetector.cs @@ -56,9 +56,6 @@ internal ObjectDetector(IntPtr ptr, ImageScanner.FHogPyramidParameter parameter) #endregion - #region Properties - #endregion - #region Methods public void Deserialize(string path) @@ -81,7 +78,7 @@ internal Matrix DrawFHog(uint weightIndex = 0, int cellDrawSize = 15) return this._Imp.DrawFHog(weightIndex, cellDrawSize); } - public IEnumerable Operator(Matrix image) + public void Operator(Matrix image, out IEnumerable rectangles) where U : struct { if (image == null) @@ -90,7 +87,19 @@ public IEnumerable Operator(Matrix image) image.ThrowIfDisposed(); this.ThrowIfDisposed(); - return this._Imp.Operator(image); + rectangles = this._Imp.Operator(image); + } + + public void Operator(Matrix image, out IEnumerable> tuples) + where U : struct + { + if (image == null) + throw new ArgumentNullException(nameof(image)); + + image.ThrowIfDisposed(); + this.ThrowIfDisposed(); + + tuples = this._Imp.OperatorWithConfidence(image); } public void Serialize(string path) @@ -166,6 +175,9 @@ protected DetectorImp(IntPtr detector) public abstract IEnumerable Operator(Matrix image) where U : struct; + public abstract IEnumerable> OperatorWithConfidence(Matrix image) + where U : struct; + public abstract void Serialize(byte[] filepath, int filepathLength); public abstract Matrix TestObjectDetectionFunction(IEnumerable> images, IEnumerable> objects) @@ -283,17 +295,50 @@ public override IEnumerable Operator(Matrix image) this.NativePtr, type, image.NativePtr, - out var matrix); + out var rects); switch (ret) { case NativeMethods.ErrorType.MatrixElementTypeNotSupport: throw new ArgumentException($"{type} is not supported."); } - using (var tmp = new StdVector(matrix)) + using (var tmp = new StdVector(rects)) return tmp.ToArray(); } + public override IEnumerable> OperatorWithConfidence(Matrix image) + { + if (image == null) + throw new ArgumentNullException(nameof(image)); + + image.ThrowIfDisposed(); + + var type = image.MatrixElementType.ToNativeMatrixElementType(); + var ret = NativeMethods.object_detector_scan_fhog_pyramid_operator_with_confidence(this._PyramidType, + this._PyramidRate, + this._FeatureExtractorType, + this.NativePtr, + type, + image.NativePtr, + out var rects, + out var confidences); + switch (ret) + { + case NativeMethods.ErrorType.MatrixElementTypeNotSupport: + throw new ArgumentException($"{type} is not supported."); + } + + using (var rectsVector = new StdVector(rects)) + using (var tconfidencesVector = new StdVector(confidences)) + { + var rectsArray = rectsVector.ToArray(); + var confidencesArray = tconfidencesVector.ToArray(); + var count = rectsArray.Length; + for (var index = 0; index < count; index++) + yield return new Tuple(confidencesArray[index], rectsArray[index]); + }; + } + public override void Serialize(byte[] filepath, int filepathLength) { var ret = NativeMethods.object_detector_scan_fhog_pyramid_serialize(filepath, diff --git a/src/DlibDotNet/PInvoke/Dlib.cs b/src/DlibDotNet/PInvoke/Dlib.cs index ef7bde23..7a75d4a8 100644 --- a/src/DlibDotNet/PInvoke/Dlib.cs +++ b/src/DlibDotNet/PInvoke/Dlib.cs @@ -421,7 +421,7 @@ internal enum ErrorType [return: MarshalAs(UnmanagedType.U1)] public static extern bool is_support_cuda(); - #region assign_pixel + #region assign_pixel [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern void assign_pixel_rgb_rgbalpha(ref RgbPixel dest, ref RgbAlphaPixel src); @@ -441,18 +441,18 @@ internal enum ErrorType [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern void assign_pixel_rgbalpha_lab(ref RgbAlphaPixel dest, ref LabPixel src); - #endregion + #endregion - #region shape_predictor + #region shape_predictor [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern IntPtr normalizing_tform(IntPtr rect); - #endregion + #endregion - #region object_detector + #region object_detector - #region scan_fhog_pyramid + #region scan_fhog_pyramid [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern ErrorType object_detector_scan_fhog_pyramid_new(PyramidType pyramidType, @@ -484,6 +484,16 @@ public static extern ErrorType object_detector_scan_fhog_pyramid_operator(Pyrami IntPtr matrix, out IntPtr dets); + [DllImport(NativeLibrary, CallingConvention = CallingConvention)] + public static extern ErrorType object_detector_scan_fhog_pyramid_operator_with_confidence(PyramidType pyramidType, + uint pyramidRate, + FHogFeatureExtractorType featureExtractorType, + IntPtr detector, + MatrixElementType elementType, + IntPtr matrix, + out IntPtr rects, + out IntPtr confidences); + [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern ErrorType object_detector_scan_fhog_pyramid_serialize(byte[] fileName, int filepathLength, @@ -493,9 +503,9 @@ public static extern ErrorType object_detector_scan_fhog_pyramid_serialize(byte[ IntPtr obj, out IntPtr errorMessage); - #endregion + #endregion - #endregion + #endregion #region matrix_range_exp @@ -582,7 +592,7 @@ public static extern ErrorType object_detector_scan_fhog_pyramid_serialize(byte[ [return: MarshalAs(UnmanagedType.U1)] public static extern bool matrix_range_exp_nr(MatrixElementType matrixElementType, IntPtr matrix, out int ret); - #endregion + #endregion [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern IntPtr find_similarity_transform_dpoint(IntPtr from_points, IntPtr to_points); @@ -593,12 +603,12 @@ public static extern ErrorType object_detector_scan_fhog_pyramid_serialize(byte[ [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern IntPtr rotation_matrix(double angle); - #region extensions + #region extensions #region extensions_load_image_data [DllImport(NativeLibrary, CallingConvention = CallingConvention)] - public static extern IntPtr extensions_load_image_data(Array2DType dst_type, Array2DType src_type, IntPtr data, uint rows, uint columns, uint steps); + public static extern IntPtr extensions_load_image_data(Array2DType dst_type, Array2DType src_type, IntPtr data, uint rows, uint columns, uint steps); [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern IntPtr extensions_load_image_data(Array2DType dst_type, Array2DType src_type, byte[] data, uint rows, uint columns, uint steps); @@ -642,7 +652,7 @@ public static extern ErrorType object_detector_scan_fhog_pyramid_serialize(byte[ [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern IntPtr extensions_load_image_data(Array2DType dst_type, Array2DType src_type, LabPixel[] data, uint rows, uint columns, uint steps); - #endregion + #endregion [DllImport(NativeLibrary, CallingConvention = CallingConvention)] public static extern ErrorType extensions_matrix_to_array(IntPtr src, MatrixElementType type, int templateRows, int templateColumns, IntPtr dst); diff --git a/test/DlibDotNet.Tests/DlibDotNet.Tests.csproj b/test/DlibDotNet.Tests/DlibDotNet.Tests.csproj index 12bd2477..34414994 100644 --- a/test/DlibDotNet.Tests/DlibDotNet.Tests.csproj +++ b/test/DlibDotNet.Tests/DlibDotNet.Tests.csproj @@ -28,9 +28,510 @@ + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/test/DlibDotNet.Tests/ImageProcessing/ObjectDetectorTest.cs b/test/DlibDotNet.Tests/ImageProcessing/ObjectDetectorTest.cs new file mode 100644 index 00000000..30e8299e --- /dev/null +++ b/test/DlibDotNet.Tests/ImageProcessing/ObjectDetectorTest.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Xunit; + +namespace DlibDotNet.Tests.ImageProcessing +{ + + public class ObjectDetectorTest : TestBase + { + + private ScanFHogPyramid _Scanner; + + private ObjectDetector> _ObjectDetector; + + public ObjectDetectorTest() + { + var path = this.GetDataFile("face_detector.svm"); + this._Scanner = new ScanFHogPyramid(6); + this._ObjectDetector = new ObjectDetector>(this._Scanner); + this._ObjectDetector.Deserialize(path.FullName); + } + + [Fact] + public void DetectFace() + { + if (this._ObjectDetector == null) + Assert.True(false, "ObjectDetector is not initialized!!"); + + var path = this.GetDataFile("Lenna.jpg"); + var image = Dlib.LoadImageAsMatrix(path.FullName); + + this._ObjectDetector.Operator(image, out IEnumerable rects); + Assert.Equal(rects.Count(), 1); + + foreach (var r in rects) + Dlib.DrawRectangle(image, r, new RgbPixel { Green = 255 }); + + Dlib.SaveBmp(image, Path.Combine(this.GetOutDir(this.GetType().Name), "DetectFace.bmp")); + + this.DisposeAndCheckDisposedState(image); + } + + [Fact] + public void DetectFaceWithConfidence() + { + if (this._ObjectDetector == null) + Assert.True(false, "ObjectDetector is not initialized!!"); + + var path = this.GetDataFile("Lenna.jpg"); + var image = Dlib.LoadImageAsMatrix(path.FullName); + + this._ObjectDetector.Operator(image, out IEnumerable> tuples); + var array = tuples.ToArray(); + Assert.Equal(array.Length, 1); + + foreach (var tuple in tuples) + Dlib.DrawRectangle(image, tuple.Item2, new RgbPixel { Green = 255 }); + Assert.True(array[0].Item1 - 0.3173714 < 0.01); + + Dlib.SaveBmp(image, Path.Combine(this.GetOutDir(this.GetType().Name), "DetectFaceWithConfidence.bmp")); + + this.DisposeAndCheckDisposedState(image); + } + + } + +} diff --git a/test/DlibDotNet.Tests/data/face_detector.svm b/test/DlibDotNet.Tests/data/face_detector.svm new file mode 100644 index 0000000000000000000000000000000000000000..6dc3445ccb499d48ec7b0329e1a4a51acc8e983d GIT binary patch literal 44695 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 Date: Fri, 29 Jan 2021 17:49:58 +0900 Subject: [PATCH 6/6] feat: bump version --- nuget/nuspec/DlibDotNet.CPU.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-100.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-101.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-102.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-110.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-111.nuspec | 2 +- nuget/nuspec/DlibDotNet.CUDA-92.nuspec | 2 +- nuget/nuspec/DlibDotNet.MKL.nuspec | 2 +- nuget/nuspec/DlibDotNet.UWP.nuspec | 2 +- src/DlibDotNet.Native.Dnn/CMakeLists.txt | 2 +- src/DlibDotNet.Native.Dnn/version-cuda.rc.in | 2 +- src/DlibDotNet.Native.Dnn/version.rc.in | 2 +- src/DlibDotNet.Native/CMakeLists.txt | 2 +- src/DlibDotNet.Native/version-cuda.rc.in | 2 +- src/DlibDotNet.Native/version.rc.in | 2 +- src/DlibDotNet/DlibDotNet.csproj | 4 ++-- 16 files changed, 17 insertions(+), 17 deletions(-) diff --git a/nuget/nuspec/DlibDotNet.CPU.nuspec b/nuget/nuspec/DlibDotNet.CPU.nuspec index cb23ba7f..f0befdc8 100644 --- a/nuget/nuspec/DlibDotNet.CPU.nuspec +++ b/nuget/nuspec/DlibDotNet.CPU.nuspec @@ -2,7 +2,7 @@ DlibDotNet - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-100.nuspec b/nuget/nuspec/DlibDotNet.CUDA-100.nuspec index 9c8eeefb..bf9e11ec 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-100.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-100.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA100 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 10.0 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-101.nuspec b/nuget/nuspec/DlibDotNet.CUDA-101.nuspec index dab97f7b..f747cbab 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-101.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-101.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA101 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 10.1 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-102.nuspec b/nuget/nuspec/DlibDotNet.CUDA-102.nuspec index 3363aa61..bb7fd8ea 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-102.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-102.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA102 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 10.2 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-110.nuspec b/nuget/nuspec/DlibDotNet.CUDA-110.nuspec index a5fce010..ebb16097 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-110.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-110.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA110 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 11.0 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-111.nuspec b/nuget/nuspec/DlibDotNet.CUDA-111.nuspec index 35123eb0..2143a999 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-111.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-111.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA111 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 11.1 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.CUDA-92.nuspec b/nuget/nuspec/DlibDotNet.CUDA-92.nuspec index 73c80b9f..78a17875 100644 --- a/nuget/nuspec/DlibDotNet.CUDA-92.nuspec +++ b/nuget/nuspec/DlibDotNet.CUDA-92.nuspec @@ -2,7 +2,7 @@ DlibDotNet.CUDA92 - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for CUDA 9.2 Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.MKL.nuspec b/nuget/nuspec/DlibDotNet.MKL.nuspec index 960a5c25..25bc9c12 100644 --- a/nuget/nuspec/DlibDotNet.MKL.nuspec +++ b/nuget/nuspec/DlibDotNet.MKL.nuspec @@ -2,7 +2,7 @@ DlibDotNet.MKL - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for MKL Takuya Takeuchi Takuya Takeuchi diff --git a/nuget/nuspec/DlibDotNet.UWP.nuspec b/nuget/nuspec/DlibDotNet.UWP.nuspec index bf9aa8f1..9061f092 100644 --- a/nuget/nuspec/DlibDotNet.UWP.nuspec +++ b/nuget/nuspec/DlibDotNet.UWP.nuspec @@ -2,7 +2,7 @@ DlibDotNet.UWP - 19.21.0.20201122 + 19.21.0.20210129 DlibDotNet for UWP Takuya Takeuchi Takuya Takeuchi diff --git a/src/DlibDotNet.Native.Dnn/CMakeLists.txt b/src/DlibDotNet.Native.Dnn/CMakeLists.txt index 394c3432..9aab69c4 100644 --- a/src/DlibDotNet.Native.Dnn/CMakeLists.txt +++ b/src/DlibDotNet.Native.Dnn/CMakeLists.txt @@ -25,7 +25,7 @@ message("-------------------------------------------------------") set(VERSION_MAJOR 19) set(VERSION_MINOR 21) set(VERSION_PATCH 0) -set(VERSION_DATE 20201122) +set(VERSION_DATE 20210129) # Only GCC requires -fPIC if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") diff --git a/src/DlibDotNet.Native.Dnn/version-cuda.rc.in b/src/DlibDotNet.Native.Dnn/version-cuda.rc.in index b2e6f8d3..5e655623 100644 --- a/src/DlibDotNet.Native.Dnn/version-cuda.rc.in +++ b/src/DlibDotNet.Native.Dnn/version-cuda.rc.in @@ -72,7 +72,7 @@ BEGIN VALUE "FileDescription", "Dlib wrapper library (deep neural network) with CUDA" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "DlibDotNet.Native.Dnn" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Takuya Takeuchi." + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Takuya Takeuchi." VALUE "OriginalFilename", "DlibDotNet.Native.Dnn.dll" VALUE "ProductName", "Dlib.Net" VALUE "ProductVersion", VER_PRODUCTVERSION_STR diff --git a/src/DlibDotNet.Native.Dnn/version.rc.in b/src/DlibDotNet.Native.Dnn/version.rc.in index d904618b..72ab646c 100644 --- a/src/DlibDotNet.Native.Dnn/version.rc.in +++ b/src/DlibDotNet.Native.Dnn/version.rc.in @@ -72,7 +72,7 @@ BEGIN VALUE "FileDescription", "Dlib wrapper library (deep neural network)" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "DlibDotNet.Native.Dnn" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Takuya Takeuchi." + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Takuya Takeuchi." VALUE "OriginalFilename", "DlibDotNet.Native.Dnn.dll" VALUE "ProductName", "Dlib.Net" VALUE "ProductVersion", VER_PRODUCTVERSION_STR diff --git a/src/DlibDotNet.Native/CMakeLists.txt b/src/DlibDotNet.Native/CMakeLists.txt index ab66843c..13e46c8a 100644 --- a/src/DlibDotNet.Native/CMakeLists.txt +++ b/src/DlibDotNet.Native/CMakeLists.txt @@ -25,7 +25,7 @@ message("-------------------------------------------------------") set(VERSION_MAJOR 19) set(VERSION_MINOR 21) set(VERSION_PATCH 0) -set(VERSION_DATE 20201122) +set(VERSION_DATE 20210129) # libjpeg-dev, libpng-dev set(DLIB_JPEG_SUPPORT True) diff --git a/src/DlibDotNet.Native/version-cuda.rc.in b/src/DlibDotNet.Native/version-cuda.rc.in index d172d226..5b64b6d0 100644 --- a/src/DlibDotNet.Native/version-cuda.rc.in +++ b/src/DlibDotNet.Native/version-cuda.rc.in @@ -72,7 +72,7 @@ BEGIN VALUE "FileDescription", "Dlib wrapper library (kernel) with CUDA" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "DlibDotNet.Native" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Takuya Takeuchi." + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Takuya Takeuchi." VALUE "OriginalFilename", "DlibDotNet.Native.dll" VALUE "ProductName", "Dlib.Net" VALUE "ProductVersion", VER_PRODUCTVERSION_STR diff --git a/src/DlibDotNet.Native/version.rc.in b/src/DlibDotNet.Native/version.rc.in index e4cf924f..4617a8ce 100644 --- a/src/DlibDotNet.Native/version.rc.in +++ b/src/DlibDotNet.Native/version.rc.in @@ -72,7 +72,7 @@ BEGIN VALUE "FileDescription", "Dlib wrapper library (kernel)" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "DlibDotNet.Native" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Takuya Takeuchi." + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Takuya Takeuchi." VALUE "OriginalFilename", "DlibDotNet.Native.dll" VALUE "ProductName", "Dlib.Net" VALUE "ProductVersion", VER_PRODUCTVERSION_STR diff --git a/src/DlibDotNet/DlibDotNet.csproj b/src/DlibDotNet/DlibDotNet.csproj index 4324d9e2..63d5156c 100644 --- a/src/DlibDotNet/DlibDotNet.csproj +++ b/src/DlibDotNet/DlibDotNet.csproj @@ -5,9 +5,9 @@ Takuya Takeuchi .NET wrapper for DLib written in C# - © Takuya Takeuchi 2018-2020 + © Takuya Takeuchi 2018-2021 Debug;Release - 19.20.0 + 19.21.0 https://github.com/takuya-takeuchi/DlibDotNet dlib .net machinelearning