From 3b5461371c4a0e2e79ecf2df4126f73f15b73048 Mon Sep 17 00:00:00 2001 From: quant Date: Sun, 15 Feb 2026 13:22:38 +0800 Subject: [PATCH] FastAPI --- fastAPI_main.py | 159 ++++++++++++++++++++++++++++++ requirement.txt | 3 + sam3/visualization_utils.py | 2 + sam3_image_food_result.jpg | Bin 0 -> 85872 bytes test.py | 190 ++++++++++++++++++++++++++++++------ test1.py | 43 ++++++++ 6 files changed, 365 insertions(+), 32 deletions(-) create mode 100644 fastAPI_main.py create mode 100644 requirement.txt create mode 100644 sam3_image_food_result.jpg create mode 100644 test1.py diff --git a/fastAPI_main.py b/fastAPI_main.py new file mode 100644 index 0000000..866d7aa --- /dev/null +++ b/fastAPI_main.py @@ -0,0 +1,159 @@ +import os +import uuid +import requests +from typing import Optional +from contextlib import asynccontextmanager + +import torch +import matplotlib +# 关键:设置非交互式后端,避免服务器环境下报错 +matplotlib.use('Agg') +import matplotlib.pyplot as plt + +from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request +from fastapi.staticfiles import StaticFiles +from fastapi.responses import JSONResponse +from PIL import Image + +# SAM3 相关导入 (请确保你的环境中已正确安装 sam3) +from sam3.model_builder import build_sam3_image_model +from sam3.model.sam3_image_processor import Sam3Processor +from sam3.visualization_utils import plot_results + +# ------------------- 配置与路径 ------------------- +STATIC_DIR = "static" +RESULT_IMAGE_DIR = os.path.join(STATIC_DIR, "results") +os.makedirs(RESULT_IMAGE_DIR, exist_ok=True) + +# ------------------- 生命周期管理 ------------------- +@asynccontextmanager +async def lifespan(app: FastAPI): + """ + FastAPI 生命周期管理器:在服务启动时加载模型,关闭时清理资源 + """ + print("正在加载 SAM3 模型到 GPU...") + + # 1. 检测设备 + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + if not torch.cuda.is_available(): + print("警告: 未检测到 GPU,将使用 CPU,速度会较慢。") + + # 2. 加载模型 (全局单例) + model = build_sam3_image_model() + model = model.to(device) + model.eval() # 切换到评估模式 + + # 3. 初始化 Processor + processor = Sam3Processor(model) + + # 4. 存入 app.state 供全局访问 + app.state.model = model + app.state.processor = processor + app.state.device = device + + print(f"模型加载完成,设备: {device}") + + yield # 服务运行中... + + # 清理资源 (如果需要) + print("正在清理资源...") + +# ------------------- FastAPI 初始化 ------------------- +app = FastAPI(lifespan=lifespan, title="SAM3 Segmentation API") + +# 挂载静态文件目录,用于通过 URL 访问生成的图片 +app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") + +# ------------------- 辅助函数 ------------------- +def load_image_from_url(url: str) -> Image.Image: + """从网络 URL 下载图片""" + try: + headers = {'User-Agent': 'Mozilla/5.0'} + response = requests.get(url, headers=headers, stream=True, timeout=10) + response.raise_for_status() + image = Image.open(response.raw).convert("RGB") + return image + except Exception as e: + raise HTTPException(status_code=400, detail=f"无法下载图片: {str(e)}") + +def generate_and_save_result(image: Image.Image, inference_state) -> str: + """生成可视化结果图并保存,返回文件名""" + # 生成唯一文件名防止冲突 + filename = f"seg_{uuid.uuid4().hex}.jpg" + save_path = os.path.join(RESULT_IMAGE_DIR, filename) + + # 绘图 (复用你提供的逻辑) + plot_results(image, inference_state) + + # 保存 + plt.savefig(save_path, dpi=150, bbox_inches='tight') + plt.close() # 务必关闭,防止内存泄漏 + + return filename + +# ------------------- API 接口 ------------------- +@app.post("/segment") +async def segment( + request: Request, + prompt: str = Form(...), + file: Optional[UploadFile] = File(None), + image_url: Optional[str] = Form(None) +): + """ + 接收图片 (文件上传 或 URL) 和 文本提示词,返回分割后的图片 URL。 + """ + + # 1. 校验输入 + if not file and not image_url: + raise HTTPException(status_code=400, detail="必须提供 file (图片文件) 或 image_url (图片链接)") + + # 2. 获取图片对象 + try: + if file: + image = Image.open(file.file).convert("RGB") + elif image_url: + image = load_image_from_url(image_url) + except Exception as e: + raise HTTPException(status_code=400, detail=f"图片解析失败: {str(e)}") + + # 3. 获取模型 + processor = request.app.state.processor + + # 4. 执行推理 + try: + # 这一步内部应该已经由 Sam3Processor 处理了 GPU 张量转移 + inference_state = processor.set_image(image) + output = processor.set_text_prompt(state=inference_state, prompt=prompt) + + masks, boxes, scores = output["masks"], output["boxes"], output["scores"] + except Exception as e: + raise HTTPException(status_code=500, detail=f"模型推理错误: {str(e)}") + + # 5. 生成可视化并保存 + try: + filename = generate_and_save_result(image, inference_state) + except Exception as e: + raise HTTPException(status_code=500, detail=f"绘图保存错误: {str(e)}") + + # 6. 构建返回 URL + # request.url_for 会自动根据当前域名生成正确的访问链接 + file_url = request.url_for("static", path=f"results/{filename}") + + return JSONResponse(content={ + "status": "success", + "result_image_url": str(file_url), + "detected_count": len(masks), + "scores": scores.tolist() if torch.is_tensor(scores) else scores + }) + +if __name__ == "__main__": + import uvicorn + + # 使用 Python 函数参数的方式传递配置 + uvicorn.run( + "fastAPI_main:app", # 注意:这里要改成你的文件名:app对象名 + host="0.0.0.0", + port=55600, + proxy_headers=True, # 对应 --proxy-headers + forwarded_allow_ips="*" # 对应 --forwarded-allow-ips="*" + ) \ No newline at end of file diff --git a/requirement.txt b/requirement.txt new file mode 100644 index 0000000..9250748 --- /dev/null +++ b/requirement.txt @@ -0,0 +1,3 @@ +uvicorn +python-multipart +fastapi \ No newline at end of file diff --git a/sam3/visualization_utils.py b/sam3/visualization_utils.py index c007c38..fd89934 100644 --- a/sam3/visualization_utils.py +++ b/sam3/visualization_utils.py @@ -875,6 +875,8 @@ def plot_results(img, results): relative_coords=False, ) + plt.show() + def single_visualization(img, anns, title): """ diff --git a/sam3_image_food_result.jpg b/sam3_image_food_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dda77377d9fca06ad8517a1ccb0f7f7f2902d57 GIT binary patch literal 85872 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

