panlei
2019-08-01 0a101dc2c24674d32d1a9901a4a65ab23c9f03bc
归置人脸
5个文件已修改
387 ■■■■■ 已修改文件
insertdata/insertDataToEs.go 318 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/personTrack.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/readyDataForRule.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
insertdata/insertDataToEs.go
@@ -71,7 +71,7 @@
    AnalyServerName string                 `json:"analyServerName"`
    AnalyServerIp   string                 `json:"analyServerIp"`
    ClusterId       string                 `json:"clusterId"`
    LinkId            string                   `json:"linkId"`
    LinkId          string                 `json:"linkId"`
    DetectScore     float64                `json:"detectScore"`
    IsAlarm         int                    `json:"isAlarm"`
    IsAckAlarm      int                    `json:"isAckAlarm"`
@@ -97,7 +97,7 @@
    ClusterId       string      `json:"clusterId"`
    PicSmUrl        []string    `json:"picSmUrl"`
    PicDate         string      `json:"picDate"`
    LinkId            string        `json:"linkId"`
    LinkId          string      `json:"linkId"`
    VideoUrl        string      `json:"videoUrl"`
    IsAlarm         int         `json:"isAlarm"`
    IsAckAlarm      int         `json:"isAckAlarm"`
@@ -110,6 +110,12 @@
    AlarmLevel   string `json:"alarmLevel"`
    RuleText     string `json:"ruleText"`
    DefenceState bool   `json:"defenceState"`
}
// 一个face对多个规则组的归置人脸的结构体
type FaceAndRules struct {
    ruleserver.Arg
    rules []ruleserver.Result
}
// 往ES插数据
@@ -137,19 +143,26 @@
//    //}
//}
func InsertToEs(msg ruleserver.ResultMsg) {
    InsertFace(msg,"")
    flag := ruleserver.BodyIsSame(msg.SdkMessage)
    if !flag {
        InsertYolo(msg,"")
    InsertFace(msg, "")
    // 如果标签中含有持续时间首次报警的timeLabel的话则不需要过人体追踪,不然就没的插入了
    fk := ruleserver.TrackOrNot(msg.RuleResult)
    if fk {
        InsertYolo(msg, "")
    } else {
        flag := ruleserver.BodyIsSame(msg.SdkMessage)
        if !flag {
            InsertYolo(msg, "")
        }
    }
}
// 往es中插入人脸数据
func InsertFace(msg ruleserver.ResultMsg,linkId string) {
func InsertFace(msg ruleserver.ResultMsg, linkId string) {
    if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.FaceResult)) > 0 {
        logger.Info("往ES插人脸数据")
        for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) {
            for _, face := range faceResult.Args {
        faces := PutFace(msg)
        if faces != nil {
            for _,face := range faces {
                // 上传大图
                // 解压缩并上传图片
                bdata, err := util.UnCompress(msg.Data)
@@ -157,8 +170,10 @@
                    panic("解压缩图片时出现错误")
                }
                alarmRules := []AlarmRule{}
                alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
                alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState})
                for _,faceResult := range face.rules {
                    alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
                    alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState})
                }
                i := protomsg.Image{}
                err = proto.Unmarshal(bdata, &i)
                bigPhotoUrl := make(map[string]interface{})
