| | |
| | | |
| | | import ( |
| | | "basic.com/pubsub/protomsg.git" |
| | | "sdkCompare/db" |
| | | "sync" |
| | | //"encoding/json" |
| | | //"fmt" |
| | |
| | | |
| | | var Count = make(chan int) |
| | | |
| | | type wfOp func(a []byte, b string) float32 |
| | | type wfOp func(a, b []float32) float32 |
| | | |
| | | /** |
| | | * @param uint8, shardCnt must be pow of two |
| | |
| | | value interface{} |
| | | } |
| | | |
| | | func (s *ShardMap) Walk(wf wfOp, sourceFea []byte, baseScore float32, isWebComp bool, target string) (targets []*protomsg.SdkCompareEach) { |
| | | func (s *ShardMap) Walk(wf wfOp, sourceFea []float32, baseScore float32) (targets []*protomsg.SdkCompareEach) { |
| | | var wg sync.WaitGroup |
| | | var lock sync.Mutex |
| | | for _, si := range s.shards { |
| | | var tempsi shardItem = *si |
| | | |
| | | for _, si := range s.shards { |
| | | var tempsi *shardItem = si // 保持对原始 shardItem 的指针引用 |
| | | |
| | | // 跳过空分片 |
| | | if len(tempsi.data) == 0 { |
| | | continue |
| | | } |
| | | |
| | | wg.Add(1) |
| | | |
| | | go func(st *shardItem, fw wfOp, sf []byte, baseSec float32, isWeb bool) { |
| | | go func(st *shardItem, fn wfOp, srcFeat []float32, baseSec float32) { |
| | | defer wg.Done() |
| | | st.RLock() // 锁定读取 |
| | | defer st.RUnlock() // 确保读取完毕后解锁 |
| | | |
| | | for _, feature := range st.data { |
| | | if eif, ok := feature.(*protomsg.Esinfo); ok { |
| | | if !isWeb { //不会比对抓拍库,只比对有效的人 |
| | | if eif.Enable == 1 { |
| | | score := float32(0) |
| | | if target == "car" { |
| | | if eif.CarNo != "" { |
| | | score = strComp(sf, eif.CarNo) |
| | | } else { |
| | | continue |
| | | } |
| | | } else { |
| | | score = fw(sf, eif.FaceFeature) |
| | | } |
| | | if score > 0 && score >= baseScore { |
| | | lock.Lock() |
| | | targets = append(targets, &protomsg.SdkCompareEach{ |
| | | Id: eif.Id, |
| | | CompareScore: score, |
| | | Tableid: eif.Tableid, |
| | | }) |
| | | lock.Unlock() |
| | | } |
| | | } |
| | | } else { //来源是web,会比对抓拍库,不管是否有效都需要比对 |
| | | score := float32(0) |
| | | if target == "car" { |
| | | if eif.CarNo != "" { |
| | | score = strComp(sf, eif.CarNo) |
| | | } else { |
| | | continue |
| | | } |
| | | } else { |
| | | score = fw(sf, eif.FaceFeature) |
| | | } |
| | | if score > 0 && score >= baseScore { |
| | | lock.Lock() |
| | | targets = append(targets, &protomsg.SdkCompareEach{ |
| | | Id: eif.Id, |
| | | CompareScore: score, |
| | | Tableid: eif.Tableid, |
| | | }) |
| | | lock.Unlock() |
| | | } |
| | | // 读取操作在锁内进行,防止并发冲突 |
| | | if item, ok := feature.(*db.FeatureCacheBase); ok { |
| | | score := fn(srcFeat, item.FaceFeature) |
| | | if score > 0 && score >= baseScore { |
| | | lock.Lock() // 保护目标切片的写入 |
| | | targets = append(targets, &protomsg.SdkCompareEach{ |
| | | Id: item.Id, |
| | | CompareScore: score, |
| | | Tableid: item.TableId, |
| | | }) |
| | | lock.Unlock() |
| | | } |
| | | } |
| | | } |
| | | |
| | | }(&tempsi, wf, sourceFea, baseScore, isWebComp) |
| | | }(tempsi, wf, sourceFea, baseScore) |
| | | } |
| | | |
| | | wg.Wait() |
| | | return targets |
| | | |
| | | } |
| | | |
| | | // print all |