Birdmark 是自有鸟类识别相册应用的业务应用仓库,负责用户、图片、观察记录、鉴定确认、图鉴、批量导入、业务 Web 页面和后续 iOS 客户端规划。
AI 推理、模型、训练/评估脚本已经拆分到独立仓库:
../birdmark-ai
当前仓库不再保存 AI 推理服务代码、模型文件、训练脚本和数据集处理脚本。业务 API 通过 HTTP 调用外部 AI 推理服务。
- 用户注册、登录、登出和 token 鉴权。
- 登录用户上传鸟类图片,并调用外部 AI 服务自动鉴定。
- 保存原图、缩略图、裁剪图、检测框和 Top-K 鉴定建议。
- 上传者可以确认物种、手动修正、标记未知或标记误检。
- 确认后的观察记录会进入个人鸟类图鉴。
- 登录用户可以浏览共享相册中的其他用户图片和鉴定结果。
- 用户可以查看、管理和软删除自己的上传。
- 支持批量导入图片,并查看任务进度、成功数和失败原因。
- 提供业务 Web 页面。
apps/
api/ 业务 API 服务
web/ 业务 Web 页面
ios/ 未来 iOS App
docs/ 产品设计、路线图和任务文档
storage/ 本地数据库、上传图片和生成媒体
datasets/ 本地数据集,暂时保留在当前工作区,不要清理
本仓库已移除:
apps/inference/apps/inference_web/packages/birdmark_ml/scripts/models/birds/start.bat
这些内容已经复制到 birdmark-ai。
支持 Windows、macOS 和 Linux。建议使用 Python 3.10+,并在本地虚拟环境中运行。
业务 API 依赖位于:
apps/api/requirements.txt
首次部署可以复制一份本地配置:
cp .env.example .envWindows PowerShell 可以使用:
Copy-Item .env.example .env先进入 AI 仓库并启动推理服务。Windows 可使用:
cd ..\birdmark-ai
.\start.batmacOS/Linux 上的 AI 服务启动方式以 birdmark-ai 仓库为准。
AI 推理服务默认地址:
http://127.0.0.1:8000
业务 API 默认通过以下环境变量读取 AI 服务地址:
$env:BIRDMARK_INFERENCE_URL="http://127.0.0.1:8000"macOS/Linux 使用:
export BIRDMARK_INFERENCE_URL="http://127.0.0.1:8000"不设置时也默认使用 http://127.0.0.1:8000。
Windows PowerShell:
.\start-api.batmacOS/Linux:
chmod +x ./start-api.sh
./start-api.sh也可以直接运行 uvicorn。Windows:
.\.venv\Scripts\python.exe -m uvicorn apps.api.app.main:app --host 127.0.0.1 --port 8100macOS/Linux:
python3 -m venv .venv
./.venv/bin/python -m pip install -r apps/api/requirements.txt
./.venv/bin/python -m uvicorn apps.api.app.main:app --host 127.0.0.1 --port 8100业务 API 默认地址:
http://127.0.0.1:8100
业务 Web 页面:
http://127.0.0.1:8100/
健康检查:
Invoke-WebRequest http://127.0.0.1:8100/health -UseBasicParsingmacOS/Linux:
curl http://127.0.0.1:8100/health启动脚本和 Python 配置都会读取仓库根目录下的 .env。系统环境变量优先级更高,适合 systemd、Docker、云平台或 CI/CD 注入。
常用变量:
BIRDMARK_API_HOST:业务 API 监听地址,默认127.0.0.1。容器或局域网部署常用0.0.0.0。BIRDMARK_API_PORT:业务 API 端口,默认8100。BIRDMARK_INFERENCE_URL:外部 AI 推理服务地址,默认http://127.0.0.1:8000。BIRDMARK_STORAGE_ROOT:上传图片、缩略图和 crop 的存储目录,默认storage。BIRDMARK_DATABASE_PATH:SQLite 数据库路径,默认storage/birdmark.sqlite3。BIRDMARK_WEB_DIR:Web 静态页面目录,默认apps/web。
生产或长期部署时,建议把 BIRDMARK_STORAGE_ROOT 和 BIRDMARK_DATABASE_PATH 指向仓库外的持久化目录,例如 /var/lib/birdmark/storage,避免代码发布时影响用户上传数据。
打开:
http://127.0.0.1:8100/
首次使用:
- 注册一个用户。
- 登录后进入主界面。
- 在“上传”页选择鸟类图片。
- 点击“上传并识别”。
- 在图片详情中查看 AI 建议。
- 选择 Top-K 建议进行确认,或手动填写物种信息。
- 到“图鉴”页查看已确认物种。
主要页面:
- 共享:浏览所有登录用户上传的图片和鉴定结果。
- 上传:单图上传并触发 AI 鉴定。
- 图鉴:查看当前用户确认过的鸟类集合。
- 我的:查看个人资料、我的上传和删除自己的照片。
- 批量:一次提交多张图片,查看批量任务状态。
注意:
- Web 页面由业务 API 提供。
- 单图识别和批量识别需要
birdmark-ai推理服务同时运行。 - 如果 AI 推理服务没有启动,上传可能会返回 502,并在照片记录中保留失败状态。
POST /auth/register:注册。POST /auth/login:登录。POST /auth/logout:登出。GET /auth/me:读取当前用户。
业务接口使用:
Authorization: Bearer <access_token>
GET /photos:共享相册列表。POST /photos:上传单张图片并识别。GET /photos/{photo_id}:图片详情。DELETE /photos/{photo_id}:上传者软删除图片。GET /me/photos:我的上传。
POST /observations/{observation_id}/confirm:确认或修正物种。POST /observations/{observation_id}/mark-unknown:标记未知。POST /observations/{observation_id}/reject:标记误检。
GET /me/collection:我的鸟类图鉴。
POST /import-batches:创建批量导入任务。GET /me/import-batches:我的批量任务列表。GET /import-batches/{batch_id}:批量任务详情。
开发期默认使用 SQLite:
storage/birdmark.sqlite3
上传和生成的媒体文件保存在:
storage/
数据库只保存图片路径和元数据,不直接保存图片二进制。
macOS/Linux 部署示例:
export BIRDMARK_API_HOST=0.0.0.0
export BIRDMARK_STORAGE_ROOT=/var/lib/birdmark/storage
export BIRDMARK_DATABASE_PATH=/var/lib/birdmark/storage/birdmark.sqlite3
./start-api.sh业务 API 和 AI 推理服务保持分离:
- 当前仓库只保留业务 API。
- 当前仓库不直接加载 YOLO、BioCLIP、torch 或 TensorRT。
apps/api/app/inference_client.py通过 HTTP 调用birdmark-ai。- AI 模型、推理队列、GPU 管理、训练和评估都在
birdmark-ai仓库维护。
新增业务功能时,优先放在 apps/api/app/ 下对应模块中:
- 用户和会话:
auth.py - 图片和上传:
photos.py - 观察记录确认:
observations.py - 图鉴:
collections.py - 批量任务:
imports.py - 数据库:
database.py - 存储:
storage.py
- 业务 Web 页面位于
apps/web/。 - 当前前端使用 React CDN 和 Ant Design CDN,没有独立构建流程。
- 修改
apps/web/后,刷新http://127.0.0.1:8100/即可查看。
后端语法和导入检查:
.\.venv\Scripts\python.exe -m compileall -q apps/api/appmacOS/Linux:
./.venv/bin/python -m compileall -q apps/api/app前端 JavaScript 语法检查,如果本机安装了 Node.js:
node --check apps/web/app.js业务 API 健康检查:
Invoke-WebRequest http://127.0.0.1:8100/health -UseBasicParsingAI 推理服务健康检查:
Invoke-WebRequest http://127.0.0.1:8000/internal/health -UseBasicParsingmacOS/Linux:
curl http://127.0.0.1:8000/internal/health- 在
birdmark-ai启动 AI 推理服务。 - 在当前仓库启动业务 API 服务。
- 打开业务 Web 页面。
- 注册或登录用户。
- 用一张小图片验证上传识别。
- 确认物种后检查我的图鉴。
- 修改代码后运行 compileall 或相关烟测。
- 提交前检查
git status和 diff。
更多设计和规划见:
docs/development-roadmap.mddocs/end-to-end-flow-design.mddocs/task-checklist.mddocs/project-structure.mddocs/ios-app-v1-design.md
- 引入 Alembic 管理数据库迁移。
- 将批量导入从 FastAPI BackgroundTasks 迁移到 Redis + RQ/Celery/Dramatiq 等队列。
- 完善 Web 的图片详情体验和批量任务轮询。
- 建立 iOS 工程和 API Client。
- 增加自动化测试和示例数据。