From 4a745a94f3eee82624e1b211b48920c0b7fcd6d2 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 17 十二月 2019 10:30:03 +0800 Subject: [PATCH] udpate --- work/sdk/plateIDdetect.go | 91 +++++++---------- work/sdk/ydetect.go | 11 - work/sdk/yolotrack.go | 72 -------------- work/sdk/flow.go | 117 +++++++++++++++++++++++ 4 files changed, 159 insertions(+), 132 deletions(-) diff --git a/work/sdk/flow.go b/work/sdk/flow.go new file mode 100644 index 0000000..c4e8019 --- /dev/null +++ b/work/sdk/flow.go @@ -0,0 +1,117 @@ +package sdk + +import ( + "analysis/logo" + "analysis/work" + "container/list" + "context" + "sync" + "time" +) + +// LockList list +type LockList struct { + cache *list.List + cv *sync.Cond + cond bool + size int +} + +// NewLockList new +func NewLockList(size int) *LockList { + return &LockList{ + cache: list.New(), + cv: sync.NewCond(&sync.Mutex{}), + cond: false, + size: size, + } +} + +// Push push +func (l *LockList) Push(v interface{}) { + l.cv.L.Lock() + l.cache.PushBack(v) + + for l.cache.Len() > l.size { + l.cache.Remove(l.cache.Front()) + } + + l.cond = true + l.cv.Signal() + l.cv.L.Unlock() +} + +// Pop pop +func (l *LockList) Pop() interface{} { + l.cv.L.Lock() + + for !l.cond { + l.cv.Wait() + } + + elem := l.cache.Front().Value + + l.cache.Remove(l.cache.Front()) + l.cond = false + l.cv.L.Unlock() + + return elem +} + +///////////////////////////////////////////////////////////////// + +func flowSimpleWork(ctx context.Context, out chan<- work.MsgRS, typ string, + fnConsume func() interface{}, fnRun func(work.MsgRS, chan<- work.MsgRS, string)) { + + tm := time.Now() + sc := 0 + + for { + select { + case <-ctx.Done(): + return + default: + + rMsg := fnConsume().(work.MsgRS) + + fnRun(rMsg, out, typ) + + sc++ + if sc == 25 { + logo.Infoln(typ, " RUN 25 FRAME USE TIME: ", time.Since(tm)) + sc = 0 + tm = time.Now() + } + if time.Since(tm) > time.Second { + logo.Infof(typ, " RUN %d FRAME USE TIME: %v", sc, time.Since(tm)) + sc = 0 + tm = time.Now() + } + } + } + +} + +// FlowSimple wrap +func FlowSimple(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string, + fnProduce func(interface{}), fnConsume func() interface{}, + fnRun func(work.MsgRS, chan<- work.MsgRS, string), fnClose func()) { + + go flowSimpleWork(ctx, out, typ, fnConsume, fnRun) + + for { + select { + case <-ctx.Done(): + fnClose() + return + default: + rMsg := <-in + if !validRemoteMessage(rMsg, typ) { + logo.Errorln(typ, " validremotemessage invalid") + ejectResult(nil, rMsg, out) + continue + } + fnProduce(rMsg) + } + } +} diff --git a/work/sdk/plateIDdetect.go b/work/sdk/plateIDdetect.go index 0fce158..520d66a 100644 --- a/work/sdk/plateIDdetect.go +++ b/work/sdk/plateIDdetect.go @@ -4,7 +4,6 @@ "analysis/logo" "analysis/work" "context" - "time" "analysis/gosdk" ) @@ -15,6 +14,7 @@ cfgCloud *gosdk.CPlateIDCloudCfg licSrvPath string modelPath string + list *LockList fn func(*gosdk.SDKImage, *gosdk.CRECT, int, int, *work.MsgRS, chan<- work.MsgRS) } @@ -31,6 +31,7 @@ return &PlateIDDetector{ licSrvPath: licSrv, modelPath: model, + list: NewLockList(6), fn: vehicle, } } @@ -46,6 +47,7 @@ cfgCloud: nil, licSrvPath: licSrv, modelPath: "", + list: NewLockList(6), fn: eparking, } @@ -60,10 +62,21 @@ cfgCloud: cfg, licSrvPath: licSrv, modelPath: model, + list: NewLockList(6), fn: cloud, } } return nil +} + +func (d *PlateIDDetector) Free() { + if d.config != nil { + gosdk.FreePlateIdDetector() + } else if d.cfgCloud != nil { + gosdk.FreePlateIDCloudSDKDetector() + } else { + gosdk.FreeVehicleITSDetector() + } } // Init impl @@ -89,59 +102,33 @@ return true } +func (d *PlateIDDetector) detect(rMsg work.MsgRS, out chan<- work.MsgRS, typ string) { + i := unpackImage(rMsg, typ) + if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 { + ejectResult(nil, rMsg, out) + return + } + + imgW, imgH := int(i.Width), int(i.Height) + img := gosdk.SDKImage{Data: i.Data, Width: imgW, Height: imgH} + + rcDetect := gosdk.CRECT{ + Left: 0, + Top: 0, + Right: (int32)(imgW), + Bottom: (int32)(imgH), + } + + mW, mH := 4096, 2160 + if d.config != nil { + mW, mH = int(d.config.MaxImageWidth), int(d.config.MaxImageHeight) + } + d.fn(&img, &rcDetect, mW, mH, &rMsg, out) +} + // Run impl func (d *PlateIDDetector) 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) - img := gosdk.SDKImage{Data: i.Data, Width: imgW, Height: imgH} - - rcDetect := gosdk.CRECT{ - Left: 0, - Top: 0, - Right: (int32)(imgW), - Bottom: (int32)(imgH), - } - - mW, mH := 4096, 2160 - if d.config != nil { - mW, mH = int(d.config.MaxImageWidth), int(d.config.MaxImageHeight) - } - d.fn(&img, &rcDetect, mW, mH, &rMsg, out) - - sc++ - if sc == 25 { - logo.Infoln("PLATE ID DETECTOR RUN 25 FRAME USE TIME: ", time.Since(tm)) - sc = 0 - tm = time.Now() - } - - if time.Since(tm) > time.Second { - logo.Infof("PLATE ID DETECTOR RUN %d FRAME USE TIME: %v", sc, time.Since(tm)) - sc = 0 - tm = time.Now() - } - - } - } + FlowSimple(ctx, in, out, typ, d.list.Push, d.list.Pop, d.detect, func() { d.Free() }) } func eparking(img *gosdk.SDKImage, rc *gosdk.CRECT, mW, mH int, rMsg *work.MsgRS, out chan<- work.MsgRS) { diff --git a/work/sdk/ydetect.go b/work/sdk/ydetect.go index 144ae0f..bc56bcc 100644 --- a/work/sdk/ydetect.go +++ b/work/sdk/ydetect.go @@ -3,9 +3,7 @@ import ( "analysis/logo" "analysis/work" - "container/list" "context" - "sync" "basic.com/valib/gogpu.git" @@ -27,9 +25,7 @@ tracker map[string]*trackInfo - cache *list.List - cv *sync.Cond - cond bool + list *LockList } // NewYDetectWithTrack with track @@ -39,9 +35,7 @@ cfg: cfg, weights: weights, name: name, - cache: list.New(), - cv: sync.NewCond(&sync.Mutex{}), - cond: false, + list: NewLockList(6), } } @@ -67,5 +61,4 @@ // Run impl interface func (y *YoloDetect) Run(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) { y.detectTrack(ctx, in, out, typ) - } diff --git a/work/sdk/yolotrack.go b/work/sdk/yolotrack.go index 29058d2..34a468d 100644 --- a/work/sdk/yolotrack.go +++ b/work/sdk/yolotrack.go @@ -4,7 +4,6 @@ "analysis/logo" "analysis/work" "context" - "time" "analysis/gosdk" @@ -14,76 +13,7 @@ func (y *YoloDetect) detectTrack(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) { y.tracker = make(map[string]*trackInfo) - go y.work(ctx, out, typ) - - for { - select { - case <-ctx.Done(): - return - default: - rMsg := <-in - if !validRemoteMessage(rMsg, typ) { - logo.Errorln("yolo validremotemessage invalid") - ejectResult(nil, rMsg, out) - continue - } - y.push(rMsg) - } - } -} - -func (y *YoloDetect) push(data work.MsgRS) { - y.cv.L.Lock() - y.cache.PushBack(data) - if y.cache.Len() > 12 { - for i := 0; i < y.cache.Len(); { - y.cache.Remove(y.cache.Front()) - i = i + 2 - } - } - // logo.Infof("push to cache count : %d\n", t.cache.Len()) - y.cond = true - y.cv.Signal() - y.cv.L.Unlock() -} - -func (y *YoloDetect) work(ctx context.Context, out chan<- work.MsgRS, typ string) { - tm := time.Now() - sc := 0 - - for { - select { - case <-ctx.Done(): - return - default: - - y.cv.L.Lock() - - for !y.cond { - y.cv.Wait() - } - - rMsg := y.cache.Front().Value.(work.MsgRS) - - y.track(rMsg, out, typ) - y.cache.Remove(y.cache.Front()) - y.cond = false - y.cv.L.Unlock() - - sc++ - if sc == 25 { - logo.Infoln("YOLO RUN 25 FRAME USE TIME: ", time.Since(tm)) - sc = 0 - tm = time.Now() - } - if time.Since(tm) > time.Second { - logo.Infof("YOLO RUN %d FRAME USE TIME: %v", sc, time.Since(tm)) - sc = 0 - tm = time.Now() - } - } - } - + FlowSimple(ctx, in, out, typ, y.list.Push, y.list.Pop, y.track, func() {}) } func (y *YoloDetect) track(rMsg work.MsgRS, out chan<- work.MsgRS, typ string) { -- Gitblit v1.8.0