From 97c8be11558c7aff01ecdbf3d2a6470e2255a013 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 13 十二月 2019 12:25:24 +0800
Subject: [PATCH] add humantrack

---
 work/sdk/humantrack.go |  190 ++++++++++++++++++++++++++++++++++++++
 proc/proc.go           |   41 +++++++-
 go.mod                 |    2 
 proc/single.go         |    9 -
 work/common.go         |   23 ----
 5 files changed, 230 insertions(+), 35 deletions(-)

diff --git a/go.mod b/go.mod
index 0227b4f..d808405 100644
--- a/go.mod
+++ b/go.mod
@@ -6,7 +6,7 @@
 	basic.com/dbapi.git v0.0.0-20190803074805-04f05c8ca762
 	basic.com/libgowrapper/sdkstruct.git v0.0.0-20191211011351-89daaec8738e
 	basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
-	basic.com/pubsub/protomsg.git v0.0.0-20191121033547-7af037c469a7
+	basic.com/pubsub/protomsg.git v0.0.0-20191213031824-8f12ebe28c26
 	basic.com/ruleForSdk.git v0.0.0-20190808095604-936797ef5da3
 	basic.com/valib/deliver.git v0.0.0-20190830083657-47adbbbb6651
 	basic.com/valib/godraw.git v0.0.0-20191122082247-26e9987cd183
diff --git a/proc/proc.go b/proc/proc.go
index 28411b4..7cbaa1f 100644
--- a/proc/proc.go
+++ b/proc/proc.go
@@ -6,6 +6,7 @@
 	"analysis/work"
 	"analysis/work/sdk"
 	"context"
+	"os"
 )
 
 type infoSDK struct {
@@ -35,6 +36,29 @@
 	name    = "./data/yolo/data/coco.names"
 )
 