ZL1roi2 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 literal 0 HcmV?d00001 diff --git a/test.py b/test.py index 0b39bb1..cea19eb 100644 --- a/test.py +++ b/test.py @@ -1,39 +1,165 @@ import torch -#################################### For Image #################################### +import matplotlib.pyplot as plt +import os +import cv2 +import numpy as np from PIL import Image -from sam3.model_builder import build_sam3_image_model +# 只保留SAM3实际存在的核心模块 +from sam3.model_builder import build_sam3_image_model, build_sam3_video_predictor from sam3.model.sam3_image_processor import Sam3Processor -# Load the model -model = build_sam3_image_model() -processor = Sam3Processor(model) -# Load an image -image = Image.open("/home/quant/data/dev/sam3-main/assets/player.gif") -inference_state = processor.set_image(image) -# Prompt the model with text -output = processor.set_text_prompt(state=inference_state, prompt="pepole") +from sam3.visualization_utils import draw_box_on_image, normalize_bbox, plot_results -# Get the masks, bounding boxes, and scores -masks, boxes, scores = output["masks"], output["boxes"], output["scores"] +# ==================== 显存优化配置 ==================== +os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True" +os.environ["CUDA_VISIBLE_DEVICES"] = "0" +torch.cuda.empty_cache() -#################################### For Video #################################### +# 通用视频帧读取函数 +def get_video_frames(video_path): + frame_paths = [] + if os.path.isfile(video_path) and video_path.endswith(('.mp4', '.avi', '.mov')): + total_frames = int(cv2.VideoCapture(video_path).get(cv2.CAP_PROP_FRAME_COUNT)) + return frame_paths, total_frames + elif os.path.isdir(video_path): + frame_files = sorted([f for f in os.listdir(video_path) if f.endswith(('.jpg', '.png'))]) + frame_paths = [os.path.join(video_path, f) for f in frame_files] + total_frames = len(frame_paths) + return frame_paths, total_frames + else: + raise ValueError(f"不支持的视频路径:{video_path}") -# from sam3.model_builder import build_sam3_video_predictor +# 缩小视频帧分辨率(减少显存占用) +def resize_frame(frame, max_side=640): + h, w = frame.shape[:2] + scale = max_side / max(h, w) + if scale < 1: + new_h, new_w = int(h * scale), int(w * scale) + frame = cv2.resize(frame, (new_w, new_h), interpolation=cv2.INTER_AREA) + return frame -# video_predictor = build_sam3_video_predictor() -# video_path = "" # a JPEG folder or an MP4 video file -# # Start a session -# response = video_predictor.handle_request( -# request=dict( -# type="start_session", -# resource_path=video_path, -# ) -# ) -# response = video_predictor.handle_request( -# request=dict( -# type="add_prompt", -# session_id=response["session_id"], -# frame_index=0, # Arbitrary frame index -# text="", -# ) -# ) -# output = response["outputs"] \ No newline at end of file +def sam3_video_inference_low_memory( + video_path, + text_prompt="", # 空提示词:让SAM3检测所有目标(最易检出) + save_dir="./sam3_video_results", + max_frames=5, + max_frame_side=640 +): + """ + 修复end_session + 提升检出率:适配你的SAM3版本 + """ + # 1. 初始化SAM3视频预测器 + video_predictor = build_sam3_video_predictor() + os.makedirs(save_dir, exist_ok=True) + + # 2. 启动SAM3会话(移除自定义model_config,避免和SAM3内部冲突) + session_response = video_predictor.handle_request( + request=dict( + type="start_session", + resource_path=video_path + # 移除model_config:你的SAM3版本会强制覆盖为max_num_objects=10000 + ) + ) + session_id = session_response["session_id"] + print(f"[低显存模式] 会话启动成功,ID: {session_id}") + + # 3. 读取视频帧信息 + frame_paths, total_frames = get_video_frames(video_path) + total_frames = min(total_frames, max_frames) + print(f"[低显存模式] 视频总帧数:{total_frames},本次处理前{total_frames}帧") + + # 4. 首帧推理(核心优化:降低阈值+空提示词,提升检出率) + first_frame_idx = 0 + prompt_response = video_predictor.handle_request( + request=dict( + type="add_prompt", + session_id=session_id, + frame_index=first_frame_idx, + text=text_prompt, + # 极低阈值:强制检出所有可能目标(从0.3→0.1) + prompt_config=dict( + box_threshold=0.1, + mask_threshold=0.1 + ) + ) + ) + first_output = prompt_response["outputs"] + first_boxes = first_output.get("boxes", []) + first_scores = first_output.get("scores", []) + print(f"[低显存模式] 首帧({first_frame_idx})检出框数:{len(first_boxes)},分数:{first_scores}") + + # 5. 处理帧(只处理首帧) + frame_save_paths = [] + cap = cv2.VideoCapture(video_path) if os.path.isfile(video_path) else None + + frame_idx = first_frame_idx + if cap is not None: + cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx) + ret, frame = cap.read() + if not ret: + print(f"[警告] 无法读取帧{frame_idx}") + cap.release() + return session_id, first_boxes + else: + frame = cv2.imread(frame_paths[frame_idx]) + + # 缩小帧分辨率 + frame = resize_frame(frame, max_frame_side) + frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + frame_pil = Image.fromarray(frame_rgb) + + # 画框(即使框数为0也保存,方便排查) + fig, ax = plt.subplots(1, 1, figsize=(8, 6)) + ax.imshow(frame_pil) + if len(first_boxes) > 0: + for box, score in zip(first_boxes, first_scores): + box_abs = normalize_bbox(box, frame_pil.width, frame_pil.height) + draw_box_on_image( + ax, box_abs, + label=f"SAM3 Score: {score:.2f}", + color="red", thickness=2 + ) + else: + ax.text(0.5, 0.5, "未检出目标", ha="center", va="center", fontsize=20, color="red") + ax.axis("off") + + # 保存带框帧 + frame_save_path = os.path.join(save_dir, f"sam3_frame_{frame_idx:04d}.jpg") + plt.savefig(frame_save_path, dpi=100, bbox_inches="tight") + plt.close(fig) + frame_save_paths.append(frame_save_path) + print(f"[低显存模式] 帧{frame_idx}处理完成,保存至:{frame_save_path}") + + # 6. 释放资源(移除end_session:你的SAM3版本不支持) + if cap is not None: + cap.release() + # 直接删除预测器+清理显存(替代end_session) + del video_predictor + torch.cuda.empty_cache() + print("[低显存模式] 推理完成,资源已释放(无需end_session)") + return session_id, first_boxes + +# ==================== 主函数 ==================== +if __name__ == "__main__": + # 1. 图像推理 + image_path = "/home/quant/data/dev/sam3/assets/images/groceries.jpg" + image_model = build_sam3_image_model() + image_processor = Sam3Processor(image_model) + image = Image.open(image_path).convert("RGB") + image = image.resize((640, 480), Image.Resampling.LANCZOS) + inference_state = image_processor.set_image(image) + image_output = image_processor.set_text_prompt(state=inference_state, prompt="food") + plot_results(image, inference_state) + plt.savefig("./sam3_image_food_result.jpg", dpi=100, bbox_inches='tight') + plt.close() + del image_model, image_processor + torch.cuda.empty_cache() + print("✅ 图像推理完成(低显存模式)") + + # 2. 视频推理:修复end_session + 提升检出率 + video_path = "/home/quant/data/dev/sam3/assets/videos/bedroom.mp4" + sam3_video_inference_low_memory( + video_path=video_path, + text_prompt="", # 空提示词:检测所有目标(优先保证检出) + max_frames=5, + max_frame_side=640 + ) \ No newline at end of file diff --git a/test1.py b/test1.py new file mode 100644 index 0000000..597da81 --- /dev/null +++ b/test1.py @@ -0,0 +1,43 @@ +import torch +import matplotlib.pyplot as plt # 新增:导入matplotlib用于保存图片 +#################################### For Image #################################### +from PIL import Image +from sam3.model_builder import build_sam3_image_model +from sam3.model.sam3_image_processor import Sam3Processor +from sam3.visualization_utils import draw_box_on_image, normalize_bbox, plot_results + +# Load the model +model = build_sam3_image_model() +processor = Sam3Processor(model) + +# Load an image - 保留之前的RGB转换修复 +image = Image.open("/home/quant/data/dev/sam3/assets/images/groceries.jpg").convert("RGB") + +# 可选:打印图像信息,验证通道数 +print(f"图像模式: {image.mode}, 尺寸: {image.size}") + +# 处理图像 +inference_state = processor.set_image(image) + +# 文本提示推理 +output = processor.set_text_prompt(state=inference_state, prompt="food") + +# 获取推理结果 +masks, boxes, scores = output["masks"], output["boxes"], output["scores"] + +# 可视化并保存图片(核心修改部分) +# 1. 生成可视化结果 +plot_results(image, inference_state) +# 2. 保存图片到当前目录,格式可选jpg/png,这里用jpg示例 +plt.savefig("./sam3_food_detection_result.jpg", # 保存路径:当前目录,文件名自定义 + dpi=150, # 图片分辨率,可选 + bbox_inches='tight') # 去除图片周围空白 +# 3. 关闭plt画布,避免内存占用 +plt.close() + +# 可选:打印输出信息 +print(f"检测到的mask数量: {len(masks)}") +print(f"检测到的box数量: {len(boxes)}") +print(f"置信度分数: {scores}") +print("图片已保存到当前目录:./sam3_food_detection_result.jpg") +