129 lines
8.7 KiB
YAML
129 lines
8.7 KiB
YAML
# 视野后端配置
|
||
server:
|
||
address: ":18080"
|
||
openapiPath: "/api.json"
|
||
# 请求体上限(默认 8MB):APK 上传(管理端下发新版本)可能数百 MB,必须放大
|
||
clientMaxBodySize: "512mb"
|
||
|
||
database:
|
||
default:
|
||
type: sqlite
|
||
# SQLite 数据文件(运行时数据,不提交 git)
|
||
link: "sqlite::@file(./data/observer.db)"
|
||
cache:
|
||
# 查询缓存 TTL(秒)
|
||
ttl: 30
|
||
|
||
auth:
|
||
# 登录 token 签名密钥(HMAC-SHA256,必填):换值即全员下线
|
||
secret: "changeme-auth-secret"
|
||
# 登录 token 有效期(秒),默认 30 天
|
||
tokenTtl: 2592000
|
||
|
||
admin:
|
||
# 后台管理端静态 token:请求头 X-Admin-Token 必须匹配;为空时管理接口全部拒绝
|
||
token: "Tongli686^*^"
|
||
|
||
app:
|
||
# Android APK 上传目录(运行时数据,与 ./data 平级、docker-compose 挂载持久化;
|
||
# 目录下永远只保留最新一个文件 observer-latest.apk,下载地址固定 /download/observer-latest.apk)
|
||
apkDir: "./workspace"
|
||
# 模型训练体系运行时数据根目录(图片/标注/模型/训练产物;与 apkDir 同目录时共用 workspace)
|
||
datasetDir: "./workspace"
|
||
|
||
# 图像生成(管理端「AI 生成图片」):provider 必填项缺失时生成接口返回「图像生成服务未配置」
|
||
imageGen:
|
||
provider: localai # dashscope | localai
|
||
baseUrl: "http://192.168.3.210:18080" # localai 必填:本机 local-ai 地址(/v1/images/generations)
|
||
model: z-image-turbo # localai 上加载的模型名;dashscope 用 qwen-image-3.0
|
||
apiKey: "" # dashscope 必填:DashScope API Key
|
||
poolSize: 1 # 生成任务并发度(z-image 显存独占,默认 1)
|
||
# 通用提示词模板:{species} 取数据集 gen_species(单值,空回退数据集名);{count} 为数量词
|
||
# (固定 "1只",每张仅 1 个目标;原表单数量选择已取消);{scene}/{action}/{light} 池内随机
|
||
# (scene/action/occlusion 从数据集表 gen_scenes/gen_actions/gen_occlusions 池随机,无 config 兜底);
|
||
# {tone} 取数据集表 gen_tone(默认深色,白化个体配浅色);{sizeHint} 按数据集表 gen_heights 站高与
|
||
# 表单距离算出像素高,按画面占比分级尺寸词(像素数与固定物体类比词均不通用,2026-08-31)+ 占比。物种只写名字
|
||
# 不写羽毛细节(细节会把镜头拉近,详见技术设计)。引导语「手机原相机主摄不变焦」(2026-08-31 v4 定案):
|
||
# 与 13px 像素数学完全自洽(公式即按主摄 vfov 52° 计算);手机拍远处目标天然显小(先验同向);
|
||
# 顺带对齐推理端域(App 就是手机拍摄)。演进:广角(前景大主体先验)→ 长焦(物理放大)→ 全删 → 手机主摄不变焦。
|
||
# 拍摄角度描述(仰/俯/平)仍不带;位置锚定「在{distanceWord}的地平线附近」(曾因"上部1/3"遵循力弱去掉位置描述,改地平线锚点重试);
|
||
# 动作/遮挡在普通模板中位于目标之后(动作=叙事焦点=视觉焦点,降级处理)
|
||
promptTemplate: "野外大远景实拍:手机原相机主摄不变焦,{scene},在{distanceWord}的地平线附近有且仅有{count}{species}{sizeHint},{occlusion},{species}在{action},只是很小的{tone}轮廓,隐约可辨,画面绝大部分是{scene},没有任何靠近镜头的动物,{light},写实野外摄影,真实照片质感"
|
||
# 远景小目标模板(代码按尺寸占比 <2% 切换):目标小到动作/遮挡/性别细节无法呈现,保留细节描写会
|
||
# 迫使模型把目标画大(2026-08-31 实测两次失败后定案)——只留「远到看不清任何细节的小点」
|
||
promptTemplateTiny: "野外大远景实拍:手机原相机主摄不变焦,{scene},在{distanceWord}的地平线附近有且仅有{count}{species}{sizeHint},远到看不清任何细节,只是隐约可辨的{tone}小点,画面绝大部分是{scene},没有任何靠近镜头的动物,{light},写实野外摄影,真实照片质感"
|
||
lights: [清晨柔和阳光, 正午明亮天光, 傍晚金色斜阳, 阴天柔和散射光]
|
||
# 目标尺寸提示(sizeHint):按「体高 × focalPx ÷ 表单距离」算出目标在图中的像素高与占比,
|
||
# 注入模板 {sizeHint}——把「厘米」换算成「米」再参与投影公式;focalPx = 图高/2 ÷ tan(vfov/2);
|
||
# 站高取数据集表 gen_heights(创建数据集时 VLM 生成,界面不维护,代码/配置不硬编码)
|
||
assumedVfovDeg: 52 # 镜头垂直视场角(度),固定为手机默认主摄(2026-08-28 用户定案;
|
||
# 曾随机 [15,90]、曾试超广角 90,均已否决)
|
||
|
||
# 训练通道(并发度 1:GPU 独占,同时仅一个 running 任务):
|
||
# mode=subprocess 训练机与服务器同机;mode=ssh 异机(训练脚本/数据集经 ssh 通道同步)
|
||
training:
|
||
mode: ssh # subprocess | ssh
|
||
ssh:
|
||
# host: "192.168.3.210" # 训练机地址(mode=ssh 必填)
|
||
host: "192.168.3.210"
|
||
user: "root"
|
||
port: 22
|
||
privateKeyPath: "" # 私钥路径与 password 二选一
|
||
password: "123"
|
||
workdir: /opt/pheasant_data # 训练机工作目录(train_server.py / yolov8s.pt 所在)
|
||
venvPython: /opt/pheasant_data/venv/bin/python
|
||
datasetDir: datasets # 训练机数据集根目录(相对 workdir,yolo/<name> 为子目录)
|
||
timeoutMinutes: 240 # 训练超时判死(started_at 起算;实测 100 张约 3 分钟,千图级约 1 小时)
|
||
model: yolov8s.pt # 训练基座权重(须已同步到训练机 workdir;s 容量适配小目标+遮挡,详见技术设计)
|
||
imgsz: 1280 # 训练/导出分辨率(须与 App 端推理输入对齐;1280 提升远距离小目标保留像素)
|
||
epochs: 150 # 训练轮数(patience 30 早停,设大可自动停)
|
||
batch: 16 # 批大小(按训练机显存调整)
|
||
device: "0" # GPU 编号(cpu 用 cpu)
|
||
|
||
# RF-DETR 预标注服务(管理端标注工作台):需从服务器可达,未配置时预标注接口返回「标注服务未配置」
|
||
localAi:
|
||
baseUrl: "http://192.168.3.210:18080" # 如 http://127.0.0.1:18080(local-ai 兼容 /v1/detection)
|
||
model: rfdetr-xlarge
|
||
vlmModel: qwen3-vl-8b # VLM 藏匿位补检模型(Qwen3-VL-8B 多模态 GGUF+mmproj,2026-09-02 起与 z-image/rfdetr 三模型共存)
|
||
threshold: 0.2 # 候选置信度下限:0.2 以下直接丢弃(不入库);0.08 实测过低——COCO 通用 rfdetr 对类鸟纹理在 0.08~0.2 区间输出大量噪声候选
|
||
confConfirmed: 0.5 # 置信度 ≥ 0.5 视为确认(class 0 真目标);0.2~0.49 落疑似(class 1)待人工复核(2026-09-02 RNPHE_257 实测调定:误检可达 0.46~0.5 且与真目标仅差 ~0.1,误检落 class 0 会污染训练正样本)
|
||
overlapThreshold: 0.3 # 重叠去重阈值(交叠/较小框面积,NMS 风格;RF-DETR 同目标常输出一大一小两框,minIoU 比 IoU 更能命中)
|
||
inputSize: 700 # 提交前整图等比缩放最长边;RF-DETR 模型包固定 700x700 输入(stretch 拉伸、不支持动态尺寸,见模型包 inference_config.json),提交更大最终也拉伸到 700 无增益,2026-09-01 实测回退
|
||
# 标注类别名(写入 data.yaml,随 result.json 存模型 labels)从数据集表取:
|
||
# 第一类 = gen_species(空回退数据集名),第二类 = gen_classes(空回退 class0/class1)
|
||
|
||
labelTask:
|
||
# 预标注并发度(逐张调 RF-DETR,缺失或非法时回退默认值)
|
||
poolSize: 4
|
||
|
||
# 套餐定价(静态配置,改价 = 改本节点后重启服务;金额单位为分,展示名由 days 派生"N天")
|
||
plans:
|
||
- id: day
|
||
days: 1
|
||
price_cents: 1000
|
||
- id: week
|
||
days: 7
|
||
price_cents: 5600
|
||
- id: month
|
||
days: 30
|
||
price_cents: 18000
|
||
|
||
payment:
|
||
# 回调验签/IO 处理并发度(缺失或非法时回退默认值)
|
||
poolSize: 16
|
||
wechat:
|
||
# 微信支付 APP 支付(APIv3),商户号未配置时接口返回「支付未配置」
|
||
appid: "" # 开放平台 AppID
|
||
mchid: "" # 商户号
|
||
apiV3Key: "" # APIv3 密钥
|
||
serialNo: "" # 商户证书序列号
|
||
privateKey: "" # 商户 API 私钥文件路径(PEM)
|
||
notifyUrl: "" # 回调地址,如 https://api.example.com/api/v1/payment/wechat/notify
|
||
alipay:
|
||
# 支付宝 APP 支付,未配置时接口返回「支付未配置」
|
||
appid: "" # 开放平台 AppID
|
||
privateKey: "" # 应用私钥文件路径(PEM)
|
||
alipayPublicKey: "" # 支付宝公钥文件路径(PEM)
|
||
sellerId: "" # 收款方 PID(回调校验 app_id/seller_id 用)
|
||
notifyUrl: "" # 回调地址,如 https://api.example.com/api/v1/payment/alipay/notify
|