zhangmeng
2024-03-26 883d8cfee0096974433fe4cbeac1a7a4ee86d9a3
add compare
1个文件已修改
95 ■■■■■ 已修改文件
face/goface.go 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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