1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
| package sdk
|
| import (
| "analysis/logo"
| "analysis/work"
| "context"
| "sync"
|
| "basic.com/valib/gogpu.git"
| "basic.com/valib/gosdk.git"
| )
|
| type faceInfo struct {
| pos gosdk.CFacePos
| id uint64
| life int
| }
|
| type fTrackInfo struct {
| lastTrackInfos []faceInfo
| lastTrackID uint64
| }
|
| const MaxFaceDetectThreadNum = 32
|
| // EFDetect detect face
| type EFDetect struct {
| threads int
| iGPU int
|
| // track
| faceAngle int
| dftfacenum int
| dftinterval int
| sampleSize int
|
| // external track
| tracker map[string]*fTrackInfo
|
| ftrackChans map[string]chan work.MsgRS
| ftrackChannels map[string]int
| ftrackChanStats []bool
| chnLock sync.Mutex
| }
|
| // NewEFDetectWithTrack with track
| func NewEFDetectWithTrack(gi, thrds, faceNum, faceAngle, interval, samp int) *EFDetect {
| return &EFDetect{
| threads: thrds,
| faceAngle: faceAngle,
| ftrackChans: make(map[string]chan work.MsgRS, MaxFaceDetectThreadNum),
| ftrackChannels: make(map[string]int, MaxFaceDetectThreadNum),
| ftrackChanStats: make([]bool, MaxFaceDetectThreadNum, MaxFaceDetectThreadNum),
| dftfacenum: faceNum,
| dftinterval: interval,
| iGPU: gi,
| sampleSize: samp,
| }
| }
|
| // Init impl interface
| func (e *EFDetect) Init() bool {
|
| e.fakeInit()
|
| e.cleanChnStat()
|
| return true
| }
|
| func (e *EFDetect) fakeInit() {
| gpu := e.iGPU
|
| if gpu == -1 {
| gpu = gogpu.ValidGPU(2048)
| }
|
| gosdk.InitFaceTracker(e.threads, gpu, 1280, 720, e.dftfacenum, e.dftinterval, e.sampleSize) // i not work
| logo.Infoln("ftrack use gpu: ", gpu)
|
| gosdk.InitFaceProperty(e.threads)
| gosdk.InitFaceExtractor(e.threads, gpu)
| logo.Infoln("fextract use gpu: ", gpu)
| }
|
| // Run impl interface
| func (e *EFDetect) Run(ctx context.Context, in <-chan work.MsgRS, out chan<- work.MsgRS, typ string) {
| e.detectTrack(ctx, in, out, typ)
| }
|
|