| | |
| | | package service |
| | | |
| | | import ( |
| | | esApi "basic.com/pubsub/esutil.git" |
| | | "basic.com/pubsub/protomsg.git" |
| | | "github.com/gogo/protobuf/proto" |
| | | "github.com/satori/go.uuid" |
| | |
| | | "nanomsg.org/go-mangos/transport/ipc" |
| | | "nanomsg.org/go-mangos/transport/tcp" |
| | | "sort" |
| | | "strconv" |
| | | "sync" |
| | | "webserver/extend/config" |
| | | "webserver/extend/logger" |
| | | "webserver/extend/util" |
| | | ) |
| | | |
| | | type FaceCompareService struct { |
| | |
| | | |
| | | type CompareOnce struct { |
| | | CompareNum string `json:"compareOnce"` |
| | | CompareData []CompareResult `json:"compareData"` |
| | | CompareData *[]*protomsg.SdkCompareEach `json:"compareData"` |
| | | } |
| | | |
| | | type CompareResultWrapper struct { |
| | | CompareData []CompareResult |
| | | By func(p,q *CompareResult) bool |
| | | CompareData *[]*protomsg.SdkCompareEach |
| | | By func(p,q *protomsg.SdkCompareEach) bool |
| | | } |
| | | |
| | | func (crw CompareResultWrapper) Len()int { |
| | | return len(crw.CompareData) |
| | | return len(*crw.CompareData) |
| | | } |
| | | func (crw CompareResultWrapper) Swap(i,j int) { |
| | | crw.CompareData[i],crw.CompareData[j] = crw.CompareData[j],crw.CompareData[i] |
| | | (*crw.CompareData)[i],(*crw.CompareData)[j] = (*crw.CompareData)[j],(*crw.CompareData)[i] |
| | | } |
| | | func (crw CompareResultWrapper) Less(i,j int) bool{ |
| | | return crw.By(&crw.CompareData[i],&crw.CompareData[j]) |
| | | return crw.By((*crw.CompareData)[i],(*crw.CompareData)[j]) |
| | | } |
| | | |
| | | func SortByScore(list []CompareResult) { |
| | | sort.Sort(CompareResultWrapper{list, func(p, q *CompareResult) bool { |
| | | func SortByScore(list *[]*protomsg.SdkCompareEach) { |
| | | sort.Sort(CompareResultWrapper{list, func(p, q *protomsg.SdkCompareEach) bool { |
| | | return q.CompareScore < p.CompareScore //递减排序 |
| | | }}) |
| | | } |
| | |
| | | |
| | | var CaptureTable = "capturetable" // 抓拍库 |
| | | |
| | | type CompareResult struct { |
| | | Id string `json:"id"` |
| | | CompareScore float32 `json:"compareScore"` |
| | | CameraId string `json:"cameraId"` |
| | | CameraAddr string `json:"cameraAddr"` |
| | | PicDate string `json:"picDate"` |
| | | Content string `json:"content"` |
| | | IsAlarm int `json:"isAlarm"` |
| | | PicMaxUrl string `json:"picMaxUrl"` |
| | | PicSmUrl []string `json:"picSmUrl"` |
| | | Sex string `json:"sex"` |
| | | AgeDescription string `json:"ageDescription"` |
| | | Race string `json:"race"` |
| | | TaskId string `json:"taskId"` |
| | | TaskName string `json:"taskName"` |
| | | BaseInfo []DbPersonVo `json:"baseInfo"` |
| | | VideoUrl string `json:"videoUrl"` |
| | | SdkName string `json:"sdkName"` |
| | | } |
| | | type DbPersonVo struct { |
| | | BwType string `json:"bwType"` |
| | | CompareScore float32 `json:"compareScore"` |
| | | IdCard string `json:"idCard"` |
| | | MonitorLevel string `json:"monitorLevel"` |
| | | PersonId string `json:"personId"` |
| | | PersonName string `json:"personName"` |
| | | PersonPicUrl string `json:"personPicUrl"` |
| | | PhoneNum string `json:"phoneNum"` |
| | | Sex string `json:"sex"` |
| | | TableId string `json:"tableId"` |
| | | TableName string `json:"tableName"` |
| | | } |
| | | |
| | | func (sv *FaceCompareService) Compare() *CompareOnce{ |
| | | b, err := proto.Marshal(&sv.CompareArgs) |
| | | compServerList := config.CompServerInfo.Url |
| | | logger.Debug("compServerList:", compServerList) |
| | | //1.向各个compare进程发起请求拿到比对结果 |
| | | resultList :=make([]CompareResult,0) |
| | | resultList :=make([]*protomsg.SdkCompareEach,0) |
| | | for _,str :=range compServerList{ |
| | | reqUrl := "tcp://"+str |
| | | resultB := doCompareRequest(reqUrl,b) |
| | |
| | | |
| | | logger.Debug("comp len(rList):", len(sdkCompResult.CompareResult)) |
| | | if len(sdkCompResult.CompareResult) >0 { |
| | | resultList = append(resultList, FillDataToCompareResult(&sdkCompResult)...) |
| | | resultList = append(resultList, sdkCompResult.CompareResult...) |
| | | //resultList = append(resultList, FillDataToCompareResult(&sdkCompResult)...) |
| | | } |
| | | } |
| | | logger.Debug("comp totalList.len:", len(resultList)) |
| | |
| | | //2.缓存比对结果 |
| | | co := &CompareOnce{ |
| | | CompareNum: sv.CompareNum, |
| | | CompareData: resultList, |
| | | CompareData: &resultList, |
| | | } |
| | | SetCompResultByNum(co) |
| | | |
| | |
| | | } |
| | | sock.Close() |
| | | return &msg |
| | | } |
| | | |
| | | //填充向前端返回的数据 |
| | | func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) []CompareResult { |
| | | resultList :=make([]CompareResult,0) |
| | | |
| | | dbPersonM := make(map[string]*protomsg.SdkCompareEach, 0) |
| | | captureM := make(map[string]*protomsg.SdkCompareEach, 0) |
| | | personIds :=make([]string,0) |
| | | captureIds := make([]string,0) |
| | | for _,v :=range compResult.CompareResult{ |
| | | if v.Tableid == CaptureTable { |
| | | captureM[v.Id] = v |
| | | captureIds = append(captureIds,v.Id) |
| | | } else { |
| | | dbPersonM[v.Id] = v |
| | | personIds = append(personIds,v.Id) |
| | | } |
| | | } |
| | | logger.Debug("comp len(personIds):", len(personIds)) |
| | | logger.Debug("comp len(captureIds):", len(captureIds)) |
| | | esServerIp := config.EsInfo.Masterip |
| | | esServerPort := config.EsInfo.Httpport |
| | | index := config.EsInfo.EsIndex.Dbtablepersons.IndexName |
| | | var dbpersons []protomsg.Dbperson |
| | | if len(personIds) >0 { |
| | | dbpersons, _ = esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort) |
| | | } |
| | | |
| | | logger.Debug("comp dbpersons.len:", len(dbpersons)) |
| | | if dbpersons !=nil { |
| | | for _,p :=range dbpersons { |
| | | var dbP = DbPersonVo { |
| | | PersonId: p.Id, |
| | | IdCard: p.IdCard, |
| | | CompareScore: util.ParseScore(dbPersonM[p.Id].CompareScore), |
| | | MonitorLevel: p.MonitorLevel, |
| | | PersonName: p.PersonName, |
| | | PersonPicUrl: p.PersonPicUrl, |
| | | PhoneNum: p.PhoneNum, |
| | | Sex: p.Sex, |
| | | TableId: p.TableId, |
| | | } |
| | | dbTableInfos, _ := esApi.Dbtablefosbyid([]string{p.TableId}, config.EsInfo.EsIndex.DbTables.IndexName, esServerIp, esServerPort) |
| | | if dbTableInfos !=nil{ |
| | | dbP.BwType = dbTableInfos[0].BwType |
| | | dbP.TableName = dbTableInfos[0].TableName |
| | | } |
| | | var cr = CompareResult{ |
| | | BaseInfo:[]DbPersonVo{ dbP }, |
| | | } |
| | | resultList = append(resultList,cr) |
| | | } |
| | | } |
| | | if len(captureIds) >0 { |
| | | videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, config.EsInfo.Masterip, config.EsInfo.Httpport) |
| | | logger.Debug("comp videoPersons.len:",len(videopersons)) |
| | | for _,vp :=range videopersons { |
| | | isAlarmInt, _ := strconv.Atoi(vp.IsAlarm) |
| | | bi := make([]DbPersonVo,0) |
| | | for _,p :=range vp.BaseInfo { |
| | | bi = append(bi, DbPersonVo{ |
| | | PersonId: p.PersonId, |
| | | IdCard: p.IdCard, |
| | | CompareScore: util.ParseScore(p.CompareScore), |
| | | MonitorLevel: parseMonitorLevel(p.MonitorLevel), |
| | | PersonName: p.PersonName, |
| | | PersonPicUrl: p.PersonPicUrl, |
| | | PhoneNum: p.PhoneNum, |
| | | Sex: p.Sex, |
| | | TableId: p.TableId, |
| | | }) |
| | | } |
| | | vpE := CompareResult{ |
| | | Id: vp.Id, |
| | | CompareScore: util.ParseScore(captureM[vp.Id].CompareScore), |
| | | CameraId: vp.CameraId, |
| | | CameraAddr: vp.CameraAddr, |
| | | PicDate: vp.PicDate, |
| | | PicMaxUrl: vp.PicMaxUrl, |
| | | PicSmUrl: vp.PicSmUrl, |
| | | IsAlarm: isAlarmInt, |
| | | Sex: vp.Sex, |
| | | AgeDescription: vp.AgeDescription, |
| | | Race: vp.Race, |
| | | TaskName: vp.TaskName, |
| | | TaskId: vp.TaskId, |
| | | VideoUrl: vp.VideoUrl, |
| | | BaseInfo: bi, |
| | | SdkName: "人脸", |
| | | } |
| | | resultList = append(resultList,vpE) |
| | | } |
| | | } |
| | | return resultList |
| | | } |
| | | |
| | | func parseMonitorLevel(level string) string { |
| | | if level == "1" { |
| | | return "一级" |
| | | } |
| | | if level == "2" { |
| | | return "二级" |
| | | } |
| | | if level == "3" { |
| | | return "三级" |
| | | } |
| | | return level |
| | | } |