ONNX 模型库
返回模型

说明文档

The README content is already in Chinese (Simplified). Here it is with all code blocks, links, and markdown formatting preserved:

<div align="center" style="text-align: center;"> <img src="./assets/logo.png" alt="logo" width="200" style="display: block; margin: 0 auto;" /> </div>

<p align="center"> <a href="https://github.com/getcharzp/go-vision/fork" target="blank"> <img src="https://img.shields.io/github/forks/getcharzp/go-vision?style=for-the-badge" alt="go-vision forks"/> </a> <a href="https://github.com/getcharzp/go-vision/stargazers" target="blank"> <img src="https://img.shields.io/github/stars/getcharzp/go-vision?style=for-the-badge" alt="go-vision stars"/> </a> <a href="https://github.com/getcharzp/go-vision/pulls" target="blank"> <img src="https://img.shields.io/github/issues-pr/getcharzp/go-vision?style=for-the-badge" alt="go-vision pull-requests"/> </a> </p>

go-vision 基于 Golang + ONNX 构建的视觉库,支持 SAM2、YOLOv11-Det、YOLOv11-Seg、YOLOv11-Cls、YOLOv11-Pose、YOLOv11-OBB、YOLO26-Det、 YOLO26-Seg、YOLO26-Cls、YOLO26-Pose、YOLO26-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图
<img width="100%" src="./examples/test.png" alt=""> <img width="100%" src="./examples/output_mask.png" alt="">

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)
}
原图 检测结果
<img width="100%" src="./examples/test.png" alt=""> <img width="100%" src="./examples/yolov11_det.jpg" alt="">

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图
<img width="100%" src="./examples/test.png" alt=""> <img width="100%" src="./examples/yolov11_seg_mask_0.png" alt="">

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)
}
原图 姿态图
<img width="100%" src="./examples/person.jpg" alt=""> <img width="100%" src="./examples/yolov11_pose.jpg" alt="">

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图
<img width="100%" src="./examples/ship.jpg" alt=""> <img width="100%" src="./examples/yolov11_obb.jpg" alt="">

yolo26-det

package main

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

func main() {
	engine, err := yolo26.NewDetEngine(yolo26.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("yolo26_det.jpg", targetImg, 50)
}
原图 检测结果
<img width="100%" src="./examples/test.png" alt=""> <img width="100%" src="./examples/yolo26_det.jpg" alt="">

yolo26-seg

package main

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

func main() {
	cfg := yolo26.DefaultSegConfig()
	cfg.ModelPath = "../yolo26_weights/yolo26s-seg.onnx"
	cfg.OnnxRuntimeLibPath = "../lib/onnxruntime.dll"

	engine, err := yolo26.NewSegEngine(cfg)
	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("yolo26_seg_mask_%d.png", idx), res.Mask, 100)
	}
}
原图 Mask图
<img width="100%" src="./examples/test.png" alt=""> <img width="100%" src="./examples/yolo26_seg_mask_0.png" alt="">

yolo26-cls

package main

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

