训练体系整合与标注单阶段化

- 标注:AI 预标注直写 labels_json(去候选确认两阶段);重叠去重(minIoU);全量标注按钮
- 训练:脚本迁移入 server/training/(Go 化 prepare_yolo/analyze_rfdetr,保留 train_server.py);tflite 产物自检并入训练流程(check_tflite)
- 数据目录/权重不进 git;.gitignore 迁移至仓库根
This commit is contained in:
2026-08-26 18:22:56 +08:00
parent 4f39e85882
commit a0b115d954
108 changed files with 10877 additions and 798 deletions
+41
View File
@@ -50,3 +50,44 @@ func (p *CallbackPool) Submit(ctx context.Context, fn func(ctx context.Context)
return ctx.Err()
}
}
// LabelTaskPool 预标注任务并发池:逐张图片调 RF-DETR(IO 等待为主),
// 并发度来自 config.yml labelTask.poolSize,缺失或非法时回退 consts 默认值。
// 池内任务禁止提交本池(防 worker 饿死死锁);DB 写仍走 Serial 单写者。
type LabelTaskPool struct {
pool *grpool.Pool
}
var (
labelTaskPoolOnce sync.Once
labelTaskPool *LabelTaskPool
)
// LabelTaskPoolInstance 进程级预标注池单例(懒初始化,读取配置)。
func LabelTaskPoolInstance() *LabelTaskPool {
labelTaskPoolOnce.Do(func() {
ctx := context.Background()
size := g.Cfg().MustGet(ctx, "labelTask.poolSize", consts.LabelPoolDefaultSize).Int()
if size <= 0 {
size = consts.LabelPoolDefaultSize
}
labelTaskPool = &LabelTaskPool{pool: grpool.New(size, size)}
})
return labelTaskPool
}
// Submit 提交单张图片的预标注任务并等待完成,返回任务的 error。
func (p *LabelTaskPool) Submit(ctx context.Context, fn func(ctx context.Context) error) error {
res := make(chan error, 1)
if err := p.pool.Add(ctx, func(ctx context.Context) {
res <- fn(ctx)
}); err != nil {
return err
}
select {
case err := <-res:
return err
case <-ctx.Done():
return ctx.Err()
}
}