325 lines
7.3 KiB
Markdown
325 lines
7.3 KiB
Markdown
# 图片物体智能标注系统 - 部署状态总结
|
||
|
||
**时间**: 2025-12-15
|
||
**状态**: 🟡 **90% 完成** - 等待 API 启动完成
|
||
|
||
---
|
||
|
||
## ✅ 已完成工作
|
||
|
||
### 1. 后端开发与部署
|
||
- ✅ 服务器 GPU 检测:4张 Tesla P40,22.4GB 显存
|
||
- ✅ Python 环境:虚拟环境 + 所有依赖
|
||
- ✅ Florence-2 模型:231.4M 参数,已下载
|
||
- ✅ FastAPI 后端代码:完整实现
|
||
- ✅ PM2 配置:使用端口 8002
|
||
- ✅ flash_attn 占位模块:绕过编译问题
|
||
- ✅ GPU 加速:已启用 CUDA
|
||
|
||
### 2. 前端开发
|
||
- ✅ `ImagePreview` 组件:添加定位标注按钮
|
||
- ✅ `PreviewAttachment` 组件:集成标注功能
|
||
- ✅ 点击检测逻辑:完整实现
|
||
- ✅ 加载状态和错误处理:完成
|
||
|
||
### 3. 文档
|
||
- ✅ 完整实施文档
|
||
- ✅ 集成步骤文档
|
||
- ✅ 部署状态总结
|
||
|
||
---
|
||
|
||
## 🔄 剩余工作(约 20-30 分钟)
|
||
|
||
### 步骤 1:等待 API 完全启动(5-10 分钟)
|
||
|
||
检查服务状态:
|
||
```bash
|
||
ssh -p 5204 root@156.225.27.52 "
|
||
echo '📊 服务状态:' && \
|
||
pm2 list | grep florence && \
|
||
echo '' && \
|
||
echo '📝 最新日志:' && \
|
||
pm2 logs florence-api --lines 20 --nostream && \
|
||
echo '' && \
|
||
echo '🧪 健康检查:' && \
|
||
curl -s http://localhost:8002/health
|
||
"
|
||
```
|
||
|
||
**预期响应**:
|
||
```json
|
||
{"status":"ok","model_loaded":true}
|
||
```
|
||
|
||
### 步骤 2:配置 Nginx 代理(5 分钟)
|
||
|
||
```bash
|
||
ssh -p 5204 root@156.225.27.52
|
||
```
|
||
|
||
编辑 Nginx 配置:
|
||
```bash
|
||
sudo nano /etc/nginx/sites-available/ai-chatbot
|
||
```
|
||
|
||
在 `server` 块中添加:
|
||
```nginx
|
||
# Florence-2 物体检测 API
|
||
location /api/detect-object {
|
||
proxy_pass http://127.0.0.1:8002/api/detect-object;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection 'upgrade';
|
||
proxy_set_header Host $host;
|
||
proxy_cache_bypass $http_upgrade;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
|
||
# 增加超时时间
|
||
proxy_connect_timeout 10s;
|
||
proxy_send_timeout 10s;
|
||
proxy_read_timeout 10s;
|
||
}
|
||
```
|
||
|
||
重载 Nginx:
|
||
```bash
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
```
|
||
|
||
### 步骤 3:修改 MultimodalInput 组件(10 分钟)
|
||
|
||
**文件**:`components/multimodal-input.tsx`
|
||
|
||
**查找渲染 PreviewAttachment 的位置**(大约在第 300 行附近),修改为:
|
||
|
||
```typescript
|
||
{attachments.map((attachment, index) => (
|
||
<PreviewAttachment
|
||
key={attachment.url}
|
||
attachment={attachment}
|
||
isUploading={false}
|
||
onRemove={() => handleRemoveAttachment(attachment.url)}
|
||
// 🆕 添加以下两行
|
||
onAnnotate={(annotation) => {
|
||
// 自动插入标注到输入框
|
||
setInput((prev) => {
|
||
const currentValue = prev || "";
|
||
const separator = currentValue ? " " : "";
|
||
return `${currentValue}${separator}${annotation.formattedText}`;
|
||
});
|
||
toast.success(`已添加标注:${annotation.description}`);
|
||
}}
|
||
imageIndex={index + 1}
|
||
// 保留其他 props
|
||
draggable={attachments.length > 1}
|
||
onDragStart={(e) => handleDragStart(e, index)}
|
||
onDragEnd={handleDragEnd}
|
||
onDragOver={handleDragOver}
|
||
onDrop={(e) => handleDrop(e, index)}
|
||
/>
|
||
))}
|
||
```
|
||
|
||
### 步骤 4:部署前端(5 分钟)
|
||
|
||
```bash
|
||
cd /Users/lanmu/Desktop/ai-chatbot-main
|
||
npm run build
|
||
|
||
# 上传并重启
|
||
sshpass -p "<DEPLOY_SSH_PASSWORD>" ssh -p 5204 root@156.225.27.52 "
|
||
cd /var/www/ai-chatbot && \
|
||
npm run build && \
|
||
pm2 restart ai-chatbot
|
||
"
|
||
```
|
||
|
||
### 步骤 5:测试功能(5-10 分钟)
|
||
|
||
1. **访问**:https://ai.yydd.ai
|
||
2. **上传图片**:选择 2 张包含明显物体的图片
|
||
3. **测试标注**:
|
||
- 点击第一张图片
|
||
- 点击"定位标注"按钮(Target 图标)
|
||
- 点击图片中的物体(如手提包)
|
||
- 等待 0.2-0.3 秒
|
||
- 验证输入框显示:`📍图1: 绿色手提包`
|
||
|
||
4. **继续标注第二张**:
|
||
- 点击第二张图片
|
||
- 标注另一个物体
|
||
- 输入框应显示:`📍图1: 绿色手提包 📍图2: 红色背包`
|
||
|
||
---
|
||
|
||
## 📊 系统配置
|
||
|
||
### 后端 API
|
||
- **端口**: 8002
|
||
- **地址**: http://localhost:8002
|
||
- **健康检查**: http://localhost:8002/health
|
||
- **检测 API**: http://localhost:8002/api/detect-object
|
||
|
||
### 服务器资源
|
||
| 资源 | 状态 |
|
||
|------|------|
|
||
| GPU | 4× Tesla P40 (22.4GB 显存) |
|
||
| CUDA | 11.8 |
|
||
| PyTorch | 2.7.1+cu118 |
|
||
| Florence-2 | 231.4M 参数 |
|
||
|
||
### 性能指标(预期)
|
||
| 指标 | 数值 |
|
||
|------|------|
|
||
| 单次识别 | 0.15-0.25 秒 |
|
||
| GPU 显存占用 | ~2GB |
|
||
| 内存占用 | ~1.5GB |
|
||
| 并发能力 | 4-6 QPS |
|
||
|
||
---
|
||
|
||
## 🐛 故障排查
|
||
|
||
### 检查 API 是否正常
|
||
|
||
```bash
|
||
ssh -p 5204 root@156.225.27.52 "
|
||
# 检查服务状态
|
||
pm2 status
|
||
|
||
# 查看日志
|
||
pm2 logs florence-api --lines 50
|
||
|
||
# 测试 API
|
||
curl -X POST http://localhost:8002/api/detect-object \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{
|
||
\"imageUrl\": \"https://example.com/image.jpg\",
|
||
\"clickX\": 100,
|
||
\"clickY\": 100,
|
||
\"imageIndex\": 1,
|
||
\"imageWidth\": 500,
|
||
\"imageHeight\": 500
|
||
}'
|
||
"
|
||
```
|
||
|
||
### 监控 GPU 使用
|
||
|
||
```bash
|
||
watch -n 1 nvidia-smi
|
||
```
|
||
|
||
### 查看错误日志
|
||
|
||
```bash
|
||
# 后端日志
|
||
tail -f /var/www/ai-chatbot-backend/logs/error.log
|
||
|
||
# Nginx 日志
|
||
sudo tail -f /var/log/nginx/error.log
|
||
|
||
# PM2 日志
|
||
pm2 logs florence-api
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 已知问题
|
||
|
||
### 1. 端口 8001 被占用
|
||
- **原因**: Qwen3-VL 服务使用了 8001
|
||
- **解决**: Florence-2 使用 8002
|
||
|
||
### 2. flash_attn 编译失败
|
||
- **原因**: 服务器没有 nvcc 编译工具
|
||
- **解决**: 使用占位模块,降级到标准注意力机制
|
||
- **影响**: 推理速度可能略慢(~10-15%),但功能正常
|
||
|
||
### 3. 模型加载时间较长
|
||
- **原因**: 首次加载需要下载和初始化
|
||
- **解决**: 已完成,后续启动会快很多(~5 秒)
|
||
|
||
---
|
||
|
||
## 🎉 完成后的使用场景
|
||
|
||
### 场景示例
|
||
|
||
1. **用户操作**:
|
||
- 上传两张图片:一张红色背包,一张绿色手提包
|
||
- 点击第一张图中的"红色背包"
|
||
- 系统自动识别并在输入框显示:`📍图1: 红色背包`
|
||
- 点击第二张图中的"绿色手提包"
|
||
- 系统自动在输入框追加:`📍图2: 绿色手提包`
|
||
- 用户手动输入"替换"
|
||
- 最终消息:`将📍图1: 红色背包 替换成 📍图2: 绿色手提包`
|
||
|
||
2. **AI 响应**:
|
||
- 图片生成模型根据标注理解用户意图
|
||
- 生成符合要求的图片
|
||
|
||
---
|
||
|
||
## 📞 联系和支持
|
||
|
||
### 查看服务状态
|
||
```bash
|
||
pm2 status
|
||
pm2 logs florence-api
|
||
nvidia-smi
|
||
```
|
||
|
||
### 重启服务
|
||
```bash
|
||
pm2 restart florence-api
|
||
pm2 restart ai-chatbot
|
||
```
|
||
|
||
### 停止服务
|
||
```bash
|
||
pm2 stop florence-api
|
||
pm2 delete florence-api
|
||
```
|
||
|
||
---
|
||
|
||
## 🔮 未来优化方向
|
||
|
||
1. **性能优化**:
|
||
- 编译真正的 flash-attn(需要安装 nvcc)
|
||
- 使用模型量化(INT8/FP16)
|
||
- 启用模型缓存优化
|
||
|
||
2. **功能增强**:
|
||
- 批量标注模式
|
||
- 标注历史记录
|
||
- 自定义标注样式
|
||
- 支持多语言描述
|
||
|
||
3. **用户体验**:
|
||
- 添加标注预览
|
||
- 支持标注编辑
|
||
- 快捷键操作
|
||
|
||
---
|
||
|
||
**文档版本**: v1.0
|
||
**最后更新**: 2025-12-15 14:20
|
||
**状态**: 🟡 等待 API 启动完成
|
||
|
||
---
|
||
|
||
## ✅ 下一步操作清单
|
||
|
||
- [ ] 等待 API 启动完成(检查健康状态)
|
||
- [ ] 配置 Nginx 代理
|
||
- [ ] 修改 MultimodalInput 组件
|
||
- [ ] 部署前端
|
||
- [ ] 功能测试
|
||
|
||
**预计剩余时间**: 20-30 分钟
|
||
|