5.0 KiB
5.0 KiB
name, overview, todos
| name | overview | todos | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| matting-client-and-test | 实现 pkg/matting 抠图服务 Go 客户端,补齐配置读取并把端口对齐到 8001,然后在本地安装依赖、下载 BiRefNet_lite 模型并启动服务,用 image.png 跑通真实抠图测试。 |
|
用户需求
完成 Go 后端 pkg/matting 抠图客户端封装,并用仓库根目录下的 image.png 进行真实抠图测试。
已确认的补充约束
- 测试方式:本地启动真实抠图服务跑通(安装 torch 等依赖、下载 BiRefNet_lite 模型、启动 8001 服务、用 image.png 真实抠图验证)。
- 服务端口:将
config.yaml中MattingModel.Port改为 8001,与 Python 服务默认端口一致。
核心功能
- 实现
pkg/matting客户端,封装对 Python 抠图服务POST /matting的 multipart 上传调用,返回透明底 PNG 字节。 - 提供客户端初始化(从全局配置读取 Host/Port)与可指定地址的构造方式,便于测试解耦。
- 补充主程序配置加载,使
MattingModel配置真正生效。 - 编写测试用例,读取
image.png作为输入,验证返回结果为合法 PNG 图片。 - 在本地搭建并启动 Python 抠图服务,完成端到端真实抠图验证。
技术栈
- 语言:Go(复用现有
net/http、mime/multipart、context标准库)。 - 参考实现:
pkg/tokenhub/client.go(Client 结构体 + NewClient 从 global 配置读取 + 带 Timeout 的 httpClient)。 - 服务端:已有
thirdparty/matting_server/main.py(FastAPI,POST /mattingmultipart 字段名file,返回image/png)。
实现方案
客户端设计(新建 pkg/matting/matting.go)
- 采用与
tokenhub.Client一致的轻量客户端模式,不引入第三方 HTTP 库。 Client持有baseURL与httpClient(Timeout 建议 120s,抠图为 CPU/GPU 推理耗时较长)。NewClient()从global.MattingModelSetting.Host/Port拼接http://host:port。NewClientWithAddr(host string, port int)便于测试与解耦,避免依赖全局配置初始化。Matting(ctx, imageData []byte) ([]byte, error):构造 multipart/form-data,字段名file(与 Python 端UploadFile = File(...)对齐),发送 POST 到/matting,读取并返回响应体;非 200 时返回带状态码与响应体摘要的错误。HealthCheck(ctx) error:GET/healthz,用于服务启动后确认就绪与测试前置检查。
配置接线
main.go的setupSetting()补setting.ReadSection("MattingModel", &global.MattingModelSetting),避免global.MattingModelSetting为 nil 导致NewClientpanic。configs/config.yaml:MattingModel.Port由 80 改为 8001;移除结构体不支持的retry字段。configs/config.example.yaml:补MattingModel(Host 127.0.0.1 / Port 8001)示例段。
测试设计(新建 pkg/matting/matting_test.go)
- 读取
../../image.png(测试文件位于pkg/matting/下)。 - 使用
NewClientWithAddr("127.0.0.1", 8001)调用Matting。 - 断言返回字节非空、以 PNG 魔数
\x89PNG开头;将结果写入t.TempDir()下的文件便于人工核验。 - 可选:先调用
HealthCheck确认服务就绪,失败时给出明确提示。
环境准备与真实跑通
- 使用独立 venv 隔离 Python 依赖,
pip install -r thirdparty/matting_server/requirements.txt(CPU 版 torch)。 - 启动
thirdparty/matting_server/main.py(监听 8001),等待 BiRefNet_lite 模型下载与加载完成。 - 执行
go test ./pkg/matting/ -run TestMatting -v完成真实抠图验证。
关键代码结构
type Client struct {
baseURL string
httpClient *http.Client
}
func NewClient() *Client
func NewClientWithAddr(host string, port int) *Client
func (c *Client) Matting(ctx context.Context, imageData []byte) ([]byte, error)
func (c *Client) HealthCheck(ctx context.Context) error
实现注意事项
- multipart 写入需正确
Close()并设置Content-Type: multipart/form-data; boundary=...。 - 请求与响应体需
defer resp.Body.Close(),避免连接泄漏。 - 错误信息应包含 HTTP 状态码与响应体摘要(截断),便于定位模型侧错误,避免打印大体积二进制。
- 不引入与现有项目冲突的新架构或第三方依赖,保持
pkg包风格一致。