Skip to content

Commit bdfaba2

Browse files
fixed detect and recognize example
1 parent 2b127e4 commit bdfaba2

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

examples/public/commons.js

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,39 @@ async function initFaceRecognitionNet() {
2525
}
2626

2727
// fetch first image of each class and compute their descriptors
28-
async function initTrainDescriptorsByClass(net) {
28+
async function initTrainDescriptorsByClass(net, numImagesForTraining = 1) {
29+
const maxAvailableImagesPerClass = 5
30+
numImagesForTraining = Math.min(numImagesForTraining, maxAvailableImagesPerClass)
2931
return Promise.all(classes.map(
3032
async className => {
31-
const img = await facerecognition.bufferToImage(
32-
await fetchImage(getFaceImageUri(className, 1))
33-
)
34-
const descriptor = await net.computeFaceDescriptor(img)
33+
const descriptors = []
34+
for (let i = 1; i < (numImagesForTraining + 1); i++) {
35+
const img = await facerecognition.bufferToImage(
36+
await fetchImage(getFaceImageUri(className, i))
37+
)
38+
descriptors.push(await net.computeFaceDescriptor(img))
39+
}
3540
return {
36-
descriptor,
41+
descriptors,
3742
className
3843
}
3944
}
4045
))
4146
}
4247

43-
function getBestMatch(allDescriptors, queryDescriptor) {
44-
return allDescriptors
48+
function getBestMatch(descriptorsByClass, queryDescriptor) {
49+
function computeMeanDistance(descriptorsOfClass) {
50+
return facerecognition.round(
51+
descriptorsOfClass
52+
.map(d => facerecognition.euclideanDistance(d, queryDescriptor))
53+
.reduce((d1, d2) => d1 + d2, 0)
54+
/ (descriptorsOfClass.length || 1)
55+
)
56+
}
57+
return descriptorsByClass
4558
.map(
46-
({ descriptor, className }) => ({
47-
distance: facerecognition.round(
48-
facerecognition.euclideanDistance(descriptor, queryDescriptor)
49-
),
59+
({ descriptors, className }) => ({
60+
distance: computeMeanDistance(descriptors),
5061
className
5162
})
5263
)

examples/views/detectAndRecognizeFaces.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</div>
4242

4343
<script>
44-
const threshold = 0.6
44+
const threshold = 0.8
4545
let minConfidence = 0.7
4646
let detectionNet, recognitionNet
4747
let trainDescriptorsByClass = []
@@ -71,7 +71,7 @@
7171
const detectionsForSize = detections.map(det => det.forSize(width, height))
7272
facerecognition.drawDetection('overlay', detectionsForSize, { withScore: false })
7373

74-
const faceTensors = await facerecognition.extractFaceTensors(input, detections)
74+
const faceTensors = (await facerecognition.extractFaceTensors(input, detections))
7575
const descriptors = await Promise.all(faceTensors.map(t => recognitionNet.computeFaceDescriptor(t)))
7676

7777
// free memory for face image tensors after we computed their descriptors
@@ -94,7 +94,7 @@
9494
async function run() {
9595
detectionNet = await initFaceDetectionNet()
9696
recognitionNet = await initFaceRecognitionNet()
97-
trainDescriptorsByClass = await initTrainDescriptorsByClass(recognitionNet)
97+
trainDescriptorsByClass = await initTrainDescriptorsByClass(recognitionNet, 1)
9898
$('#loader').hide()
9999
onSelectionChanged($('#selectList select').val())
100100
}

0 commit comments

Comments
 (0)