panlei
2019-08-01 0a101dc2c24674d32d1a9901a4a65ab23c9f03bc
归置人脸
5个文件已修改
307 ■■■■ 已修改文件
insertdata/insertDataToEs.go 290 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/personTrack.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/readyDataForRule.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
insertdata/insertDataToEs.go
@@ -112,6 +112,12 @@
    DefenceState bool   `json:"defenceState"`
}
// 一个face对多个规则组的归置人脸的结构体
type FaceAndRules struct {
    ruleserver.Arg
    rules []ruleserver.Result
}
// 往ES插数据
//func InsertToEs(msg ruleserver.ResultMsg) {
//    var timeLabel string
@@ -138,9 +144,15 @@
//}
func InsertToEs(msg ruleserver.ResultMsg) {
    InsertFace(msg,"")
    // 如果标签中含有持续时间首次报警的timeLabel的话则不需要过人体追踪,不然就没的插入了
    fk := ruleserver.TrackOrNot(msg.RuleResult)
    if fk {
        InsertYolo(msg, "")
    } else {
    flag := ruleserver.BodyIsSame(msg.SdkMessage)
    if !flag {
        InsertYolo(msg,"")
        }
    }
}
@@ -148,8 +160,9 @@
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{}
                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,83 +260,33 @@
        }
    }
}
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)
    }
    requstbody, err := json.Marshal(pervideo)
    if err != nil {
        logger.Info("json parse error ", err)
        return
        return faces
    }
    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})
    return nil
    }
    //if msg.RuleResult["cacheData"] != nil {
    //    InsertFace(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
    //}
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}})
        }
    }
}
// 往es中插入yolo数据
@@ -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,6 +97,7 @@
    LinkCache []ResultMsg
    TimeLabel string
}
// 过规则库打上的标签
type FaceResult struct {
    Result