| | |
| | | |
| | | import ( |
| | | "encoding/json" |
| | | "fmt" |
| | | "ruleprocess/cache" |
| | | "ruleprocess/logger" |
| | | "sort" |
| | |
| | | "time" |
| | | |
| | | bigCache "basic.com/pubsub/cache.git" |
| | | "basic.com/pubsub/cache.git/esutil" |
| | | "basic.com/pubsub/protomsg.git" |
| | | "github.com/knetic/govaluate" |
| | | ) |
| | |
| | | |
| | | // 把sdk从数据帧上提取的按照区域分类归置 |
| | | func SdkDataFormat(cameraId string, arg *SdkData, cameraPolygons []protomsg.CameraPolygon) { |
| | | logger.Info("--------看看解析出来的数据---", *arg) |
| | | logger.Info("==================================本sdkData中解出来的目标数据=======================================") |
| | | for _,photo := range arg.Photo{ |
| | | logger.Info("--------看看解析出来的数据---", cameraId,arg.IpcId,photo.Rects,photo.Score) |
| | | } |
| | | for _, polygon := range cameraPolygons { |
| | | //logger.Println("++++++在这儿看一下区域啊:", polygon.Polygon) |
| | | areaMap := AreaMap{cameraId: cameraId, areaId: polygon.Id, areaJson: polygon.Polygon, triggerLine: polygon.TriggerLine, directionLine: polygon.DirectionLine} |
| | |
| | | } |
| | | } |
| | | func Compare(args *SdkDatas, groupRule *protomsg.GroupRule) { |
| | | compareFlag := false |
| | | compareFlag := 0 |
| | | tableIds := "" |
| | | // 看看是否有只配人脸比对算法但没有配对比库的规则,如果有,则比对对象为全部底库 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" { // 配了人脸比对 |
| | | if groupRule.Rules[j].SdkArgAlias == "compareBase" { // 配了比对的底库 |
| | | compareFlag = true |
| | | if groupRule.Rules[j].SdkArgAlias == "compareBase" && groupRule.Rules[j].SdkArgValue != "" { // 配了比对底库的参数但没有配全部底库 |
| | | compareFlag = 2 |
| | | tableIds = groupRule.Rules[j].SdkArgValue + "," // 最后会多一个tableId,切出来的数组取len-1就可以 |
| | | } |
| | | if groupRule.Rules[j].SdkArgAlias == "compareBase" && groupRule.Rules[j].SdkArgValue == "" { // 配的参数是比对全部底库 |
| | | compareFlag = 1 |
| | | } |
| | | } |
| | | } |
| | | if compareFlag { |
| | | logger.Info("配置了对比底库参数") |
| | | } else { |
| | | // 作弊,直接让其比对全部底库 |
| | | compareFlag = 1 |
| | | if compareFlag == 0 { |
| | | logger.Info("没有配置对比底库参数") |
| | | return |
| | | } |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | // 只有是人脸对比并且配置的参数是对比底库才走(若配的对比阈值则不走) |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && groupRule.Rules[j].SdkArgAlias == "compareBase" { |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972"{ |
| | | for _, sdkData := range args.Sdkdata { |
| | | if sdkData.IpcId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 搜索到人脸检测的sdkdata 现在关于人脸的只有他一个sdk,全找他 |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | // 拿区域中每个人脸特征值去对比,填充其liker |
| | | if groupRule.Rules[j].PolygonId == areaMap.areaId { |
| | | for _, arg := range areaMap.args { |
| | | bytes := bigCache.Getdbpersonmsg("", arg.Feature, true) |
| | | var m map[string]float32 |
| | | err1 := json.Unmarshal(bytes, &m) |
| | | if err1 != nil { |
| | | logger.Error("getBaseInfo解压错误", err1) |
| | | if compareFlag == 1 { |
| | | bytes := bigCache.Getdbpersonmsg("", arg.Feature, true) |
| | | var m map[string]float32 |
| | | err1 := json.Unmarshal(bytes, &m) |
| | | if err1 != nil { |
| | | logger.Error("getBaseInfo解压错误", err1) |
| | | } |
| | | for key, val := range m { |
| | | baseinfo,err1 := esutil.Dbpersoninfosbyid(key) |
| | | if err1 != nil { |
| | | logger.Error("查询底库人员信息出错",err1) |
| | | } |
| | | baseinfo.CompareScore = val |
| | | arg.Liker = append(arg.Liker, &baseinfo) |
| | | } |
| | | } |
| | | for key, val := range m { |
| | | fmt.Println(key) |
| | | baseinfo := protomsg.Baseinfo{} |
| | | baseinfo.CompareScore = val |
| | | arg.Liker = append(arg.Liker, &baseinfo) |
| | | if compareFlag == 2 { |
| | | array := strings.Split(tableIds, ",") |
| | | for i := 0; i < len(array)-1; i++ { |
| | | bytes := bigCache.Getdbpersonmsg(array[i], arg.Feature, true) |
| | | var m map[string]float32 |
| | | err1 := json.Unmarshal(bytes, &m) |
| | | if err1 != nil { |
| | | logger.Error("getBaseInfo解压错误", err1) |
| | | } |
| | | for key, val := range m { |
| | | baseinfo, err1 := esutil.Dbpersoninfosbyid(key) |
| | | if err1 != nil { |
| | | logger.Error("查询底库人员信息出错",err1) |
| | | } |
| | | baseinfo.CompareScore = val |
| | | arg.Liker = append(arg.Liker, &baseinfo) |
| | | } |
| | | } |
| | | } |
| | | logger.Info("-------------------成功给liker赋值:", arg.Liker) |
| | | } |
| | |
| | | sdkName := sdk.SdkName |
| | | |
| | | if ipcId == sdkData.IpcId { |
| | | logger.Info("当前走的规则的算法是--:",sdkName,"---") |
| | | logger.Info("当前走的规则的算法是--:", sdkName, "---") |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | ruleResult := filterRule(groupRule.Rules[j], &areaMap) |
| | | if ruleResult.Result != "" { |
| | |
| | | timeEle.N = timeEle.InitN // 重置定时器 |
| | | } |
| | | } |
| | | logger.Info("-------------------重置定时器并返回false---------------") |
| | | logger.Info("-------------------重置可能存在的定时器并返回false---------------") |
| | | return false |
| | | } else { |
| | | // 最后成功报警才把符合条件的人脸数据塞进结果标签里 |
| | |
| | | if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" { |
| | | // 如果是不规矩的连接符统统返回false 规则也只能判断人脸的相似度,所以不存在别的连接符 |
| | | if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加 |
| | | logger.Info("--------------------终于等到你的下文") |
| | | var args []Arg |
| | | if rule.RuleWithPre == "&&" { |
| | | args = am.filterData |