From aa1b946f4ba9b62dee9b9464ff4450ebbc48c4ec Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期四, 25 七月 2019 16:32:13 +0800 Subject: [PATCH] fix score to %.2f --- controllers/fileController.go | 399 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 301 insertions(+), 98 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 038ae87..74d1b25 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -2,11 +2,15 @@ import ( "basic.com/pubsub/protomsg.git" + "basic.com/fileServer/WeedFSClient.git" + "basic.com/valib/deliver.git" "bytes" "encoding/base64" + "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" + "github.com/gogo/protobuf/proto" "github.com/satori/go.uuid" "image" "image/jpeg" @@ -14,13 +18,18 @@ "log" "mime/multipart" "net/http" + "path" + "strconv" "strings" + "time" "webserver/extend/code" + "webserver/extend/config" "webserver/extend/esutil" + "webserver/extend/logger" "webserver/extend/util" "webserver/models" "webserver/service" - + esApi "basic.com/pubsub/esutil.git" ) type FileController struct { @@ -34,7 +43,6 @@ //var picUrlField = "fid" /**涓婁紶鏂规硶**/ -var weedfsUri = "http://192.168.1.182:6333/submit" //var weedfsUri = "http://192.168.1.182:9500/submit" @@ -71,7 +79,7 @@ // fastdfs 涓婁紶 鏆傚簾寮� //field := fdfsclient.UploadFileByBuffer(data, fileSuffix) } - field, result, err := uploadFileReturnAddr(file, filename, tableId) + fileNameOnly, result, err := uploadFileReturnAddr(file, filename, tableId) if err != nil { if err.Error() == "NotFeatureFindError" { util.ResponseFormat(c, code.NotFeatureFindError, filename) @@ -87,7 +95,209 @@ util.ResponseFormat(c, code.ServiceInsideError, result["data"]) } } else { - util.ResponseFormat(c, code.Success, field) + util.ResponseFormat(c, code.Success, fileNameOnly) + } +} + + +type FaceExtract struct { + Url string `json:"url"` + FaceBytes []byte `json:"faceBytes"` +} +var faceExtractedMap = make(map[string]FaceExtract,0) + +// @Summary 浜鸿劯鎻愬彇 +// @Description 浜鸿劯鎻愬彇 +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @Param file formData file true "浜哄憳鍥剧墖" +// @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" +// @Router /data/api-v/dbperson/faceExtract [POST] +func (controller FileController) FaceExtract(c *gin.Context) { + file, _, err := c.Request.FormFile("file") //image杩欎釜鏄痷plaodify鍙傛暟瀹氫箟涓殑 'fileObjName':'image' + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + resultMap :=make(map[string]interface{},0) + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + fileBytes, _ := ioutil.ReadAll(file) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) >0 { + //1.鎻愬彇姣忎竴寮犱汉鑴稿皬鍥� + urlArr := make([]string,0) + for _,r := range faceArr { + rcFace := r.Pos.RcFace + cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) + if e == nil{ + faceExtractedMap[weedFilePath] = FaceExtract{ + Url:weedFilePath, + FaceBytes:r.Feats, + } + urlArr = append(urlArr, weedFilePath) + } + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", fileBytes) + resultMap["uploadImage"] = originFilePath + resultMap["smImage"] = urlArr + util.ResponseFormat(c,code.Success, resultMap) + } else { + util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") + } +} + +type CompareResult struct { + Id string `json:"id"` + 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"` + TaskName string `json:"taskName"` + BaseInfo []DbPersonVo `json:"baseInfo"` + VideoUrl string `json:"videoUrl"` +} +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"` +} + +var captureTable = "capturetable" // 鎶撴媿搴� +type SearchCondition struct { + PicUrl string `json:"picUrl"` + Databases []string `json:"databases"` + Threshold string `json:"threshold"` +} +// @Summary 浠ュ浘鎼滃浘 +// @Description 浠ュ浘鎼滃浘 +// @Accept json +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @Param condition body controllers.SearchCondition true "鎼滅储鍙傛暟" +// @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" +// @Router /data/api-v/dbperson/searchByPhoto [POST] +func (controller FileController) SearchByPhoto(c *gin.Context) { + var condition SearchCondition + err := c.BindJSON(&condition) + if err !=nil || condition.PicUrl == "" || len(condition.Databases) == 0 { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + compThreshold, err := strconv.ParseFloat(condition.Threshold,32) + if condition.PicUrl == "" || err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + if face,ok := faceExtractedMap[condition.PicUrl];!ok{ + util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") + return + } else { + arg := protomsg.CompareArgs{ + TableIds: condition.Databases, + FaceFeature: face.FaceBytes, + CompareThreshold: float32(compThreshold), + } + if condition.Databases !=nil { + arg.TableIds = append(arg.TableIds, condition.Databases...) + } + b, err := proto.Marshal(&arg) + if err !=nil{ + util.ResponseFormat(c, code.ComError, "璇锋眰marshal澶辫触") + return + } + compServerList := config.CompServerInfo.Url + logger.Debug("compServerList:", compServerList) + resultList :=make([]CompareResult,0) + for _,str :=range compServerList{ + reqUrl := "tcp://"+str + reqClient := deliver.NewClient(deliver.ReqRep, reqUrl) + err = reqClient.Send(b) + if err !=nil{ + logger.Debug("reqClient.Send err:",err) + continue + } + resultB, err := reqClient.Recv() + if err !=nil{ + logger.Debug("reqClient.Recv err:",err) + continue + } + rList :=make([]protomsg.Esinfo,0) + err = json.Unmarshal(resultB, &rList) + if err !=nil{ + logger.Debug("recv result Unmarshal err:", err) + continue + } + logger.Debug("rList:", rList) + + dbPersonM := make(map[string]*protomsg.Esinfo,0) + captureM := make(map[string]*protomsg.Esinfo,0) + personIds :=make([]string,0) + captureIds := make([]string,0) + for _,v :=range rList{ + 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("personIds:", personIds) + logger.Debug("captureIds:",captureIds) + esServerIp := config.EsInfo.Masterip + esServerPort := config.EsInfo.Httpport + index := config.EsInfo.EsIndex.Dbtablepersons.IndexName + dbpersons, e := esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort) + if e !=nil { + logger.Debug("Dbpersoninfosbyid.err:",e) + } + logger.Debug("dbpersons:", dbpersons) + if e ==nil && 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) + } + } + logger.Debug("resultList:",resultList) + } + util.ResponseFormat(c,code.Success,resultList) } } @@ -99,18 +309,27 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - + var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� fileBytes, _ := ioutil.ReadAll(file) - faceExtArr, err := getFaceFeaFromSdk(fileBytes) - if err ==nil && len(faceExtArr) >0 { + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) + if err ==nil && len(faceArr) >0 { var faceBase64= "" - for _,r := range faceExtArr { + var rcFace *protomsg.Rect + for _,r := range faceArr { + rcFace = r.Pos.RcFace faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰� break } - util.ResponseFormat(c,code.Success,faceBase64) + //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 + cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "testCutFace", cutFaceImgData) + if e !=nil{ + util.ResponseFormat(c,code.ComError,"鏂囦欢涓婁紶澶辫触") + } else { + util.ResponseFormat(c,code.Success,weedFilePath + ";" + faceBase64) + } } else { util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") } @@ -123,7 +342,6 @@ }*/ func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { - defer file.Close() field := "" // weedfs 涓婁紶 @@ -131,86 +349,74 @@ if err !=nil { return "",nil,err } - fmt.Println("fileBytes.len:",len(fileBytes)) - fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", file) + + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + var faceBase64="" + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) + if faceArr ==nil { + return "",nil,errors.New("NotFeatureFindError") + } + var rcFace *protomsg.Rect + if err ==nil && len(faceArr) >0 { + for _,r := range faceArr { + //鎷垮埌浜鸿劯鐨勫潗鏍� + rcFace = r.Pos.RcFace + + faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰� + break + } + } + var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 + cutFaceImgData := util.SubImg(*pI, int(rcFace.Left), int(rcFace.Top), int(rcFace.Right), int(rcFace.Bottom)) + fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", cutFaceImgData) if e != nil { fmt.Println(e.Error()) return "", nil, e } else { field = fileInfo[picUrlField].(string) // 鏂囦欢璺緞 } - - if field != "" { - // 杩斿洖鐗瑰緛鍊� fileInfo["point"] = v.RcFace fileInfo["feature"] = feat - - /*features := gorun.GetSimpleFaceDetect(picIp+field) // 鐗瑰緛鍊� // linux - if len(features) == 0 { // linux - return field,nil,errors.New("NotFeatureFindError") // linux - }else if len(features) > 1 { // linux - return field,nil,errors.New("TooManyFeatureFindError") // linux - } // linux - feat := features[0]["feature"].([]byte) // linux - if len(feat) != 2560 { // linux - return field,nil,errors.New("NotFeatureFindError") - - } */ // linux - if strings.Contains(field,"/"){ - idx := strings.Index(field, "/") - field = field[idx+1:] - } - fmt.Println("field:",field) - //imgB, _ := ioutil.ReadAll(file) - //fmt.Println("img.length:",len(imgB)) - - //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� - var faceBase64="" - faceExtArr, err := getFaceFeaFromSdk(fileBytes) - if faceExtArr ==nil { - return "",nil,errors.New("NotFeatureFindError") - } - if err ==nil && len(faceExtArr) >0 { - for _,r := range faceExtArr { - faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰� - break - } - } - - - dbperson := new(models.Dbtablepersons) - dbperson.PersonPicUrl = field // 鍥剧墖璺粡 - dbperson.TableId = tableId // - dbperson.PersonName = filename // 鍥剧墖鍚� - // 婕旂ずbase64缂栫爜 - - dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� - - result := addDbPerson(dbperson) - return field, result, nil - } else { - return field, nil, nil + if strings.Contains(field,"/"){ + idx := strings.Index(field, "/") + field = field[idx+1:] } + fmt.Println("field:",field) + ext := path.Ext(filename) + fileNameOnly := strings.TrimSuffix(filename, ext) + + dbperson := new(models.Dbtablepersons) + dbperson.PersonPicUrl = field // 鍥剧墖璺粡 + dbperson.TableId = tableId // + dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� + // 婕旂ずbase64缂栫爜 + + dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� + + result := addDbPerson(dbperson) + return fileNameOnly, result, nil + } -func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error){ - s := service.NewFaceSdkService(fileBytes) - i, err := s.ReadFromUploadImg() - if err !=nil{ - fmt.Println("readFromUploadImg err:",err) - return nil,err - } - bc, err := service.ImgCompress(i) - if err !=nil { - fmt.Println("ImgCompress err:",err) - return nil,err - } - s.PushImgMsg(bc) - s.GetFaceFea() - if s.Result == nil{ - return nil,errors.New("no fea") - } else { - return s.Result,nil - } -} +//func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){ +// s := service.NewFaceSdkService(fileBytes) +// i, err := s.ReadFromUploadImg() +// if err !=nil{ +// fmt.Println("readFromUploadImg err:",err) +// return nil,err,i +// } +// bc, err := service.ImgCompress(i) +// if err !=nil { +// fmt.Println("ImgCompress err:",err) +// return nil,err,i +// } +// s.PushImgMsg(bc) +// s.GetFaceFea() +// if s.Result == nil{ +// return nil,errors.New("no fea"),i +// } else { +// return s.Result,nil,i +// } +//} /**涓婁紶鏂规硶**/ @@ -235,9 +441,9 @@ return } extNames := make([]string, 0) - isAllFiald := true addResult := make(map[string]interface{}, 0) - details := make([]string, 0) + successList := make([]string, 0) + failList := make([]string,0) for _, head := range fileHeaders { //鏂囦欢鐨勫悕绉� filename := head.Filename @@ -246,26 +452,22 @@ if err != nil { log.Fatal(err) } - //data, _ := ioutil.ReadAll(file) - // weedfs 涓婁紶 + field, _, err1 := uploadFileReturnAddr(file, filename, tableId) - extNames = append(extNames, field) - if isAllFiald && err1 == nil { - isAllFiald = false - } - if err1 != nil { - if field == "" { - details = append(details, filename+"涓婁紶澶辫触,"+err1.Error()) - } else { - details = append(details, filename+"鍔犲叆搴曞簱澶辫触,"+err1.Error()) - } + //extNames = append(extNames, field) + + if err1 != nil || field == "" { + failList = append(failList, filename) + } else { + successList = append(successList, filename) } } - addResult["isAllFiald"] = isAllFiald + addResult["successList"] = successList + addResult["failList"] = failList addResult["fields"] = extNames - addResult["detail"] = details + //addResult["detail"] = details //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 - if !isAllFiald { + if len(successList)>0 { util.ResponseFormat(c, code.Success, addResult) } else { util.ResponseFormat(c, code.ServiceInsideError, err.Error()) @@ -311,6 +513,7 @@ util.ResponseFormat(c, code.UploadFileError, err2.Error()) return } + var weedfsUri = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" { uri := weedfsUri fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) -- Gitblit v1.8.0