+const (
+	FDetect = "FaceDetect"
+	// FExtract  = "FaceExtract"
+	// FProperty = "FaceProperty"
+	FCompare   = "FaceCompare"
+	FtTract    = "FaceTrack"
+	FtDetect   = "FaceTrackDetect"
+	FtOnly     = "FaceTrackOnly"
+	YDetect    = "Yolo"
+	PlateID    = "Plate"
+	HumanTrack = "HumanTrack"
+)
+
+var (
+	SDK = []string{
+		YDetect,
+		FDetect,
+		FCompare,
+		PlateID,
+		HumanTrack,
+	}
+)
+
 func prepare(name string, gpu int) (string, bool) {
 
 	return initSDK(name, gpu)
@@ -44,7 +68,7 @@
 
 	sdkType := name
 
-	if s, f := util.FindStringInArray(sdkType, work.SDK); f {
+	if s, f := util.FindStringInArray(sdkType, SDK); f {
 		sdkType = s
 	} else {
 		logo.Errorln("THERE IS NO THIS SDK TYPE: ", sdkType)
@@ -64,23 +88,28 @@
 	var e sdk.Engine
 	ret := true
 
-	if sdkType == work.FDetect {
+	if sdkType == FDetect {
 		e, ret = createFaceDetect(gpu, thrds, util.SFI.DetectNum, util.SFI.DetectAngle, util.SFI.TrackInterval, util.SFI.SampleSize)
 
-	} else if sdkType == work.YDetect {
+	} else if sdkType == YDetect {
 		e, ret = createYolo(gpu)
 
-	} else if sdkType == work.FtTract {
+	} else if sdkType == FtTract {
 		e, ret = createFaceTrack(gpu, thrds, util.SFI.DetectNum, util.SFI.DetectAngle, util.SFI.TrackInterval, util.SFI.SampleSize)
 
-	} else if sdkType == work.FCompare {
+	} else if sdkType == FCompare {
 		e = sdk.NewEFExtract(100)
-	} else if sdkType == work.PlateID {
+	} else if sdkType == PlateID {
 		e = sdk.NewVehicleDetector(util.SCI.LicenseServerPath, util.SCI.Model, util.SCI.MaxImageWidth, util.SCI.MaxImageHeight)
+	} else if sdkType == HumanTrack {
+		e = sdk.NewHumanTracker(gpu, 1, 0)
 	}
 
 	if ret {
 		mapFunc[sdkType] = e
+	} else {
+		logo.Errorln("CREATE SDK : ", sdkType, " FAILED")
+		os.Exit(0)
 	}
 	return sdkType, ret
 }
diff --git a/proc/single.go b/proc/single.go
index 6262a28..2284ea2 100644
--- a/proc/single.go
+++ b/proc/single.go
@@ -3,7 +3,6 @@
 import (
 	"analysis/logo"
 	"analysis/util"
-	"analysis/work"
 	"context"
 	"strings"
 )
@@ -58,12 +57,12 @@
 		logo.Errorf("NO THIS SDK PROC SDKPROC : ", typ)
 	}
 	rSDK := []string{
-		work.FDetect,
-		work.FCompare,
+		FDetect,
+		FCompare,
 	}
 	if typ == util.FeatYolo {
 		rSDK = rSDK[0:0]
-		rSDK = append(rSDK, work.YDetect)
+		rSDK = append(rSDK, YDetect)
 	}
 	var res []bool
 	for _, v := range rSDK {
@@ -95,7 +94,7 @@
 func allProc(ctx context.Context, gpu int, shm bool) bool {
 	var res []bool
 
-	for _, v := range work.SDK {
+	for _, v := range SDK {
 		_, f := prepare(v, gpu)
 		res = append(res, f)
 	}
diff --git a/work/common.go b/work/common.go
index b646ce2..30a0653 100644
--- a/work/common.go
+++ b/work/common.go
@@ -6,29 +6,6 @@
 	"basic.com/pubsub/protomsg.git"
 )
 
-const (
-	FDetect = "FaceDetect"
-	// FExtract  = "FaceExtract"
-	// FProperty = "FaceProperty"
-	FCompare = "FaceCompare"
-	FtTract  = "FaceTrack"
-	FtDetect = "FaceTrackDetect"
-	FtOnly   = "FaceTrackOnly"
-	YDetect  = "Yolo"
-	PlateID  = "Plate"
-)
-
-var (
-	SDK = []string{
-		YDetect,
-		FDetect,
-		FCompare,
-		PlateID,
-		// FtTract,
-		// FtOnly,
-	}
-)
-
 const mode = deliver.PushPull
 
 // MsgRS msg recv and snd
diff --git a/work/sdk/humantrack.go b/work/sdk/humantrack.go
new file mode 100644
index 0000000..e84b9ff
--- /dev/null
+++ b/work/sdk/humantrack.go
@@ -0,0 +1,190 @@
+package sdk
+
+import (
+	"analysis/logo"
+	"analysis/work"
+	"context"
+	"plugin"
+	"time"
+
+	"github.com/gogo/protobuf/proto"
+
+	"basic.com/libgowrapper/sdkstruct.git"
+	"basic.com/pubsub/protomsg.git"
+	"basic.com/valib/gogpu.git"
+)
+
+// HumanTracker track
+type HumanTracker struct {
+	gpu       int
+	batchSize int
+	flag      int
+
+	handle       interface{}
+	fnInit       func(int, int, int) interface{}
+	fnFree       func(interface{})
+	fnRun        func(interface{}, []byte, int, int, int) []sdkstruct.FgResult
+	fnProcess    func(interface{}, []sdkstruct.SDKImage) ([]sdkstruct.FgResult, error)
+	fnVer        func(interface{}) string
+	fnSimilarity func([]float32, []float32) (float64, error)
+}
+
+// NewHumanTracker new
+func NewHumanTracker(gpu, batchSize, flag int) *HumanTracker {
+	soFile := "libyolo.so"
+
+	plug, err := plugin.Open(soFile)
+	if err != nil {
+		logo.Errorln("Open: ", soFile, " error: ", err)
+		return nil
+	}
+
+	fnInit, _ := LoadFunc(plug, soFile, "NewSDK")
+	fnFree, _ := LoadFunc(plug, soFile, "Free")
+	fnRun, _ := LoadFunc(plug, soFile, "Run")
+	fnProc, _ := LoadFunc(plug, soFile, "Process")
+	fnVer, _ := LoadFunc(plug, soFile, "GetVersion")
+	fnSim, _ := LoadFunc(plug, soFile, "CFFSimilarity")
+
+	return &HumanTracker{
+		gpu:       gpu,
+		batchSize: batchSize,
+		flag:      flag,
+
+		handle:       nil,
+		fnInit:       fnInit.(func(int, int, int) interface{}),
+		fnFree:       fnFree.(func(interface{})),
+		fnRun:        fnRun.(func(interface{}, []byte, int, int, int) []sdkstruct.FgResult),
+		fnProcess:    fnProc.(func(interface{}, []sdkstruct.SDKImage) ([]sdkstruct.FgResult, error)),
+		fnVer:        fnVer.(func(interface{}) string),
+		fnSimilarity: fnSim.(func([]float32, []float32) (float64, error)),
+	}
+}
+
+// Init impl
+func (t *HumanTracker) Init() bool {
+	if t.batchSize != 1 {
+		logo.Errorln("ONLY SUPPORT BATCH SIZE = 1")
+		return false
+	}
+	gpu := t.gpu
+	if gpu == -1 {
+		gpu = gogpu.ValidGPU(2048)
+	}
+	h := t.fnInit(gpu, t.batchSize, t.flag)
+	logo.Infoln("HumanTrack USE GPU: ", gpu)
+
+	if h == nil {
+		logo.Errorln("CREATE HumanTrack DETECTOR ERROR")
+		return false
+	}
+
+	t.handle = h
+	return true
+}
+
+// Run impl
+func (t *HumanTracker) Run(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) {
+	tm := time.Now()
+	sc := 0
+
+	for {
+		select {
+		case <-ctx.Done():
+			return
+		default:
+			rMsg := <-in
+			if !validRemoteMessage(rMsg, typ) {
+				ejectResult(nil, rMsg, out)
+				continue
+			}
+
+			i := unpackImage(rMsg, typ)
+			if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 {
+				ejectResult(nil, rMsg, out)
+				continue
+			}
+
+			imgW, imgH := int(i.Width), int(i.Height)
+
+			// var images []sdkstruct.SDKImage
+			// img := sdkstruct.SDKImage{
+			// 	Data:    i.Data,
+			// 	Width:   imgW,
+			// 	Height:  imgH,
+			// 	Channel: 3,
+			// }
+			// images = append(images, img)
+			res := t.fnRun(t.handle, i.Data, imgW, imgH, 3)
+			if res != nil {
+				ejectResult(nil, rMsg, out)
+				continue
+			}
+
+			hr := convert2ProtoHumanTrackResult(res)
+			result := protomsg.HumanTrackResult{Result: hr[0]}
+			data, err := proto.Marshal(&result)
+			if err != nil {
+				logo.Errorln("HUMAN TRACKER MARSHAL PROTO PLATE IDS ERROR", err)
+				data = nil
+			}
+			ejectResult(data, rMsg, out)
+
+			/////////////////////////////////////
+			sc++
+			if sc == 25 {
+				logo.Infoln("HUMAN TRACKER RUN 25 FRAME USE TIME: ", time.Since(tm))
+				sc = 0
+				tm = time.Now()
+			}
+
+			if time.Since(tm) > time.Second {
+				logo.Infof("HUMAN TRACKER RUN %d FRAME USE TIME: %v", sc, time.Since(tm))
+				sc = 0
+				tm = time.Now()
+			}
+
+		}
+	}
+}
+
+// message HumanTrack {
+//     Rect rcHuman = 1;
+// 	float confidence = 2;
+// 	int32 x = 3;
+// 	int32 y = 4;
+// 	int32 id = 5;
+// 	repeated float feature = 6;
+// }
+
+// message HumanTrackResult {
+//     repeated HumanTrack result = 1;
+// }
+
+func convert2ProtoHumanTrackResult(obj []sdkstruct.FgResult) [][]*protomsg.HumanTrack {
+	ret := [][]*protomsg.HumanTrack{}
+	for _, v := range obj {
+		res := []*protomsg.HumanTrack{}
+		for i := 0; i < int(v.FgNum); i++ {
+			r := v.Fginfo[i]
+
+			rect := protomsg.Rect{
+				Left:   r.Left,
+				Right:  r.Right,
+				Top:    r.Top,
+				Bottom: r.Bottom,
+			}
+			pr := &protomsg.HumanTrack{
+				RcHuman:    &rect,
+				Confidence: r.Confidence,
+				X:          r.X,
+				Y:          r.Y,
+				Id:         r.ID,
+				Feature:    r.Feature[:],
+			}
+			res = append(res, pr)
+		}
+		ret = append(ret, res)
+	}
+	return ret
+}

--
Gitblit v1.8.0