在本文中,将探讨如何利用计算机视觉技术来识别并计数图像中的不同物体。这种技术可以应用于多种场景,例如监控海岸线附近的船只和摩托艇数量,以决定是否需要建造更多的码头以避免拥挤。
要开始计数图像中的物体,首先需要一个包含计算机视觉模型返回的所有预测的列表。将使用Roboflow上托管的Aerial Maritime模型,但也可以使用任何想要的模型。模型可以预测以下物体:
在开始之前,请确保代码中有一个名为“predictions”的列表,其中包含一个字典列表。每个字典应包含一个预测类别的名称和任何可能想要引用的辅助信息(例如预测的坐标)。
{
'predictions': [
{'x': 127.0, 'y': 566.0, 'width': 78.0, 'height': 104.0, 'confidence': 0.8159579038619995, 'class': 'dock'},
{'x': 1200.0, 'y': 475.5, 'width': 52.0, 'height': 85.0, 'confidence': 0.7788712978363037, 'class': 'dock'}
]
}
将编写一个Python函数来计算列表中每个类别出现的次数:
def count_instances(predictions: dict) -> dict:
classes = {}
for bounding_box in predictions['predictions']:
if bounding_box['class'] in classes:
classes[bounding_box['class']] += 1
else:
classes[bounding_box['class']] = 1
return classes
此函数创建一个名为“classes”的字典。然后,它遍历每个预测。对于每个类别,它在“classes”字典中的该类别的计数器上加1。如果类别不在字典中,则将类别添加到字典中,值为1。
代码的最后一行将预测保存到一个文件中,以便可以看到它们被绘制出来。如果不是在运行Roboflow模型,可以注释掉这行代码。
让运行代码,看看会发生什么。以下输出返回:
{'dock': 4, 'jetski': 1, 'lift': 5}
这个字典给提供了很多信息。可以得出结论,根据模型,图像中没有船只。还可以看到,在拍摄照片时,码头上没有船只。也可以得出更多的结论。
已经成功地计算了图像中的物体数量!代码还在图像上绘制了预测,并将它们保存到一个名为“aerial_with_bounding_boxes.jpg”的图像中。可以打开这个文件,看看模型的表现如何:
可以在代码中添加逻辑,如果计数的物体数量过高,就做一些事情。例如,可以让代码在发现拥挤的码头时将记录保存到CSV文件中:
with open("results.csv", "w+") as f:
writer = csv.writer(f)
writer.writerow(["class", "count", "image"])
if results["boat"] > 0:
writer.writerow(["boat", results["boat"], "aerial.jpeg"])
如果aerial.jpeg图像中发现超过10艘船只,这段代码将把记录写入CSV文件。这段代码可以适应整个文件夹的图像,为每个图像运行并记录码头拥挤的情况。
在上面的例子中,使用了Roboflow Universe上托管的Aerial Maritime项目,这是一个拥有超过110,000个计算机视觉数据集和超过10,000个训练模型的开放仓库。可以通过在浏览器中打开项目并点击“Deploy”来测试数据集。这将打开一个交互式小部件,通过它可以与模型交互。将图像拖入模型以获取预测:
要使用Roboflowpip包获取预测,请首先通过命令行安装它:
pip install roboflow
接下来,在Deploy标签上滚动并复制出现的Python代码。这段代码将允许将模型加载到Python程序中。代码看起来像这样:
from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_API_KEY")
project = rf.workspace().project("aerial-maritime")
model = project.version(22).model
将YOUR_API_KEY文本替换为API密钥。这将在Deploy标签上的代码中自动显示。要获取图像上的预测,请使用此代码:
inference = model.predict("aerial.jpg", confidence=40, overlap=30)
predictions = inference.json()
这将返回一个JSON对象的预测,可以在前面的例子中使用它来计算图像中每个类别出现的次数。