ai-chatbot/图片标注-前后端数据流测试.md
Your Name 53ddb7e585
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Initial commit - clean repository
2025-12-17 20:15:18 +08:00

336 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 图片标注功能 - 前后端数据流验证
## ✅ 数据格式匹配验证
### 前端发送(PreviewAttachment.tsx)
```typescript
const response = await fetch("/api/detect-object", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
imageUrl: url, // ✅ 来自 attachment.url (S3 URL)
clickX, // ✅ 点击位置 X 坐标
clickY, // ✅ 点击位置 Y 坐标
imageIndex: imageIndex || 1, // ✅ 图片序号(从 1 开始)
imageWidth: img.naturalWidth, // ✅ 图片原始宽度
imageHeight: img.naturalHeight // ✅ 图片原始高度
}),
});
```
### 后端接收(app/main.py)
```python
class DetectRequest(BaseModel):
imageUrl: str # ✅ 匹配
clickX: int # ✅ 匹配
clickY: int # ✅ 匹配
imageIndex: int # ✅ 匹配
imageWidth: int # ✅ 匹配
imageHeight: int # ✅ 匹配
```
**结论**:✅ 字段名和类型完全匹配!
---
## 🔍 图片 URL 可访问性验证
### 1. 前端图片来源
用户上传的图片 → `MultimodalInput` → 上传到 S3 → 获得公开 URL → 存储在 `attachment.url`
### 2. S3 URL 格式示例
```
https://your-bucket.s3.amazonaws.com/uploads/2025/12/xxxxx.jpg
```
### 3. 后端访问方式
```python
# florence_service.py line 60
response = requests.get(image_url, timeout=10)
image = Image.open(BytesIO(response.content)).convert("RGB")
```
**要求**:
- ✅ S3 存储桶必须配置公开读取权限
- ✅ URL 必须是 HTTPS(后端支持)
- ✅ 图片格式:JPEG/PNG/WebP(PIL 支持)
---
## 🧪 完整测试用例
### 测试 1:基本功能测试
**步骤**:
```bash
# 1. 确认 API 服务运行正常
ssh -p 5204 root@156.225.27.52 "curl http://localhost:8002/health"
# 预期: {"status":"ok","model_loaded":true}
# 2. 使用真实图片 URL 测试
ssh -p 5204 root@156.225.27.52 "
curl -X POST http://localhost:8002/api/detect-object \
-H 'Content-Type: application/json' \
-d '{
\"imageUrl\": \"https://images.unsplash.com/photo-1523380677598-64d85d015339\",
\"clickX\": 250,
\"clickY\": 250,
\"imageIndex\": 1,
\"imageWidth\": 500,
\"imageHeight\": 500
}'
"
```
**预期响应**:
```json
{
"success": true,
"data": {
"description": "一个红色背包",
"descriptionEn": "a red backpack",
"confidence": 0.95,
"imageIndex": 1,
"formattedText": "📍图1: 一个红色背包"
},
"error": null
}
```
### 测试 2:前端到后端完整流程
**前端操作**:
1. 访问 https://ai.yydd.ai
2. 选择图片生成模型
3. 上传一张包含明显物体的图片(如红色背包)
4. 点击图片预览
5. 点击"定位标注"按钮(Target 图标)
6. 点击图片中的背包位置
**预期结果**:
- ✅ 显示 toast: "正在识别物体..."
- ✅ 0.2-0.3 秒后显示: "识别成功:一个红色背包"
- ✅ 输入框自动填入: "📍图1: 一个红色背包"
- ✅ 关闭预览弹窗
**验证后端日志**:
```bash
pm2 logs florence-api --lines 20
```
应该看到:
```
🔍 开始检测: http://your-s3-url/image.jpg at (250, 250)
📥 下载图片: 1024 KB
✂️ 裁剪区域: (150, 150, 350, 350)
🔍 正在识别物体...
✅ 识别结果: a red backpack
📍 格式化输出: 📍图1: 一个红色背包
```
### 测试 3:错误处理
**测试场景 A - 无效 URL**:
```json
{
"imageUrl": "https://invalid-url.com/image.jpg",
...
}
```
预期: `{"success": false, "error": "物体识别失败: ..."}`
**测试场景 B - 网络超时**:
前端显示: "识别失败,请检查网络连接"
**测试场景 C - 图片太小**:
点击坐标超出图片范围 → 后端自动调整裁剪区域
---
## 🔧 潜在问题和解决方案
### 问题 1:S3 图片无法访问
**症状**:
- 后端日志: `requests.exceptions.ConnectionError`
- 前端显示: "识别失败,请检查网络连接"
**原因**:
- S3 存储桶未配置公开读取
- CORS 配置不正确
- 图片 URL 已过期(如使用签名 URL)
**解决**:
```bash
# 检查 S3 URL 是否可访问
curl -I https://your-bucket.s3.amazonaws.com/uploads/test.jpg
# 应该返回 200 OK
```
### 问题 2:CORS 错误
**症状**:
浏览器控制台: `CORS policy: No 'Access-Control-Allow-Origin' header`
**原因**:
后端 CORS 配置不包含前端域名
**解决**:
已在 `app/main.py` 中配置:
```python
allow_origins=["https://ai.yydd.ai", "http://localhost:3000"]
```
### 问题 3:Nginx 代理未配置
**症状**:
- 前端请求 `/api/detect-object` → 404 Not Found
**原因**:
Nginx 未将 `/api/detect-object` 代理到后端 8002 端口
**解决**:
按照《部署状态总结.md》步骤 1 配置 Nginx
---
## 🎯 最终验证清单
部署完成后,请按顺序检查:
- [ ] **后端健康检查**
```bash
curl http://localhost:8002/health
# ✅ {"status":"ok","model_loaded":true}
```
- [ ] **Nginx 代理生效**
```bash
curl https://ai.yydd.ai/api/detect-object -X POST \
-H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/test.jpg","clickX":100,"clickY":100,"imageIndex":1,"imageWidth":500,"imageHeight":500}'
# ✅ 不应该返回 404
```
- [ ] **前端上传图片成功**
- 上传图片 → 获得 S3 URL
- 在浏览器地址栏直接访问该 URL → 能看到图片
- [ ] **标注按钮显示**
- 点击上传的图片 → 弹窗显示
- 右上角有"Target"图标按钮
- [ ] **完整标注流程**
- 点击 Target 按钮 → 按钮变蓝色
- 点击图片物体 → 显示加载动画
- 0.2-0.3 秒后 → 输入框填入标注文本
- [ ] **后端日志正常**
```bash
pm2 logs florence-api --lines 20
# ✅ 看到识别成功的日志
```
---
## 📊 性能监控
### GPU 使用率监控
```bash
watch -n 1 nvidia-smi
```
**正常状态**:
- 待机: ~1.2GB 显存,0% 使用率
- 推理中: ~2GB 显存,80-100% 使用率(0.2秒)
- 推理后: 回落到待机状态
### API 响应时间
```bash
# 测试 10 次,查看平均响应时间
for i in {1..10}; do
time curl -s -X POST http://localhost:8002/api/detect-object \
-H 'Content-Type: application/json' \
-d '{"imageUrl":"...","clickX":100,"clickY":100,"imageIndex":1,"imageWidth":500,"imageHeight":500}' \
> /dev/null
done
```
**预期**:
- 首次: ~0.3 秒(冷启动)
- 后续: ~0.15-0.25 秒
---
## 🆘 故障排查命令
### 快速诊断脚本
```bash
#!/bin/bash
echo "=== Florence-2 API 诊断 ==="
echo ""
echo "1. 服务状态:"
pm2 list | grep florence
echo ""
echo "2. 健康检查:"
curl -s http://localhost:8002/health
echo ""
echo "3. GPU 状态:"
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv,noheader
echo ""
echo "4. 最新日志 (最后 5 行):"
pm2 logs florence-api --lines 5 --nostream
echo ""
echo "5. 端口监听:"
netstat -tlnp | grep 8002
echo ""
echo "=== 诊断完成 ==="
```
保存为 `diagnose-florence.sh`,运行:
```bash
chmod +x diagnose-florence.sh
./diagnose-florence.sh
```
---
## 📞 问题反馈模板
如果遇到问题,请提供以下信息:
1. **前端错误**:
- 浏览器控制台截图
- Network 标签中的请求/响应详情
2. **后端日志**:
```bash
pm2 logs florence-api --lines 50
```
3. **服务状态**:
```bash
pm2 status
curl http://localhost:8002/health
```
4. **测试图片 URL**:
- 提供无法识别的图片 URL
- 点击的坐标位置
---
**文档版本**: v1.0
**创建日期**: 2025-12-15
**最后更新**: 2025-12-15 14:30
**✅ 数据流验证结果**:前后端数据格式完全匹配,只需完成 Nginx 配置和前端集成即可正常工作!