logo

go-vision forks go-vision stars go-vision pull-requests

go-vision 基于 Golang + ONNX 构建的轻量级视觉库

安装

# 下载包
go get -u github.com/getcharzp/go-vision

# 下载模型、动态链接库
git clone https://huggingface.co/getcharzp/go-vision

快速开始

sam2

package main

import (
    "fmt"
    "github.com/getcharzp/go-vision/sam2"
    "github.com/up-zero/gotool/imageutil"
    "log"
)

func main() {
    engine, err := sam2.NewEngine(sam2.DefaultConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./test.png")
    imgCtx, err := engine.EncodeImage(img)
    if err != nil {
        log.Fatalf("图片 Encode 失败: %v", err)
    }
    defer imgCtx.Destroy()

    points := []sam2.Point{
        {X: 367, Y: 168, Label: sam2.LabelBoxTopLeft},  // 左上
        {X: 441, Y: 349, Label: sam2.LabelBoxBotRight}, // 右下
    }
    imgResult, score, err := imgCtx.Decode(points)
    if err != nil {
        log.Fatalf("Mask Decode 失败: %v", err)
    }

    fmt.Printf("Mask generated, score: %.4f\n", score)
    imageutil.Save("output_mask.png", imgResult, 100)
}
原图 Mask图

yolov11-det

package main

import (
    "fmt"
    "github.com/getcharzp/go-vision/yolov11"
    "github.com/up-zero/gotool/imageutil"
    "image"
    "image/color"
    "image/draw"
    "log"
)

func main() {
    engine, err := yolov11.NewDetEngine(yolov11.DefaultDetConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./test.png")
    results, err := engine.Predict(img)
    if err != nil {
        log.Fatalf("预测失败: %v", err)
    }

    targetImg := image.NewRGBA(img.Bounds())
    draw.Draw(targetImg, img.Bounds(), img, img.Bounds().Min, draw.Src)
    fmt.Printf("检测到目标: %d 个\n", len(results))
    for _, res := range results {
        fmt.Printf("Class: %d, Score: %.2f, Box: %v\n", res.ClassID, res.Score, res.Box)
        imageutil.DrawThickRectOutline(targetImg, res.Box, color.RGBA{R: 255, G: 0, B: 0, A: 255}, 3)
    }
    imageutil.Save("yolov11_det.jpg", targetImg, 50)
}
原图 检测结果

yolov11-seg

package main

import (
    "fmt"
    "github.com/getcharzp/go-vision/yolov11"
    "github.com/up-zero/gotool/imageutil"
    "log"
)

func main() {
    engine, err := yolov11.NewSegEngine(yolov11.DefaultSegConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./test.png")
    results, err := engine.Predict(img)
    if err != nil {
        log.Fatalf("预测失败: %v", err)
    }

    fmt.Printf("检测到目标: %d 个\n", len(results))
    for idx, res := range results {
        fmt.Printf("Class: %d, Score: %.2f, Box: %v\n", res.ClassID, res.Score, res.Box)
        imageutil.Save(fmt.Sprintf("yolov11_seg_mask_%d.png", idx), res.Mask, 100)
    }
}
原图 Mask图

yolov11-cls

package main

import (
    "fmt"
    "github.com/getcharzp/go-vision/yolov11"
    "github.com/up-zero/gotool/imageutil"
    "log"
)

func main() {
    engine, err := yolov11.NewClsEngine(yolov11.DefaultClsConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./test.png")
    results, err := engine.Predict(img, 5)
    if err != nil {
        log.Fatalf("预测失败: %v", err)
    }

    for _, res := range results {
        fmt.Printf("Class: %d, Score: %.5f\n", res.ClassID, res.Score)
    }
}

// 输出:
//  Class: 656, Score: 0.70231
//  Class: 436, Score: 0.22404
//  Class: 511, Score: 0.02263
//  Class: 675, Score: 0.01796
//  Class: 717, Score: 0.00385

yolov11-pose

package main

import (
    "github.com/getcharzp/go-vision/yolov11"
    "github.com/up-zero/gotool/imageutil"
    "log"
)

func main() {
    engine, err := yolov11.NewPoseEngine(yolov11.DefaultPoseConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./person.jpg")
    results, err := engine.Predict(img)
    if err != nil {
        log.Fatalf("预测失败: %v", err)
    }

    dst := yolov11.DrawPoseResult(img, results)
    imageutil.Save("yolov11_pose.jpg", dst, 50)
}
原图 姿态图

yolov11-obb

package main

import (
    "github.com/getcharzp/go-vision/yolov11"
    "github.com/up-zero/gotool/imageutil"
    "image"
    "image/color"
    "image/draw"
    "log"
)

func main() {
    engine, err := yolov11.NewOBBEngine(yolov11.DefaultOBBConfig())
    if err != nil {
        log.Fatalf("初始化引擎失败: %v", err)
    }
    defer engine.Destroy()

    img, _ := imageutil.Open("./ship.jpg")
    results, err := engine.Predict(img)
    if err != nil {
        log.Fatalf("预测失败: %v", err)
    }

    dst := image.NewRGBA(img.Bounds())
    draw.Draw(dst, img.Bounds(), img, img.Bounds().Min, draw.Src)
    for _, result := range results {
        imageutil.DrawThickPolygonOutline(dst, result.Corners[:], 3, color.RGBA{R: 255, G: 0, B: 0, A: 255})
    }
    imageutil.Save("yolov11_obb.jpg", dst, 50)
}
原图 OBB图
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support