本仓库提供一个简易的图片分类训练与预测系统,
可用于学校学生上课体验项目中的图像收集与分析。
后端基于 Python Flask,提供 JSON API;
前端位于 frontend 目录,采用 Vue 的 VitePress 构建。
python -m venv .venv
source .venv/bin/activate # Windows 使用 .venv\Scripts\activate- 准备 Python 3.8+ 环境,安装 Flask、TensorFlow 等依赖。
若需更准确的人脸比对效果,可额外安装
face_recognition库:pip install face_recognition。 安装前会遇到cmake、dlib和numpy==1.26.9版本的环境问题。pip install "numpy==1.26.4可以解决numpy问题;cmake和dlib安装包已经在项目中给出直接安装即可。 翻译功能依赖argostranslate以及对应的中英离线语言包,请预先安装:pip install argostranslate,并通过运行install_en_zh_translate.py完成导入中英互译数据。 - 在项目根目录执行
python app.py启动后端服务。 - 安装 Node.js 后进入
frontend目录,执行npm install。 - 通过
npx vitepress dev docs启动前端开发服务器。 - 打开前端页面后可在首页按需配置后端地址,随后即可使用各功能。
- pip install的库比较多,除了上述内容以外还有flask_sock、tensorflow
后端 SSO 现在同时支持两套变量:
- 旧变量(优先级更高):
SCHOOL_SSO_* - OpenWebUI 风格变量:
OPENID_PROVIDER_URL、OAUTH_CLIENT_ID、OAUTH_CLIENT_SECRET、OAUTH_SCOPES、OPENID_REDIRECT_URI
推荐使用 OpenWebUI 风格最小配置:
export OPENID_PROVIDER_URL="https://your-idp.example.com/realms/main"
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-client-secret"
export OAUTH_SCOPES="openid profile email"
export OPENID_REDIRECT_URI="https://your-backend.example.com/api/sso/callback"说明:
- 当只设置
OPENID_PROVIDER_URL时,后端会自动尝试读取/.well-known/openid-configuration并补全授权、令牌、用户信息端点。 - 如果你同时设置了
SCHOOL_SSO_AUTH_URL/SCHOOL_SSO_TOKEN_URL/SCHOOL_SSO_USERINFO_URL,会优先使用这些显式值。
- 在项目根目录构建镜像:
docker build -t online-training:latest . - 启动容器:
docker run --rm -p 5001:5001 --name online-training online-training:latest
- 访问后端:
http://127.0.0.1:5001
说明:
- Docker 镜像会尝试安装
face_recognition/dlib,并在构建阶段准备 C/C++ 编译环境。 - 若目标机器资源较小,
dlib编译可能耗时较长;如构建失败,建议优先使用本机 Python/Windows EXE 运行。
- 打开前端页面,先在“上传训练图片”处按类别上传样本。
- 在“开始训练”页面点击按钮,等待模型训练完成。
- 训练结束后,在“上传图片进行预测”页面选择图片即可得到分类结果。
- 如需连接不同的后端服务,可在前端首页调整 API 地址。
train_data目录下需按类别建立子文件夹,每个类别至少包含一张图片。- 模型训练在 CPU 上进行,数据量较大时耗时可能较长。
- 若部署在不同服务器,请修改
frontend/docs/apiConfig.js中的API_BASE。
MobileNetV2(weights='imagenet') 默认会联网下载权重。项目已支持本地权重优先加载:
- 准备权重文件(建议文件名):
mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5
- 放到项目目录:
models/mobilenet_v2_no_top.h5
- 或者通过环境变量指定任意路径:
export MOBILENET_WEIGHTS_PATH=/abs/path/mobilenet_v2_no_top.h5 python app.py
说明:
- 人脸比对分支如果拿不到有效预训练权重会自动禁用(避免随机权重导致误判)。
- 训练分支在无预训练权重时会退化到
weights=None,可以训练但效果通常会变差。
- 语音对话功能(Zipformer)模型待研究
- yolo-world相关支持