From 883d8cfee0096974433fe4cbeac1a7a4ee86d9a3 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 26 三月 2024 10:42:33 +0800
Subject: [PATCH] add compare

---
 face/goface.go |   95 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 92 insertions(+), 3 deletions(-)

diff --git a/face/goface.go b/face/goface.go
index 502c2ba..d3b6599 100644
--- a/face/goface.go
+++ b/face/goface.go
@@ -164,15 +164,104 @@
 	return nil
 }
 
+// #if FEATURE_NORMALIZE
+// float CosineDistance(const BYTE* fea1, const BYTE* fea2, int length)
+// {
+// 	int i;
+// 	const float* jfea1 = (const float*)fea1;
+// 	const float* jfea2 = (const float*)fea2;
+
+// 	float score = 0.0f;
+// 	for (i = 0; i < length; i++)
+// 	{
+// 		score += jfea1[i] * jfea2[i];
+// 	}
+
+// 	return score;
+// }
+// #else
+// float CosineDistance(const BYTE* fea1, const BYTE* fea2, int length)
+// {
+// 	int i;
+// 	const float* jfea1 = (const float*)fea1;
+// 	const float* jfea2 = (const float*)fea2;
+// 	double normTemp1 = 0.0;
+// 	double normTemp2 = 0.0;
+// 	double normTemp = 0.0;
+
+// 	double score = 0.0f;
+// 	for (i = 0; i < length; i++) {
+// 		score += jfea1[i] * jfea2[i];
+// 		normTemp1 += jfea1[i] * jfea1[i];
+// 		normTemp2 += jfea2[i] * jfea2[i];
+// 	}
+// 	normTemp = sqrt(normTemp1)*sqrt(normTemp2);
+
+// 	score = score / normTemp;
+
+// 	return score;
+// }
+// #endif
+
+// int feaDim = FEATURE_RAW_SIZE / 4;
+
+// THFEATURE_API float EF_Compare(BYTE* pFeature1,BYTE* pFeature2)
+// {
+// 	if(pFeature1==NULL||pFeature2==NULL) return 0.0f;
+
+// 	float fscore;
+
+// 	BYTE* pFea1=pFeature1;
+// 	BYTE* pFea2=pFeature2;
+
+// 	fscore = CosineDistance(pFea1, pFea2, feaDim);
+// 	fscore+=0.05f;
+
+// 	if(fscore>0.9999f) fscore=0.9999f;
+// 	if(fscore<0.0001f) fscore=0.0001f;
+
+//		return  fscore;
+//	}
+//
+
+func byteSlice2float32Slice(src []byte) []float32 {
+	if len(src) == 0 {
+		return nil
+	}
+
+	l := len(src) / 4
+	ptr := unsafe.Pointer(&src[0])
+
+	return (*[1 << 26]float32)(ptr)[:l:l]
+}
+
 // Compare face compare
 func (s *SDKFace) Compare(feat1 []byte, feat2 []byte) float32 {
 
-	if !s.extractor {
+	ffeat1 := byteSlice2float32Slice(feat1)
+	ffeat2 := byteSlice2float32Slice(feat2)
+	if len(ffeat1) != len(ffeat2) {
 		return 0
 	}
+	// normalize
+	var score float32
+	for i := 0; i < len(ffeat1); i++ {
+		score += ffeat1[i] * ffeat2[i]
+	}
+	score += 0.05
+	if score > 0.9999 {
+		score = 0.9999
+	}
+	if score < 0.0001 {
+		score = 0.0001
+	}
+	return score
 
-	res := C.compare(s.handle, (*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
-	return float32(res)
+	// if !s.extractor {
+	// 	return 0
+	// }
+	// res := C.compare(s.handle, (*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
+	// return float32(res)
 }
 
 // Propertize prop

--
Gitblit v1.8.0