派生自 libgowrapper/yolo

zhangmeng
2019-12-10 eb19ddaebdf451cee76dc31082a3194a5f9b50ac
update
1个文件已修改
107 ■■■■■ 已修改文件
goyolo.go 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goyolo.go
@@ -68,8 +68,8 @@
// RatioInterTrack 跟踪判断重叠阈值
const RatioInterTrack = 50 //跟踪判断重叠阈值
// NewSDKYolo init yolo sdk
func NewSDKYolo(fc, fw, fn string, gi int) interface{} {
// NewSDK init yolo sdk
func NewSDK(fc, fw, fn string, gi int) interface{} {
    c := C.CString(fc)
    defer C.free(unsafe.Pointer(c))
@@ -218,9 +218,77 @@
}
// Run yolo detect   (只识别人)
func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, []byte) {
func Run(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, int) {
    if data == nil || w <= 0 || h <= 0 {
        return nil, nil
        return nil, 0
    }
    y := i.(*YoloHandle)
    channel := c
    if channel == 0 {
        channel = 3
    }
    v, ok := y.tracker[id]
    if !ok {
        i := &trackInfo{}
        y.tracker[id] = i
        v = i
    }
    whole, _ := YoloDetectTrack2(y, v.lastTrackObjs, &v.lastTrackID, data, w, h, channel, thrsh, umns)
    y.tracker[id].lastTrackObjs = whole
    y.tracker[id].lastTrackID = v.lastTrackID
    var dWhole []byte
    var err error
    if len(whole) > 0 {
        infos := convert2ProtoYoloTrack(whole, 1.0, 1.0)
        p := protomsg.ParamYoloObj{Infos: infos}
        dWhole, err = proto.Marshal(&p)
        if err != nil {
            fmt.Println("ydetect track marshal proto yolo obj error", err)
            dWhole = nil
        }
    }
    return dWhole, len(whole)
}
func convert2ProtoYoloTrack(obj []CObjTrackInfo, fx, fy float64) []*protomsg.ObjInfo {
    ret := []*protomsg.ObjInfo{}
    for _, v := range obj {
        if fx < 1.0 || fy < 1.0 {
            v.ObjInfo.RcObj.Left = (int32)((float64)(v.ObjInfo.RcObj.Left) / fx)
            v.ObjInfo.RcObj.Right = (int32)((float64)(v.ObjInfo.RcObj.Right) / fx)
            v.ObjInfo.RcObj.Top = (int32)((float64)(v.ObjInfo.RcObj.Top) / fy)
            v.ObjInfo.RcObj.Bottom = (int32)((float64)(v.ObjInfo.RcObj.Bottom) / fy)
        }
        rect := protomsg.Rect{
            Left:   v.ObjInfo.RcObj.Left,
            Right:  v.ObjInfo.RcObj.Right,
            Top:    v.ObjInfo.RcObj.Top,
            Bottom: v.ObjInfo.RcObj.Bottom,
        }
        obj := protomsg.ObjInfo{
            RcObj: &rect,
            Typ:   v.ObjInfo.Typ,
            Prob:  v.ObjInfo.Prob,
            ObjID: v.ID,
        }
        ret = append(ret, &obj)
    }
    return ret
}
// Run2 yolo detect   (只识别人)
func Run2(i interface{}, id string, data []byte, w, h, c int, thrsh float32, umns int) ([]byte, int, []byte, int) {
    if data == nil || w <= 0 || h <= 0 {
        return nil, 0, nil, 0
    }
    y := i.(*YoloHandle)
@@ -255,34 +323,5 @@
    if len(recent) > 0 {
        dRecent = nil
    }
    return dWhole, dRecent
}
func convert2ProtoYoloTrack(obj []CObjTrackInfo, fx, fy float64) []*protomsg.ObjInfo {
    ret := []*protomsg.ObjInfo{}
    for _, v := range obj {
        if fx < 1.0 || fy < 1.0 {
            v.ObjInfo.RcObj.Left = (int32)((float64)(v.ObjInfo.RcObj.Left) / fx)
            v.ObjInfo.RcObj.Right = (int32)((float64)(v.ObjInfo.RcObj.Right) / fx)
            v.ObjInfo.RcObj.Top = (int32)((float64)(v.ObjInfo.RcObj.Top) / fy)
            v.ObjInfo.RcObj.Bottom = (int32)((float64)(v.ObjInfo.RcObj.Bottom) / fy)
        }
        rect := protomsg.Rect{
            Left:   v.ObjInfo.RcObj.Left,
            Right:  v.ObjInfo.RcObj.Right,
            Top:    v.ObjInfo.RcObj.Top,
            Bottom: v.ObjInfo.RcObj.Bottom,
        }
        obj := protomsg.ObjInfo{
            RcObj: &rect,
            Typ:   v.ObjInfo.Typ,
            Prob:  v.ObjInfo.Prob,
            ObjID: v.ID,
        }
        ret = append(ret, &obj)
    }
    return ret
    return dWhole, len(whole), dRecent, len(recent)
}