From 7858ad214af2b27e165653ca5b9bd964b487d20d Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 17 十二月 2019 10:44:16 +0800
Subject: [PATCH] udpate

---
 work/sdk/plateIDdetect.go |   92 +++++++++++++-----------------
 work/sdk/ydetect.go       |   11 ---
 work/sdk/yolotrack.go     |   72 -----------------------
 3 files changed, 43 insertions(+), 132 deletions(-)

diff --git a/work/sdk/plateIDdetect.go b/work/sdk/plateIDdetect.go
index 3c355be..d5e5cf0 100644
--- a/work/sdk/plateIDdetect.go
+++ b/work/sdk/plateIDdetect.go
@@ -4,7 +4,6 @@
 	"analysis/logo"
 	"analysis/work"
 	"context"
-	"time"
 
 	"basic.com/valib/gosdk.git"
 )
@@ -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,22 @@
 			cfgCloud:   cfg,
 			licSrvPath: licSrv,
 			modelPath:  model,
+			list:       NewLockList(6),
 			fn:         cloud,
 		}
 	}
 	return nil
+}
+
+// Free free
+func (d *PlateIDDetector) Free() {
+	if d.config != nil {
+		gosdk.FreePlateIdDetector()
+	} else if d.cfgCloud != nil {
+		gosdk.FreePlateIDCloudSDKDetector()
+	} else {
+		gosdk.FreeVehicleITSDetector()
+	}
 }
 
 // Init impl
@@ -89,59 +103,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 9b641c9..3a95a02 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 5f864cf..1ae08e2 100644
--- a/work/sdk/yolotrack.go
+++ b/work/sdk/yolotrack.go
@@ -4,7 +4,6 @@
 	"analysis/logo"
 	"analysis/work"
 	"context"
-	"time"
 
 	"basic.com/pubsub/protomsg.git"
 	"basic.com/valib/gosdk.git"
@@ -13,76 +12,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() { gosdk.Free() })
 }
 
 func (y *YoloDetect) track(rMsg work.MsgRS, out chan<- work.MsgRS, typ string) {

--
Gitblit v1.8.0