From 76ee1245a5be00553a4971035c04fc057177be97 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期一, 08 七月 2019 14:03:33 +0800
Subject: [PATCH] get faceFea from FaceDetect sdk
---
controllers/fileController.go | 58 ++++----
extend/logger/logger.go | 216 ++++++++++++++++++++++++++++++
service/FaceSdkService.go | 129 +++++++++--------
3 files changed, 313 insertions(+), 90 deletions(-)
diff --git a/controllers/fileController.go b/controllers/fileController.go
index 868bd7a..3b641e0 100644
--- a/controllers/fileController.go
+++ b/controllers/fileController.go
@@ -103,13 +103,13 @@
//灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰�
fileBytes, _ := ioutil.ReadAll(file)
- faceExtArr, err, pI := getFaceFeaFromSdk(fileBytes)
- if err ==nil && len(faceExtArr) >0 {
+ faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes)
+ if err ==nil && len(faceArr) >0 {
var faceBase64= ""
var field = ""
var rcFace *protomsg.Rect
- for _,r := range faceExtArr {
- rcFace = r.Pos.Pos.RcFace
+ for _,r := range faceArr {
+ rcFace = r.Pos.RcFace
faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰�
break
}
@@ -150,15 +150,15 @@
//灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰�
var faceBase64=""
- faceExtArr, err,pI := getFaceFeaFromSdk(fileBytes)
- if faceExtArr ==nil {
+ faceArr, err,pI := service.GetFaceFeaFromSdk(fileBytes)
+ if faceArr ==nil {
return "",nil,errors.New("NotFeatureFindError")
}
var rcFace *protomsg.Rect
- if err ==nil && len(faceExtArr) >0 {
- for _,r := range faceExtArr {
+ if err ==nil && len(faceArr) >0 {
+ for _,r := range faceArr {
//鎷垮埌浜鸿劯鐨勫潗鏍�
- rcFace = r.Pos.Pos.RcFace
+ rcFace = r.Pos.RcFace
faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰�
break
@@ -192,26 +192,26 @@
}
-func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){
- s := service.NewFaceSdkService(fileBytes)
- i, err := s.ReadFromUploadImg()
- if err !=nil{
- fmt.Println("readFromUploadImg err:",err)
- return nil,err,i
- }
- bc, err := service.ImgCompress(i)
- if err !=nil {
- fmt.Println("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 getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){
+// s := service.NewFaceSdkService(fileBytes)
+// i, err := s.ReadFromUploadImg()
+// if err !=nil{
+// fmt.Println("readFromUploadImg err:",err)
+// return nil,err,i
+// }
+// bc, err := service.ImgCompress(i)
+// if err !=nil {
+// fmt.Println("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
+// }
+//}
/**涓婁紶鏂规硶**/
diff --git a/extend/logger/logger.go b/extend/logger/logger.go
index 90c66f6..73b919c 100644
--- a/extend/logger/logger.go
+++ b/extend/logger/logger.go
@@ -1 +1,217 @@
package logger
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "os/exec"
+ "strings"
+ "time"
+)
+
+const (
+ PanicLevel int = iota
+ FatalLevel
+ ErrorLevel
+ WarnLevel
+ InfoLevel
+ DebugLevel
+)
+
+const (
+ color_red = uint8(iota + 91)
+ color_green // 缁�
+ color_yellow // 榛�
+ color_blue // 钃�
+ color_magenta // 娲嬬孩
+)
+
+const (
+ fatalPrefix = "[FATAL] "
+ errorPrefix = "[ERROR] "
+ warnPrefix = "[WARN] "
+ infoPrefix = "[INFO] "
+ debugPrefix = "[DEBUG] "
+)
+
+const (
+ ByDay int = iota
+ ByWeek
+ ByMonth
+ BySize
+)
+
+type LogFile struct {
+ level int // 鏃ュ織绛夌骇
+ saveMode int // 淇濆瓨妯″紡
+ saveDays int // 鏃ュ織淇濆瓨澶╂暟
+ logTime int64 //
+ fileName string // 鏃ュ織鏂囦欢鍚�
+ filesize int64 // 鏂囦欢澶у皬, 闇�瑕佽缃� saveMode 涓� BySize 鐢熸晥
+ fileFd *os.File
+}
+
+var logFile LogFile
+
+func init() {
+ logFile.saveMode = ByDay // 榛樿鎸夊ぉ淇濆瓨
+ logFile.saveDays = 15 // 榛樿淇濆瓨涓夊ぉ鐨�
+ logFile.level = ErrorLevel
+ logFile.filesize = 1024 * 1024 * 10 // 榛樿10M锛� 闇�瑕佽缃� saveMode 涓� BySize
+}
+
+func Config(logFolder string, level int) {
+ logFile.fileName = logFolder
+ logFile.level = level
+
+ log.SetOutput(logFile)
+ //log.SetFlags(log.Lmicroseconds | log.Lshortfile)
+ log.SetFlags(log.Ldate | log.Ltime)
+}
+func GetLogFile() (*LogFile) {
+ return &logFile
+}
+
+func SetLevel(level int) {
+ logFile.level = level
+}
+
+func SetSaveMode(saveMode int) {
+ logFile.saveMode = saveMode
+}
+
+func SetSaveDays(saveDays int) {
+ logFile.saveDays = saveDays
+}
+
+func SetSaveSize(saveSize int64) {
+ logFile.filesize = saveSize
+}
+
+func Debug(args ...interface{}) {
+ if logFile.level >= DebugLevel {
+ log.SetPrefix(blue(debugPrefix))
+ _ = log.Output(2, fmt.Sprintln(args...))
+ }
+}
+
+func Info(args ...interface{}) {
+ if logFile.level >= InfoLevel {
+ log.SetPrefix(green(infoPrefix))
+ _ = log.Output(2, fmt.Sprintln(args...))
+ }
+}
+
+func Warn(args ...interface{}) {
+ if logFile.level >= WarnLevel {
+ log.SetPrefix(magenta(warnPrefix))
+ _ = log.Output(2, fmt.Sprintln(args...))
+ }
+}
+
+func Error(args ...interface{}) {
+ if logFile.level >= ErrorLevel {
+ log.SetPrefix(red(errorPrefix))
+ _ = log.Output(2, fmt.Sprintln(args...))
+ }
+}
+
+func Fatal(args ...interface{}) {
+ if logFile.level >= FatalLevel {
+ log.SetPrefix(red(fatalPrefix))
+ _ = log.Output(2, fmt.Sprintln(args...))
+ }
+}
+
+func GetRedPrefix(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
+}
+
+func red(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
+}
+
+func green(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_green, s)
+}
+
+func yellow(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_yellow, s)
+}
+
+func blue(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_blue, s)
+}
+
+func magenta(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_magenta, s)
+}
+
+func (me LogFile) Write(buf []byte) (n int, err error) {
+ if me.fileName == "" {
+ fmt.Printf("consol: %s", buf)
+ return len(buf), nil
+ }
+
+ switch logFile.saveMode {
+ case BySize:
+ fileInfo, err := os.Stat(logFile.fileName)
+ if err != nil {
+ logFile.createLogFile()
+ logFile.logTime = time.Now().Unix()
+ }else {
+ filesize:= fileInfo.Size();
+ if logFile.fileFd == nil ||
+ filesize > logFile.filesize {
+ logFile.createLogFile()
+ logFile.logTime = time.Now().Unix()
+ }
+ }
+ default: // 榛樿鎸夊ぉ ByDay
+ if logFile.logTime+3600 < time.Now().Unix() {
+ logFile.createLogFile()
+ logFile.logTime = time.Now().Unix()
+ }
+ }
+
+ if logFile.fileFd == nil {
+ fmt.Printf("log fileFd is nil !\n")
+ return len(buf), nil
+ }
+
+ return logFile.fileFd.Write(buf)
+}
+
+func (me *LogFile) createLogFile() {
+ logdir := "./"
+ if index := strings.LastIndex(me.fileName, "/"); index != -1 {
+ logdir = me.fileName[0:index] + "/"
+ os.MkdirAll(me.fileName[0:index], os.ModePerm)
+ }
+
+ now := time.Now()
+ filename := fmt.Sprintf("%s_%04d%02d%02d",
+ me.fileName, now.Year(), now.Month(), now.Day())
+ if err := os.Rename(me.fileName, filename); err == nil {
+ go func() {
+ tarCmd := exec.Command("tar", "-zcf", filename+".tar.gz", filename, "--remove-files")
+ tarCmd.Run()
+
+ rmCmd := exec.Command("/bin/sh", "-c",
+ "find "+logdir+` -type f -mtime +` +string(logFile.saveDays)+ ` -exec rm {} \;`)
+ rmCmd.Run()
+ }()
+ }
+
+ for index := 0; index < 10; index++ {
+ if fd, err := os.OpenFile(me.fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeExclusive); nil == err {
+ me.fileFd.Sync()
+ me.fileFd.Close()
+ me.fileFd = fd
+ break
+ }else {
+ fmt.Println("Open logfile error! err: ", err.Error())
+ }
+ me.fileFd = nil
+ }
+}
\ No newline at end of file
diff --git a/service/FaceSdkService.go b/service/FaceSdkService.go
index 8275437..a3f0387 100644
--- a/service/FaceSdkService.go
+++ b/service/FaceSdkService.go
@@ -3,7 +3,6 @@
import (
"basic.com/pubsub/protomsg.git"
"basic.com/valib/deliver.git"
- "fmt"
"github.com/gogo/protobuf/proto"
"github.com/pierrec/lz4"
"github.com/pkg/errors"
@@ -11,12 +10,13 @@
"gocv.io/x/gocv"
"sync"
"time"
+ "webserver/extend/logger"
)
type FaceSdkService struct {
File []byte
Id string
- Result []*protomsg.ResultFaceExtCom
+ Result []*protomsg.ResultFaceDetect
}
const (
@@ -28,6 +28,27 @@
Url_Service_PUSH = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Push_Ext
Url_Service_PULL = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Pull_Ext
)
+
+func GetFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceDetect,error,*protomsg.Image){
+ s := NewFaceSdkService(fileBytes)
+ 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) FaceSdkService{
return FaceSdkService{
@@ -45,11 +66,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)
@@ -60,18 +81,18 @@
//defer (*(s.File)).Close()
//imgB, err := ioutil.ReadAll(*(s.File))
//if err !=nil{
- // fmt.Println("File.Read err:",err)
+ // 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())
@@ -92,18 +113,18 @@
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]
@@ -124,8 +145,8 @@
case <-ticker.C:
return
default:
- if feas,ok := resultMap.Get(s.Id);ok {
- s.Result = feas
+ if faces,ok := resultMap.Get(s.Id);ok {
+ s.Result = faces
return
}
}
@@ -145,7 +166,7 @@
defer picMat.Close()
if picMat.Empty() {
- fmt.Println("file not exist")
+ logger.Debug("file not exist")
return i
}
height := int32(picMat.Rows())
@@ -163,7 +184,7 @@
Id: timeUnix,
}
i.Cid = uuid.NewV4().String() //鏁版嵁鍞竴id
- fmt.Println("gocv read img completed")
+ logger.Debug("gocv read img completed")
return i
}
@@ -172,35 +193,35 @@
}
type FeaResult struct {
- FeaM map[string][]*protomsg.ResultFaceExtCom
+ FaceM map[string][]*protomsg.ResultFaceDetect
Lock sync.Mutex
}
-func (f *FeaResult) Write(id string,faceResult []*protomsg.ResultFaceExtCom){
+func (f *FeaResult) Write(id string,faceDetectResult []*protomsg.ResultFaceDetect){
f.Lock.Lock()
defer f.Lock.Unlock()
- f.FeaM[id] = faceResult
+ f.FaceM[id] = faceDetectResult
}
-func (f *FeaResult) Get(id string) ([]*protomsg.ResultFaceExtCom,bool){
+func (f *FeaResult) Get(id string) ([]*protomsg.ResultFaceDetect,bool){
f.Lock.Lock()
defer f.Lock.Unlock()
- coms,ok := f.FeaM[id]
+ coms,ok := f.FaceM[id]
return coms,ok
}
func (f *FeaResult) Delete(id string){
f.Lock.Lock()
defer f.Lock.Unlock()
- delete(f.FeaM,id)
+ delete(f.FaceM,id)
}
var resultMap = FeaResult{}
func InitService() {
- fmt.Println("service init!")
+ logger.Debug("service init!")
imgPushChan = make(chan []byte)
- resultMap.FeaM = make(map[string][]*protomsg.ResultFaceExtCom,0)
+ resultMap.FaceM = make(map[string][]*protomsg.ResultFaceDetect,0)
client_push = deliver.NewClient(deliver.PushPull, Url_Service_PUSH)
client_pull = deliver.NewClient(deliver.PushPull, Url_Service_PULL)
defer func() {
@@ -216,13 +237,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")
}
}
}
@@ -231,60 +252,46 @@
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)
+ logger.Debug("received MSG:", rMsg.Cid)
perId := rMsg.Cid //鏁版嵁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("浜鸿劯妫�娴嬬粨鏋滈暱搴︼細",len(swt.Sdkdata))
- // if len(swt.Sdkdata)>1{
- // 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"{
- fmt.Println("浜鸿劯鎻愬彇缁撴灉闀垮害:",len(swt.Sdkdata))
- if len(swt.Sdkdata) > 1{
- var pff protomsg.ParamFaceFeature
- if err := proto.Unmarshal(swt.Sdkdata, &pff);err !=nil{
- //fmt.Println("ParamFaceFeature unmarshal err:",err)
+ if swt.Sdktype =="FaceDetect"{
+ 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 {
- fmt.Println("鐩爣鏁帮細",len(pff.ExtComp))
- if len(pff.ExtComp) >0 {
- resultMap.Write(perId,pff.ExtComp)
-
- //for _,fea :=range pff.ExtComp{
- // base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
- // fmt.Println("perId:",perId)
- // fmt.Println("faceFeature:",base64Fea)
- //}
+ 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
}
+ break
}
}
}
} else {
- fmt.Println("recv msg Err:", err)
+ logger.Debug("recv msg Err:", err)
}
}
--
Gitblit v1.8.0