Skip to content

Commit

Permalink
Merge branch 'release/1.2.3.6'
Browse files Browse the repository at this point in the history
  • Loading branch information
takuya-takeuchi committed Dec 20, 2018
2 parents d578352 + 9c4e008 commit 2d368fa
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 22 deletions.
2 changes: 1 addition & 1 deletion nuget/FaceRecognitionDotNet-CPU.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<package >
<metadata>
<id>FaceRecognitionDotNet</id>
<version>1.2.3.5</version>
<version>1.2.3.6</version>
<title>FaceRecognitionDotNet</title>
<authors>Takuya Takeuchi</authors>
<owners>Takuya Takeuchi</owners>
Expand Down
2 changes: 1 addition & 1 deletion nuget/FaceRecognitionDotNet-CUDA.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<package >
<metadata>
<id>FaceRecognitionDotNet-WithCUDA</id>
<version>1.2.3.5</version>
<version>1.2.3.6</version>
<title>FaceRecognitionDotNet (with CUDA)</title>
<authors>Takuya Takeuchi</authors>
<owners>Takuya Takeuchi</owners>
Expand Down
65 changes: 46 additions & 19 deletions src/FaceRecognitionDotNet/FaceRecognition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,11 @@ public IEnumerable<FaceEncoding> FaceEncodings(Image image, IEnumerable<Location

var rawLandmarks = this.RawFaceLandmarks(image, knownFaceLocation, PredictorModel.Small);
foreach (var landmark in rawLandmarks)
yield return new FaceEncoding(FaceRecognitionModelV1.ComputeFaceDescriptor(this._FaceEncoder, image, landmark, numJitters));
{
var ret = new FaceEncoding(FaceRecognitionModelV1.ComputeFaceDescriptor(this._FaceEncoder, image, landmark, numJitters));
landmark.Dispose();
yield return ret;
}
}

/// <summary>
Expand All @@ -275,16 +279,20 @@ public IEnumerable<FaceEncoding> FaceEncodings(Image image, IEnumerable<Location
if (this.IsDisposed)
throw new ObjectDisposedException(nameof(FaceEncoding));

var landmarks = this.RawFaceLandmarks(faceImage, faceLocations, model);
var landmarks = this.RawFaceLandmarks(faceImage, faceLocations, model).ToArray();
var landmarkTuples = landmarks.Select(landmark => Enumerable.Range(0, (int)landmark.Parts)
.Select(index => new Point(landmark.GetPart((uint)index))).ToArray());

// For a definition of each point index, see https://cdn-images-1.medium.com/max/1600/1*AbEg31EgkbXSQehuNJBlWg.png
switch (model)
var results = new List<Dictionary<FacePart, IEnumerable<Point>>>();

try
{
case PredictorModel.Large:
foreach (var landmarkTuple in landmarkTuples)
yield return new Dictionary<FacePart, IEnumerable<Point>>

// For a definition of each point index, see https://cdn-images-1.medium.com/max/1600/1*AbEg31EgkbXSQehuNJBlWg.png
switch (model)
{
case PredictorModel.Large:
results.AddRange(landmarkTuples.Select(landmarkTuple => new Dictionary<FacePart, IEnumerable<Point>>
{
{ FacePart.Chin, Enumerable.Range(0,17).Select(i => landmarkTuple[i]).ToArray() },
{ FacePart.LeftEyebrow, Enumerable.Range(17,5).Select(i => landmarkTuple[i]).ToArray() },
Expand All @@ -306,20 +314,27 @@ public IEnumerable<FaceEncoding> FaceEncodings(Image image, IEnumerable<Location
.Concat( new [] { landmarkTuple[66] })
.Concat( new [] { landmarkTuple[65] })
.Concat( new [] { landmarkTuple[64] }) }
};
break;
case PredictorModel.Small:
foreach (var landmarkTuple in landmarkTuples)
yield return new Dictionary<FacePart, IEnumerable<Point>>
}));
break;
case PredictorModel.Small:
results.AddRange(landmarkTuples.Select(landmarkTuple => new Dictionary<FacePart, IEnumerable<Point>>
{
{ FacePart.NoseTip, Enumerable.Range(4,1).Select(i => landmarkTuple[i]).ToArray() },
{ FacePart.LeftEye, Enumerable.Range(2,2).Select(i => landmarkTuple[i]).ToArray() },
{ FacePart.RightEye, Enumerable.Range(0,2).Select(i => landmarkTuple[i]).ToArray() }
};
break;
default:
throw new ArgumentOutOfRangeException(nameof(model), model, null);
}));
break;
default:
throw new ArgumentOutOfRangeException(nameof(model), model, null);
}
}
finally
{
foreach (var landmark in landmarks)
landmark.Dispose();
}

return results.ToArray();
}

/// <summary>
Expand All @@ -344,11 +359,19 @@ public IEnumerable<Location> FaceLocations(Image image, int numberOfTimesToUpsam
{
case Model.Cnn:
foreach (var face in this.RawFaceLocations(image, numberOfTimesToUpsample, Model.Cnn))
yield return TrimBound(face.Rect, image.Width, image.Height);
{
var ret = TrimBound(face.Rect, image.Width, image.Height);
face.Dispose();
yield return ret;
}
break;
default:
foreach (var face in this.RawFaceLocations(image, numberOfTimesToUpsample, model))
yield return TrimBound(face.Rect, image.Width, image.Height);
{
var ret = TrimBound(face.Rect, image.Width, image.Height);
face.Dispose();
yield return ret;
}
break;
}
}
Expand Down Expand Up @@ -418,7 +441,11 @@ private IEnumerable<FullObjectDetection> RawFaceLandmarks(Image faceImage, IEnum
posePredictor = this._PosePredictor5Point;

foreach (var rect in tmp)
yield return posePredictor.Detect(faceImage.Matrix, rect);
{
var ret = posePredictor.Detect(faceImage.Matrix, rect);
rect.Dispose();
yield return ret;
}
}

private IEnumerable<MModRect> RawFaceLocations(Image faceImage, int numberOfTimesToUpsample = 1, Model model = Model.Hog)
Expand Down
2 changes: 1 addition & 1 deletion src/FaceRecognitionDotNet/FaceRecognitionDotNet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<Authors>Takuya Takeuchi</Authors>
<Copyright>Takuya Takeuchi</Copyright>
<Description>Porting face_recognition (by Adam Geitgey) by C#</Description>
<Version>1.2.3.5</Version>
<Version>1.2.3.6</Version>
</PropertyGroup>

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

0 comments on commit 2d368fa

Please sign in to comment.