From 82e7baf2276f4038705a83c0c5a2cb18828791e5 Mon Sep 17 00:00:00 2001
From: sunty <suntianyu0923@163.com>
Date: 星期二, 30 七月 2019 11:42:54 +0800
Subject: [PATCH] fix taglist
---
service/FaceSdkService.go | 204 +++++++++++++++++++++++++++++++--------------------
1 files changed, 124 insertions(+), 80 deletions(-)
diff --git a/service/FaceSdkService.go b/service/FaceSdkService.go
index 58b5cf2..43a4101 100644
--- a/service/FaceSdkService.go
+++ b/service/FaceSdkService.go
@@ -3,37 +3,61 @@
import (
"basic.com/pubsub/protomsg.git"
"basic.com/valib/deliver.git"
- "encoding/base64"
- "fmt"
"github.com/gogo/protobuf/proto"
"github.com/pierrec/lz4"
"github.com/pkg/errors"
"github.com/satori/go.uuid"
"gocv.io/x/gocv"
- "mime/multipart"
"sync"
"time"
+ "webserver/extend/logger"
+ "webserver/extend/util"
)
type FaceSdkService struct {
- File multipart.File
- Id string
+ File []byte
+ Id int64
+ Result []*protomsg.ResultFaceDetect
+ DeadTime time.Duration
}
const (
Ipc_Push_Ext = "_2.ipc"
Ipc_Pull_Ext = "_1.ipc"
Ipc_Url_Pre = "ipc:///tmp///"
+ faceExtractWebCID = "virtual-face-extract-web-camera-id"
Virtual_FaceTaskId = "92496BDF-2BFA-98F2-62E8-96DD9866ABD2"
Virtual_FaceSdkId = "virtual-faceextract-sdk-pull"
Url_Service_PUSH = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Push_Ext
Url_Service_PULL = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Pull_Ext
)
-func NewFaceSdkService(file multipart.File) FaceSdkService{
+func GetFaceFeaFromSdk(fileBytes []byte,deadTime time.Duration) ([]*protomsg.ResultFaceDetect,error,*protomsg.Image){
+ s := NewFaceSdkService(fileBytes, deadTime)
+ i, err := s.ReadFromUploadImg()
+ if err !=nil{
+ logger.Debug("readFromUploadImg err:",err)
+ return nil,err,i
+ }
+ bc, err := ImgCompress(i)
+ if err !=nil {
+ logger.Debug("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
+ }
+}
+
+func NewFaceSdkService(fileBytes []byte, deadTime time.Duration) FaceSdkService{
return FaceSdkService{
- File:file,
- Id:uuid.NewV4().String(),
+ File:fileBytes,
+ Id:time.Now().UnixNano(),
+ DeadTime:deadTime,
}
}
@@ -46,11 +70,11 @@
i := readTestImgFile()
- fmt.Printf("width:%d,height:%d,data.length:%d,timestamp:%s,id:%d\n",i.Width,i.Height,len(i.Data),i.Timestamp,i.Id)
+ logger.Debug("width:%d,height:%d,data.length:%d,timestamp:%s,id:%d\n",i.Width,i.Height,len(i.Data),i.Timestamp,i.Id)
bc, err := ImgCompress(&i)
if err !=nil {
- fmt.Println("image is not compressible")
+ logger.Debug("image is not compressible")
} else {
var s FaceSdkService
s.PushImgMsg(bc)
@@ -58,20 +82,21 @@
}
func (s *FaceSdkService) ReadFromUploadImg() (*protomsg.Image,error){
- defer s.File.Close()
- imgB := make([]byte,0)
- if _, err := s.File.Read(imgB);err !=nil{
- fmt.Println("File.Read err:",err)
- return nil,err
- }
- picMat, err := gocv.IMDecode(imgB, gocv.IMReadColor)
+ //defer (*(s.File)).Close()
+ //imgB, err := ioutil.ReadAll(*(s.File))
+ //if err !=nil{
+ // logger.Debug("File.Read err:",err)
+ // return nil,err
+ //}
+
+ picMat, err := gocv.IMDecode(s.File, gocv.IMReadColor)
if err !=nil {
- fmt.Println("gocv.IMDecode err:",err)
+ logger.Debug("gocv.IMDecode err:",err)
return nil,err
}
defer picMat.Close()
if picMat.Empty() {
- fmt.Println("file not exist")
+ logger.Debug("file not exist")
return nil,errors.New("picMat is empty")
}
height := int32(picMat.Rows())
@@ -85,25 +110,25 @@
Height: height,
Timestamp: formatTimeStr,
Data: data,
- Id: timeUnix,
- Cid:s.Id,
+ Id: s.Id,
+ Cid: faceExtractWebCID,
},nil
}
func ImgCompress(i *protomsg.Image) ([]byte,error){
if b, err := proto.Marshal(i); err != nil {
- fmt.Println("protoImage marshal err")
+ logger.Debug("protoImage marshal err")
return nil,err
} else {
bc := make([]byte, len(b))
ht := make([]int, 64<<10)
n, err := lz4.CompressBlock(b, bc, ht)
if err != nil {
- fmt.Println(err)
+ logger.Debug(err)
return nil,err
}
if n >= len(b) {
- fmt.Println("image is not compressible")
+ logger.Debug("image is not compressible")
return nil,errors.New("compressed len is 0")
}
bc = bc[:n]
@@ -111,33 +136,27 @@
}
}
-func (s *FaceSdkService) GetFaceFea() (feas []*protomsg.ResultFaceExtCom,err error){
+func (s *FaceSdkService) GetFaceFea(){
var wg sync.WaitGroup
wg.Add(1)
- ch := make(chan []*protomsg.ResultFaceExtCom,0)
- go func() {
+ ticker := time.NewTicker(s.DeadTime)
+ go func(ticker *time.Ticker, s *FaceSdkService) {
+ defer ticker.Stop()
+ defer wg.Done()
+
for {
select {
- case <-time.Tick(time.Second*10):
- ch <- nil
- wg.Done()
+ case <-ticker.C:
return
default:
- if feas,ok := resultMap[s.Id];ok {
- fmt.Println("faceFea got!!!")
- ch <- feas
+ if faces,ok := resultMap.Get(s.Id);ok {
+ s.Result = faces
return
}
}
}
- }()
+ }(ticker, s)
wg.Wait()
- msg := <- ch
- if msg != nil {
- return msg,nil
- } else {
- return msg,errors.New("no fea")
- }
}
func readTestImgFile() protomsg.Image{
@@ -151,7 +170,7 @@
defer picMat.Close()
if picMat.Empty() {
- fmt.Println("file not exist")
+ logger.Debug("file not exist")
return i
}
height := int32(picMat.Rows())
@@ -169,7 +188,7 @@
Id: timeUnix,
}
i.Cid = uuid.NewV4().String() //鏁版嵁鍞竴id
- fmt.Println("gocv read img completed")
+ logger.Debug("gocv read img completed")
return i
}
@@ -177,14 +196,36 @@
imgPushChan <- is
}
-var resultMap map[string][]*protomsg.ResultFaceExtCom
+type FeaResult struct {
+ FaceM map[int64][]*protomsg.ResultFaceDetect
+ Lock sync.Mutex
+}
+
+func (f *FeaResult) Write(id int64,faceDetectResult []*protomsg.ResultFaceDetect){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ f.FaceM[id] = faceDetectResult
+}
+
+func (f *FeaResult) Get(id int64) ([]*protomsg.ResultFaceDetect,bool){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ coms,ok := f.FaceM[id]
+ return coms,ok
+}
+
+func (f *FeaResult) Delete(id int64){
+ f.Lock.Lock()
+ defer f.Lock.Unlock()
+ delete(f.FaceM,id)
+}
+
+var resultMap = FeaResult{}
func InitService() {
- fmt.Println("service init!")
+ logger.Debug("service init!")
imgPushChan = make(chan []byte)
-
- resultMap = make(map[string][]*protomsg.ResultFaceExtCom,0)
-
+ resultMap.FaceM = make(map[int64][]*protomsg.ResultFaceDetect,0)
client_push = deliver.NewClient(deliver.PushPull, Url_Service_PUSH)
client_pull = deliver.NewClient(deliver.PushPull, Url_Service_PULL)
defer func() {
@@ -200,13 +241,13 @@
for {
select {
case d := <-imgPushChan:
- fmt.Println("imgPushChan in")
+ logger.Debug("imgPushChan in")
err := client_push.Send(d)
if err != nil {
- fmt.Println("img Send err:", err)
+ logger.Debug("img Send err:", err)
}
default:
- //fmt.Println("no img in")
+ //logger.Debug("no img in")
}
}
}
@@ -215,45 +256,48 @@
for {
resultBytes, err := client_pull.Recv()
if err != nil {
- //fmt.Println("pull err:", err)
+ //logger.Debug("pull err:", err)
continue
}
rMsg := protomsg.SdkMessage{}
if err := proto.Unmarshal(resultBytes, &rMsg); err == nil {
- fmt.Println("received MSG:", rMsg.Cid)
- perId := rMsg.Cid //鏁版嵁id
+ logger.Debug("received MSG:", rMsg.Cid)
+ i := protomsg.Image{}
+ bdata, err := util.UnCompress(rMsg.Data)
+ if err !=nil {
+ logger.Debug("uncompress err:",err)
+ continue
+ }
+ err = proto.Unmarshal(bdata, &i)
+ if err !=nil {
+ continue
+ }
+ perId := i.Id //鏁版嵁id
if rMsg.Tasklab != nil && rMsg.Tasklab.Taskid == Virtual_FaceTaskId {
sdkInfos := rMsg.Tasklab.Sdkinfos
- fmt.Println("Len(sdkInfos)=",len(sdkInfos))
+ logger.Debug("Len(sdkInfos)=",len(sdkInfos))
for _,swt :=range sdkInfos{
+ //浜鸿劯妫�娴嬬殑缁撴灉
if swt.Sdktype =="FaceDetect"{
- fmt.Println("浜鸿劯妫�娴嬬粨鏋�")
- var pfp protomsg.ParamFacePos
- err := proto.Unmarshal(swt.Sdkdata, &pfp)
- if err !=nil {
- fmt.Println("faceDetect result unmarshal err:",err)
- } else {
- for _,face :=range pfp.Faces{
- fmt.Println("FacePos:",face.Pos)
- fmt.Println("ThftResult:",face.Result)
- }
- }
- }
- if swt.Sdktype == "FaceExtract"{
- var pff protomsg.ParamFaceFeature
- if err := proto.Unmarshal(swt.Sdkdata, &pff);err !=nil{
- //fmt.Println("ParamFaceFeature unmarshal err:",err)
- } else {
- fmt.Println("鐩爣鏁帮細",len(pff.ExtComp))
- if len(pff.ExtComp) >0 {
- resultMap[rMsg.Cid] = pff.ExtComp
-
- for _,fea :=range pff.ExtComp{
- base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
- fmt.Println("perId:",perId)
- fmt.Println("faceFeature:",base64Fea)
+ logger.Debug("浜鸿劯妫�娴嬬粨鏋滈暱搴︼細",len(swt.Sdkdata))
+ if len(swt.Sdkdata)>1{
+ var pfp protomsg.ParamFacePos
+ err := proto.Unmarshal(swt.Sdkdata, &pfp)
+ if err !=nil {
+ logger.Debug("faceDetect result unmarshal err:",err)
+ } else {
+ logger.Debug("妫�娴嬩汉鑴告暟:",len(pfp.Faces))
+ if len(pfp.Faces)>0{
+ resultMap.Write(perId,pfp.Faces)
}
+ //for _,face :=range pfp.Faces{
+ //logger.Debug("FacePos:",face.Pos)
+ //logger.Debug("ThftResult:",face.Result)
+ // base64Fea := base64.StdEncoding.EncodeToString(face.Feats)
+ // logger.Debug("perId:",perId)
+ // logger.Debug("faceFeature:",base64Fea)
+ //}
}
}
break
@@ -261,7 +305,7 @@
}
}
} else {
- fmt.Println("recv msg Err:", err)
+ logger.Debug("recv msg Err:", err)
}
}
--
Gitblit v1.8.0