@@ -25,28 +25,39 @@ async function initFaceRecognitionNet() {
25
25
}
26
26
27
27
// 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 )
29
31
return Promise . all ( classes . map (
30
32
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
+ }
35
40
return {
36
- descriptor ,
41
+ descriptors ,
37
42
className
38
43
}
39
44
}
40
45
) )
41
46
}
42
47
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
45
58
. map (
46
- ( { descriptor, className } ) => ( {
47
- distance : facerecognition . round (
48
- facerecognition . euclideanDistance ( descriptor , queryDescriptor )
49
- ) ,
59
+ ( { descriptors, className } ) => ( {
60
+ distance : computeMeanDistance ( descriptors ) ,
50
61
className
51
62
} )
52
63
)
0 commit comments