- 标注:AI 预标注直写 labels_json(去候选确认两阶段);重叠去重(minIoU);全量标注按钮 - 训练:脚本迁移入 server/training/(Go 化 prepare_yolo/analyze_rfdetr,保留 train_server.py);tflite 产物自检并入训练流程(check_tflite) - 数据目录/权重不进 git;.gitignore 迁移至仓库根
46 lines
1.7 KiB
Go
46 lines
1.7 KiB
Go
package common
|
||
|
||
import (
|
||
"context"
|
||
"crypto/sha256"
|
||
"encoding/hex"
|
||
"path/filepath"
|
||
"strconv"
|
||
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
)
|
||
|
||
// 训练体系运行时数据布局(config.yml app.datasetDir,默认 ./workspace,挂载持久化、不提交 git):
|
||
//
|
||
// datasets/<name>/ 数据集图片(平铺,文件名唯一,标注存 DB dataset_image.labels_json)
|
||
// models/<name>/ latest.tflite 当前生效副本(无存档,客户端固定下载)
|
||
// trainings/<taskId>/ 训练产物(best.tflite + artifact.zip)
|
||
//
|
||
// 训练机与 Go 服务器异机时,数据集经 training 通道同步(见 common/training_runner.go)。
|
||
|
||
// DatasetDir 训练体系运行时数据根目录:config.yml app.datasetDir(默认 ./workspace)
|
||
func DatasetDir(ctx context.Context) string {
|
||
return g.Cfg().MustGet(ctx, "app.datasetDir", "./workspace").String()
|
||
}
|
||
|
||
// DatasetImagesDir 某数据集图片目录
|
||
func DatasetImagesDir(ctx context.Context, datasetName string) string {
|
||
return filepath.Join(DatasetDir(ctx), "datasets", datasetName)
|
||
}
|
||
|
||
// DatasetModelsDir 某数据集模型目录
|
||
func DatasetModelsDir(ctx context.Context, datasetName string) string {
|
||
return filepath.Join(DatasetDir(ctx), "models", datasetName)
|
||
}
|
||
|
||
// TrainingArtifactsDir 某训练任务产物目录(拉回的 best.tflite + artifact.zip)
|
||
func TrainingArtifactsDir(ctx context.Context, taskId int64) string {
|
||
return filepath.Join(DatasetDir(ctx), "trainings", strconv.FormatInt(taskId, 10))
|
||
}
|
||
|
||
// Sha256Hex 计算文件内容 SHA-256 十六进制(模型版本校验用)
|
||
func Sha256Hex(data []byte) (string, error) {
|
||
sum := sha256.Sum256(data)
|
||
return hex.EncodeToString(sum[:]), nil
|
||
}
|