From 4ea10d6ce2e1905e50b0282ca3a380f46a0b1dff Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 26 三月 2024 11:28:08 +0800
Subject: [PATCH] add float32 slice must 1536

---
 face/faceCompare.go |  112 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 87 insertions(+), 25 deletions(-)

diff --git a/face/faceCompare.go b/face/faceCompare.go
index ec6a0af..b4b139c 100644
--- a/face/faceCompare.go
+++ b/face/faceCompare.go
@@ -1,37 +1,99 @@
 package face
 
 import (
-    "unsafe"
+	"fmt"
+	"unsafe"
 )
 
+// #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 DecCompare(feat1 []byte, feat2 []byte) float32 {
-    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
+	ffeat1 := byteSlice2float32Slice(feat1)
+	ffeat2 := byteSlice2float32Slice(feat2)
+	if len(ffeat1) != len(ffeat2) {
+		return 0
+	}
+	fmt.Println("len:", len(ffeat1), len(feat2))
+	//fmt.Println("ffeat1:", ffeat1, "ffeat2:", ffeat2, "len:", len(ffeat1), len(feat2))
+	// normalize
+	var score float32
+	for i := 0; i < 1536; i++ {
+		score += ffeat1[i] * ffeat2[i]
+	}
+	score += 0.05
+	if score > 0.9999 {
+		score = 0.9999
+	}
+	if score < 0.0001 {
+		score = 0.0001
+	}
+	fmt.Println("score:", score)
+	return score
 }
 
 func byteSlice2float32Slice(src []byte) []float32 {
-    if len(src) == 0 {
-        return nil
-    }
+	if len(src) == 0 {
+		return nil
+	}
 
-    l := len(src) / 4
-    ptr := unsafe.Pointer(&src[0])
+	l := len(src) / 4
+	ptr := unsafe.Pointer(&src[0])
 
-    return (*[1 << 26]float32)(ptr)[:l:l]
+	return (*[1 << 26]float32)((*[1 << 26]float32)(ptr))[:l:l]
 }

--
Gitblit v1.8.0