vision

package module
v0.0.0-...-ce8f20e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 26, 2025 License: MIT Imports: 11 Imported by: 0

README


license: mit pipeline_tag: mask-generation tags:

  • mask-generation
  • image-segmentation

logo

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

go-vision 基于 Golang + ONNX 构建的视觉库,支持 SAM2、YOLOv11-Det、YOLOv11-Seg、YOLOv11-Cls、YOLOv11-Pose、YOLOv11-OBB 等模型。

安装

# 下载包
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图

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func DefaultLibraryPath

func DefaultLibraryPath() string

DefaultLibraryPath 根据运行时环境判断加载哪个库文件

Types

type OnnxConfig

type OnnxConfig struct {
	SessionOptions *ort.SessionOptions

	// 必填参数
	OnnxRuntimeLibPath string // onnxruntime.dll (或 .so, .dylib) 的路径
	// 可选参数
	UseCuda    bool // (可选) 是否启用 CUDA
	NumThreads int  // (可选) ONNX 线程数, 默认由CPU核心数决定

	// EnableCpuMemArena 控制 ONNX 的内存池策略
	// false (默认): 禁用内存池,推理速度稍慢,但 Destroy 后立即归还内存给 OS ,解决内存滞留问题
	// true: 启用内存池,推理速度最快,但 Destroy 后内存会被缓存以供复用
	EnableCpuMemArena bool
}

func (*OnnxConfig) New

func (cfg *OnnxConfig) New() error

New 初始化 ONNX 环境

type TextDrawer

type TextDrawer struct {
	// contains filtered or unexported fields
}

TextDrawer 文本绘制工具

func NewTextDrawer

func NewTextDrawer(fontPath string) (*TextDrawer, error)

NewTextDrawer 创建文本绘制工具

Params:

fontPath: 字体路径

func (*TextDrawer) Close

func (d *TextDrawer) Close()

Close 释放资源

func (*TextDrawer) DrawText

func (d *TextDrawer) DrawText(img draw.Image, text string, x, y int, c color.Color)

DrawText 绘制文本

Params:

img: 被绘制的图像
text: 绘制的文本
x, y: 绘制的坐标
c: 绘制的颜色

func (*TextDrawer) SetSize

func (d *TextDrawer) SetSize(fontSize float64) error

SetSize 动态调整字体大小

Params:

fontSize: 字体大小

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL