From cbe73e3706a6494b506febd0e4a51ce1096aae1f Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期四, 05 十二月 2019 17:21:46 +0800 Subject: [PATCH] 加跟踪算法,进程间通讯加sleep --- algorithm/middleware/middleware.go | 104 ++++- ruleserver/server.go | 2 go.mod | 1 ruleserver/ruleToformula.go | 17 + ruleserver/readyDataForRule.go | 110 +++--- labelFilter/req.go | 33 - algorithm/personTrack/personTrack.go | 203 ++++++++++++ go.sum | 2 insertdata/insertDataToEs.go | 75 +--- algorithm/middleware/readyData.go | 214 ++++++++----- main.go | 90 ++--- logger/log.xml | 4 structure/rule.go | 47 +- 13 files changed, 582 insertions(+), 320 deletions(-) diff --git a/algorithm/middleware/middleware.go b/algorithm/middleware/middleware.go index 282e069..8657df7 100644 --- a/algorithm/middleware/middleware.go +++ b/algorithm/middleware/middleware.go @@ -18,6 +18,38 @@ resultSplice := []*structure.LittleRuleResult{} sdkNames := "" polygonId := "" + // 杩欐杩囩殑鏄椂闂存瑙勫垯锛堟椂闂存绛夛級 + for j := 0; j < len(groupRule.Rules); j++ { + for _, sdkData := range args.Sdkdata { + sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) + if err != nil { + logger.Error("娌℃煡鍒皊dk鐨勪俊鎭�---", err) + } + ipcId := sdk.IpcId + sdkName := sdk.SdkName + if ipcId == sdkData.IpcId { + for _, areaMap := range sdkData.AreaMapList { + ruleResult := timeRuleResult(groupRule.Rules[j], areaMap) + if ruleResult.Result != "" { + if strings.Contains(ruleResult.Result, "false") { + return false,"","" // 涓嶇鍚堟椂闂磋鍒欑殑璇濈洿鎺ヨ繑鍥烇紝涓嶅啀娴垂鏃堕棿 + } + if strings.Contains(ruleResult.Result, "true") { + areaMap.IsEffective = true + } + //logger.Info("鏃堕棿瑙勫垯缁撴灉锛�", ruleResult.Result) + if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) { + sdkNames = sdkName + " " + } + if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) { + polygonId += groupRule.Rules[j].PolygonId + "," + } + resultSplice = append(resultSplice, &ruleResult) + } + } + } + } + } // 鍏堣繃瀹屾潯浠惰鍒� for j := 0; j < len(groupRule.Rules); j++ { @@ -168,6 +200,42 @@ } } } + // 璺ㄦ憚鍍忔満璺熻釜 + for j := 0; j < len(groupRule.Rules); j++ { + if groupRule.Rules[j].SdkId == "浜轰綋璺熻釜" && groupRule.Rules[j].SdkArgAlias != "鐏甸瓊鍙傛暟"{ + for _, sdkData := range args.Sdkdata { + // 鏍规嵁瑙勫垯鐨剆dkId鏌ュ嚭鍏跺搴旂殑ipcId锛岀敤ipcId鍘绘壘璇ユ瘮瀵圭殑鏁版嵁 + sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) + if err != nil { + _ = logger.Error("娌℃煡鍒皊dk鐨勪俊鎭�---", err) + } + ipcId := sdk.IpcId + sdkName := sdk.SdkName + //logger.Info("瑙勫垯鐨刬pcId涓巗dkData鐨処pcId:", ipcId, "===", sdkData.IpcId) + if ipcId == sdkData.IpcId { + //logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", groupRule.Rules[j],sdkName,groupRule.Rules[j].SdkArgAlias, "---","") + for _, areaMap := range sdkData.AreaMapList { + ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message) + if ruleResult.Result != "" { + //logger.Info("杞︾墝缁撴灉锛�", ruleResult.Result) + // 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥 + if strings.Contains(ruleResult.Result, "true") { + areaMap.IsEffective = true + } + // 濡傛灉姝ょ粨鏋滀负鐪熶笖褰撳墠杩囩殑鏄痽olo绠楁硶锛屽簲璁颁笅姝よ鍒欐墍瀵瑰簲鐨剆dkName,鍙﹀锛岃繕瑕佸幓閲� (鍚庡姞锛氭妸姝ゆ潯瑙︾鐨勫尯鍩焛d涔熻褰曚笅鏉�) + if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) { + sdkNames = sdkName + " " + } + if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) { + polygonId += groupRule.Rules[j].PolygonId + "," + } + resultSplice = append(resultSplice, &ruleResult) + } + } + } + } + } + } // 鍐嶈繃鍏朵粬鏁版嵁 杩欐鐩存帴寰楀埌缁撴灉锛堢湡鎴栧亣锛� 杩囩洰鏍囨暟閲� for j := 0; j < len(groupRule.Rules); j++ { if groupRule.Rules[j].SdkArgAlias == "objCount" { @@ -200,35 +268,7 @@ } } } - // 杩欐杩囩殑鏄椂闂存瑙勫垯锛堟椂闂存绛夛級 - for j := 0; j < len(groupRule.Rules); j++ { - for _, sdkData := range args.Sdkdata { - sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) - if err != nil { - logger.Error("娌℃煡鍒皊dk鐨勪俊鎭�---", err) - } - ipcId := sdk.IpcId - sdkName := sdk.SdkName - if ipcId == sdkData.IpcId { - for _, areaMap := range sdkData.AreaMapList { - ruleResult := timeRuleResult(groupRule.Rules[j], areaMap) - if ruleResult.Result != "" { - if strings.Contains(ruleResult.Result, "true") { - areaMap.IsEffective = true - } - //logger.Info("鏃堕棿瑙勫垯缁撴灉锛�", ruleResult.Result) - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) { - sdkNames = sdkName + " " - } - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) { - polygonId += groupRule.Rules[j].PolygonId + "," - } - resultSplice = append(resultSplice, &ruleResult) - } - } - } - } - } + // 灏嗘暟缁勬寜sort鎺掑簭 sort.Sort(ruleserver.ResultList(resultSplice)) // 鎺掑簭鍚庡彇鍚勮嚜鐨勭粨鏋滃拰杩炴帴绗︽嫾鍑鸿鍒欒〃杈惧紡寰楀嚭缁撴灉 @@ -334,9 +374,11 @@ soName = "static.so" } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a978" { soName = "plate.so" + } else if sdkId == "浜轰綋璺熻釜" { + soName = "personTrack.so" } - //soInfo,errr := cache.GetSoInfoById(sdkId) - //if errr != nil { + //soInfo,err := cache.GetSoInfoById(sdkId) + //if err != nil { // panic("娌¤鍒版敞鍐岃〃") //} //soName := soInfo.SoName diff --git a/algorithm/middleware/readyData.go b/algorithm/middleware/readyData.go index ee8c813..8b367f8 100644 --- a/algorithm/middleware/readyData.go +++ b/algorithm/middleware/readyData.go @@ -35,7 +35,7 @@ // 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁� a.TargetNum++ uuid := uuid.NewV4().String() - arg1 := structure.Arg{obj.Id,uuid,obj.Score, ruleserver.PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}} + arg1 := structure.Arg{structure.SourceArg{obj.Id,uuid,obj.Score, ruleserver.PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature,obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}},structure.SourceArg{}} //logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1) a.Args = append(a.Args, &arg1) a.FilterData = append(a.FilterData, &arg1) @@ -106,91 +106,135 @@ logger.Info("鎺ュ埌鏁版嵁锛屾憚鍍忔満涓猴細", m.Cid, "鍥剧墖鐨刬d涓猴細", i.Id) //logger.Info("----------------鐪嬬湅鏈夊嚑涓畻娉曪細",len(m.Tasklab.Sdkinfos)) for _, sdkinfo := range m.Tasklab.Sdkinfos { // yolo绠楁硶 - if sdkinfo.Sdktype == "Yolo" { - arg := structure.SdkData{} - arg.TaskId = m.Tasklab.Taskid - arg.IpcId = sdkinfo.Ipcid - arg.IsYolo = true - arg.ImageWidth = int(i.Width) - arg.ImageHeight = int(i.Height) - logger.Info("-----杩借釜涔嬪悗sdkinfo.Sdkdata鐨勯暱搴︿负锛�----", len(sdkinfo.Sdkdata)) - if len(sdkinfo.Sdkdata) > 1 { - // 澶т簬1鎵嶆湁鏁版嵁 - yoloParam := protomsg.ParamYoloObj{} - err = proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam) - if err != nil { - logger.Info("瑙f瀽YOLO sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err) - continue - } - var yoloNum int = 0 - for _, info := range yoloParam.Infos { - if info.Typ == 0 { - //logger.Debug("-------------yolo鐨勫潗鏍囨湁鍑犱釜",info.RcObj) - photoMap := structure.PhotoMap{Rects: rectFormat(info.RcObj), Score: float64(info.Prob) * 100, Type: "yolo",Id:strconv.Itoa(int(info.ObjID))} - arg.Photo = append(arg.Photo, photoMap) - yoloNum++ - } - } - logger.Info("--------------杩借釜涔嬪悗yolo鐨勪釜鏁帮細", yoloNum) - args.Sdkdata = append(args.Sdkdata, &arg) - } else { - continue - } - - } - if sdkinfo.Sdktype == "FaceDetect" { // 浜鸿劯妫�娴� - arg := structure.SdkData{} - arg.TaskId = m.Tasklab.Taskid - arg.IpcId = sdkinfo.Ipcid - arg.IsYolo = false - arg.ImageWidth = int(i.Width) - arg.ImageHeight = int(i.Height) - if len(sdkinfo.Sdkdata) > 1 { - faceParam := protomsg.ParamFacePos{} - err = proto.Unmarshal(sdkinfo.Sdkdata, &faceParam) - if err != nil { - logger.Info("瑙f瀽FACE sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err) - continue - } - logger.Info("--------------杩借釜涔嬪悗浜鸿劯鐨勪釜鏁帮細", len(faceParam.Faces)) - for _, info := range faceParam.Faces { - //logger.Info("_______________________________________________绗竴娆$湅鐩镐技鍊硷細",info.Pos.FAngle.Confidence*100) - photoMap := structure.PhotoMap{Id: strconv.Itoa(int(info.Pos.FaceID)) , Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence * 100), Type: "face", ThftRes: *(info.Result), Feature: info.Feats} - arg.Photo = append(arg.Photo, photoMap) - } - args.Sdkdata = append(args.Sdkdata, &arg) - } else { - continue - } - } - if sdkinfo.Sdktype == "Plate" { // 杞︾墝璇嗗埆 - arg := structure.SdkData{} - arg.TaskId = m.Tasklab.Taskid - logger.Info("杞︾墝鐨刬pcid锛�",sdkinfo.Ipcid) - arg.IpcId = sdkinfo.Ipcid - arg.IsYolo = false - arg.ImageWidth = int(i.Width) - arg.ImageHeight = int(i.Height) - if len(sdkinfo.Sdkdata) > 1 { - plateIDResult := protomsg.PlateIDResult {} - err = proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult ) - if err != nil { - logger.Info("瑙f瀽杞︾墝鏁版嵁鏃跺嚭鐜伴敊璇�", err) - continue - } - for _, info := range plateIDResult.Result { - logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation) - if info.NConfidence > 70 { - logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,) - photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info} - arg.Photo = append(arg.Photo, photoMap) - } - } - args.Sdkdata = append(args.Sdkdata, &arg) - } else { - continue - } + switch sdkinfo.Sdktype { + case "Yolo": + extractYolo(args,m,sdkinfo,i) + case "FaceDetect": + extractFace(args,m,sdkinfo,i) + case "Plate": + extractCar(args,m,sdkinfo,i) + case "Track": + extractTrack(args,m,sdkinfo,i) } } return m } + +// 鎶婁汉鑴告斁杩涘搴旂殑浜轰綋 +func FacePush2Body () { + +} +// 鎻愬彇face +func extractFace(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) { + arg := structure.SdkData{} + arg.TaskId = m.Tasklab.Taskid + arg.IpcId = sdkinfo.Ipcid + arg.IsYolo = false + arg.ImageWidth = int(i.Width) + arg.ImageHeight = int(i.Height) + if len(sdkinfo.Sdkdata) > 1 { + faceParam := protomsg.ParamFacePos{} + err := proto.Unmarshal(sdkinfo.Sdkdata, &faceParam) + if err != nil { + logger.Info("瑙f瀽FACE sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err) + return + } + logger.Info("--------------杩借釜涔嬪悗浜鸿劯鐨勪釜鏁帮細", len(faceParam.Faces)) + for _, info := range faceParam.Faces { + //logger.Info("_______________________________________________绗竴娆$湅鐩镐技鍊硷細",info.Pos.FAngle.Confidence*100) + photoMap := structure.PhotoMap{Id: strconv.Itoa(int(info.Pos.FaceID)) , Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence * 100), Type: "face", ThftRes: *(info.Result), Feature: info.Feats} + arg.Photo = append(arg.Photo, photoMap) + } + args.Sdkdata = append(args.Sdkdata, &arg) + } +} +// 鎻愬彇yolo +func extractYolo(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) { + arg := structure.SdkData{} + arg.TaskId = m.Tasklab.Taskid + arg.IpcId = sdkinfo.Ipcid + arg.IsYolo = true + arg.ImageWidth = int(i.Width) + arg.ImageHeight = int(i.Height) + logger.Info("-----杩借釜涔嬪悗sdkinfo.Sdkdata鐨勯暱搴︿负锛�----", len(sdkinfo.Sdkdata)) + if len(sdkinfo.Sdkdata) > 1 { + // 澶т簬1鎵嶆湁鏁版嵁 + yoloParam := protomsg.ParamYoloObj{} + err := proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam) + if err != nil { + logger.Info("瑙f瀽YOLO sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err) + return + } + var yoloNum int = 0 + for _, info := range yoloParam.Infos { + if info.Typ == 0 { + //logger.Debug("-------------yolo鐨勫潗鏍囨湁鍑犱釜",info.RcObj) + photoMap := structure.PhotoMap{Rects: rectFormat(info.RcObj), Score: float64(info.Prob) * 100, Type: "yolo",Id:strconv.Itoa(int(info.ObjID))} + arg.Photo = append(arg.Photo, photoMap) + yoloNum++ + } + } + logger.Info("--------------杩借釜涔嬪悗yolo鐨勪釜鏁帮細", yoloNum) + args.Sdkdata = append(args.Sdkdata, &arg) + } else { + return + } +} + +// 鎻愬彇car +func extractCar(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) { + arg := structure.SdkData{} + arg.TaskId = m.Tasklab.Taskid + arg.IpcId = sdkinfo.Ipcid + arg.IsYolo = false + arg.ImageWidth = int(i.Width) + arg.ImageHeight = int(i.Height) + if len(sdkinfo.Sdkdata) > 1 { + plateIDResult := protomsg.PlateIDResult {} + err := proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult ) + if err != nil { + logger.Info("瑙f瀽杞︾墝鏁版嵁鏃跺嚭鐜伴敊璇�", err) + return + } + for _, info := range plateIDResult.Result { + logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation) + if info.NConfidence > 70 { + logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,) + photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info} + arg.Photo = append(arg.Photo, photoMap) + } + } + args.Sdkdata = append(args.Sdkdata, &arg) + } else { + return + } +} + +// 鎻愬彇璺熻釜 +func extractTrack(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) { + arg := structure.SdkData{} + arg.TaskId = m.Tasklab.Taskid + arg.IpcId = sdkinfo.Ipcid + arg.IsYolo = false + arg.ImageWidth = int(i.Width) + arg.ImageHeight = int(i.Height) + if len(sdkinfo.Sdkdata) > 1 { + plateIDResult := protomsg.PlateIDResult {} + err := proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult ) + if err != nil { + logger.Info("瑙f瀽璺熻釜鐩爣鏁版嵁鏃跺嚭鐜伴敊璇�", err) + return + } + for _, info := range plateIDResult.Result { + logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation) + if info.NConfidence > 70 { + logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,) + photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info} + arg.Photo = append(arg.Photo, photoMap) + } + } + args.Sdkdata = append(args.Sdkdata, &arg) + } else { + return + } +} \ No newline at end of file diff --git a/algorithm/personTrack/personTrack.go b/algorithm/personTrack/personTrack.go new file mode 100644 index 0000000..3961c0e --- /dev/null +++ b/algorithm/personTrack/personTrack.go @@ -0,0 +1,203 @@ +package personTrack + +import ( + "encoding/json" + "errors" + "net" + "strconv" + + "nanomsg.org/go-mangos" + "nanomsg.org/go-mangos/protocol/req" + "nanomsg.org/go-mangos/transport/tcp" + "github.com/knetic/govaluate" + logger "github.com/alecthomas/log4go" + + "basic.com/pubsub/protomsg.git" + "ruleprocess/structure" +) + +var sender chan []byte = make(chan []byte) +var receiver chan string = make(chan string) +var initFlag bool = false +var sock mangos.Socket +func Init() { + go Push() +} + +// 浜轰綋璺熻釜绠楁硶 +func Entrance(rule *protomsg.Rule, am *structure.AreaMap, lable *structure.Others, args *structure.SdkDatas, message *protomsg.SdkMessage) structure.LittleRuleResult { + if !initFlag { + Init() + } + if rule.PolygonId == am.AreaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + //logger.Debug("---------璧颁簡浜哄憳寮傚父绠楁硶", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId) + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + return filterRule(rule, am) + } else if rule.SdkArgAlias == "threshold"{ + return track(rule,am) + } + return structure.LittleRuleResult{} + } else { + return structure.LittleRuleResult{} + } +} + +// 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲� +func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { + // 澶勭悊鐨勯兘鏄痽olo鏁版嵁 + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + var args []*structure.Arg + if rule.RuleWithPre == "&&" { + args = am.FilterData + } else { + args = am.Args + } + // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 + am.FilterData = am.FilterData[0:0] + //logger.Debug("鐪嬬湅args锛氾細锛氾細锛�", args) + for _, arg := range args { + var formula string + switch rule.SdkArgAlias { + case "score": + formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue + //logger.Info("鐩镐技搴﹀皬鍏紡锛�", formula) + case "proportion": + formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue + //logger.Info("鍗犳瘮鍏紡锛�", formula) + case "size": + formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue + //logger.Info("灏哄灏忓叕寮忥細", formula) + } + expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 + result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if result.(bool) { + am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� + } + } + am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 + if am.TargetNum > 0 { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} + } else { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } + + } else if rule.SdkArgAlias == "" { + if am.TargetNum > 0 { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} + } else { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } + } + return structure.LittleRuleResult{} +} + +// 缁欑洰鏍囧~鍏卨iker +func fillLiker(compareThreshold float32,arg *structure.Arg,am *structure.AreaMap) { + trackArg := make(map[string]interface{}) + trackArg["esId"] = "" + trackArg["cameraId"] = am.CameraId + trackArg["bodyFeature"] = arg.Feature + trackArg["faceFeature"] = arg.AttachArg.Feature + b,err := json.Marshal(trackArg) + if err != nil { + _ = logger.Error("json搴忓垪鍖栭敊璇�", err) + } + esId := getCompareMsg(b) + logger.Info("姣斿鍑烘潵鐨別sid:",esId) + base := structure.BaseInfo{TargetId:esId} + arg.Liker = append(arg.Liker, &base) +} + +func track (rule *protomsg.Rule,am *structure.AreaMap) structure.LittleRuleResult{ + var threshold float32 = 70 // 榛樿闃堝�间负70 + if th,err := strconv.ParseFloat(rule.SdkArgValue,32); err == nil { + threshold = float32(th) + } + for i, arg := range am.FilterData { + fillLiker(threshold,arg,am) + if len(arg.Liker) == 0 { + // 濡傛灉娌℃湁鐩镐技鑰呭垯鍒犻櫎鏈洰鏍囨暟鎹� + am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...) + } + } + if len(am.FilterData) > 0 { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} + } else { + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } +} + +func Push(){ + var err error + var msg []byte + + if sock, err = req.NewSocket(); err != nil { + _ = logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error()) + } + errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024) + if errSize != nil { + _ = logger.Error("Failed set MaxRecvSize: %v", err) + } + //sock.AddTransport(ipc.NewTransport()) + sock.AddTransport(tcp.NewTransport()) + serverIP, _ := GetLocalIP() + if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil { + _ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error()) + } + logger.Info("搴忓垪鍖栨暟鎹�") + initFlag = true + for { + select { + // case <-ctx.Done(): + // return + case data := <- sender: + + logger.Info("鏁版嵁闀垮害涓猴細",len(data)) + + logger.Debug("鎺ㄩ�佹暟鎹�") + if err = sock.Send(data); err != nil { + _ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error()) + } + if msg, err = sock.Recv(); err != nil { + _ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error()) + } + logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg)) + receiver <- string(msg) + default: + + } + } +} + +func getCompareMsg(data []byte) string{ + sender <- data + return <- receiver +} + +// 鑾峰彇鏈満ip +func GetLocalIP() (ipv4 string, err error) { + var ( + addrs []net.Addr + addr net.Addr + ipNet *net.IPNet // IP鍦板潃 + isIpNet bool + ) + // 鑾峰彇鎵�鏈夌綉鍗� + if addrs, err = net.InterfaceAddrs(); err != nil { + return + } + // 鍙栫涓�涓潪lo鐨勭綉鍗P + for _, addr = range addrs { + // 杩欎釜缃戠粶鍦板潃鏄疘P鍦板潃: ipv4, ipv6 + if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() { + // 璺宠繃IPV6 + if ipNet.IP.To4() != nil { + ipv4 = ipNet.IP.String() // 192.168.1.1 + return + } + } + } + + err = errors.New("ipv4 not found") + return +} \ No newline at end of file diff --git a/go.mod b/go.mod index 5cb57ea..6d6f95a 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ github.com/jeanphorn/log4go v0.0.0-20190526082429-7dbb8deb9468 // indirect github.com/kirinlabs/HttpRequest v0.1.5 // indirect github.com/knetic/govaluate v3.0.0+incompatible + github.com/panjf2000/ants/v2 v2.2.2 // indirect github.com/pierrec/lz4 v2.2.3+incompatible github.com/satori/go.uuid v1.2.0 github.com/spf13/viper v1.4.0 diff --git a/go.sum b/go.sum index e57c273..565aa64 100644 --- a/go.sum +++ b/go.sum @@ -114,6 +114,8 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/panjf2000/ants/v2 v2.2.2 h1:TWzusBjq/IflXhy+/S6u5wmMLCBdJnB9tPIx9Zmhvok= +github.com/panjf2000/ants/v2 v2.2.2/go.mod h1:1GFm8bV8nyCQvU5K4WvBCTG1/YBFOD2VzjffD8fV55A= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pierrec/lz4 v2.2.3+incompatible h1:YpgKDCFg5dd0Eb+XlgrfJtH4fAqoRA1kBcKnBZ4EFSE= diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go index 0825a05..3169cb9 100644 --- a/insertdata/insertDataToEs.go +++ b/insertdata/insertDataToEs.go @@ -1,19 +1,20 @@ package insertdata import ( - logger "github.com/alecthomas/log4go" "encoding/base64" "encoding/json" "errors" "net" - "ruleprocess/cache" - "ruleprocess/structure" "strconv" "time" - "basic.com/pubsub/protomsg.git" "github.com/golang/protobuf/proto" "github.com/satori/go.uuid" + logger "github.com/alecthomas/log4go" + + "ruleprocess/cache" + "ruleprocess/structure" + "basic.com/pubsub/protomsg.git" "ruleprocess/ruleserver" "ruleprocess/util" ) @@ -27,43 +28,6 @@ ServerIp string `yaml:"serverIp"` ServerPort string `yaml:"serverPort"` DbTablePersons string `yaml:"dbTablePersons"` -} - -//func InitInsertEs() { -// weedfsUrl = "http://"+WeedFs.Ip+":"+strconv.Itoa(WeedFs.UploadPort)+"/submit" -// videoPersonUrl = "http://"+EsInfo.Masterip+":"+EsInfo.Httpport+"/"+EsInfo.EsIndex.VideoPersons.IndexName+"/"+EsInfo.EsIndex.VideoPersons.IndexType -// personAction = "http://"+EsInfo.Masterip+":"+EsInfo.Httpport+"/"+EsInfo.EsIndex.Personaction.IndexName+"/"+EsInfo.EsIndex.Personaction.IndexType -//} - -// 浜鸿劯鐨勬暟鎹粨鏋� -type PerVideoPicture struct { - Id string `json:"id"` - CameraId string `json:"cameraId"` - CameraAddr string `json:"cameraAddr"` - CameraName string `json:"cameraName"` - PicDate string `json:"picDate"` - PicMaxUrl []string `json:"picMaxUrl"` - TaskId string `json:"taskId"` - TaskName string `json:"taskName"` - SdkName string `json:"sdkName"` - Content string `json:"content"` - AlarmRules []AlarmRule `json:"alarmRules"` - LikeDate string `json:"likeDate"` - ShowLabels string `json:"showLabels"` - OtherLabels string `json:"otherLabels"` - VideoUrl string `json:"videoUrl"` - AnalyServerId string `json:"analyServerId"` - AnalyServerName string `json:"analyServerName"` - AnalyServerIp string `json:"analyServerIp"` - ClusterId string `json:"clusterId"` - IsAlarm bool `json:"isAlarm"` - IsAckAlarm bool `json:"isAckAlarm"` - IsCollect bool `json:"isCollect"` - IsDelete bool `json:"isDelete"` - BaseInfo []*structure.BaseInfo `json:"baseInfo"` - TargetInfo []Target `json:"targetInfo"` - LinkTag string `json:"linkTag"` - LinkTagInfo []*LinkInfo `json:"linkTagInfo"` } type LinkInfo struct { @@ -94,13 +58,24 @@ TargetInfo []Target `json:"targetInfo"` } -type Target struct { +// 缁熶竴鐨勬暟鎹粨鏋� +type PerVideoPicture struct { + LinkInfo + LinkTag string `json:"linkTag"` + LinkTagInfo []*LinkInfo `json:"linkTagInfo"` +} + +type SourceTarget struct { TargetId string `json:"targetId"` TargetScore float64 `json:"targetScore"` TargetType string `json:"targetType"` Feature string `json:"feature"` PicSmUrl string `json:"picSmUrl"` TargetLocation Points `json:"targetLocation"` +} +type Target struct { + SourceTarget + AttachTarget SourceTarget } type Points struct { @@ -138,7 +113,7 @@ panic("閰嶇疆鏂囦欢涓嶅悎娉�") } weedfsUrl = "http://" + localConfig1.WebPicIp + ":" + strconv.Itoa(int(localConfig1.WebPicPort)) + "/submit" - videoPersonUrl = "http://" + localConfig1.AlarmIp + ":" + strconv.Itoa(int(localConfig1.AlarmPort)) + "/" + EsInfo.EsIndex.AIOcean.IndexName + "/" + EsInfo.EsIndex.AIOcean.IndexType + videoPersonUrl = "http://" + localConfig1.AlarmIp + ":" + strconv.Itoa(int(localConfig1.AlarmPort)) + "/" + EsInfo.EsIndex.AIOcean.IndexName + "/" + EsInfo.EsIndex.AIOcean.IndexType+"?refresh=true" InsertFace(msg) InsertYolo(msg) InsertTarget(msg) @@ -146,9 +121,9 @@ // 寰�es涓彃鍏ヤ汉鑴哥被鍨嬫暟鎹� func InsertFace(msg structure.ResultMsg) { - if (msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.Result)) > 0) || (msg.RuleResult["plate"] != nil && len(msg.RuleResult["plate"].([]structure.Result)) > 0) { + if (msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.Result)) > 0) || (msg.RuleResult["plate"] != nil && len(msg.RuleResult["plate"].([]structure.Result)) > 0) || (msg.RuleResult["track"] != nil && len(msg.RuleResult["track"].([]structure.Result)) > 0) { for key, results := range msg.RuleResult { - if key == "face" || key == "plate" { + if key == "face" || key == "plate" || key == "track"{ logger.Info("寰�ES鎻掍汉鑴告暟鎹�(鎴栬溅鐗屾暟鎹�)") faces := []*ObjAndRules{} faces = PutFace(faces, results.([]structure.Result)) @@ -194,6 +169,7 @@ target.Feature = base64.StdEncoding.EncodeToString(face.Feature) target.PicSmUrl = resp["fileUrl"].(string) target.TargetLocation = Points{TopLeft: Point{face.Location.X, face.Location.Y}, BottomRight: Point{face.Location.X + face.Location.Width, face.Location.Y + face.Location.Height}} + target.AttachTarget = SourceTarget{face.AttachArg.Id,face.AttachArg.Score,face.AttachArg.Type,base64.StdEncoding.EncodeToString(face.AttachArg.Feature),"",Points{TopLeft: Point{face.AttachArg.Location.X, face.AttachArg.Location.Y}, BottomRight: Point{face.AttachArg.Location.X + face.AttachArg.Location.Width, face.AttachArg.Location.Y + face.AttachArg.Location.Height}}} var targetInfos []Target targetInfos = append(targetInfos, *target) @@ -205,7 +181,7 @@ sdkname = "杞︾墝璇嗗埆" } //logger.Info("浜鸿劯鐩爣target:",targetInfos) - pervideo := PerVideoPicture{ + pervideo := PerVideoPicture{LinkInfo{ face.Uuid, msg.Cid, msg.Push.Cam.Addr, @@ -231,6 +207,7 @@ false, face.Liker, targetInfos, + }, "", []*LinkInfo{}, } @@ -413,7 +390,7 @@ if resp["fileUrl"] != nil { url = append(url, resp["fileUrl"].(string)) //esDataId := uuid.NewV4().String() - peraction := PerVideoPicture{ + peraction := PerVideoPicture{LinkInfo{ msg.Push.PushId, msg.Cid, msg.Push.Cam.Addr, @@ -439,6 +416,7 @@ false, nil, targetInfos, + }, linkTag, linkTagInfos, } @@ -575,7 +553,7 @@ return } //esDataId := uuid.NewV4().String() - peraction := PerVideoPicture{ + peraction := PerVideoPicture{LinkInfo{ msg.Push.PushId, msg.Cid, msg.Push.Cam.Addr, @@ -601,6 +579,7 @@ false, nil, targetInfos, + }, linkTag, linkTagInfos, } diff --git a/labelFilter/req.go b/labelFilter/req.go index f97352f..c6badd2 100644 --- a/labelFilter/req.go +++ b/labelFilter/req.go @@ -90,60 +90,43 @@ } errSize := sock.SetOption(mangos.OptionMaxRecvSize,30*1024*1024) if errSize != nil { - logger.Error("浼犺緭鐨勬暟鎹秴杩囧ぇ灏忛檺鍒�") + _ = logger.Error("浼犺緭鐨勬暟鎹秴杩囧ぇ灏忛檺鍒�") return } errTimeOut := sock.SetOption(mangos.OptionRecvDeadline,time.Millisecond * 1500) if errTimeOut != nil { - logger.Error("鎺ユ敹鍝嶅簲瓒呮椂") + _ = logger.Error("鎺ユ敹鍝嶅簲瓒呮椂") return } errTimeOut1 := sock.SetOption(mangos.OptionSendDeadline,time.Millisecond * 1500) if errTimeOut1 != nil { - logger.Error("鍙戦�佽秴鏃�") + _ = logger.Error("鍙戦�佽秴鏃�") return } errWrite := sock.SetOption(mangos.OptionWriteQLen,5) if errWrite != nil { - logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触") + _ = logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触") return } errRead := sock.SetOption(mangos.OptionReadQLen,5) if errRead != nil { - logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触") + _ = logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触") return } sock.AddTransport(tcp.NewTransport()) if err = sock.Dial("tcp://"+url); err != nil { - logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: ", err.Error()) + _ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: ", err.Error()) } logger.Info("搴忓垪鍖栨暟鎹�") - //for v := range pool{ - // logger.Info("鏃犻檺寰幆",v.Cid) - //} - //var ch chan *structure.ResultMsg - //for _, v := range urlChans { - // if v.url == url{ - // ch = v.ch - // } - //} - //logger.Info("chan淇℃伅锛�",urlPool[url]) for { select { // case <-ctx.Done(): // return case data := <- urlPool[url]: - //logger.Info("鎺ユ敹鍒版暟鎹�",data.Cid) - //bytes,err1 := proto.Marshal(data) + go func(data []byte) { - //logger.Info("鏁版嵁闀垮害涓猴細",len(data)) - //if err1 != nil { - // logger.Info("搴忓垪鍖栧け璐ワ細",err1) - //} start := time.Now() - //logger.Debug("groutine"+url+"鎺ㄩ�佹暟鎹�") - //bytes := []byte("ndfasojdfaidsos") if err = sock.Send(data); err != nil { Die("groutine"+url+"鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: ", err.Error()) } @@ -156,7 +139,7 @@ } }(data) default: - + time.Sleep(time.Second) } } sock.Close() diff --git a/logger/log.xml b/logger/log.xml index 489baf0..af8a494 100644 --- a/logger/log.xml +++ b/logger/log.xml @@ -22,8 +22,8 @@ Recommended: "[%D %T] [%L] (%S) %M" --> <property name="format">[%D %T] [%L] (%S) %M</property> - <property name="rotate">false</property> <!-- true enables log rotation, otherwise append --> - <property name="maxsize">600M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 --> + <property name="rotate">true</property> <!-- true enables log rotation, otherwise append --> + <property name="maxsize">800M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 --> <property name="maxlines">10K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands --> <property name="daily">true</property> <!-- Automatically rotates when a log message is written after midnight --> </filter> diff --git a/main.go b/main.go index f8a44a5..11dbbb4 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,25 @@ package main import ( - "basic.com/dbapi.git" - "basic.com/pubsub/protomsg.git" - "basic.com/valib/deliver.git" + + "flag" + "fmt" + "sync" "net/http" _ "net/http/pprof" "plugin" + + //"github.com/spf13/viper" + logger "github.com/alecthomas/log4go" + "github.com/panjf2000/ants/v2" + + "basic.com/pubsub/protomsg.git" + "basic.com/valib/deliver.git" "ruleprocess/insertdata" "ruleprocess/labelFilter" "ruleprocess/structure" - //"basic.com/valib/logger.git" - "flag" - "fmt" - //"github.com/spf13/viper" - logger "github.com/alecthomas/log4go" "ruleprocess/cache" "ruleprocess/ruleserver" - "sync" ) var dbIp = flag.String("dbIp", "127.0.0.1", "dbserver ip") @@ -47,6 +49,7 @@ } func main() { //fmt.Println("缂撳瓨鍒濆鍖栧畬鎴�",<- initchan)//dbserver鍒濆鍖栧畬姣� + defer ants.Release() go func() { http.ListenAndServe("0.0.0.0:8899",nil) }() @@ -54,17 +57,17 @@ wg := sync.WaitGroup{} wg.Add(3) - dbapi.Init(*dbIp, *dbPort) go cache.Init(initchan, *dbIp, *surveyPort, *pubPort) logger.Info("cache init completed!!!", <-initchan) //dbserver鍒濆鍖栧畬姣� ruleserver.Init() labelFilter.Init() + go ruleserver.TimeTicker() go ruleserver.StartServer() - //timeEle := ruleserver.TimeElement{N: 300, InitN: 300} - //ruleserver.TimeEleList["ruleprocess"] = &timeEle + nReciever("ipc:///tmp/sdk-2-rules-process.ipc", deliver.PushPull, 1) wg.Wait() + } func nReciever(url string, m deliver.Mode, count int) { c := deliver.NewServer(m, url) @@ -72,49 +75,39 @@ } func nRecvImpl(c deliver.Deliver, index int) { - var msg []byte + //var wg1 sync.WaitGroup + //p,_ := ants.NewPool(100) + //syncCalculateSum := func() { + // Task(msg) + // wg1.Done() + //} + //wg1.Wait() var err error - //msgChan := make(chan []byte,100) for { - select { - // case <-ctx.Done(): - // return - default: - msg, err = c.Recv() - //msgChan <- msg - if err != nil { - //logger.Info("recv error : ", err) - fmt.Println("recv error : ", err) - continue - } else { - - //go func(msg []byte) { - //logger.Debug("褰撳墠鏃堕棿鎴筹細", time.Now().Unix()) - //logger.Warn(time.Now().Format("2006-01-02 15:04:05")) - arg := structure.SdkDatas{} - //paramFormat(msg, &arg) - //start := time.Now() - m := CallParamFormat(msg, &arg) - // 杩涜瑙勫垯澶勭悊鍒ゆ柇(鎵撲笂瑙勫垯鐨勬爣绛�) - ruleserver.Judge(&arg, &m) // 鎶妔dkMessage浼犺繘鍘伙紝鏂逛究缂撳瓨鏁版嵁鏃舵嫾鍑轰竴涓猺esultMag - // 鎶奱rg閲岀殑鎵撶殑鏍囩鎷垮嚭鏉ョ粰m鍐嶅皝瑁呬竴灞� - resultMsg := structure.ResultMsg{SdkMessage: &m, RuleResult: arg.RuleResult} - ruleserver.GetAttachInfo(resultMsg.SdkMessage) - //ruleEnd := time.Since(start) - //logger.Debug("瑙勫垯鍒ゆ柇瀹屾墍鐢ㄦ椂闂达細", ruleEnd) - // 灏嗘墦瀹屾爣绛剧殑鏁版嵁鎻掑叆鍒癊S - insertdata.InsertToEs(resultMsg) - //esEnd := time.Since(start) - //logger.Debug("鎻掑叆瀹孍s鎵�鐢ㄦ椂闂达細", esEnd) - //浜嬩欢鎺ㄩ�� - labelFilter.PushSomthing(resultMsg) - //}(msg) - } + msg, err = c.Recv() + if err == nil { + //wg1.Add(1) + //_ = p.Submit(syncCalculateSum) + Task(msg) } } } +func Task (msg []byte) { + arg := structure.SdkDatas{} + //start := time.Now() + m := CallParamFormat(msg, &arg) + // 杩涜瑙勫垯澶勭悊鍒ゆ柇(鎵撲笂瑙勫垯鐨勬爣绛�) + ruleserver.Judge(&arg, &m) // 鎶妔dkMessage浼犺繘鍘伙紝鏂逛究缂撳瓨鏁版嵁鏃舵嫾鍑轰竴涓猺esultMag + // 鎶奱rg閲岀殑鎵撶殑鏍囩鎷垮嚭鏉ョ粰m鍐嶅皝瑁呬竴灞� + resultMsg := structure.ResultMsg{SdkMessage: &m, RuleResult: arg.RuleResult} + ruleserver.GetAttachInfo(resultMsg.SdkMessage) + // 灏嗘墦瀹屾爣绛剧殑鏁版嵁鎻掑叆鍒癊S + insertdata.InsertToEs(resultMsg) + //浜嬩欢鎺ㄩ�� + labelFilter.PushSomthing(resultMsg) +} func CallParamFormat(msg []byte, args *structure.SdkDatas) protomsg.SdkMessage{ //logger.Info("鍛煎彨涓棿浠舵牸寮忓寲鏁版嵁") p,err := plugin.Open("./algorithm/middleware.so") @@ -129,4 +122,3 @@ return mess } -// 5鍒嗛挓鏀朵笉鍒版秷鎭潃姝昏嚜宸遍噸鍚� diff --git a/ruleserver/readyDataForRule.go b/ruleserver/readyDataForRule.go index 46420b7..bdd79c4 100644 --- a/ruleserver/readyDataForRule.go +++ b/ruleserver/readyDataForRule.go @@ -3,12 +3,11 @@ import ( "basic.com/dbapi.git" "basic.com/pubsub/protomsg.git" - logger "github.com/alecthomas/log4go" "encoding/json" "errors" "fmt" + logger "github.com/alecthomas/log4go" "github.com/golang/protobuf/proto" - uuid "github.com/satori/go.uuid" "math" "nanomsg.org/go-mangos" "nanomsg.org/go-mangos/protocol/req" @@ -229,48 +228,48 @@ } // 璁$畻鍖哄煙鍐呯殑鐩爣鏁伴噺浠ュ強灏嗙浉浼煎害銆佸崰姣斻�佸昂瀵哥瓑鎵撳寘 -func CountAreaObjs(a *structure.AreaMap,arg *structure.SdkData) { - - a.TargetNum = 0 - threshold := 80.0 // 鐩镐技搴� - intersectionper := 20.0 // 鍗犳瘮 - size := 0.0 // 灏哄 - - areaPoints := Json2points(a.AreaJson) - logger.Info("鐪嬬湅鍥剧墖鐨剋idth鍜宧eight:",arg.ImageWidth,arg.ImageHeight) - widthScale := float64(arg.ImageWidth) / 960 - heigthScale := float64(arg.ImageHeight) / 540 - for _, obj := range arg.Photo { - //logger.Info("------------------鐪嬬湅sdkData:", arg.SdkName, "鐨凱hoto鏁版嵁----------------", obj, "----椤轰究鐪嬬湅鍗犳瘮-----锛�", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale)) - if obj.Score >= threshold && float64(obj.Rects.Width*obj.Rects.Height) >= size && PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) >= intersectionper { - // 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁� - a.TargetNum++ - uuid := uuid.NewV4().String() - arg1 := structure.Arg{obj.Id,uuid,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}} - //logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1) - a.Args = append(a.Args, &arg1) - a.FilterData = append(a.FilterData, &arg1) - } - } - //logger.Info("鍖哄煙鏄細",areaPoints,"鍖哄煙鍐呯洰鏍囨暟閲忎负锛�",a.TargetNum,"---",len(a.FilterData)) - a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16] - //logger.Println("--------------------鐪嬬湅鍖哄煙鏁版嵁锛�",*a) -} - -// 鎶妔dk浠庢暟鎹抚涓婃彁鍙栫殑鎸夌収鍖哄煙鍒嗙被褰掔疆 -func SdkDataFormat(cameraId string, arg *structure.SdkData, cameraPolygons []protomsg.CameraPolygon) { - logger.Info("==================================鏈瑂dkData涓В鍑烘潵鐨勭洰鏍囨暟鎹�=======================================") - for _, photo := range arg.Photo { - logger.Info("--------瑙f瀽鍑烘潵鐨勬暟鎹�---", cameraId, arg.IpcId, photo.Rects, photo.Score) - } - for _, polygon := range cameraPolygons { - //logger.Println("++++++鍦ㄨ繖鍎跨湅涓�涓嬪尯鍩熷晩:", polygon.Polygon) - areaMap := structure.AreaMap{CameraId: cameraId, AreaId: polygon.Id, AreaJson: polygon.Polygon, TriggerLine: polygon.TriggerLine, DirectionLine: polygon.DirectionLine} - // 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁 - CountAreaObjs(&areaMap,arg) - arg.AreaMapList = append(arg.AreaMapList, &areaMap) - } -} +//func CountAreaObjs(a *structure.AreaMap,arg *structure.SdkData) { +// +// a.TargetNum = 0 +// threshold := 80.0 // 鐩镐技搴� +// intersectionper := 20.0 // 鍗犳瘮 +// size := 0.0 // 灏哄 +// +// areaPoints := Json2points(a.AreaJson) +// logger.Info("鐪嬬湅鍥剧墖鐨剋idth鍜宧eight:",arg.ImageWidth,arg.ImageHeight) +// widthScale := float64(arg.ImageWidth) / 960 +// heigthScale := float64(arg.ImageHeight) / 540 +// for _, obj := range arg.Photo { +// //logger.Info("------------------鐪嬬湅sdkData:", arg.SdkName, "鐨凱hoto鏁版嵁----------------", obj, "----椤轰究鐪嬬湅鍗犳瘮-----锛�", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale)) +// if obj.Score >= threshold && float64(obj.Rects.Width*obj.Rects.Height) >= size && PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) >= intersectionper { +// // 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁� +// a.TargetNum++ +// uuid := uuid.NewV4().String() +// arg1 := structure.Arg{obj.Id,uuid,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}} +// //logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1) +// a.Args = append(a.Args, &arg1) +// a.FilterData = append(a.FilterData, &arg1) +// } +// } +// //logger.Info("鍖哄煙鏄細",areaPoints,"鍖哄煙鍐呯洰鏍囨暟閲忎负锛�",a.TargetNum,"---",len(a.FilterData)) +// a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16] +// //logger.Println("--------------------鐪嬬湅鍖哄煙鏁版嵁锛�",*a) +//} +// +//// 鎶妔dk浠庢暟鎹抚涓婃彁鍙栫殑鎸夌収鍖哄煙鍒嗙被褰掔疆 +//func SdkDataFormat(cameraId string, arg *structure.SdkData, cameraPolygons []protomsg.CameraPolygon) { +// logger.Info("==================================鏈瑂dkData涓В鍑烘潵鐨勭洰鏍囨暟鎹�=======================================") +// for _, photo := range arg.Photo { +// logger.Info("--------瑙f瀽鍑烘潵鐨勬暟鎹�---", cameraId, arg.IpcId, photo.Rects, photo.Score) +// } +// for _, polygon := range cameraPolygons { +// //logger.Println("++++++鍦ㄨ繖鍎跨湅涓�涓嬪尯鍩熷晩:", polygon.Polygon) +// areaMap := structure.AreaMap{CameraId: cameraId, AreaId: polygon.Id, AreaJson: polygon.Polygon, TriggerLine: polygon.TriggerLine, DirectionLine: polygon.DirectionLine} +// // 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁 +// CountAreaObjs(&areaMap,arg) +// arg.AreaMapList = append(arg.AreaMapList, &areaMap) +// } +//} func Push(data *protomsg.CompareArgs,sock mangos.Socket) []byte{ //var sock mangos.Socket @@ -282,12 +281,12 @@ //} errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024) if errSize != nil { - logger.Error("Failed set MaxRecvSize: %v", err) + _ = logger.Error("Failed set MaxRecvSize: %v", err) return nil } serverIP, _ := GetLocalIP() if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil { - logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error()) + _ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error()) } //sock.AddTransport(ipc.NewTransport()) sock.AddTransport(tcp.NewTransport()) @@ -301,11 +300,11 @@ logger.Debug("鎺ㄩ�佹暟鎹�") //bytes := []byte("ndfasojdfaidsos") if err = sock.Send(bytes); err != nil { - logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error()) + _ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error()) //os.Exit(1) } if msg, err = sock.Recv(); err != nil { - logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error()) + _ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error()) //os.Exit(1) } logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg)) @@ -318,17 +317,17 @@ var msg []byte if sock, err = req.NewSocket(); err != nil { - logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error()) + _ = logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error()) } errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024) if errSize != nil { - logger.Error("Failed set MaxRecvSize: %v", err) + _ = logger.Error("Failed set MaxRecvSize: %v", err) } //sock.AddTransport(ipc.NewTransport()) sock.AddTransport(tcp.NewTransport()) serverIP, _ := GetLocalIP() if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil { - logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error()) + _ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error()) } logger.Info("搴忓垪鍖栨暟鎹�") @@ -344,19 +343,16 @@ logger.Info("搴忓垪鍖栧け璐ワ細",err1) } logger.Debug("鎺ㄩ�佹暟鎹�") - //bytes := []byte("ndfasojdfaidsos") if err = sock.Send(bytes); err != nil { - logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error()) - //os.Exit(1) + _ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error()) } if msg, err = sock.Recv(); err != nil { - logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error()) - //os.Exit(1) + _ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error()) } logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg)) receiver <- msg default: - + time.Sleep(time.Second) } } } diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go index f200c2b..8688dab 100644 --- a/ruleserver/ruleToformula.go +++ b/ruleserver/ruleToformula.go @@ -196,6 +196,18 @@ } } } + // 璺熻釜鐩爣缁熻 + personTrack := []*structure.Arg{} + for _, sdkData := range args.Sdkdata { + //logger.Info("鐪嬬湅sdkNames",sdkNames) + if sdkData.IpcId == "璺熻釜鐨刬pcId" { // 鎶婅窡韪〉闈㈢殑鍚勪釜鐩爣鐨勫潗鏍囪緭鍑� + for _, areaMap := range sdkData.AreaMapList { + if areaMap.IsEffective { + personTrack = append(personTrack, putFaceToResult(areaMap, personTrack)...) + } + } + } + } var islink bool if groupRule.SetType == "linkTask" { islink = true @@ -224,6 +236,11 @@ //logger.Info("-------------------杞︾墝缁撴灉鏍囩", len(args.RuleResult["plate"].([]structure.Result))) //labelTypes = append(labelTypes,2) } + if len(personTrack) > 0 { + args.RuleResult["track"] = append(args.RuleResult["track"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, personTrack, polygonId, islink,label}) + //logger.Info("-------------------杞︾墝缁撴灉鏍囩", len(args.RuleResult["plate"].([]structure.Result))) + //labelTypes = append(labelTypes,2) + } // 缁欐寔缁椂闂寸殑绗竴寮犺祴浜堢紦瀛樻暟鎹紙閬嶅巻澶嶅埗锛� //if cacheId != "" { // 鏈夎繖甯ф暟鎹殑缂撳瓨 // tempMap := make(map[string]interface{}) diff --git a/ruleserver/server.go b/ruleserver/server.go index b1fc03f..0ee0e48 100644 --- a/ruleserver/server.go +++ b/ruleserver/server.go @@ -43,6 +43,8 @@ select { case dbMsg := <-videotapChan: publishMessage(dbMsg) + default: + time.Sleep(time.Second) } } } diff --git a/structure/rule.go b/structure/rule.go index 8ddf5fe..99604a4 100644 --- a/structure/rule.go +++ b/structure/rule.go @@ -5,23 +5,27 @@ ) // 姣忎釜鐩爣鐨勫弬鏁帮細鐩镐技搴︼紝鍗犳瘮锛屽昂瀵� -type Arg struct { - Id string - Uuid string - Score float64 // 鍖哄煙鍐呯殑鐩爣鐨勭浉浼煎害 - Proportion float64 // 鍖哄煙鍐呯殑鐩爣鐨勫崰姣� - Size float64 // 鍖哄煙鍐呯殑鐩爣鐨勫昂瀵� - AreaJson string // 鎵�灞炲尯鍩� - Type string // 璁拌浇鏁版嵁绫诲瀷 - Location Rect // 璁颁笅姣忎釜鐩爣鐨勪綅缃弬鏁帮紝鏈�鍚庣粰缁撴灉瑁呴厤鐩爣鏁版嵁鐨勬椂鍊欑敤鐨勫埌 - Car *protomsg.PlateIDVehicle // 杞﹁締鍙傛暟 - Feature []byte - ThftRes protomsg.ThftResult - Liker []*BaseInfo - TimeLable string - CacheData ResultMsg +type SourceArg struct { + Id string + Uuid string + Score float64 // 鍖哄煙鍐呯殑鐩爣鐨勭浉浼煎害 + Proportion float64 // 鍖哄煙鍐呯殑鐩爣鐨勫崰姣� + Size float64 // 鍖哄煙鍐呯殑鐩爣鐨勫昂瀵� + AreaJson string // 鎵�灞炲尯鍩� + Type string // 璁拌浇鏁版嵁绫诲瀷 + Location Rect // 璁颁笅姣忎釜鐩爣鐨勪綅缃弬鏁帮紝鏈�鍚庣粰缁撴灉瑁呴厤鐩爣鏁版嵁鐨勬椂鍊欑敤鐨勫埌 + Car *protomsg.PlateIDVehicle // 杞﹁締鍙傛暟 + Feature []byte + ThftRes protomsg.ThftResult + Liker []*BaseInfo + TimeLable string + CacheData ResultMsg } +type Arg struct { + SourceArg + AttachArg SourceArg +} // 姣忎釜鍖哄煙鍐呯殑鍥剧墖鏁版嵁闆嗗悎 type AreaMap struct { CameraId string @@ -36,7 +40,7 @@ TargetNum int // 鍖哄煙鍐呯洰鏍囨暟閲� Args []*Arg // 鍖哄煙鍐呯洰鏍囬泦鍚� FilterData []*Arg // 杩囨护鍚庡尯鍩熷唴鐩爣闆嗗悎 - AlarmObj []*Arg // 鍖哄煙鍐呮渶鍚庢弧瓒宠鍒欑殑鐩爣 + AlarmObj []*Arg // 鍖哄煙鍐呮渶鍚庢弧瓒宠鍒欑殑鐩爣 Time string // 褰撳墠鏃堕棿锛堢敤浠ュ尮閰嶆椂闂磋鍒欙級 IsEffective bool // 瑙勫垯涓槸鍚︾敤鍒颁簡姝ゅ尯鍩� } @@ -46,10 +50,10 @@ Id string Rects Rect // 鐭╁舰鍖哄煙鍙傛暟 Score float64 // 鐩镐技搴﹀緱鍒嗭紙鏈夊澶х▼搴﹀儚涓�涓洰鏍囥�備汉鑴革紝浜轰綋鎴栬溅绛夌瓑锛� - Type string // 璁拌浇鏁版嵁绫诲瀷 + Type string // 璁拌浇鏁版嵁绫诲瀷 ThftRes protomsg.ThftResult Feature []byte - Car *protomsg.PlateIDVehicle + Car *protomsg.PlateIDVehicle } // 姣忎釜绠楁硶瀵逛簬褰撳墠甯х敾闈㈣嚜宸辨彁鍙栫殑鏁版嵁 @@ -85,7 +89,7 @@ AlarmLevel int32 // 鎶ヨ绛夌骇 RuleText string // 鏂囧瓧鐗堣鍒欑粍 //Location []TargetInfo // 鐩爣鐨勫潗鏍� - AlarmObj []*Arg // 鎶ヨ鐨勭洰鏍囨暟鎹� 鎵撶畻搴熸帀涓婇潰鐨凩ocation + AlarmObj []*Arg // 鎶ヨ鐨勭洰鏍囨暟鎹� 鎵撶畻搴熸帀涓婇潰鐨凩ocation AlarmPolygon string // 瑙﹀彂鐨勬姤璀︽ IsLink bool // 鏄惁鏄仈鍔ㄤ换鍔� Others @@ -126,8 +130,5 @@ TargetPicUrl string `json:"targetPicUrl"` MonitorLevel string `json:"monitorLevel"` Content string `json:"content"` - DbLabel string `json:"labels"` - //PhoneNum string `json:"phoneNum"` - //Sex string `json:"sex"` - //IdCard string `json:"idCard"` + DbLabel string `json:"labels"` } -- Gitblit v1.8.0