@@ -245,87 +260,37 @@
        }
    }
}
func ChangeStatusFace(msg ruleserver.ResultMsg) {
    logger.Info("往ES插入人脸非报警但是状态转换数据")
    // 上传大图
    // 解压缩并上传图片
    bdata, err := util.UnCompress(msg.Data)
    if err != nil {
        panic("解压缩图片时出现错误")
    }
    i := protomsg.Image{}
    err = proto.Unmarshal(bdata, &i)
    bigPhotoUrl := make(map[string]interface{})
    bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
    logger.Debug("========大图路径:", bigPhotoUrl)
    // 人脸检测,没有相似的底库人员
    localConfig, err := cache.GetServerInfo()
    if err != nil {
        logger.Error("查询本机信息失败!")
    }
    serverIp, err := GetLocalIP()
    // 查询cameraName
    camera, err := cache.GetCameraById(msg.Cid)
    if err != nil {
        logger.Error("查询摄像机信息失败")
    }
    esDataId := uuid.NewV4().String()
    pervideo := PerVideoPicture{
        esDataId,
        msg.Cid,
        camera.Addr,
        i.Timestamp,
        strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1],
        msg.Tasklab.Taskid,
        msg.Tasklab.Taskname,
        "人脸",
        "状态转换数据,非报警数据",
        []AlarmRule{},
        time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间
        "",
        0,
        "",
        "",
        0,
        0,
        "",
        []string{""},
        "暂无集群",
        localConfig.ServerId,
        localConfig.ServerName,
        serverIp,
        "",
        "",
        0,
        1,
        0,
        0,
        0,
        []*ruleserver.BaseInfo{},
// 归置人脸
func PutFace(msg ruleserver.ResultMsg) []FaceAndRules{
    if msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]ruleserver.FaceResult)) > 0 {
        logger.Info("整理人脸数据")
        faces := []FaceAndRules{}
        for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) {
            hebingFace(faces, faceResult)
        }
        return faces
    }
    requstbody, err := json.Marshal(pervideo)
    if err != nil {
        logger.Info("json parse error ", err)
        return
    return nil
}
func hebingFace(faces []FaceAndRules, faceResult ruleserver.FaceResult) {
    for _, arg := range faceResult.Args {
        // 拿到每一张人脸
        flag := false
        for _, face := range faces {
            if arg.Id == face.Id {
                flag = true
                face.rules = append(face.rules,faceResult.Result)
            }
        }
        if flag {
            faces = append(faces, FaceAndRules{arg, []ruleserver.Result{faceResult.Result}})
        }
    }
    resp1, err1 := EsReq("POST", videoPersonUrl, requstbody)
    if err1 != nil {
        logger.Error("上传ES出错!---", err1)
    } else {
        logger.Info("插入es返回的信息:", resp1)
        // 发出录像信号
        ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1})
    }
    //if msg.RuleResult["cacheData"] != nil {
    //    InsertFace(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
    //}
}
// 往es中插入yolo数据
func InsertYolo(msg ruleserver.ResultMsg,linkId string) {
func InsertYolo(msg ruleserver.ResultMsg, linkId string) {
    if msg.RuleResult["yolo"] != nil && len(msg.RuleResult["yolo"].([]ruleserver.Result)) > 0 {
        // 先判断一下数据带的规则标签是否有可以插入的
        flag := false
@@ -373,11 +338,11 @@
            }
            linkFlag := false
            for _, yoloResult := range msg.RuleResult["yolo"].([]ruleserver.Result) {
                if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1{
                if (yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10") && yoloResult.Others.LinkCache != nil && len(yoloResult.Others.LinkCache) > 1 {
                    linkId := uuid.NewV4().String()
                    for _, msg2 := range yoloResult.Others.LinkCache {
                        logger.Warn("插入联动数据","此帧数据的id为",msg2.Cid)
                        InsertYolo(msg2,linkId)
                        logger.Warn("插入联动数据", "此帧数据的id为", msg2.Cid)
                        InsertYolo(msg2, linkId)
                        linkFlag = true
                    }
                }
@@ -547,6 +512,84 @@
        //os.Exit(1)
    }
}
func ChangeStatusFace(msg ruleserver.ResultMsg) {
    logger.Info("往ES插入人脸非报警但是状态转换数据")
    // 上传大图
    // 解压缩并上传图片
    bdata, err := util.UnCompress(msg.Data)
    if err != nil {
        panic("解压缩图片时出现错误")
    }
    i := protomsg.Image{}
    err = proto.Unmarshal(bdata, &i)
    bigPhotoUrl := make(map[string]interface{})
    bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
    logger.Debug("========大图路径:", bigPhotoUrl)
    // 人脸检测,没有相似的底库人员
    localConfig, err := cache.GetServerInfo()
    if err != nil {
        logger.Error("查询本机信息失败!")
    }
    serverIp, err := GetLocalIP()
    // 查询cameraName
    camera, err := cache.GetCameraById(msg.Cid)
    if err != nil {
        logger.Error("查询摄像机信息失败")
    }
    esDataId := uuid.NewV4().String()
    pervideo := PerVideoPicture{
        esDataId,
        msg.Cid,
        camera.Addr,
        i.Timestamp,
        strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1],
        msg.Tasklab.Taskid,
        msg.Tasklab.Taskname,
        "人脸",
        "状态转换数据,非报警数据",
        []AlarmRule{},
        time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间
        "",
        0,
        "",
        "",
        0,
        0,
        "",
        []string{""},
        "暂无集群",
        localConfig.ServerId,
        localConfig.ServerName,
        serverIp,
        "",
        "",
        0,
        1,
        0,
        0,
        0,
        []*ruleserver.BaseInfo{},
    }
    requstbody, err := json.Marshal(pervideo)
    if err != nil {
        logger.Info("json parse error ", err)
        return
    }
    resp1, err1 := EsReq("POST", videoPersonUrl, requstbody)
    if err1 != nil {
        logger.Error("上传ES出错!---", err1)
    } else {
        logger.Info("插入es返回的信息:", resp1)
        // 发出录像信号
        ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1})
    }
    //if msg.RuleResult["cacheData"] != nil {
    //    InsertFace(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
    //}
}
// 获取本机ip
func GetLocalIP() (ipv4 string, err error) {
@@ -630,3 +673,100 @@
    }
    return race
}
//for _, faceResult := range msg.RuleResult["face"].([]ruleserver.FaceResult) {
//    for _, face := range faceResult.Args {
//        // 上传大图
//        // 解压缩并上传图片
//        bdata, err := util.UnCompress(msg.Data)
//        if err != nil {
//            panic("解压缩图片时出现错误")
//        }
//        alarmRules := []AlarmRule{}
//        alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
//        alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState})
//        i := protomsg.Image{}
//        err = proto.Unmarshal(bdata, &i)
//        bigPhotoUrl := make(map[string]interface{})
//        bigPhotoUrl, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
//        logger.Debug("========大图路径:", bigPhotoUrl)
//        // 人脸检测,没有相似的底库人员
//        localConfig, err := cache.GetServerInfo()
//        if err != nil {
//            logger.Error("查询本机信息失败!")
//        }
//        serverIp, err := GetLocalIP()
//        // 查询cameraName
//        camera, err := cache.GetCameraById(msg.Cid)
//        if err != nil {
//            logger.Error("查询摄像机信息失败")
//        }
//        bytes := util.SubImg(i, int(face.Location.X), int(face.Location.Y), int(face.Location.X+face.Location.Width), int(face.Location.Y+face.Location.Height))
//        resp, err := util.PostFormBufferData1(weedfsUrl, bytes, uuid.NewV4().String())
//        if err != nil {
//            logger.Error("上传小图出错")
//        }
//        logger.Info("================小图地址:", resp["fileUrl"].(string))
//        sex := ""
//        if face.ThftRes.Gender == 1 {
//            sex = "男"
//        } else {
//            sex = "女"
//        }
//        race := getRaceString(face.ThftRes.Race)
//        ageDescription := getDescription(face.ThftRes.Age)
//        esDataId := uuid.NewV4().String()
//        linksId := ""
//        if linkId != "" {
//            linksId = linkId
//        }
//        pervideo := PerVideoPicture{
//            esDataId,
//            msg.Cid,
//            camera.Addr,
//            i.Timestamp,
//            strings.Split(bigPhotoUrl["fileUrl"].(string), "/")[1],
//            msg.Tasklab.Taskid,
//            msg.Tasklab.Taskname,
//            "人脸",
//            "",
//            alarmRules,
//            time.Now().Format("2006-01-02 15:04:05"), // 只检测,没有比对时间
//            sex,
//            face.ThftRes.Age,
//            ageDescription,
//            race,
//            face.ThftRes.Smile,
//            face.ThftRes.Beauty,
//            base64.StdEncoding.EncodeToString(face.Feature),
//            []string{strings.Split(resp["fileUrl"].(string), "/")[1]},
//            "暂无集群",
//            localConfig.ServerId,
//            localConfig.ServerName,
//            serverIp,
//            "",
//            linksId,
//            face.Score,
//            1,
//            0,
//            0,
//            0,
//            face.Liker,
//        }
//        requstbody, err := json.Marshal(pervideo)
//
//        if err != nil {
//            logger.Info("json parse error ", err)
//            return
//        }
//        resp1, err1 := EsReq("POST", videoPersonUrl, requstbody)
//        if err1 != nil {
//            logger.Error("上传ES出错!---", err1)
//        } else {
//            logger.Info("插入es返回的信息:", resp1)
//            // 发出录像信号
//            ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 1})
//        }
//    }
//}
main.go
@@ -189,7 +189,7 @@
                logger.Info("--------------追踪之后yolo的个数:",len(faceParam.Faces))
                for _, info := range faceParam.Faces {
                    //logger.Info("_______________________________________________第一次看相似值:",info.Pos.FAngle.Confidence*100)
                    photoMap := ruleserver.PhotoMap{Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence*100), IsYolo:false,ThftRes:*(info.Result),Feature:info.Feats}
                    photoMap := ruleserver.PhotoMap{Id:info.Pos.FaceID,Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence*100), IsYolo:false,ThftRes:*(info.Result),Feature:info.Feats}
                    arg.Photo = append(arg.Photo, photoMap)
                }
                args.Sdkdata = append(args.Sdkdata,&arg)
