package face
|
|
import (
|
"fmt"
|
"strconv"
|
"unsafe"
|
)
|
|
func ByteSlice2float32Slice(src []byte) []float32 {
|
if len(src) == 0 {
|
return nil
|
}
|
|
l := len(src) / 4
|
ptr := unsafe.Pointer(&src[0])
|
|
return (*[1 << 26]float32)((*[1 << 26]float32)(ptr))[:l:l]
|
}
|
|
func DoSdkCompare(ci, co []float32) float32 {
|
sec := DirectCompare(ci, co)
|
//logger.Debug("比对得分为:", sec)
|
|
sec = ParseScore(sec)
|
return sec
|
}
|
|
func DirectCompare(feat1 []float32, feat2 []float32) float32 {
|
if len(feat1) != len(feat2) {
|
return 0
|
}
|
|
var score float32
|
if len(feat1) != len(feat2) {
|
return 0
|
}
|
l := len(feat1)
|
if l == 0 {
|
return 0
|
}
|
for i := 0; i < l; i++ {
|
score += feat1[i] * feat2[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 ParseScore(compareScore float32) float32 {
|
if compareScore <= 1 {
|
compareScore = compareScore * 100
|
}
|
if compareScore == 100 {
|
return 100
|
}
|
f, _ := strconv.ParseFloat(fmt.Sprintf("%2.2f", compareScore), 32)
|
|
return float32(f)
|
}
|