Skip to content

Commit f71ddb4

Browse files
Merge branch 'release/1.2.3.10'
2 parents 2085a22 + 2d38904 commit f71ddb4

File tree

10 files changed

+144
-10
lines changed

10 files changed

+144
-10
lines changed

LICENSE renamed to LICENSE.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2018 Takuya Takeuchi
3+
Copyright (c) 2018-2019 Takuya Takeuchi
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

nuget/FaceRecognitionDotNet-CPU.nuspec

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
<package >
33
<metadata>
44
<id>FaceRecognitionDotNet</id>
5-
<version>1.2.3.9</version>
5+
<version>1.2.3.10</version>
66
<title>FaceRecognitionDotNet</title>
77
<authors>Takuya Takeuchi</authors>
88
<owners>Takuya Takeuchi</owners>
99
<requireLicenseAcceptance>true</requireLicenseAcceptance>
10-
<licenseUrl>https://opensource.org/licenses/MIT</licenseUrl>
10+
<license type="file">LICENSE.txt</license>
1111
<projectUrl>https://github.com/takuya-takeuchi/FaceRecognitionDotNet</projectUrl>
1212
<iconUrl>https://github.com/takuya-takeuchi/FaceRecognitionDotNet/blob/master/nuget/face128.png?raw=true</iconUrl>
1313
<description>The world's simplest facial recognition api for .NET
@@ -19,13 +19,16 @@ This library is ported from https://github.com/ageitgey/face_recognition by C#.<
1919
<serviceable>true</serviceable>
2020
<dependencies>
2121
<group targetFramework="netstandard2.0">
22-
<dependency id="DlibDotNet" version="[19.16.0.20190122,)" />
22+
<dependency id="DlibDotNet" version="[19.16.0.20190223,)" />
2323
</group>
2424
</dependencies>
2525
</metadata>
2626
<files>
2727
<file src="..\src\FaceRecognitionDotNet\bin\Release\netstandard2.0\FaceRecognitionDotNet.dll" target="lib\netstandard2.0" />
2828
<file src="..\src\FaceRecognitionDotNet\bin\Release\netstandard2.0\FaceRecognitionDotNet.xml" target="lib\netstandard2.0" />
29-
<file src="..\src\FaceRecognitionDotNet\docs\ja\*.xml" target="lib\netstandard2.0\ja" />
29+
<file src="..\src\FaceRecognitionDotNet\docs\ja\*.xml" target="lib\netstandard2.0\ja" />
30+
31+
<!-- license -->
32+
<file src="..\LICENSE.txt" target="" />
3033
</files>
3134
</package>

nuget/FaceRecognitionDotNet-CUDA.nuspec

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
<package >
33
<metadata>
44
<id>FaceRecognitionDotNet-WithCUDA</id>
5-
<version>1.2.3.9</version>
5+
<version>1.2.3.10</version>
66
<title>FaceRecognitionDotNet (with CUDA)</title>
77
<authors>Takuya Takeuchi</authors>
88
<owners>Takuya Takeuchi</owners>
99
<requireLicenseAcceptance>true</requireLicenseAcceptance>
10-
<licenseUrl>https://opensource.org/licenses/MIT</licenseUrl>
10+
<license type="file">LICENSE.txt</license>
1111
<projectUrl>https://github.com/takuya-takeuchi/FaceRecognitionDotNet</projectUrl>
1212
<iconUrl>https://github.com/takuya-takeuchi/FaceRecognitionDotNet/blob/master/nuget/face128.png?raw=true</iconUrl>
1313
<description>The world's simplest facial recognition api for .NET
@@ -19,13 +19,16 @@ This library is ported from https://github.com/ageitgey/face_recognition by C#.<
1919
<serviceable>true</serviceable>
2020
<dependencies>
2121
<group targetFramework="netstandard2.0">
22-
<dependency id="DlibDotNet-WithCUDA" version="[19.16.0.20190122,)" />
22+
<dependency id="DlibDotNet-WithCUDA" version="[19.16.0.20190223,)" />
2323
</group>
2424
</dependencies>
2525
</metadata>
2626
<files>
2727
<file src="..\src\FaceRecognitionDotNet\bin\Release\netstandard2.0\FaceRecognitionDotNet.dll" target="lib\netstandard2.0" />
2828
<file src="..\src\FaceRecognitionDotNet\bin\Release\netstandard2.0\FaceRecognitionDotNet.xml" target="lib\netstandard2.0" />
2929
<file src="..\src\FaceRecognitionDotNet\docs\ja\*.xml" target="lib\netstandard2.0\ja" />
30+
31+
<!-- license -->
32+
<file src="..\LICENSE.txt" target="" />
3033
</files>
3134
</package>

nuget/nuget.exe

5.43 MB
Binary file not shown.

src/FaceRecognitionDotNet/FaceRecognition.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,26 @@ public IEnumerable<Location> FaceLocations(Image image, int numberOfTimesToUpsam
372372
}
373373
}
374374

