171 lines
7.6 KiB
Go
171 lines
7.6 KiB
Go
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;同机位连续帧近距通常 <8,2026-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/failed(queued=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.tflite(s 档无后缀 = 旧版唯一位,向后兼容)
|
||
TrainingVariantNFileSuffix = "_n"
|
||
|
||
// 训练/模型类型(2026-09-09 综合训练):species=单物种(存量默认)| combined=多物种综合模型
|
||
// (dataset_id=0、dataset_ids=覆盖数据集列表,文件基名 combined)
|
||
TrainingKindSpecies = "species"
|
||
TrainingKindCombined = "combined"
|
||
// 综合模型文件基名与训练机目录名
|
||
TrainingCombinedBase = "combined"
|
||
|
||
// 数据集状态 building → labeled → synced(synced = 已同步训练机)
|
||
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,异场景帧通常 >12,2026-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},
|
||
}
|