ruleserver/personTrack.go
@@ -103,6 +103,16 @@
    logger.Debug("---------------------------------追踪结束--------------------------------------")
    return false
}
func TrackOrNot(label map[string]interface{}) bool{
    if label["yolo"] != nil && len(label["yolo"].([]Result)) > 0 {
        for _,res := range label["yolo"].([]Result) {
            if res.TimeLabel == "10" {
                return true
            }
        }
    }
    return false
}
// 过滤掉那些已在缓存中且分值更低的人脸,更新缓存(没有的加上,分值更新为更高的,多的删除)
func FaceIsInPond(cameraId string, sdkinfor *protomsg.SdkmsgWithTask) string {
ruleserver/readyDataForRule.go
@@ -267,7 +267,7 @@
        if threshold <= obj.Score && size <= float64(obj.Rects.Width*obj.Rects.Height) && intersectionper <= PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) {
            // 这步要备齐表达式里所需要的所有参数
            a.targetNum++
            arg1 := Arg{obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.Feature, obj.ThftRes, []*BaseInfo{}}
            arg1 := Arg{obj.Id,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.Feature, obj.ThftRes, []*BaseInfo{}}
            //logger.Println("放进去的arg:-------", arg1)
            a.args = append(a.args, &arg1)
            a.filterData = append(a.filterData, &arg1)
ruleserver/ruleToformula.go
@@ -14,6 +14,7 @@
// 每个目标的参数:相似度,占比,尺寸
type Arg struct {
    Id         uint64
    Score      float64 // 区域内的目标的相似度
    Proportion float64 // 区域内的目标的占比
    Size       float64 // 区域内的目标的尺寸
@@ -45,6 +46,7 @@
// sdk输出的图片上单个目标的数据
type PhotoMap struct {
    Id      uint64
    Rects   Rect    // 矩形区域参数
    Score   float64 // 相似度得分(有多大程度像一个目标。人脸,人体或车等等)
    IsYolo  bool    // 是否是yolo数据
@@ -95,10 +97,11 @@
    LinkCache []ResultMsg
    TimeLabel string
}
// 过规则库打上的标签
type FaceResult struct {
    Result
    Args         []Arg
    Args []Arg
}
type LittleRuleResult struct {
    SdkName string // 记录下此结果是哪个sdk的结果
@@ -135,7 +138,7 @@
                if len(temp) > 0 {
                    if group.SetType != "linkTask" {
                        // 独立任务的处理
                        RunRule(args, group, taskId, message,label)
                        RunRule(args, group, taskId, message, label)
                    }
                }
            }
@@ -148,7 +151,7 @@
                if len(temp) > 0 {
                    if group.SetType == "linkTask" {
                        // groupId中含有link则为联动任务
                        LinkTask(args, group, taskId, message,label)
                        LinkTask(args, group, taskId, message, label)
                    }
                }
            }
@@ -156,7 +159,7 @@
    }
}
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage,label Others) bool {
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) bool {
    defer func() {
        if err := recover(); err != nil {
            logger.Error("比对规则有误", err.(string))
@@ -277,7 +280,7 @@
    if completeFormula != "" {
        logger.Info("结果公式-----------:", completeFormula)
        expression, err := govaluate.NewEvaluableExpression(completeFormula)
        if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil{
        if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil {
            panic("规则有误,得到的数学公式不可解析")
        }
        result, _ := expression.Evaluate(nil) // 得到数学公式的结果
@@ -315,7 +318,7 @@
                for _, sdkData := range args.Sdkdata {
                    if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" && faceFlag { // sdkData里有人脸数据且配置了算法才把符合条件的数据塞进标签里去
                        for _, areaMap := range sdkData.AreaMapList {
                            faces = append(faces, putFaceToResult(areaMap,faces)...)
                            faces = append(faces, putFaceToResult(areaMap, faces)...)
                        }
                    }
                }
@@ -334,11 +337,11 @@
                }
                //logger.Debug("------locations的内容:", locations)
                if sdkNames != "" {
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId,label})
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, label})
                    //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
                }
                if faceFlag {
                    args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId,label},faces})
                    args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId, label}, faces})
                    //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
                }
                return true
