diff --git a/server/README.md b/server/README.md index 3368444..feaf004 100644 --- a/server/README.md +++ b/server/README.md @@ -14,11 +14,11 @@ | 套餐 | `config.yml` `plans` 节点配置三档套餐(改价 = 改配置重启),价格**整数分**(1000 / 5600 / 18000) | | 后台管理端 | `server_admin/`(Vue3 + Element Plus)管理页面:订单查询、账号/授权管理(手动授权/撤销)、App 版本管理;构建产物由后端 `/admin/` 托管,登录页输入 token 后以 `X-Admin-Token` 头鉴权(`config.yml admin.token`) | | 版本管理 | 后台管理端上传 Android APK + 更新说明,APK 存服务器 `app.apkDir`(默认 `./workspace/`,与 `./data` 平级、挂载持久化)**固定文件名 `observer-latest.apk`,上传即覆盖,目录永远只保留最新一个文件**;**版本号从文件名识别**:文件须命名为 `observer-x.y.z.apk`(Flutter 打包产物即此命名,版本号取自 pubspec);客户端启动时 `GET /api/v1/app/update` 检查更新:服务器版本高于本地版本即弹更新提示(不可跳过)。**仅 Android 检查,iOS 不做版本下发**(iOS 走 App Store 自行更新)。版本记录可删除:删最新版本联动删除 APK 文件,删历史版本仅删记录 | -| 数据训练(唯一入口) | 后台管理端「数据训练」一个菜单承载数据集全流程:**数据集卡片列表**(封面图/描述/图片数/已标注数/**训练状态徽标**),**卡片下方直接展示训练任务进度条与状态**(无独立训练页);详情页为**图片与标注一体视图**:分页(每页 20 条)逐行「原图 ‖ 标注图」对照展示;**图片入库(手动上传/AI 生成)自动触发 RF-DETR 全图扫描标注**,进度条展示在页顶;页顶另有「全量标注」按钮可手动重标全部图片(覆盖各图已有标注);点击原图/标注图弹窗放大,弹窗内 canvas 直接画框/点框删除/清空并保存——AI 自动标注结果直接作为标注,人工可修改/清理全部框;封面(上传自动转 jpg + UUID 命名)/**描述**/AI 生成图片(provider 抽象:dashscope 通义万相付费 API / localai 训练机 local-ai qwen-image,`config.yml imageGen` 节点切换,见配置说明);AI 标注端点与训练机 SSH 为**全局配置,直接读 `config.yml`**(`localAi` / `training.ssh` 节点,改配置需重启服务);图片落服务器 `app.datasetDir`/`datasets/<数据集名>/`,DB 存元数据 + 标注 JSON | +| 数据训练(唯一入口) | 后台管理端「数据训练」一个菜单承载数据集全流程:**数据集卡片列表**(封面图/描述/图片数/已标注数/**训练状态徽标**),**卡片下方直接展示训练任务进度条与状态**(无独立训练页);详情页为**图片与标注一体视图**:分页(每页 20 条)逐行「原图 ‖ 标注图」对照展示;**图片入库(手动上传/AI 生成)自动触发 RF-DETR 全图扫描标注**,进度条展示在页顶;页顶另有「全量标注」按钮可手动重标全部图片(覆盖各图已有标注);点击原图/标注图弹窗放大,弹窗为**审核视图(不做手动画框)**:点击框选中,列表可确认疑似框/删除误检框/清空并保存——AI 自动标注结果直接作为标注,人工仅审核确认;封面(上传自动转 jpg + UUID 命名)/**描述**/AI 生成图片(provider 抽象:dashscope 通义万相付费 API / localai 训练机 local-ai qwen-image,`config.yml imageGen` 节点切换,见配置说明);AI 标注端点与训练机 SSH 为**全局配置,直接读 `config.yml`**(`localAi` / `training.ssh` 节点,改配置需重启服务);图片落服务器 `app.datasetDir`/`datasets/<数据集名>/`,DB 存元数据 + 标注 JSON | | 模型训练 | 从数据集卡片「开始训练」一键触发(参数 imgsz/epochs/batch/device 默认走 `config.yml` `training` 节点,部署级配置):进度/日志/指标监控(每 epoch 粒度)、取消;训练通道 `training` 节点可配置 subprocess(与 Go 服务同机直接起 python)/ ssh(异机执行,SSH 凭据取 `config.yml` `training.ssh` 节点),并发度 1(GPU 独占);训练脚本 `server/training/train_server.py`(随项目迁移,2026-08-26)参数化,产物(best.tflite/best.pt/曲线)拉回服务器;训练收尾自动做 **tflite 产物自检**(输入/输出 shape 校验,原 `inspect_tflite.py` 逻辑内嵌脚本),自检失败任务置失败并带出原因;`dump_graph.py` 留作训练机人工深度调试 | | 模型版本与热更新 | **每数据集一个模型**:训练完成后一键「发布」(训练任务操作列)——tflite 落 `workspace/trainings/<数据集名>.tflite` + sha256/指标/类别名入 `model_version`(按数据集独立版本序列 m1.0.0 递增)。管理端**无模型管理界面**(版本记录仅支撑客户端下发)。**App 模型热更新**:`GET /api/v1/app/update` 扩展返回 `models` 目录数组,客户端独立检查,新模型下载校验替换,失败回退旧模型——模型迭代不再重打包 APK | | 模型目录与多模型推理 | `GET /api/v1/models`(登录态)返回全部数据集当前生效模型(数据集/版本/类别/大小/sha256/下载地址),下载 URL `/download/trainings/<数据集名>.tflite`;**App 模型管理页**用户自由下载/删除/启用模型,识别时**加载全部已启用模型并行推理 + 跨模型 NMS 合并**(按类别名),内置 assets 模型兜底 | -| 标注 | **图片入库自动触发**:手动上传/AI 生成成功后,新增图自动调 `config.yml` `localAi` 节点配置的 AI 端点做 RF-DETR 全图扫描(`label_task` 记录进度,页顶进度条展示;**localAi 未配置 → 上传/生成接口直接报错;已有标注任务在跑(忙)→ 不报错**,当前任务成功完成后自动补标未标注图)→ 扫描结果(**重叠去重**:NMS 风格按置信度降序保留,重叠比 > `localAi.overlapThreshold` 默认 0.3 的框剔除——重叠比 = 交叠面积/两框较小面积,RF-DETR 同目标常输出一大一小两框,此判据能命中,同目标只留置信度最高者)**直接写 `dataset_image.labels_json`**(覆盖该图已有标注,即重标语义);点击弹窗放大后在 canvas 上画框/点框删除/清空/改类别 → 保存即整体覆写 `dataset_image.labels_json`(YOLO 归一化 JSON 数组,AI 与人工框同存,人工可修改/清理);`POST /admin/label-tasks` 详情页「全量标注」按钮入口(另有自动触发),可发起全量/指定图重标;自动/手动/混合并存,训练前自动整理(prepare_yolo 逻辑在服务端) | +| 标注 | **图片入库自动触发**:手动上传/AI 生成成功后,新增图自动调 `config.yml` `localAi` 节点配置的 AI 端点做 RF-DETR 全图扫描(`label_task` 记录进度,页顶进度条展示;**localAi 未配置 → 上传/生成接口直接报错;已有标注任务在跑(忙)→ 不报错**,当前任务成功完成后自动补标未标注图)→ 扫描结果(**重叠去重**:NMS 风格按置信度降序保留,重叠比 > `localAi.overlapThreshold` 默认 0.3 的框剔除——重叠比 = 交叠面积/两框较小面积,RF-DETR 同目标常输出一大一小两框,此判据能命中,同目标只留置信度最高者)**直接写 `dataset_image.labels_json`**(覆盖该图已有标注,即重标语义);点击弹窗放大进入**审核视图(不做手动画框)**:点击框选中,列表确认疑似框/删除误检框/清空 → 保存即整体覆写 `dataset_image.labels_json`(YOLO 归一化 JSON 数组,AI 标注直写、人工仅审核确认);`POST /admin/label-tasks` 详情页「全量标注」按钮入口(另有自动触发),可发起全量/指定图重标;自动/手动/混合并存,训练前自动整理(prepare_yolo 逻辑在服务端) | ## 架构与数据流 diff --git a/server/biz/service/dataset.go b/server/biz/service/dataset.go index a379882..8ed6ad2 100644 --- a/server/biz/service/dataset.go +++ b/server/biz/service/dataset.go @@ -605,9 +605,11 @@ func (s *datasetService) buildPromptFromTemplate(ctx context.Context, datasetNam species = pool[rand.Intn(len(pool))] } } - // 场景/动作按数据集习性取池(鸭水面、雉鸡灌丛……),未配置该数据集回退通用池 + // 场景/动作/遮挡按数据集习性取池(鸭水面、雉鸡灌丛……),未配置该数据集回退通用池; + // 遮挡:身体完全暴露的个体对识别标注训练无意义,每张必带(程度轻~重随机) scene := pickCfgByDataset(ctx, datasetName, "imageGen.sceneByDataset", "imageGen.scenes") action := pickCfgByDataset(ctx, datasetName, "imageGen.actionByDataset", "imageGen.actions") + occlusion := pickCfgByDataset(ctx, datasetName, "imageGen.occlusionByDataset", "imageGen.occlusions") light := pickCfg(ctx, "imageGen.lights") // 轮廓色词按物种(白化个体如白雉鸡配浅色,默认深色剪影) tone := g.Cfg().MustGet(ctx, "imageGen.speciesTone."+species, "深色").String() @@ -623,8 +625,8 @@ func (s *datasetService) buildPromptFromTemplate(ctx context.Context, datasetNam out := tpl for k, v := range map[string]string{ "{scene}": scene, "{species}": species, "{count}": countWord, - "{action}": action, "{light}": light, "{distanceWord}": distWord, "{sizeHint}": sizeHint, - "{tone}": tone, + "{action}": action, "{occlusion}": occlusion, "{light}": light, + "{distanceWord}": distWord, "{sizeHint}": sizeHint, "{tone}": tone, } { out = strings.ReplaceAll(out, k, v) } diff --git a/server/config.yml b/server/config.yml index 0f262ce..8abb5e8 100644 --- a/server/config.yml +++ b/server/config.yml @@ -44,7 +44,7 @@ imageGen: # 物种只写名字不写羽毛细节(细节会把镜头拉近,详见技术设计)。不带拍摄角度描述(2026-08-28): # 角度描述会与目标位置耦合,仰拍使贴地目标沉底、固定俯拍构图单一——交由模型平视先验自由构图, # 目标自然落在中部/上部 - promptTemplate: "野外大远景实拍:广角镜头下{scene},{distanceWord}有且仅有{count}{species}的小小身影{sizeHint}在{action},{species}离镜头很远,只是很小的{tone}轮廓,隐约可辨,画面绝大部分是{scene},没有任何靠近镜头的动物,{light},写实野外摄影,真实照片质感" + promptTemplate: "野外大远景实拍:广角镜头下{scene},{distanceWord}有且仅有{count}{species}的小小身影{sizeHint}在{action},{occlusion},{species}离镜头很远,只是很小的{tone}轮廓,隐约可辨,画面绝大部分是{scene},没有任何靠近镜头的动物,{light},写实野外摄影,真实照片质感" speciesByDataset: # 数据集名 → 物种池(表单未填动物名称时随机取一个) 鸽子: [家鸽,火斑鸠,虎纹斑鸠,珠颈斑鸠,灰斑鸠] 雉鸡: [雉鸡,白雉鸡] @@ -91,6 +91,36 @@ imageGen: 兔子: [低头啃食草叶, 警觉地竖起耳朵, 小步跳跃前行, 蹲坐不动, 啃食草叶] 鸭子: [缓缓游动于水面, 低头潜入水中觅食, 水面梳理羽毛, 缓慢划水前行, 岸边泥滩觅食] 鹌鹑: [低头啄食, 草丛间觅食, 小步疾走, 停歇不动] + # 遮挡描述池(模板 {occlusion} 占位,插在「在{action}」之后):身体完全暴露的个体对识别/标注训练 + # 无意义,每张必取一条(全池覆盖轻~重遮挡,程度随机);遮挡物多样(杂草/树叶/枝条等),须与场景自洽 + occlusions: # 通用遮挡池(未配置 occlusionByDataset 的数据集回退此池) + - "身体部分被前景的杂草遮挡" + - "大半个身体隐入草丛,只露出头背" + - "身体被身前的杂草枝条半遮半掩" + - "只有头背部从茂密草丛中露出" + - "身体部分被低垂的树叶和枝条遮挡" + - "大半个身体隐在枝叶间,只露出头背" + occlusionByDataset: # 数据集名 → 遮挡池(按动物习性与场景配置;未配置回退通用 occlusions) + 雉鸡: + - "身体部分被前方的草丛和矮灌丛遮挡" + - "大半个身子隐入灌丛枝叶间,只露出头颈" + - "身体被身前的枯草丛半遮半掩" + - "只有头背部从密草丛中露出" + - "身体藏在树影下,被垂落的树叶半遮" + 兔子: + - "身体部分被荒草遮挡,只露出头部" + - "大半身体隐入草丛,一对长耳竖在草尖上方" + - "身体被身前的枯黄野草半掩" + - "身体部分被林缘的树叶和枝条遮挡" + 鸭子: + - "身体部分隐入岸边芦苇丛中" + - "半身没入水面,只露出头背" + - "身体被岸边的芦苇和杂草半遮" + - "身体部分隐入岸边垂落的枝叶间" + 鹌鹑: + - "身体隐在密草丛中,只露出头部" + - "大半身体藏进草丛,隐约只见头和背部" + - "身体藏在草叶和落叶之间,只露出头部" # 目标尺寸提示(sizeHint):按「体高 × focalPx ÷ 表单距离」算出目标在图中的像素高与占比, # 注入模板 {sizeHint}——把「厘米」换算成「米」再参与投影公式;focalPx = 图高/2 ÷ tan(vfov/2) assumedVfovDeg: 52 # 镜头垂直视场角(度),固定为手机默认主摄(2026-08-28 用户定案; diff --git a/server/data/observer.db b/server/data/observer.db index 23120ff..d13fbf4 100644 Binary files a/server/data/observer.db and b/server/data/observer.db differ diff --git a/server/workspace/datasets/兔子/32058343-7231-41c9-884f-44175e1cf090.jpg b/server/workspace/datasets/兔子/32058343-7231-41c9-884f-44175e1cf090.jpg deleted file mode 100644 index 5f9440e..0000000 Binary files a/server/workspace/datasets/兔子/32058343-7231-41c9-884f-44175e1cf090.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/0d013220-1a1a-4a44-84b0-e5616b7604a5.jpg b/server/workspace/datasets/雉鸡/0d013220-1a1a-4a44-84b0-e5616b7604a5.jpg deleted file mode 100644 index 93e13b3..0000000 Binary files a/server/workspace/datasets/雉鸡/0d013220-1a1a-4a44-84b0-e5616b7604a5.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_01.jpg b/server/workspace/datasets/雉鸡/pheasant_01.jpg deleted file mode 100644 index 505cb4e..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_01.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_02.jpg b/server/workspace/datasets/雉鸡/pheasant_02.jpg deleted file mode 100644 index 077e567..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_02.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_03.jpg b/server/workspace/datasets/雉鸡/pheasant_03.jpg deleted file mode 100644 index a1cef70..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_03.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_04.jpg b/server/workspace/datasets/雉鸡/pheasant_04.jpg deleted file mode 100644 index 0b5978f..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_04.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_05.jpg b/server/workspace/datasets/雉鸡/pheasant_05.jpg deleted file mode 100644 index 9e83d3b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_05.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_06.jpg b/server/workspace/datasets/雉鸡/pheasant_06.jpg deleted file mode 100644 index 0ca8f7c..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_06.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_07.jpg b/server/workspace/datasets/雉鸡/pheasant_07.jpg deleted file mode 100644 index dc16a8f..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_07.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_08.jpg b/server/workspace/datasets/雉鸡/pheasant_08.jpg deleted file mode 100644 index 464c805..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_08.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_09.jpg b/server/workspace/datasets/雉鸡/pheasant_09.jpg deleted file mode 100644 index 63b0706..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_09.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_10.jpg b/server/workspace/datasets/雉鸡/pheasant_10.jpg deleted file mode 100644 index 7b83a97..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_10.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_100.jpg b/server/workspace/datasets/雉鸡/pheasant_100.jpg deleted file mode 100644 index e529382..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_100.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_101.jpg b/server/workspace/datasets/雉鸡/pheasant_101.jpg deleted file mode 100644 index d3d4f10..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_101.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_102.jpg b/server/workspace/datasets/雉鸡/pheasant_102.jpg deleted file mode 100644 index 9cf81b1..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_102.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_106.jpg b/server/workspace/datasets/雉鸡/pheasant_106.jpg deleted file mode 100644 index 6500a81..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_106.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_107.jpg b/server/workspace/datasets/雉鸡/pheasant_107.jpg deleted file mode 100644 index 5deaad2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_107.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_108.jpg b/server/workspace/datasets/雉鸡/pheasant_108.jpg deleted file mode 100644 index 86b13ed..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_108.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_109.jpg b/server/workspace/datasets/雉鸡/pheasant_109.jpg deleted file mode 100644 index 5a1b378..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_109.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_11.jpg b/server/workspace/datasets/雉鸡/pheasant_11.jpg deleted file mode 100644 index bf6afa8..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_11.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_12.jpg b/server/workspace/datasets/雉鸡/pheasant_12.jpg deleted file mode 100644 index 7863e29..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_12.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_13.jpg b/server/workspace/datasets/雉鸡/pheasant_13.jpg deleted file mode 100644 index 3caff68..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_13.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_14.jpg b/server/workspace/datasets/雉鸡/pheasant_14.jpg deleted file mode 100644 index 81a5bdf..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_14.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_15.jpg b/server/workspace/datasets/雉鸡/pheasant_15.jpg deleted file mode 100644 index 8f00d26..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_15.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_16.jpg b/server/workspace/datasets/雉鸡/pheasant_16.jpg deleted file mode 100644 index 1dbc3f7..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_16.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_17.jpg b/server/workspace/datasets/雉鸡/pheasant_17.jpg deleted file mode 100644 index 1506443..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_17.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_18.jpg b/server/workspace/datasets/雉鸡/pheasant_18.jpg deleted file mode 100644 index 2221c0b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_18.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_19.jpg b/server/workspace/datasets/雉鸡/pheasant_19.jpg deleted file mode 100644 index 519d7b4..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_19.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_20.jpg b/server/workspace/datasets/雉鸡/pheasant_20.jpg deleted file mode 100644 index 8b1457b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_20.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_21.jpg b/server/workspace/datasets/雉鸡/pheasant_21.jpg deleted file mode 100644 index 1227dcf..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_21.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_22.jpg b/server/workspace/datasets/雉鸡/pheasant_22.jpg deleted file mode 100644 index 2bc9e30..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_22.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_23.jpg b/server/workspace/datasets/雉鸡/pheasant_23.jpg deleted file mode 100644 index 19c171d..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_23.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_24.jpg b/server/workspace/datasets/雉鸡/pheasant_24.jpg deleted file mode 100644 index 945fc98..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_24.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_25.jpg b/server/workspace/datasets/雉鸡/pheasant_25.jpg deleted file mode 100644 index 12e352b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_25.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_26.jpg b/server/workspace/datasets/雉鸡/pheasant_26.jpg deleted file mode 100644 index aca7304..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_26.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_27.jpg b/server/workspace/datasets/雉鸡/pheasant_27.jpg deleted file mode 100644 index 66b1255..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_27.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_28.jpg b/server/workspace/datasets/雉鸡/pheasant_28.jpg deleted file mode 100644 index d335abe..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_28.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_29.jpg b/server/workspace/datasets/雉鸡/pheasant_29.jpg deleted file mode 100644 index b3c1470..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_29.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_30.jpg b/server/workspace/datasets/雉鸡/pheasant_30.jpg deleted file mode 100644 index 8a27a37..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_30.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_31.jpg b/server/workspace/datasets/雉鸡/pheasant_31.jpg deleted file mode 100644 index 32f76b3..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_31.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_32.jpg b/server/workspace/datasets/雉鸡/pheasant_32.jpg deleted file mode 100644 index 159840f..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_32.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_33.jpg b/server/workspace/datasets/雉鸡/pheasant_33.jpg deleted file mode 100644 index 48498f1..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_33.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_34.jpg b/server/workspace/datasets/雉鸡/pheasant_34.jpg deleted file mode 100644 index eeaa817..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_34.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_35.jpg b/server/workspace/datasets/雉鸡/pheasant_35.jpg deleted file mode 100644 index fe6c108..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_35.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_36.jpg b/server/workspace/datasets/雉鸡/pheasant_36.jpg deleted file mode 100644 index 2438a44..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_36.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_37.jpg b/server/workspace/datasets/雉鸡/pheasant_37.jpg deleted file mode 100644 index d2d0840..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_37.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_38.jpg b/server/workspace/datasets/雉鸡/pheasant_38.jpg deleted file mode 100644 index 07c5755..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_38.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_39.jpg b/server/workspace/datasets/雉鸡/pheasant_39.jpg deleted file mode 100644 index eaec1a0..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_39.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_40.jpg b/server/workspace/datasets/雉鸡/pheasant_40.jpg deleted file mode 100644 index 1819191..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_40.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_41.jpg b/server/workspace/datasets/雉鸡/pheasant_41.jpg deleted file mode 100644 index a5e0707..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_41.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_42.jpg b/server/workspace/datasets/雉鸡/pheasant_42.jpg deleted file mode 100644 index b2caec2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_42.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_43.jpg b/server/workspace/datasets/雉鸡/pheasant_43.jpg deleted file mode 100644 index 68244af..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_43.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_44.jpg b/server/workspace/datasets/雉鸡/pheasant_44.jpg deleted file mode 100644 index f7fd857..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_44.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_45.jpg b/server/workspace/datasets/雉鸡/pheasant_45.jpg deleted file mode 100644 index 9095e30..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_45.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_46.jpg b/server/workspace/datasets/雉鸡/pheasant_46.jpg deleted file mode 100644 index 018c83d..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_46.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_47.jpg b/server/workspace/datasets/雉鸡/pheasant_47.jpg deleted file mode 100644 index 2879bcc..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_47.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_48.jpg b/server/workspace/datasets/雉鸡/pheasant_48.jpg deleted file mode 100644 index 7a5d42c..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_48.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_49.jpg b/server/workspace/datasets/雉鸡/pheasant_49.jpg deleted file mode 100644 index 5709d12..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_49.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_50.jpg b/server/workspace/datasets/雉鸡/pheasant_50.jpg deleted file mode 100644 index 2990c17..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_50.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_51.jpg b/server/workspace/datasets/雉鸡/pheasant_51.jpg deleted file mode 100644 index c34e274..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_51.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_52.jpg b/server/workspace/datasets/雉鸡/pheasant_52.jpg deleted file mode 100644 index 5e7e887..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_52.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_53.jpg b/server/workspace/datasets/雉鸡/pheasant_53.jpg deleted file mode 100644 index 649ccd3..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_53.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_54.jpg b/server/workspace/datasets/雉鸡/pheasant_54.jpg deleted file mode 100644 index f7d3569..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_54.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_55.jpg b/server/workspace/datasets/雉鸡/pheasant_55.jpg deleted file mode 100644 index 93fe83b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_55.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_56.jpg b/server/workspace/datasets/雉鸡/pheasant_56.jpg deleted file mode 100644 index 0474a97..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_56.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_57.jpg b/server/workspace/datasets/雉鸡/pheasant_57.jpg deleted file mode 100644 index e0f5362..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_57.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_58.jpg b/server/workspace/datasets/雉鸡/pheasant_58.jpg deleted file mode 100644 index b00a1c2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_58.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_59.jpg b/server/workspace/datasets/雉鸡/pheasant_59.jpg deleted file mode 100644 index 85c93a4..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_59.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_60.jpg b/server/workspace/datasets/雉鸡/pheasant_60.jpg deleted file mode 100644 index 6b295e5..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_60.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_61.jpg b/server/workspace/datasets/雉鸡/pheasant_61.jpg deleted file mode 100644 index 6d0fa00..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_61.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_62.jpg b/server/workspace/datasets/雉鸡/pheasant_62.jpg deleted file mode 100644 index f5632de..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_62.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_63.jpg b/server/workspace/datasets/雉鸡/pheasant_63.jpg deleted file mode 100644 index 80308a1..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_63.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_64.jpg b/server/workspace/datasets/雉鸡/pheasant_64.jpg deleted file mode 100644 index 877927b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_64.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_65.jpg b/server/workspace/datasets/雉鸡/pheasant_65.jpg deleted file mode 100644 index b503eaf..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_65.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_66.jpg b/server/workspace/datasets/雉鸡/pheasant_66.jpg deleted file mode 100644 index 8e7fba0..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_66.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_67.jpg b/server/workspace/datasets/雉鸡/pheasant_67.jpg deleted file mode 100644 index f64e248..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_67.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_68.jpg b/server/workspace/datasets/雉鸡/pheasant_68.jpg deleted file mode 100644 index 10ecdc6..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_68.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_69.jpg b/server/workspace/datasets/雉鸡/pheasant_69.jpg deleted file mode 100644 index 8a54d48..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_69.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_70.jpg b/server/workspace/datasets/雉鸡/pheasant_70.jpg deleted file mode 100644 index efa6366..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_70.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_71.jpg b/server/workspace/datasets/雉鸡/pheasant_71.jpg deleted file mode 100644 index 1f958d2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_71.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_72.jpg b/server/workspace/datasets/雉鸡/pheasant_72.jpg deleted file mode 100644 index 843f850..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_72.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_73.jpg b/server/workspace/datasets/雉鸡/pheasant_73.jpg deleted file mode 100644 index 7c67201..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_73.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_74.jpg b/server/workspace/datasets/雉鸡/pheasant_74.jpg deleted file mode 100644 index 2614192..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_74.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_75.jpg b/server/workspace/datasets/雉鸡/pheasant_75.jpg deleted file mode 100644 index 5453d2b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_75.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_76.jpg b/server/workspace/datasets/雉鸡/pheasant_76.jpg deleted file mode 100644 index b396836..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_76.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_77.jpg b/server/workspace/datasets/雉鸡/pheasant_77.jpg deleted file mode 100644 index d6695b7..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_77.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_78.jpg b/server/workspace/datasets/雉鸡/pheasant_78.jpg deleted file mode 100644 index 6ce4f72..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_78.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_79.jpg b/server/workspace/datasets/雉鸡/pheasant_79.jpg deleted file mode 100644 index d8c10db..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_79.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_80.jpg b/server/workspace/datasets/雉鸡/pheasant_80.jpg deleted file mode 100644 index 3c1dc86..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_80.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_81.jpg b/server/workspace/datasets/雉鸡/pheasant_81.jpg deleted file mode 100644 index aa3bb87..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_81.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_82.jpg b/server/workspace/datasets/雉鸡/pheasant_82.jpg deleted file mode 100644 index 67b726a..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_82.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_83.jpg b/server/workspace/datasets/雉鸡/pheasant_83.jpg deleted file mode 100644 index a96da08..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_83.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_84.jpg b/server/workspace/datasets/雉鸡/pheasant_84.jpg deleted file mode 100644 index 7603562..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_84.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_85.jpg b/server/workspace/datasets/雉鸡/pheasant_85.jpg deleted file mode 100644 index 7f8815f..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_85.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_86.jpg b/server/workspace/datasets/雉鸡/pheasant_86.jpg deleted file mode 100644 index 46c4ffd..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_86.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_87.jpg b/server/workspace/datasets/雉鸡/pheasant_87.jpg deleted file mode 100644 index 40afb7c..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_87.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_88.jpg b/server/workspace/datasets/雉鸡/pheasant_88.jpg deleted file mode 100644 index 60ea1a2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_88.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_89.jpg b/server/workspace/datasets/雉鸡/pheasant_89.jpg deleted file mode 100644 index ee77e13..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_89.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_90.jpg b/server/workspace/datasets/雉鸡/pheasant_90.jpg deleted file mode 100644 index 394a0d2..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_90.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_91.jpg b/server/workspace/datasets/雉鸡/pheasant_91.jpg deleted file mode 100644 index 3df010f..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_91.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_92.jpg b/server/workspace/datasets/雉鸡/pheasant_92.jpg deleted file mode 100644 index 34ec821..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_92.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_93.jpg b/server/workspace/datasets/雉鸡/pheasant_93.jpg deleted file mode 100644 index 4822176..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_93.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_94.jpg b/server/workspace/datasets/雉鸡/pheasant_94.jpg deleted file mode 100644 index 4ff4963..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_94.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_95.jpg b/server/workspace/datasets/雉鸡/pheasant_95.jpg deleted file mode 100644 index 077b9ff..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_95.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_96.jpg b/server/workspace/datasets/雉鸡/pheasant_96.jpg deleted file mode 100644 index 0aab6f5..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_96.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_97.jpg b/server/workspace/datasets/雉鸡/pheasant_97.jpg deleted file mode 100644 index 2db609a..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_97.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_98.jpg b/server/workspace/datasets/雉鸡/pheasant_98.jpg deleted file mode 100644 index 2f49984..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_98.jpg and /dev/null differ diff --git a/server/workspace/datasets/雉鸡/pheasant_99.jpg b/server/workspace/datasets/雉鸡/pheasant_99.jpg deleted file mode 100644 index b3e737b..0000000 Binary files a/server/workspace/datasets/雉鸡/pheasant_99.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸭子/0361b693-fe4b-4098-8dd9-c2973e77289e.jpg b/server/workspace/datasets/鸭子/0361b693-fe4b-4098-8dd9-c2973e77289e.jpg deleted file mode 100644 index c1cb33c..0000000 Binary files a/server/workspace/datasets/鸭子/0361b693-fe4b-4098-8dd9-c2973e77289e.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/f2a8cf0e-534e-4aba-9288-54d8d2180666.jpg b/server/workspace/datasets/鸽子/f2a8cf0e-534e-4aba-9288-54d8d2180666.jpg deleted file mode 100644 index 9712d75..0000000 Binary files a/server/workspace/datasets/鸽子/f2a8cf0e-534e-4aba-9288-54d8d2180666.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_01.jpg b/server/workspace/datasets/鸽子/pigeon_01.jpg deleted file mode 100644 index 04c8a6f..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_01.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_02.jpg b/server/workspace/datasets/鸽子/pigeon_02.jpg deleted file mode 100644 index 27d5a4a..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_02.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_03.jpg b/server/workspace/datasets/鸽子/pigeon_03.jpg deleted file mode 100644 index c6ec107..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_03.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_04.jpg b/server/workspace/datasets/鸽子/pigeon_04.jpg deleted file mode 100644 index 33c5b93..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_04.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_05.jpg b/server/workspace/datasets/鸽子/pigeon_05.jpg deleted file mode 100644 index 7f24426..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_05.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_06.jpg b/server/workspace/datasets/鸽子/pigeon_06.jpg deleted file mode 100644 index 0f2701e..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_06.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_07.jpg b/server/workspace/datasets/鸽子/pigeon_07.jpg deleted file mode 100644 index 727518f..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_07.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_08.jpg b/server/workspace/datasets/鸽子/pigeon_08.jpg deleted file mode 100644 index 98044d0..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_08.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_09.jpg b/server/workspace/datasets/鸽子/pigeon_09.jpg deleted file mode 100644 index f84dbc0..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_09.jpg and /dev/null differ diff --git a/server/workspace/datasets/鸽子/pigeon_11.jpg b/server/workspace/datasets/鸽子/pigeon_11.jpg deleted file mode 100644 index 69810b7..0000000 Binary files a/server/workspace/datasets/鸽子/pigeon_11.jpg and /dev/null differ diff --git a/server/workspace/datasets/鹌鹑/d5dc7788-dd70-44ae-901b-5c2f9de242b1.jpg b/server/workspace/datasets/鹌鹑/d5dc7788-dd70-44ae-901b-5c2f9de242b1.jpg deleted file mode 100644 index 3c0da36..0000000 Binary files a/server/workspace/datasets/鹌鹑/d5dc7788-dd70-44ae-901b-5c2f9de242b1.jpg and /dev/null differ diff --git a/server/技术设计.md b/server/技术设计.md index 160139c..7e9e822 100644 --- a/server/技术设计.md +++ b/server/技术设计.md @@ -83,7 +83,7 @@ CREATE TABLE IF NOT EXISTS dataset_image ( filename TEXT NOT NULL, -- 唯一文件名(防重名加时间戳后缀) source TEXT NOT NULL DEFAULT 'manual', -- manual | ai prompt TEXT, -- AI 生成图记录提示词(追溯用) - labels_json TEXT, -- 标注 JSON 数组(YOLO 归一化 xywh+类别+置信度),AI 自动标注与人工标注同存(人工可修改/清理),null/''/'[]'=未标注 + labels_json TEXT, -- 标注 JSON 数组(YOLO 归一化 xywh+类别+置信度),AI 自动标注直写、人工仅审核确认(2026-08-28:疑似确认/误检删除,不手动画框),null/''/'[]'=未标注 created_at TEXT NOT NULL, UNIQUE (dataset_id, filename) ); @@ -153,7 +153,7 @@ CREATE INDEX IF NOT EXISTS idx_model_training_status ON model_training(status); - v7 = `dataset` / `dataset_image` / `model_training` / `model_version` / `label_task` 新表(模型训练体系;各 `dao` init `CREATE TABLE IF NOT EXISTS` 自动建,此处记录 DDL 变更) - v8 = `dataset` 加 9 列(`cover`/`description`/`ai_endpoint`/`ai_model`/`train_host`/`train_user`/`train_password`/`train_key`)+ `label_task` 加 `filenames` 列(多选批量标注;`PRAGMA table_info` 逐列检测缺失才 `ALTER TABLE ... ADD COLUMN`,新库建表自带跳过)——**其中 6 列(ai/train 覆盖字段)为遗留列**:AI 标注/训练机 SSH 配置统一走 `config.yml`(`localAi` / `training.ssh`),新代码不读写,存量库保留不迁移 - v9 = 标注存储从文件迁移入库:`dataset_image` 加 `labels_json`/`candidates_json` 两列(`common.EnsureColumn` 迁移),启动时把历史 `labels/<数据集>/*.txt` 解析入 `labels_json`(幂等:仅未迁移行处理),`boxes.json` 废弃;**历史 labels/ 目录与迁移代码已删除(2026-08-26:数据全部入表后无保留价值)** -- v10 = 标注流程简化(撤销候选确认两阶段):`ALTER TABLE dataset_image DROP COLUMN candidates_json`(`PRAGMA table_info` 检测列存在才 DROP,新库建表已无此列直接跳过;存量候选数据为空直接删)——AI 预标注结果直写 `labels_json`,人工可修改/清理全部标注框 +- v10 = 标注流程简化(撤销候选确认两阶段):`ALTER TABLE dataset_image DROP COLUMN candidates_json`(`PRAGMA table_info` 检测列存在才 DROP,新库建表已无此列直接跳过;存量候选数据为空直接删)——AI 预标注结果直写 `labels_json`,人工仅审核确认(2026-08-28 定案:疑似框确认/误检删除,不手动画框) - v11 = 移除模型存档回退机制:`ALTER TABLE model_version DROP COLUMN model_file`(模型文件不落表:发布即写 `trainings/<数据集名>.tflite`,客户端固定下载) - v12 = 清理孤儿字段:`dataset` 删 6 列(`ai_endpoint`/`ai_model`/`train_host`/`train_user`/`train_password`/`train_key`,配置统一走 `config.yml` 的 `localAi`/`training.ssh`,零读写)+ `model_version` 删 `artifact_file`(zip 产物布局移除后无人写)+ `label_task` 删 `boxes_file`(标注已入库,候选框文件机制废弃)——均 `PRAGMA table_info` 检测列存在才 `ALTER TABLE ... DROP COLUMN`,新库建表已无此列自动跳过 @@ -307,7 +307,7 @@ Android 客户端启动 GET /api/v1/app/update(公开,无需 token;iOS 不 ``` 管理端 数据集管理(上传 / AI 生成)→ 图片落服务器 workspace/datasets// - ├─► 二期:标注工作台(RF-DETR 预标注 + 人工确认)→ labels/ + ├─► 二期:标注工作台(RF-DETR 预标注 + VLM 藏匿位补检,人工仅审核确认) └─► 发起训练 → 同步数据集到训练机 → runner 起训练 → 进度/日志/指标 └─► 产物(best.tflite + best.pt 归档)拉回服务器 └─► 发布 → model_version + workspace/model-latest.tflite(sha256) @@ -316,7 +316,7 @@ Android 客户端启动 GET /api/v1/app/update(公开,无需 token;iOS 不 ### 数据集存储与流转(决策:图片不进 DB、不提交 git) -- 图片目录:`app.datasetDir`(默认 `./workspace/`)下 `datasets/<数据集名>/`(图片平铺,文件名唯一防重名);标注存 `dataset_image.labels_json`(JSON 数组,每元素 `{class,cx,cy,w,h,confidence}` 归一化,AI 自动标注与人工标注同存、人工可修改/清理);**历史 labels/ txt 目录与 yolo 暂存目录已删除(2026-08-26,标注全在 DB,训练集流式化不落本地盘)** +- 图片目录:`app.datasetDir`(默认 `./workspace/`)下 `datasets/<数据集名>/`(图片平铺,文件名唯一防重名);标注存 `dataset_image.labels_json`(JSON 数组,每元素 `{class,cx,cy,w,h,confidence}` 归一化,AI 自动标注直写、人工仅审核确认——2026-08-28:疑似确认/误检删除,不手动画框);**历史 labels/ txt 目录与 yolo 暂存目录已删除(2026-08-26,标注全在 DB,训练集流式化不落本地盘)** - **封面命名规范(2026-08-26)**:封面文件不得固定命名 `cover`,上传时解码为 **jpg 格式 + UUIDv4 命名**(`common.UuidV4()` 生成,crypto/rand 无第三方依赖,落盘 `datasets//.jpg`,旧封面删除);DB `cover` 列只存文件名,前端用 DB 值拼 URL 零改动;删除/校验按 `isCoverName` 正则(UUID v4 + `.jpg` 后缀)识别,不认固定名——历史 `cover.jpg` 等存量封面启动时 `MigrateLegacyCovers` 幂等重命名迁移 - DB 只存文件名/来源/prompt 等元数据(`dataset` / `dataset_image`),**禁止图片进库** - 生成/上传图片是**付费资产**:删除接口必须带前端确认文案(提示 AI 生成图有成本);删除 = 删文件 + 删记录,目录清理 @@ -330,9 +330,9 @@ Android 客户端启动 GET /api/v1/app/update(公开,无需 token;iOS 不 - `baseUrl`/`apiKey` 缺失时对应 provider 视为未配置,生成接口返回「图像生成服务未配置」 - 尺寸参数由前端传(固定竖版 704x1248,比例与既有训练图 1152x2048 一致、32 倍数对齐);**实测竖版图在 local-ai 上极慢(约 26 分钟/张,Qwen-Image 行列注意力对非方形输入效率差,与分辨率关系不大;方形 1024x1024 仅 5 分钟)**,超时与前端等待按此配置,一次建议 1 张 - 生成同步执行(count 1..8,每张超时 `imageGen.timeoutSeconds`,默认 120s;localai 建议 600),逐张落盘 + 入库(记录 prompt 便于追溯);中途失败返回错误(已成功的图保留,不删除——付费资产原则) -- prompt 手填覆盖;留空走 `imageGen.promptTemplate` 通用模板逐张组装(物种池 speciesByDataset 按数据集名、数量词=animalCount、场景/动作/光线池随机,每张独立组装保持多样性;物种只写名字不写羽毛细节,细节会拉近镜头);**遵守项目提示词规范:不得包含目标位置描述**(位置由模型自行推理,前端模板与校验文案落实此约束) +- prompt 手填覆盖;留空走 `imageGen.promptTemplate` 通用模板逐张组装(物种池 speciesByDataset 按数据集名、数量词=animalCount、场景/动作/光线/遮挡池随机,每张独立组装保持多样性;物种只写名字不写羽毛细节,细节会拉近镜头);**遵守项目提示词规范:不得包含目标位置描述**(位置由模型自行推理,前端模板与校验文案落实此约束) - **生成图距离/数量校验(2026-08-28)**:表单填 `distance`(米,固定值) 与 `animalCount` 后逐张启用;**距离校验已取消(2026-08-28)**:生成即入库,无逐张拒检;参数与公式见 git 历史(物理公式 d=体高×focalPx÷像素高) -- **VLM 藏匿位补检(两阶段第二阶段)**:`/datasets/images/vlm-review` 单图接口;qwen3.8-9b(+mmproj) 以「图片+物种(生成 prompt 与物种池匹配)+场景光线线索+已确认框坐标(排除)」推理藏匿位,输出归一化 bbox JSON(范围校验+与已有框重叠去重),追加 ≤3 个 class=1 疑似框进同一 labels_json;VL 与 z-image 显存互斥(12G 装不下两者),批量补检在生成队列空闲后执行;qwen3.8-9b yaml 自带 mmproj 实为多模态模型(生成校验);自动标注框数按置信度降序裁剪 ≤ animal_count(存 dataset_image.animal_count 列),估算距离 = 物种站高 × focalPx ÷ 最大框高像素(focalPx=`图高/2/tan(vfov/2)`,站高按物种查 `imageGen.speciesHeights`,单位 cm 换算为米,未配置物种代码兜底 35cm;**2026-08-28 语义修正**:speciesHeights 为站高(垂直尺度,鸟=脚到头顶、兽=蹲坐高),勿用体长——与提示词「高度」描述及检测框高自洽;避免跨物种共用一个标定系数)(K=1.8:6%≈30m、4.5%≈40m,K 隐含镜头视场角假设);**镜头固定主摄(2026-08-28 定案)**:vfov 固定 `imageGen.assumedVfovDeg=52°`(手机默认主摄;曾随机 [15,90] 覆盖面广但目标像素波动 7~57px 不可控,曾试超广角 90 亦否决);**场景/动作按数据集(2026-08-28)**:`imageGen.sceneByDataset`/`actionByDataset` 按数据集名配池(鸭→水面、雉鸡→灌丛草丛、兔→草坡荒地、鹌鹑→草丛),未配置回退通用 scenes/actions;**拍摄角度(2026-08-28,已废弃角度描述)**:不带任何拍摄角度描述——演进:固定「上部三分之一」区域描述对文生图模型遵循力弱(生成物落底)→ 加固定俯拍(目标上移成功但构图单一,用户否决)→ 池内随机俯/平/仰(仰拍使贴地目标必然沉底,用户否决)→ 只留俯拍/平视(用户仍嫌啰嗦)→ **完全去掉角度描述**(2026-08-28 定案):交由模型平视先验自由构图,目标自然落在画面中部/上部;模板只靠「{species}离镜头很远,只是很小的{tone}轮廓」(物种名替代泛称「目标」,不限定鸟类——物种池含兔子等非鸟物种;`{tone}` 轮廓色词按 `imageGen.speciesTone.<物种>` 取,默认深色剪影,**白雉鸡配浅色**——白羽个体用「深色轮廓」描述会与模型渲染矛盾,2026-08-28)维持远景感,手填提示词仅追加数量约束;不合格丢弃重生成,单张上限 3 次(`consts.GenValidateMaxAttempts`),连续不合格整体报错(已合格张数保留) +- **VLM 藏匿位补检(两阶段第二阶段)**:`/datasets/images/vlm-review` 单图接口;qwen3.8-9b(+mmproj) 以「图片+物种(生成 prompt 与物种池匹配)+场景光线线索+已确认框坐标(排除)」推理藏匿位,输出归一化 bbox JSON(范围校验+与已有框重叠去重),追加 ≤3 个 class=1 疑似框进同一 labels_json;VL 与 z-image 显存互斥(12G 装不下两者),批量补检在生成队列空闲后执行;qwen3.8-9b yaml 自带 mmproj 实为多模态模型(生成校验);自动标注框数按置信度降序裁剪 ≤ animal_count(存 dataset_image.animal_count 列),估算距离 = 物种站高 × focalPx ÷ 最大框高像素(focalPx=`图高/2/tan(vfov/2)`,站高按物种查 `imageGen.speciesHeights`,单位 cm 换算为米,未配置物种代码兜底 35cm;**2026-08-28 语义修正**:speciesHeights 为站高(垂直尺度,鸟=脚到头顶、兽=蹲坐高),勿用体长——与提示词「高度」描述及检测框高自洽;避免跨物种共用一个标定系数)(K=1.8:6%≈30m、4.5%≈40m,K 隐含镜头视场角假设);**镜头固定主摄(2026-08-28 定案)**:vfov 固定 `imageGen.assumedVfovDeg=52°`(手机默认主摄;曾随机 [15,90] 覆盖面广但目标像素波动 7~57px 不可控,曾试超广角 90 亦否决);**场景/动作按数据集(2026-08-28)**:`imageGen.sceneByDataset`/`actionByDataset` 按数据集名配池(鸭→水面、雉鸡→灌丛草丛、兔→草坡荒地、鹌鹑→草丛),未配置回退通用 scenes/actions;**遮挡描述(2026-08-28)**:模板加 `{occlusion}` 占位(插在「在{action}」之后)——身体完全暴露的个体对识别/标注训练无意义,野外目标必然存在植被等遮挡;`imageGen.occlusionByDataset` 按数据集配遮挡池(雉鸡→草丛灌丛半掩、兔→荒草只露头耳、鸭→芦苇水面半没、鹌鹑→密草藏身),未配置回退通用 `imageGen.occlusions`;池内条目覆盖轻(身体半掩)~重(只露头背)遮挡,每张随机取一条,杜绝完全暴露;遮挡物多样(杂草/树叶/枝条,2026-08-28 补树叶)且须与 sceneByDataset 场景自洽;遮挡后可见部分小于站高,检测框高与距离估算按可见部分仍自洽(真实场景同此);**拍摄角度(2026-08-28,已废弃角度描述)**:不带任何拍摄角度描述——演进:固定「上部三分之一」区域描述对文生图模型遵循力弱(生成物落底)→ 加固定俯拍(目标上移成功但构图单一,用户否决)→ 池内随机俯/平/仰(仰拍使贴地目标必然沉底,用户否决)→ 只留俯拍/平视(用户仍嫌啰嗦)→ **完全去掉角度描述**(2026-08-28 定案):交由模型平视先验自由构图,目标自然落在画面中部/上部;模板只靠「{species}离镜头很远,只是很小的{tone}轮廓」(物种名替代泛称「目标」,不限定鸟类——物种池含兔子等非鸟物种;`{tone}` 轮廓色词按 `imageGen.speciesTone.<物种>` 取,默认深色剪影,**白雉鸡配浅色**——白羽个体用「深色轮廓」描述会与模型渲染矛盾,2026-08-28)维持远景感,手填提示词仅追加数量约束;不合格丢弃重生成,单张上限 3 次(`consts.GenValidateMaxAttempts`),连续不合格整体报错(已合格张数保留) ### 训练通道(runner 抽象,决策:同机/异机不确定 → 可配置)