zhangzengfei
2024-09-26 88b1f1d1d14a8fe9e3dde2f363a89d821fc0e641
compare/compare.go
@@ -1,11 +1,10 @@
package compare
import (
   "encoding/base64"
   "fmt"
   "strconv"
   "sdkCompare/cache"
   "sdkCompare/util"
   "basic.com/pubsub/protomsg.git"
   "basic.com/valib/logger.git"
@@ -14,10 +13,12 @@
const thresholdLimit = float32(30)
func GetComparePersonBaseInfo(args protomsg.CompareArgs) []byte {
func Walk(args protomsg.CompareArgs) []byte {
   if args.FaceFeature == nil {
      return nil
   }
   fFeature := util.ByteSlice2float32Slice(args.FaceFeature)
   //指定最低分
   baseScore := thresholdLimit
@@ -29,61 +30,37 @@
      baseScore = 0
   }
   var scResult protomsg.SdkCompareResult
   logger.Debugf("Compare args treeNodes %+v, is all %v, target %s, feature len %d", args.TreeNodes, args.IsCompareAll, args.CompareTarget, len(fFeature))
   var walkedArea = make(map[string]struct{}, 0)
   // 优先比对传入的小区id
   if args.TreeNodes != nil && len(args.TreeNodes) > 0 {
      for _, id := range args.TreeNodes {
         if _, ok := cache.CacheMap.Area[id]; ok {
            targets := cache.CacheMap.Area[id].Walk(DoSdkCompare, args.FaceFeature, baseScore)
            if len(targets) > 0 {
               scResult.CompareResult = append(scResult.CompareResult, targets...)
            }
   var response protomsg.SdkCompareResult
            walkedArea[id] = struct{}{}
         }
      }
      if len(scResult.CompareResult) > 0 {
         goto done
      }
   // 抓拍库比对
   switch args.CompareTarget {
   case "realName":
      response = realNamePersonsCompere(args, fFeature, baseScore)
   case "keyPerson":
      response = keyPersonsCompere(args, fFeature, baseScore)
   default:
      response = capturePersonsCompere(args, fFeature, baseScore)
   }
   // 比对以外的小区
   if !args.IsCompareAll && len(args.TreeNodes) > 0 {
      baseScore += 20
   logger.Debugf("Compare target %s result len %d", args.CompareTarget, len(response.CompareResult))
   if len(response.CompareResult) > 0 {
      logger.Debugf("Compare result %+v", response.CompareResult)
   }
   for key, val := range cache.CacheMap.Area {
      if _, ok := walkedArea[key]; ok {
         continue
      }
      targets := val.Walk(DoSdkCompare, args.FaceFeature, baseScore)
      if len(targets) > 0 {
         scResult.CompareResult = append(scResult.CompareResult, targets...)
      }
   }
done:
   logger.Debugf("比对结果 %d条", len(scResult.CompareResult))
   buf, err := proto.Marshal(&scResult)
   buf, err := proto.Marshal(&response)
   if err != nil {
      logger.Error("scResult Marshal error!", err)
      logger.Error("response Marshal error!", err)
      return nil
   }
   return buf
}
func DoSdkCompare(ci []byte, co string) float32 {
   co_d, err := base64.StdEncoding.DecodeString(co)
   if err != nil {
      logger.Error("DoSdkCompare err:", err)
      return -1
   }
   sec := DecCompare(ci, co_d)
func DoSdkCompare(ci, co []float32) float32 {
   sec := DirectCompare(ci, co)
   //logger.Debug("比对得分为:", sec)
   sec = ParseScore(sec)