func main() {
	cfg := yolo26.DefaultClsConfig()
	cfg.ModelPath = "../yolo26_weights/yolo26m-cls.onnx"
	cfg.OnnxRuntimeLibPath = "../lib/onnxruntime.dll"

	engine, err := yolo26.NewClsEngine(cfg)
	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.99169
//  Class: 436, Score: 0.00258
//  Class: 511, Score: 0.00242
//  Class: 654, Score: 0.00054
//  Class: 675, Score: 0.00053

yolo26-pose

package main

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

func main() {
	cfg := yolo26.DefaultPoseConfig()
	cfg.ModelPath = "../yolo26_weights/yolo26m-pose.onnx"
	cfg.OnnxRuntimeLibPath = "../lib/onnxruntime.dll"

	engine, err := yolo26.NewPoseEngine(cfg)
	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 := yolo26.DrawPoseResult(img, results)
	imageutil.Save("yolo26_pose.jpg", dst, 50)
}
原图 姿态图
<img width="100%" src="./examples/person.jpg" alt=""> <img width="100%" src="./examples/yolo26_pose.jpg" alt="">

yolo26-obb

package main

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

func main() {
	cfg := yolo26.DefaultOBBConfig()
	cfg.ModelPath = "../yolo26_weights/yolo26m-obb.onnx"
	cfg.OnnxRuntimeLibPath = "../lib/onnxruntime.dll"

	engine, err := yolo26.NewOBBEngine(cfg)
	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("yolo26_obb.jpg", dst, 50)
}
原图 OBB图
<img width="100%" src="./examples/ship.jpg" alt=""> <img width="100%" src="./examples/yolo26_obb.jpg" alt="">

GetcharZp/go-vision

作者 GetcharZp

mask-generation
↓ 0 ♥ 1

创建时间: 2025-12-11 06:34:24+00:00

更新时间: 2026-02-13 10:07:54+00:00

在 Hugging Face 上查看

文件 (79)

.gitattributes
.gitignore
LICENSE
README.md
assets/logo.png
examples/output_mask.png
examples/person.jpg
examples/sam2_test.go
examples/ship.jpg
examples/test.png
examples/yolo26_det.jpg
examples/yolo26_obb.jpg
examples/yolo26_pose.jpg
examples/yolo26_seg_mask_0.png
examples/yolo26_test.go
examples/yolov11_det.jpg
examples/yolov11_obb.jpg
examples/yolov11_pose.jpg
examples/yolov11_seg_mask_0.png
examples/yolov11_test.go
lib/onnxruntime.dll
lib/onnxruntime_amd64.dylib
lib/onnxruntime_amd64.so
lib/onnxruntime_arm64.dylib
lib/onnxruntime_arm64.so
sam2_weights/prompt_encoder_mask_decoder.onnx ONNX
sam2_weights/prompt_encoder_mask_decoder.onnx_data
sam2_weights/vision_encoder.onnx ONNX
sam2_weights/vision_encoder.onnx_data
yolo26_weights/yolo26l-cls.onnx ONNX
yolo26_weights/yolo26l-obb.onnx ONNX
yolo26_weights/yolo26l-pose.onnx ONNX
yolo26_weights/yolo26l-seg.onnx ONNX
yolo26_weights/yolo26l.onnx ONNX
yolo26_weights/yolo26m-cls.onnx ONNX
yolo26_weights/yolo26m-obb.onnx ONNX
yolo26_weights/yolo26m-pose.onnx ONNX
yolo26_weights/yolo26m-seg.onnx ONNX
yolo26_weights/yolo26m.onnx ONNX
yolo26_weights/yolo26n-cls.onnx ONNX
yolo26_weights/yolo26n-obb.onnx ONNX
yolo26_weights/yolo26n-pose.onnx ONNX
yolo26_weights/yolo26n-seg.onnx ONNX
yolo26_weights/yolo26n.onnx ONNX
yolo26_weights/yolo26s-cls.onnx ONNX
yolo26_weights/yolo26s-obb.onnx ONNX
yolo26_weights/yolo26s-pose.onnx ONNX
yolo26_weights/yolo26s-seg.onnx ONNX
yolo26_weights/yolo26s.onnx ONNX
yolo26_weights/yolo26x-cls.onnx ONNX
yolo26_weights/yolo26x-obb.onnx ONNX
yolo26_weights/yolo26x-pose.onnx ONNX
yolo26_weights/yolo26x-seg.onnx ONNX
yolo26_weights/yolo26x.onnx ONNX
yolov11_weights/yolo11l-cls.onnx ONNX
yolov11_weights/yolo11l-obb.onnx ONNX
yolov11_weights/yolo11l-pose.onnx ONNX
yolov11_weights/yolo11l-seg.onnx ONNX
yolov11_weights/yolo11l.onnx ONNX
yolov11_weights/yolo11m-cls.onnx ONNX
yolov11_weights/yolo11m-obb.onnx ONNX
yolov11_weights/yolo11m-pose.onnx ONNX
yolov11_weights/yolo11m-seg.onnx ONNX
yolov11_weights/yolo11m.onnx ONNX
yolov11_weights/yolo11n-cls.onnx ONNX
yolov11_weights/yolo11n-obb.onnx ONNX
yolov11_weights/yolo11n-pose.onnx ONNX
yolov11_weights/yolo11n-seg.onnx ONNX
yolov11_weights/yolo11n.onnx ONNX
yolov11_weights/yolo11s-cls.onnx ONNX
yolov11_weights/yolo11s-obb.onnx ONNX
yolov11_weights/yolo11s-pose.onnx ONNX
yolov11_weights/yolo11s-seg.onnx ONNX
yolov11_weights/yolo11s.onnx ONNX
yolov11_weights/yolo11x-cls.onnx ONNX
yolov11_weights/yolo11x-obb.onnx ONNX
yolov11_weights/yolo11x-pose.onnx ONNX
yolov11_weights/yolo11x-seg.onnx ONNX
yolov11_weights/yolo11x.onnx ONNX