| | |
| | | package main |
| | | |
| | | import ( |
| | | "bufio" |
| | | "context" |
| | | "fmt" |
| | | "io/ioutil" |
| | | "os" |
| | | "strings" |
| | | "time" |
| | | "unsafe" |
| | | |
| | | "basic.com/libgowrapper/sdkhelper.git" |
| | | "basic.com/valib/gogpu.git" |
| | | |
| | | "basic.com/pubsub/protomsg.git" |
| | | "basic.com/valib/godraw.git" |
| | | |
| | | "basic.com/valib/deliver.git" |
| | | "github.com/gogo/protobuf/proto" |
| | | |
| | | "nanomsg.org/go-mangos" |
| | | "nanomsg.org/go-mangos/protocol/rep" |
| | | "nanomsg.org/go-mangos/transport/ipc" |
| | | "nanomsg.org/go-mangos/transport/tcp" |
| | | ) |
| | | |
| | | type reid struct { |
| | |
| | | func Run(ctx context.Context, i interface{}) { |
| | | s := i.(*reid) |
| | | |
| | | c := deliver.NewClient(deliver.ReqRep, s.ipc) |
| | | |
| | | var msg []byte |
| | | var sock mangos.Socket |
| | | var err error |
| | | var msg []byte |
| | | |
| | | for { |
| | | if sock, err = rep.NewSocket(); err != nil { |
| | | s.fnLogger("can't get new rep socket: ", err) |
| | | time.Sleep(5 * time.Millisecond) |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | sock.AddTransport(ipc.NewTransport()) |
| | | sock.AddTransport(tcp.NewTransport()) |
| | | |
| | | for { |
| | | if err = sock.Listen(s.ipc); err != nil { |
| | | suf := "ipc://" |
| | | p := strings.Index(s.ipc, suf) |
| | | if p >= 0 { |
| | | file := s.ipc[p+len(string(suf)):] |
| | | os.Remove(file) |
| | | s.fnLogger("remove:", file) |
| | | } |
| | | s.fnLogger("can't listen on rep socket: ", err) |
| | | time.Sleep(5 * time.Millisecond) |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | for { |
| | | select { |
| | | case <-ctx.Done(): |
| | | sock.Close() |
| | | return |
| | | default: |
| | | |
| | | msg, err = c.Recv() |
| | | if err != nil { |
| | | if msg, err = sock.Recv(); err != nil { |
| | | s.fnLogger("REID~~~~~~Recv From HumanTrack error: ", err) |
| | | continue |
| | | } |
| | | |
| | |
| | | } |
| | | s.fnLogger("REID~~~~~~Recv Image:", len(i.Data)) |
| | | |
| | | ///////////////////////////////// |
| | | if jpg, err := godraw.ToJpeg(i.Data, int(i.Width), int(i.Height), nil); err == nil { |
| | | ioutil.WriteFile("./pic.jpg", jpg, 0644) |
| | | } |
| | | ///////////////////////////////// |
| | | feat := s.handle.Extract2(unsafe.Pointer(&i.Data[0]), int(i.Width), int(i.Height), 3) |
| | | if feat == nil { |
| | | // feat = make([]float32, 1) |
| | |
| | | s.fnLogger("REID~~~~~~extractor---human_feats------%f", feat[k+2000]) |
| | | } |
| | | s.fnLogger("REID~~~~~~Run Reid Use GPU: ", s.gpu) |
| | | |
| | | ///////////////////////////////// |
| | | if f, err := os.Create("./reid-feat.txt"); err == nil { |
| | | defer f.Close() |
| | | |
| | | w := bufio.NewWriter(f) |
| | | for k, v := range feat { |
| | | lineStr := fmt.Sprintf("%d->%f", k, v) |
| | | fmt.Fprintln(w, lineStr) |
| | | } |
| | | w.Flush() |
| | | } |
| | | ///////////////////////////////// |
| | | |
| | | } |
| | | buf := float32SliceAsByteSlice(feat) |
| | | c.Send(buf) |
| | | ioutil.WriteFile("./reid-feat-byte.txt", buf, 0644) |
| | | |
| | | if err = sock.Send(buf); err != nil { |
| | | s.fnLogger("REID~~~~~~Send HumanTrack error: ", err) |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | l := len(src) * 4 |
| | | ptr := unsafe.Pointer(&src[0]) |
| | | // It is important to keep in mind that the Go garbage collector |
| | | // will not interact with this data, and that if src if freed, |
| | | // the behavior of any Go code using the slice is nondeterministic. |
| | | // Reference: https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices |
| | | return (*[1 << 26]byte)((*[1 << 26]byte)(ptr))[:l:l] |
| | | } |