@@ -357,12 +360,12 @@
    }
}
func putFaceToResult(am *AreaMap,faceList []Arg) []Arg {
func putFaceToResult(am *AreaMap, faceList []Arg) []Arg {
    faces := []Arg{}
    if len(am.filterData) > 0 {
        for _, data := range am.filterData {
            flag := true
            for _,face := range faceList  {
            for _, face := range faceList {
                if data.Location.X == face.Location.X && data.Location.Y == face.Location.Y && data.Location.Width == face.Location.Width && data.Location.Height == face.Location.Height {
                    flag = false
                }
@@ -389,7 +392,7 @@
}
// 联动任务的处理
func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage,label Others) {
func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) {
    // new一个定时器,如果以此groupId为标志的定时器不存在的话
    logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText)
    var flag bool = true
@@ -414,12 +417,12 @@
                }
            }
            if flag1 {
                TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre,ResultMsg{}})
                TimeEleList[groupRule.GroupId].RuleResults = append(TimeEleList[groupRule.GroupId].RuleResults, &RuleResult{groupRule.Rules[j].CameraId, groupRule.Rules[j].Sort, "", groupRule.Rules[j].RuleWithPre, ResultMsg{}})
            }
        }
    }
    // 往数组里赋值
    isOk := RunRule(args, groupRule, taskId, message,label)
    isOk := RunRule(args, groupRule, taskId, message, label)
    if isOk {
        logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为true")
        // 根据cameraId去更新或者插入结果,然后判断是否数组是否可以得出报警的结论
@@ -428,21 +431,21 @@
            if va.CameraId == args.CameraId {
                va.Result = strconv.FormatBool(isOk)
                tempMap := make(map[string]interface{})
                for k,result := range args.RuleResult {
                for k, result := range args.RuleResult {
                    if k == "yolo" {
                        tempMap[k] = []Result{}
                        for _,res := range result.([]Result) {
                            tempMap[k] = append(tempMap[k].([]Result),res)
                        for _, res := range result.([]Result) {
                            tempMap[k] = append(tempMap[k].([]Result), res)
                        }
                    }
                    if k == "face" {
                        tempMap[k] = []FaceResult{}
                        for _,res := range result.([]FaceResult) {
                            tempMap[k] = append(tempMap[k].([]FaceResult),res)
                        for _, res := range result.([]FaceResult) {
                            tempMap[k] = append(tempMap[k].([]FaceResult), res)
                        }
                    }
                }
                va.CacheData = ResultMsg{message,tempMap}
                va.CacheData = ResultMsg{message, tempMap}
                logger.Info("这个摄像机--", args.CameraId, "--被赋予了result", va.Result)
            }
        }
@@ -472,15 +475,15 @@
                    // 把数组里缓存的数据取出来一起报警
                    label.LinkCache = []ResultMsg{}
                    for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
                        label.LinkCache = append(label.LinkCache,ruleRes.CacheData)
                        label.LinkCache = append(label.LinkCache, ruleRes.CacheData)
                    }
                    logger.Debug("联动任务缓存了几个数据",len(label.LinkCache))
                    for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++  {
                    logger.Debug("联动任务缓存了几个数据", len(label.LinkCache))
                    for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ {
                        if args.RuleResult["yolo"].([]Result)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                            args.RuleResult["yolo"].([]Result)[i].Others.LinkCache = label.LinkCache
                        }
                    }
                    for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++  {
                    for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ {
                        if args.RuleResult["face"].([]FaceResult)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                            args.RuleResult["face"].([]FaceResult)[i].Others.LinkCache = label.LinkCache
                        }
@@ -498,9 +501,9 @@
        //        va.Result = strconv.FormatBool(isOk)
        //    }
        //}
        for k,_ := range TimeEleList  {
        for k, _ := range TimeEleList {
            if k == groupRule.GroupId {
                delete(TimeEleList,k)
                delete(TimeEleList, k)
                logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
            }
        }
@@ -572,7 +575,7 @@
                        am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段
                    }
                    if am.targetNum > 0 {
                         logger.Info("!!!!!!!!!人脸检测成功")
                        logger.Info("!!!!!!!!!人脸检测成功")
                        return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
                    } else {
                        return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}