From 2f5f0c75f3257b4ea9c37df6d02e5598b975740f Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期三, 11 十二月 2019 17:10:27 +0800 Subject: [PATCH] copy from VAProcess --- work/sdk/facetrack.go | 267 +++++++++------------------------------------------- 1 files changed, 48 insertions(+), 219 deletions(-) diff --git a/work/sdk/facetrack.go b/work/sdk/facetrack.go index dc45d2c..0c1b998 100644 --- a/work/sdk/facetrack.go +++ b/work/sdk/facetrack.go @@ -30,50 +30,21 @@ */ import "C" import ( - "analysis/goconv" "analysis/logo" "analysis/work" "context" + "fmt" "time" "unsafe" + "basic.com/libgowrapper/sdkstruct.git" "basic.com/pubsub/protomsg.git" - "basic.com/valib/gosdk.git" "github.com/gogo/protobuf/proto" ) -func tconvert2ProtoFacePos(dec gosdk.CFaceInfo) *protomsg.FacePos { - - crect := dec.RcFace - rect := protomsg.Rect{Left: crect.Left, Top: crect.Top, Right: crect.Right, Bottom: crect.Bottom} - leftEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtLeftEye)) - rightEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtRightEye)) - mouth := (*protomsg.Point)(unsafe.Pointer(&dec.PtMouth)) - nose := (*protomsg.Point)(unsafe.Pointer(&dec.PtNose)) - angle := (*protomsg.FaceAngle)(unsafe.Pointer(&dec.FAngle)) - faceID := uint64(dec.NFaceID) - - facialData := dec.PFacialData[:512] - - // facialData := make([]byte, 512) - // copy(facialData[:], dec.PFacialData[:512]) - - return &protomsg.FacePos{ - RcFace: &rect, - PtLeftEye: leftEye, - PtRightEye: rightEye, - PtMouth: mouth, - PtNose: nose, - FAngle: angle, - Quality: dec.NQuality, - FacialData: facialData, - FaceID: faceID, - } -} - const ( - CacheFrameNum = 3 - TrackChnTimeout = time.Duration(10) + cacheFrameNum = 3 + trackChnTimeout = time.Duration(10) ) func (e *EFDetect) cleanChnStat() { @@ -108,6 +79,7 @@ for { select { case <-ctx.Done(): + e.fnFree(e.handle) return default: rMsg := <-in @@ -121,7 +93,7 @@ e.ftrackChans[rMsg.Msg.Cid] <- rMsg } else { - e.ftrackChans[rMsg.Msg.Cid] = make(chan work.MsgRS, CacheFrameNum) + e.ftrackChans[rMsg.Msg.Cid] = make(chan work.MsgRS, cacheFrameNum) chn := e.getAvailableChn() if chn < 0 { logo.Infof("TOO MUCH CHANNEL") @@ -137,7 +109,7 @@ } // conv to bgr24 and resize imgW, imgH := int(i.Width), int(i.Height) - ret := gosdk.ResizeFaceTracker(e.ftrackChannels[rMsg.Msg.Cid], imgW, imgH) + ret := e.fnTrackerResize(e.handle, e.ftrackChannels[rMsg.Msg.Cid], imgW, imgH) logo.Infof("ResizeFaceTracker: cid:%s, chan:%d, wXh:%d x %d ,result:%d\n", rMsg.Msg.Cid, e.ftrackChannels[rMsg.Msg.Cid], imgW, imgH, ret) go e.detectTrackOneChn(ctx, e.ftrackChans[rMsg.Msg.Cid], out, typ, e.ftrackChannels[rMsg.Msg.Cid]) @@ -156,8 +128,8 @@ for { select { case <-ctx.Done(): - goconv.Free() return + case rMsg := <-in: if !validRemoteMessage(rMsg, typ) { @@ -175,20 +147,14 @@ // conv to bgr24 and resize imgW, imgH := int(i.Width), int(i.Height) - bgrData := goconv.YUV2BGR(i.Data, imgW, imgH) - if bgrData == nil { - ejectResult(nil, rMsg, out) - continue - } - img := gosdk.SDKImage{Data: bgrData, Width: imgW, Height: imgH} - detect := gosdk.FaceTrackSimple(img, dtchn) + fRes := e.fnRun(e.handle, i.Data, imgW, imgH, 3, dtchn) var faces []*protomsg.ResultFaceDetect - //灏唖dk杩斿洖鍊艰浆鎹㈡垚protomsg绫诲瀷 - for _, d := range detect { + for _, r := range fRes { + d := r.Info /// filter rules sdkid := rMsg.Msg.Tasklab.Sdkinfos[rMsg.Msg.Tasklab.Index].Ipcid size := (d.RcFace.Right - d.RcFace.Left) * (d.RcFace.Bottom - d.RcFace.Top) @@ -198,31 +164,23 @@ } /// filter rules - //杩愯sd - dec := gosdk.FaceInfo2FacePos(d) - prop := gosdk.FaceProperty(dec, img, dtchn) - feat := gosdk.FaceExtract(dec, img, dtchn) - - resP := (*protomsg.ThftResult)(unsafe.Pointer(&prop)) - - result := tconvert2ProtoFacePos(d) + feat := r.Feat + prop := (*protomsg.ThftResult)(unsafe.Pointer(&r.Prop)) + fpos := tconvert2ProtoFacePos(d) //缁勬垚缁撴灉骞跺簭鍒楀寲 - res := &protomsg.ResultFaceDetect{Pos: result, Result: resP, Feats: feat} + res := &protomsg.ResultFaceDetect{Pos: fpos, Result: prop, Feats: feat} faces = append(faces, res) } - var err error var data []byte if len(faces) > 0 { - // logo.Infoln("CID: ", rMsg.Msg.Cid, " TASK: ", rMsg.Msg.Tasklab.Taskid, " FACE TRACK OBJS: ", len(faces)) - facePos := protomsg.ParamFacePos{Faces: faces} data, err = proto.Marshal(&facePos) if err != nil { - logo.Errorln("fdetect marshal proto face pos error", err) + fmt.Println("fdetect marshal proto face pos error", err) data = nil } } @@ -232,21 +190,21 @@ if rMsg.Msg.Tasklab != nil { id, name = rMsg.Msg.Tasklab.Taskid, rMsg.Msg.Tasklab.Taskname } - logo.Infoln("CAMERAID: ", rMsg.Msg.Cid, " TASKID: ", id, " TASKNAME: ", name, " DETECT FACE COUNT: ", len(faces)) + logo.Infoln("CAMERAID: ", rMsg.Msg.Cid, " TASKID: ", id, " TASKNAME: ", name, " DETECT FACE COUNT: ", len(fRes)) sc++ if sc == 25 { - logo.Infoln("chan:%d, FACE RUN 25 FRAME USE TIME: ", dtchn, time.Since(tm)) + logo.Infoln("CHAN:%d, FACE RUN 25 FRAME USE TIME: ", dtchn, time.Since(tm)) sc = 0 tm = time.Now() } if time.Since(tm) > time.Second { - logo.Infof("cahn:%d, FACE RUN %d FRAME USE TIME: %v", dtchn, sc, time.Since(tm)) + logo.Infof("CHAN:%d, FACE RUN %d FRAME USE TIME: %v", dtchn, sc, time.Since(tm)) sc = 0 tm = time.Now() } - case <-time.After(TrackChnTimeout * time.Second): + case <-time.After(trackChnTimeout * time.Second): logo.Errorln("Timeout to get image, curCid:", curCid) if curCid != "" { delete(e.ftrackChans, curCid) @@ -258,160 +216,31 @@ } } -//func (e *EFDetect) detectTrack(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) { -// tm := time.Now() -// sc := 0 -// -// for { -// select { -// case <-ctx.Done(): -// goconv.Free() -// return -// default: -// rMsg := <-in -// validMsg := validRemoteMessage(rMsg, typ) -// -// i := unpackImage(rMsg, typ) -// if i == nil { -// ejectResult(nil, rMsg, out) -// continue -// } -// -// // conv to bgr24 and resize -// imgW, imgH := int(i.Width), int(i.Height) -// resizeW, resizeH := util.SFI.TrackPicWidth, util.SFI.TrackPicHeight -// fx := (float64)(resizeW) / (float64)(imgW) -// fy := (float64)(resizeH) / (float64)(imgH) -// -// origData, resizeData := goconv.YUV2BGRandResize(i.Data, goconv.PIX_FMT_NV12, imgW, imgH, fx, fy) -// if origData == nil { -// ejectResult(nil, rMsg, out) -// continue -// } -// // resize to track -// if imgW < resizeW && imgH < resizeH { -// resizeData = origData -// resizeW, resizeH = imgW, imgH -// } -// // resize to track -// -// img := gosdk.SDKImage{Data: origData, Width: imgW, Height: imgH} -// imgTrack := gosdk.SDKImage{Data: resizeData, Width: resizeW, Height: resizeH} -// if !validMsg { -// ejectResult(nil, rMsg, out) -// continue -// } -// //杩愯sdk -// c, ok, _ := e.q.Get() -// if !ok { -// logo.Errorln("fdetect there is no idle thread") -// ejectResult(nil, rMsg, out) -// continue -// } -// detect := gosdk.FaceTrackSimple(imgTrack, c.(int)) -// e.q.Put(c) -// -// // if len(detect) > 0 { -// // logo.Infof("FACE DETECT FROM CAMERA %s IMAGE-ID %d, TASKID %s, %d FACES COUNT\n", rMsg.Msg.Cid, i.Id, rMsg.Msg.Tasklab.Taskid, len(detect)) -// // } -// -// var faces []*protomsg.ResultFaceDetect -// -// //灏唖dk杩斿洖鍊艰浆鎹㈡垚protomsg绫诲瀷 -// for _, d := range detect { -// -// /// filter rules -// sdkid := rMsg.Msg.Tasklab.Sdkinfos[rMsg.Msg.Tasklab.Index].Ipcid -// size := (d.RcFace.Right - d.RcFace.Left) * (d.RcFace.Bottom - d.RcFace.Top) -// angle := d.FAngle -// if !filter(rMsg.Msg.Tasklab.Taskid, sdkid, angle.Confidence, float32(angle.Yaw), int(size)) { -// continue -// } -// /// filter rules -// -// if fx < 1.0 || fy < 1.0 { -// d.RcFace.Left = (int32)((float64)(d.RcFace.Left) / fx) -// d.RcFace.Top = (int32)((float64)(d.RcFace.Top) / fy) -// d.RcFace.Right = (int32)((float64)(d.RcFace.Right) / fx) -// d.RcFace.Bottom = (int32)((float64)(d.RcFace.Bottom) / fy) -// d.PtLeftEye.X = (int32)((float64)(d.PtLeftEye.X) / fx) -// d.PtLeftEye.Y = (int32)((float64)(d.PtLeftEye.Y) / fy) -// d.PtRightEye.X = (int32)((float64)(d.PtRightEye.X) / fx) -// d.PtRightEye.Y = (int32)((float64)(d.PtRightEye.Y) / fy) -// d.PtMouth.X = (int32)((float64)(d.PtMouth.X) / fx) -// d.PtMouth.Y = (int32)((float64)(d.PtMouth.Y) / fy) -// d.PtNose.X = (int32)((float64)(d.PtNose.X) / fx) -// d.PtNose.Y = (int32)((float64)(d.PtNose.Y) / fy) -// -// faceData := d.PFacialData[:8192] -// data := C.CBytes(faceData) -// defer C.free(data) -// resizeP := C.resize(&data, C.float(fx), C.float(fy)) -// fd := C.GoBytes(resizeP, 8192) -// d.PFacialData = *(*[8192]uint8)(unsafe.Pointer(&fd[0])) -// -// } -// -// //杩愯sd -// dec := gosdk.FaceInfo2FacePos(d) -// -// c, ok, _ := e.qprop.Get() -// if !ok { -// logo.Errorln("fproperty there is no idle thread") -// continue -// } -// prop := gosdk.FaceProperty(dec, imgTrack, c.(int)) -// e.qprop.Put(c) -// -// c, ok, _ = e.qext.Get() -// if !ok { -// logo.Errorln("fextract there is no idle thread") -// continue -// } -// feat := gosdk.FaceExtract(dec, imgTrack, c.(int)) -// e.qext.Put(c) -// -// resP := (*protomsg.ThftResult)(unsafe.Pointer(&prop)) -// -// result := tconvert2ProtoFacePos(d) -// -// //缁勬垚缁撴灉骞跺簭鍒楀寲 -// res := &protomsg.ResultFaceDetect{Pos: result, Result: resP, Feats: feat} -// faces = append(faces, res) -// -// } -// -// var err error -// var data []byte -// if len(faces) > 0 { -// -// // logo.Infoln("CID: ", rMsg.Msg.Cid, " TASK: ", rMsg.Msg.Tasklab.Taskid, " FACE TRACK OBJS: ", len(faces)) -// -// facePos := protomsg.ParamFacePos{Faces: faces} -// data, err = proto.Marshal(&facePos) -// if err != nil { -// logo.Errorln("fdetect marshal proto face pos error", err) -// data = nil -// } -// } -// -// // logo.Infoln("CURRENT INDEX: ",rMsg.Msg.Tasklab.Index) -// rMsg.BGRImg = &img -// ejectResult(data, rMsg, out) -// -// sc++ -// if sc == 25 { -// logo.Infoln("FACE RUN 25 FRAME USE TIME: ", time.Since(tm)) -// sc = 0 -// tm = time.Now() -// } -// -// if time.Since(tm) > time.Second { -// logo.Infof("FACE RUN %d FRAME USE TIME: %v", sc, time.Since(tm)) -// sc = 0 -// tm = time.Now() -// } -// -// } -// } -//} +func tconvert2ProtoFacePos(dec sdkstruct.CFaceInfo) *protomsg.FacePos { + + crect := dec.RcFace + rect := protomsg.Rect{Left: crect.Left, Top: crect.Top, Right: crect.Right, Bottom: crect.Bottom} + leftEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtLeftEye)) + rightEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtRightEye)) + mouth := (*protomsg.Point)(unsafe.Pointer(&dec.PtMouth)) + nose := (*protomsg.Point)(unsafe.Pointer(&dec.PtNose)) + angle := (*protomsg.FaceAngle)(unsafe.Pointer(&dec.FAngle)) + faceID := uint64(dec.NFaceID) + + facialData := dec.PFacialData[:512] + + // facialData := make([]byte, 512) + // copy(facialData[:], dec.PFacialData[:512]) + + return &protomsg.FacePos{ + RcFace: &rect, + PtLeftEye: leftEye, + PtRightEye: rightEye, + PtMouth: mouth, + PtNose: nose, + FAngle: angle, + Quality: dec.NQuality, + FacialData: facialData, + FaceID: faceID, + } +} -- Gitblit v1.8.0