375+
/// <summary>
376+
/// Creates an <see cref="FaceEncoding"/> from the <see cref="double"/> array.
377+
/// </summary>
378+
/// <param name="encoding">The <see cref="double"/> array contains face encoding data.</param>
379+
/// <returns>The <see cref="FaceEncoding"/> this method creates.</returns>
380+
/// <exception cref="ArgumentNullException"><paramref name="encoding"/> is null.</exception>
381+
/// <exception cref="ArgumentOutOfRangeException"><paramref name="encoding"/> must be 128.</exception>
382+
public static FaceEncoding LoadFaceEncoding(double[] encoding)
383+
{
384+
if (encoding == null)
385+
throw new ArgumentNullException(nameof(encoding));
386+
if (encoding.Length != 128)
387+
throw new ArgumentOutOfRangeException($"{nameof(encoding)}.{nameof(encoding.Length)} must be 128.");
388+
389+
var matrix = Matrix<double>.CreateTemplateParameterizeMatrix(0, 1);
390+
matrix.SetSize(128);
391+
matrix.Assign(encoding);
392+
return new FaceEncoding(matrix);
393+
}
394+
375395
/// <summary>
376396
/// Creates an <see cref="Image"/> from the <see cref="byte"/> array.
377397
/// </summary>

src/FaceRecognitionDotNet/FaceRecognitionDotNet.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<Authors>Takuya Takeuchi</Authors>
66
<Copyright>Takuya Takeuchi</Copyright>
77
<Description>Porting face_recognition (by Adam Geitgey) by C#</Description>
8-
<Version>1.2.3.9</Version>
8+
<Version>1.2.3.10</Version>
99
</PropertyGroup>
1010

1111
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

src/FaceRecognitionDotNet/docs/FaceRecognitionDotNet.xml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/FaceRecognitionDotNet/docs/ja/FaceRecognitionDotNet.xml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/FaceRecognitionDotNet.Tests/FaceRecognitionTest.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,96 @@ public void Initialize()
446446
this._FaceRecognition = FaceRecognition.Create(ModelDirectory);
447447
}
448448

449+
[TestMethod]
450+
public void LoadFaceEncoding()
451+
{
452+
var bidenUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Biden_2013.jpg";
453+
var bidenFile = "480px-Biden_2013.jpg";
454+
455+
var path1 = Path.Combine(ImageDirectory, bidenFile);
456+
if (!File.Exists(path1))
457+
{
458+
var url = $"{bidenUrl}/{bidenFile}";
459+
var binary = new HttpClient().GetByteArrayAsync(url).Result;
460+
461+
Directory.CreateDirectory(ImageDirectory);
462+
File.WriteAllBytes(path1, binary);
463+
}
464+
465+
bool atLeast1Time = false;
466+
467+
var getMatrix = typeof(FaceEncoding).GetField("_Encoding", BindingFlags.Instance | BindingFlags.NonPublic);
468+
469+
foreach (var mode in new[] { Mode.Rgb, Mode.Greyscale })
470+
{
471+
using (var image1 = FaceRecognition.LoadImageFile(path1, mode))
472+
{
473+
var encodings = this._FaceRecognition.FaceEncodings(image1).ToArray();
474+
foreach (var e1 in encodings)
475+
{
476+
atLeast1Time = true;
477+
478+
var matrix = getMatrix.GetValue(e1) as Matrix<double>;
479+
Assert.IsNotNull(matrix);
480+
481+
var fe = matrix.ToArray();
482+
483+
using (var e2 = FaceRecognition.LoadFaceEncoding(fe))
484+
{
485+
var distance = FaceRecognition.FaceDistance(e1, e2);
486+
Console.WriteLine($"Original: {distance}");
487+
Assert.IsTrue(Math.Abs(distance) < double.Epsilon);
488+
}
489+
490+
fe[0] = 1;
491+
using (var e2 = FaceRecognition.LoadFaceEncoding(fe))
492+
{
493+
var distance = FaceRecognition.FaceDistance(e1, e2);
494+
Console.WriteLine($"Modified: {distance}");
495+
Assert.IsTrue(Math.Abs(distance) > double.Epsilon);
496+
}
497+
}
498+
499+
foreach (var encoding in encodings)
500+
encoding.Dispose();
501+
}
502+
}
503+
504+
if (!atLeast1Time)
505+
Assert.Fail("Assert check did not execute");
506+
}
507+
508+
[TestMethod]
509+
public void LoadFaceEncodingFail()
510+
{
511+
try
512+
{
513+
FaceRecognition.LoadFaceEncoding(null);
514+
Assert.Fail($"{nameof(this.FaceEncodings)}.{nameof(FaceRecognition.LoadFaceEncoding)} should throw {nameof(ArgumentNullException)}");
515+
}
516+
catch (ArgumentNullException)
517+
{
518+
}
519+
520+
try
521+
{
522+
FaceRecognition.LoadFaceEncoding(new double[129]);
523+
Assert.Fail($"{nameof(this.FaceEncodings)}.{nameof(FaceRecognition.LoadFaceEncoding)} should throw {nameof(ArgumentOutOfRangeException)}");
524+
}
525+
catch (ArgumentOutOfRangeException)
526+
{
527+
}
528+
529+
try
530+
{
531+
FaceRecognition.LoadFaceEncoding(new double[127]);
532+
Assert.Fail($"{nameof(this.FaceEncodings)}.{nameof(FaceRecognition.LoadFaceEncoding)} should throw {nameof(ArgumentOutOfRangeException)}");
533+
}
534+
catch (ArgumentOutOfRangeException)
535+
{
536+
}
537+
}
538+
449539
[TestMethod]
450540
public void LoadImage()
451541
{

0 commit comments

Comments
 (0)