package proc
|
|
import (
|
"analysis/logo"
|
"analysis/util"
|
"analysis/work"
|
"analysis/work/sdk"
|
"context"
|
)
|
|
type infoSDK struct {
|
name string
|
ipc string
|
s sdk.Engine
|
shm bool
|
}
|
|
var (
|
mapFunc = make(map[string]sdk.Engine)
|
infos []infoSDK
|
fn func([]byte, bool)
|
)
|
|
const (
|
postPull = `_1`
|
postPush = `_2`
|
|
reservedGMem = 512
|
yoloGMem = 2048
|
faceGMem = 1024
|
faceMustGPU0 = 0
|
|
cfg = "./data/yolo/cfg/yolov3.cfg"
|
weights = "./data/yolo/yolov3.weights"
|
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"
|
)
|
|
var (
|
SDK = []string{
|
YDetect,
|
FDetect,
|
FCompare,
|
PlateID,
|
// FtTract,
|
// FtOnly,
|
}
|
)
|
|
func prepare(name string, gpu int) (string, bool) {
|
return initSDK(name, gpu)
|
}
|
|
func initSDK(name string, gpu int) (string, bool) {
|
|
sdkType := name
|
|
if s, f := util.FindStringInArray(sdkType, SDK); f {
|
sdkType = s
|
} else {
|
logo.Errorln("THERE IS NO THIS SDK TYPE: ", sdkType)
|
return sdkType, false
|
}
|
|
thrds := util.SFI.DetectThrd
|
if thrds < util.SFI.PropThrd {
|
thrds = util.SFI.PropThrd
|
}
|
if thrds < util.SFI.ExtractThrd {
|
thrds = util.SFI.ExtractThrd
|
}
|
|
logo.Infoln("PASS GPU INDEX: ", gpu)
|
|
var e sdk.Engine
|
ret := true
|
|
if sdkType == FDetect {
|
e, ret = createFaceDetect(gpu, thrds, util.SFI.DetectNum, util.SFI.DetectAngle, util.SFI.TrackInterval, util.SFI.SampleSize)
|
|
} else if sdkType == YDetect {
|
e, ret = createYolo(gpu)
|
|
} else if sdkType == FtTract {
|
e, ret = createFaceTrack(gpu, thrds, util.SFI.DetectNum, util.SFI.DetectAngle, util.SFI.TrackInterval, util.SFI.SampleSize)
|
|
} else if sdkType == FCompare {
|
e = sdk.NewEFExtract(100)
|
} else if sdkType == PlateID {
|
e = sdk.NewPlateIDDetector(util.SCI.LicenseServerPath, util.SCI.Model, util.SCI.MaxImageWidth, util.SCI.MaxImageHeight)
|
}
|
|
if ret {
|
mapFunc[sdkType] = e
|
}
|
return sdkType, ret
|
}
|
|
func build(fname, id string, shm bool) {
|
f, ok := mapFunc[fname]
|
if !ok {
|
logo.Errorln("sdk has no this func : ", fname)
|
return
|
}
|
|
if flag := f.Init(); !flag {
|
logo.Errorln("create sdk : ", fname, " error")
|
return
|
}
|
|
s := infoSDK{fname, id, f, shm}
|
infos = append(infos, s)
|
}
|
|
func runAll(ctx context.Context) {
|
|
rule := work.NewToRule(30)
|
url := util.ToRuleIPC
|
go rule.Run(ctx, url)
|
|
fn = func(data []byte, valid bool) {
|
if rule != nil {
|
rule.Push(data, valid)
|
}
|
}
|
|
for _, v := range infos {
|
go run(ctx, v.s, v.name, v.ipc, v.shm)
|
}
|
}
|
|
func run(ctx context.Context, s sdk.Engine, fname, id string, shm bool) {
|
chRcv := make(chan work.MsgRS)
|
chSnd := make(chan work.MsgRS)
|
|
ipcRcv := util.GetIpcAddress(shm, id+postPull)
|
recv := work.NewReciever(ipcRcv, chRcv, shm)
|
logo.Infoln("RECV IPC: ", ipcRcv)
|
go recv.Run(ctx)
|
|
ipcSnd := util.GetIpcAddress(shm, id+postPush)
|
snd := work.NewSender(ipcSnd, chSnd, shm)
|
snd.ApplyCallbackFunc(fn)
|
logo.Infoln("SND IPC: ", ipcSnd)
|
go snd.Run(ctx)
|
|
s.Run(ctx, chRcv, chSnd, fname)
|
}
|
|
////////////////////////////////////////////////////////////////
|
////////////// test
|
////////////////////////////////////////////////////////////////
|
// single run
|
func runSDK(ctx context.Context, fname, id string, shm bool) {
|
|
f, ok := mapFunc[fname]
|
if !ok {
|
logo.Errorln("sdk has no this func : ", fname)
|
return
|
}
|
|
if flag := f.Init(); !flag {
|
logo.Errorln("create sdk : ", fname, " error")
|
return
|
}
|
|
chRcv := make(chan work.MsgRS)
|
chSnd := make(chan work.MsgRS)
|
|
ipcS := `ipc:///tmp/`
|
|
ipcRcv := ipcS + id + postPull
|
recv := work.NewReciever(ipcRcv, chRcv, shm)
|
logo.Infoln("\nrecv ipc: ", ipcRcv)
|
go recv.Run(ctx)
|
|
ipcSnd := ipcS + id + postPush
|
snd := work.NewSender(ipcSnd, chSnd, shm)
|
logo.Infoln("\nsnd ipc: ", ipcSnd)
|
go snd.Run(ctx)
|
|
f.Run(ctx, chRcv, chSnd, fname)
|
|
}
|