reid from https://github.com/michuanhaohao/reid-strong-baseline
554325746@qq.com
2020-03-25 b2500a8eb6665ce6efe0a7d954b6f101af83d7ec
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
package main
 
/*
#cgo CFLAGS: -I${SRCDIR}/sdk/include -I${SRCDIR}/thirdparty/include/opencv4 -I${SRCDIR}/sdk/include/torch/csrc/api/include -I${SRCDIR}/csrc -w -g
#cgo CXXFLAGS: -I${SRCDIR}/sdk/include -I${SRCDIR}/thirdparty/include/opencv4 -I${SRCDIR}/sdk/include/torch/csrc/api/include -I${SRCDIR}/csrc -w -g -std=c++11
#cgo LDFLAGS: -Wl,-rpath,${SRCDIR}/sdk/lib
#cgo LDFLAGS: -L${SRCDIR}/sdk/lib -ltorch -lc10 -lc10_cuda -lcudart -lgomp -lnvToolsExt
#cgo LDFLAGS: -L${SRCDIR}/thirdparty/lib -lopencv_core -lopencv_imgproc
#cgo LDFLAGS: -ldl -lpthread
 
#include <stdlib.h>
#include "creid.h"
 
float get_val(float *data, int index){
    return data[index];
}
*/
import "C"
import "unsafe"
 
// ReID id
type ReID struct {
    handle unsafe.Pointer
}
 
// NewSDK new reid
func NewSDK(gpu int, module string) *ReID {
    cmodule := C.CString(module)
    defer C.free(unsafe.Pointer(cmodule))
    h := C.create_reid(C.int(gpu), cmodule)
    return &ReID{h}
}
 
// Free free
func (r *ReID) Free() {
}
 
// Extract extract
// func (r *ReID) Extract(img []byte) []float32 {
 
//  var fSize C.int
//  cfeat := C.extract(r.handle, (*C.uchar)(unsafe.Pointer(&img[0])), &fSize)
//  if cfeat == nil {
//      return nil
//  }
 
//  ret := make([]float32, 0, fSize)
//  for i := 0; i < int(fSize); i++ {
//      r := C.get_val(cfeat, C.int(i))
//      ret = append(ret, float32(r))
//  }
//  C.free(unsafe.Pointer(cfeat))
//  return ret
// }
 
// Extract2 extract
func (r *ReID) Extract2(img unsafe.Pointer, w, h, c int) []float32 {
 
    var fSize C.int
    cfeat := C.extract(r.handle, (*C.uchar)(img), C.int(w), C.int(h), C.int(c), &fSize)
    if cfeat == nil {
        return nil
    }
 
    ret := make([]float32, 0, fSize)
    for i := 0; i < int(fSize); i++ {
        r := C.get_val(cfeat, C.int(i))
        ret = append(ret, float32(r))
    }
    C.free(unsafe.Pointer(cfeat))
    return ret
}
 
// Compare compare
func (r *ReID) Compare(feat1, feat2 []float32) float32 {
 
    p := C.compare(r.handle, (*C.float)(unsafe.Pointer(&feat1)), (*C.float)(unsafe.Pointer(&feat2)))
    return float32(p)
}