简化模型部署:Roboflow Inference指南

在传统的部署方法中,部署计算机视觉模型往往需要复杂的设置,包括处理Docker容器的复杂性或依赖云服务。但如果部署模型像使用Python包一样简单呢?本文将深入探讨RoboflowInference如何提供一个清新的、以Python为中心的替代方案。

传统部署的挑战

传统上,部署计算机视觉模型意味着需要深入Docker容器或投资于基于云的服务。虽然这些方法有其优点,但也带来了挑战:

  • 成本问题:云服务伴随着持续的费用。随着应用程序扩展,账单也会增加。
  • 设置复杂性:对于新手来说,配置Docker可能是一个迷宫。
  • 延迟和离线访问问题:基于云的方法可能会引入延迟,没有互联网访问,模型就无法访问。

Roboflow Inference:简化本地部署

使用Roboflow Inference (pip install inference),可以在本地部署和推理计算机视觉模型。优势是显而易见的:

  • 成本效益:没有持续的云成本或隐藏费用。
  • 最小化设置:告别复杂的配置。
  • 降低延迟:在本地机器上实时处理数据。
  • 离线能力:无论是否连接互联网,都可以对模型进行推理。

步骤1:使用pip安装Inference

将使用pip将Python包inference安装到Python环境中。根据是否使用CPU vs GPU,或者是否计划使用CLIP或SAM并需要额外依赖项(如pytorch),有几种不同的安装选项。要找出哪个选项适合,请访问inference GitHub仓库。

对于本文,将在CPU上运行推理,因此将使用以下命令安装该包:

pip install inference

这就是使用CPU进行计算机视觉模型推理所需的全部!对于生产用例,可能会使用inference-gpu。运行GPU推理的Python包是相同的,因此本文也将适用于inference-gpu。

还需要安装opencv-python以在屏幕上可视化图像和预测:

pip install opencv-python

步骤2:选择计算机视觉模型

访问RoboflowUniverse,使用别人已经创建的现有计算机视觉模型(或根据目标自己创建一个!)。将在本文中演示人脸识别,因此将使用这个预训练模型。

从这个项目中,将需要一些信息来编写Python脚本:

  • 项目名称:face-detection-mik1i
  • 项目版本:18

步骤3:对图像进行推理

现在让创建一个Python脚本来将这个模型加载到本地机器上,并对其进行图像推理。

from inference.models.utils import get_roboflow_model import cv2 # 图像路径 image_path = "photo.jpg" # Roboflow模型 model_name = "face-detection-mik1i" model_version = "18" # 获取Roboflow面部模型(这将从Roboflow获取模型) model = get_roboflow_model( model_id="{}/{}".format(model_name, model_version), # 用Roboflow API密钥替换ROBOFLOW_API_KEY api_key="ROBOFLOW_API_KEY" ) # 使用opencv加载图像 frame = cv2.imread(image_path) # 推理图像以找到面部 results = model.infer(image=frame, confidence=0.5, iou_threshold=0.5) # 如果检测到面部,则绘制面部边界框(使用opencv) if results[0].predictions: prediction = results[0].predictions[0] print(prediction) x_center = int(prediction.x) y_center = int(prediction.y) width = int(prediction.width) height = int(prediction.height) # 根据中心、宽度和高度计算左上角和右下角 x0 = x_center - width // 2 y0 = y_center - height // 2 x1 = x_center + width // 2 y1 = y_center + height // 2 cv2.rectangle(frame, (x0, y0), (x1, y1), (255,255,0), 10) cv2.putText(frame, "Face", (x0, y0 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 2) # 显示图像 cv2.imshow('Image Frame', frame) cv2.waitKey(0) # 等待按键 cv2.destroyAllWindows() # 关闭显示图像的窗口

这段代码利用Roboflow推理包进行面部检测。首先,它指定了要处理的图像的路径("photo.jpg")和要获取的Roboflow面部检测模型的详细信息。通过使用get_roboflow_model函数,代码使用指定的模型名称、版本和一个占位符API密钥检索此模型。

一旦图像被加载到程序中,使用OpenCV的imread函数,Roboflow模型就用来基于某些置信度和交并比(IoU)阈值预测图像上的面部。如果检测到面部,代码会绘制一个蓝色的边界框,并使用OpenCV函数用"Face"标记它。然后,处理过的图像,如果检测到面部,则用边界框装饰,然后显示给用户。

步骤4:在视频(网络摄像头)上进行推理

如果想使用来自网络摄像头的视频流而不是单个图像进行推理呢?没问题,上面的代码可以适应从网络摄像头读取并像处理单个图像一样在本地机器上对每一帧进行推理。

from inference.models.utils import get_roboflow_model import cv2 # Roboflow模型 model_name = "face-detection-mik1i" model_version = "18" # 打开默认摄像头(通常是内置网络摄像头) cap = cv2.VideoCapture(0) # 检查是否成功打开网络摄像头 if not cap.isOpened(): print("错误:无法打开摄像头。") exit() # 获取Roboflow面部模型(这将从Roboflow获取模型) model = get_roboflow_model( model_id="{}/{}".format(model_name, model_version), # 用Roboflow API密钥替换ROBOFLOW_API_KEY api_key="ROBOFLOW_API_KEY" ) while True: # 逐帧捕获 ret, frame = cap.read() # 如果成功读取帧,则显示它 if ret: # 对帧进行推理 results = model.infer(image=frame, confidence=0.5, iou_threshold=0.5) # 如果检测到面部,则绘制面部边界框(使用opencv) if results[0].predictions: prediction = results[0].predictions[0] print(prediction) x_center = int(prediction.x) y_center = int(prediction.y) width = int(prediction.width) height = int(prediction.height) # 根据中心、宽度和高度计算左上角和右下角 x0 = x_center - width // 2 y0 = y_center - height // 2 x1 = x_center + width // 2 y1 = y_center + height // 2 cv2.rectangle(frame, (x0, y0), (x1, y1), (255,255,0), 10) cv2.putText(frame, "Face", (x0, y0 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 2) # 显示结果帧 cv2.imshow('Webcam Feed', frame) # 按'q'退出视频窗口 if cv2.waitKey(1) & 0xFF == ord('q'): break else: print("错误:无法读取帧。") break # 完成后,释放捕获并销毁所有窗口 cap.release() cv2.destroyAllWindows()

这段代码利用Roboflow推理包和OpenCV库从Roboflow加载一个预训练的模型,以实时检测网络摄像头画面中的面部。首先,脚本指定要使用的Roboflow模型的名称和版本。然后,它初始化默认摄像头,通常是计算机的内置网络摄像头。

成功初始化摄像头后,使用其API密钥从Roboflow获取指定的面部检测模型。然后,脚本不断从网络摄像头捕获帧。每个捕获的帧都由Roboflow模型处理以识别任何面部。

如果检测到面部,其边界框坐标将被打印出来,并在其周围绘制一个标记为"Face"的矩形。然后,处理过的帧,如果检测到面部,则用突出显示的矩形实时显示。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485