Files
observer/server/biz/consts/consts.go
T
2026-09-10 09:41:13 +08:00

171 lines
7.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package consts
// 业务常量集中地:表名、状态、默认参数与协程池默认大小。
const (
TablePaymentOrder = "payment_order"
TableLicense = "license"
TableAppVersion = "app_version"
TableDataset = "dataset"
TableDatasetImage = "dataset_image"
TableTraining = "model_training"
TableModelVersion = "model_version"
TableLabelTask = "label_task"
TableGenTask = "gen_task"
TableAnnotateTask = "annotate_task"
TableAnnotateRecord = "annotate_record"
TableRewardLog = "reward_log"
TableFalseTargetReport = "false_target_report"
// 假目标上报状态(技术设计.md「假目标上报」):App 上报 → 管理端审核 →
// 通过 = 迁移入负样本库当背景图;拒绝 = 记录与文件同删(无 rejected 存量状态)
FalseTargetPending = "pending"
FalseTargetApproved = "approved"
// 假目标上报每用户每日上限(防灌水/滥用)
FalseTargetDailyLimit = 50
// 假目标上报整帧 dHash 查重阈值:与已上报记录最小汉明距离 ≤ 该值视为近重复拒绝
// (同 CleanHashHamming;同机位连续帧近距通常 <82026-09-09
FalseTargetDupHamming = 8
// dataset_image.review_status 审核三态(技术设计.md「标注审核状态机」):
// 预标/App 提交 → 待审核;人工保存/审核通过 → 已审核;拒绝清标注 → 未标注(回任务池)。
// 不变式:review_status=0 ⟹ labels_json 无框;训练集只收 ReviewApproved
ReviewImageNone = 0
ReviewImagePending = 1
ReviewImageApproved = 2
// 订单状态机 created → paid(closed 仅超时/失败关闭)
OrderStatusCreated = "created"
OrderStatusPaid = "paid"
OrderStatusClosed = "closed"
ChannelWechat = "wechat"
ChannelAlipay = "alipay"
// 未支付订单惰性关闭阈值与同设备复用窗口(秒)
PendingOrderWindowSeconds = 2 * 3600
// 回调 IO 池默认并发度(被 config.yml payment.poolSize 覆盖)
PaymentPoolDefaultSize = 16
// 预标注(逐张调 RF-DETR)池默认并发度(被 config.yml labelTask.poolSize 覆盖)
LabelPoolDefaultSize = 4
// 训练任务状态机 queued → running → success/failedqueued=GPU 忙排队,2026-09-03 双档位串行)
TrainingStatusQueued = "queued"
TrainingStatusRunning = "running"
TrainingStatusSuccess = "success"
TrainingStatusFailed = "failed"
// 训练档位:s=高识别(yolov8s@1280,精度优先,默认) | n=高性能(yolov8n@704,速度优先)
TrainingVariantS = "s"
TrainingVariantN = "n"
// n 档模型文件名后缀:trainings/<基名>_n.tflites 档无后缀 = 旧版唯一位,向后兼容)
TrainingVariantNFileSuffix = "_n"
// 训练/模型类型(2026-09-09 综合训练):species=单物种(存量默认)| combined=多物种综合模型
// dataset_id=0、dataset_ids=覆盖数据集列表,文件基名 combined)
TrainingKindSpecies = "species"
TrainingKindCombined = "combined"
// 综合模型文件基名与训练机目录名
TrainingCombinedBase = "combined"
// 数据集状态 building → labeled → syncedsynced = 已同步训练机)
DatasetStatusBuilding = "building"
DatasetStatusLabeled = "labeled"
DatasetStatusSynced = "synced"
// 负样本库(技术设计.md「负样本库」):source=negative 的特殊数据集,统一背景样本
// 训练打包时混入全部物种数据集(空标签 = 背景);固定保留名同是目录名,
// AdminCreateDataset 拒绝用户使用该名,AdminDeleteDataset 拒绝删除整库
DatasetSourceNegative = "negative"
NegativeDatasetName = "__negative__"
// 标注任务状态
LabelTaskRunning = "running"
LabelTaskDone = "done"
// 文生图任务状态 running → done/failed
GenTaskRunning = "running"
GenTaskDone = "done"
GenTaskFailed = "failed"
// 文生图池默认并发度(被 config.yml imageGen.poolSize 覆盖;z-image 显存独占,默认 1)
GenPoolDefaultSize = 1
// 单图 VLM 藏匿位补检疑似框(class=1)上限;每次调用可追加数 = 上限 - 图内已有疑似框数,≤0 跳过调用
VlmMaxSuspectPerImage = 3
// 单图预标(RF-DETR)框数上限:去重后检出仍超过该数按置信度取前 N——
// 生成声明 1 个目标不代表图内只有 1 个,曾按声明数量裁剪漏目标,改固定上限
// (与 VlmMaxSuspectPerImage 同量级,单图人工复核工作量可控)
MaxPrelabelPerImage = 3
// 预标注四级漏斗(技术设计.md「预标注四级漏斗」):
// 单图漏斗总超时秒数——L2 切片 ~20 块串行 + L3 VLM 兜底,原 120s 只够单次全图检测
LabelImageTimeoutSec = 300
// L3 VLM 提议候选区数上限(图全空时让 VLM 指可疑位置,RF-DETR 精修确认,宁可指错不可遗漏)
VlmLocateMaxRegions = 3
// L3 候选区扩大倍数(VLM 坐标偏粗,扩大裁剪给 RF-DETR 足够上下文,钳制图片边界)
VlmRegionExpand = 2.0
// 标注众包与时长激励(技术设计.md「App 标注众包与时长激励」):
// 以下为 config.yml annotateReward 缺失/非法时的回退默认值,可配项含义见 config.yml 注释
AnnotateClaimSize = 10 // 每次领取图片数
AnnotateClaimTimeoutHour = 2 // 领取锁超时(pending 超时视为放弃,领取时惰性释放)
AnnotateRewardPerImages = 10 // 每累计提交 N 张发一次时长
AnnotateRewardMinutes = 30 // 每次发放分钟数(expires_at 分钟级顺延)
AnnotateDailyCapMinutes = 120 // 每日发放上限(自然日)
AnnotateFreezeRatio = 0.8 // 通过比例低于该值触发冻结
AnnotateFreezeMinReviewed = 5 // 触发冻结判定的最小已审核样本数(防小样本误冻)
AnnotateFreezeHours = 24 // 冻结时长(annotate_frozen_until 时间戳对比天然自动解冻)
// 众包任务状态
AnnotateTaskPublished = "published"
AnnotateTaskStopped = "stopped"
// 用户标注记录状态机:领取 pending → 提交 submitted → 审核 approved/rejected
AnnotateRecordPending = "pending"
AnnotateRecordSubmitted = "submitted"
AnnotateRecordApproved = "approved"
AnnotateRecordRejected = "rejected"
// 模型版本号前缀(m1.0.0),同数据集内递增
ModelVersionPrefix = "m"
// 桶内多样性保留的整图 dHash 相似阈值:与已保留图最小汉明距离 > 该值才保留
// (同场地连拍帧整图哈希近距通常 <8,异场景帧通常 >122026-09-02 实测校准)
CleanHashHamming = 8
)
// CleanBuckets 数据清洗目标尺寸档(训练集去冗余,见技术设计.md「数据清洗」):
// 按最大 class 0 框的归一化框高 h 划分,边界为占图高百分比,下含上不含。
// <2% 极远档豁免——recall 瓶颈档只缺不多,不进候选清单(配额 0 固定不适用);
// 其余档 Quota 为「目标保留张数」缺省值,preview 请求可覆盖(管理端配额表默认展示即此表)。
// 配额随目标尺寸单调递减(2026-09-02 定案;2026-09-04 按每物种 800 张训练规模放大为方案B,
// 覆盖 5m-100m 目标——<2% 档跨 26m→100m+,主动供给 ~300 且集中在 1-2% 子带,
// 0.5% 以下低于 s档可检线不供给;档位↔距离映射与物理上限见技术设计.md):
// 尺寸越大越易检出、冗余切得越狠,小档护稀缺硬样本;可控档合计 520 + <2% 豁免档 ≈ 800。
// 旧小数据集各档总量 < 配额时配额不生效——超配档才裁剪,不受影响。
type CleanBucket struct {
Label string
MinPct float64
MaxPct float64
Quota int
}
var CleanBuckets = []CleanBucket{
{"<2%", 0, 2, 0},
{"2-3%", 2, 3, 110},
{"3-4%", 3, 4, 100},
{"4-6%", 4, 6, 90},
{"6-8%", 6, 8, 70},
{"8-12%", 8, 12, 60},
{"12-20%", 12, 20, 50},
{">20%", 20, 100, 40},
}