zhangmeng
2020-01-13 94e9f50569bd20a697edb36711d017de1c19d1a5
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)
}