在传统的部署方法中,部署计算机视觉模型往往需要复杂的设置,包括处理Docker容器的复杂性或依赖云服务。但如果部署模型像使用Python包一样简单呢?本文将深入探讨RoboflowInference如何提供一个清新的、以Python为中心的替代方案。
传统上,部署计算机视觉模型意味着需要深入Docker容器或投资于基于云的服务。虽然这些方法有其优点,但也带来了挑战:
使用Roboflow Inference (pip install 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
访问RoboflowUniverse,使用别人已经创建的现有计算机视觉模型(或根据目标自己创建一个!)。将在本文中演示人脸识别,因此将使用这个预训练模型。
从这个项目中,将需要一些信息来编写Python脚本:
现在让创建一个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"标记它。然后,处理过的图像,如果检测到面部,则用边界框装饰,然后显示给用户。
如果想使用来自网络摄像头的视频流而不是单个图像进行推理呢?没问题,上面的代码可以适应从网络摄像头读取并像处理单个图像一样在本地机器上对每一帧进行推理。
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"的矩形。然后,处理过的帧,如果检测到面部,则用突出显示的矩形实时显示。