在本指南中,将探讨如何评估Google Cloud Vision的通用对象检测API(Google也称之为对象定位)与其他可用模型和API的性能。这对于确保为特定用例选择最佳模型非常有帮助。将使用Roboflow Universe中的自定义训练模型来检测人物,作为示例比较。
步骤1:寻找评估数据集
在这个例子中,希望检测人物,并希望模型能够在各种场景中良好地检测人物。为了找到一个好的数据集,可以在Roboflow Universe中搜索一个训练有素的对象检测模型。在这种情况下,为了评估模型在各种设置中的表现,将使用一个大型、通用、多样化的数据集,如COCO。在这个例子中,将使用一个仅限于人物的COCO子集的Universe数据集。
可选:创建自己的模型或评估数据集
如果有自己的用例,想要与Google Cloud Vision进行比较,可以创建自己的数据集并训练一个模型,然后比较该自定义训练模型与Google Cloud Vision的性能。例如,可以从希望部署模型的地方捕获大约一百张图像或视频,然后将图像上传到Roboflow。可以快速注释它们,甚至可以让Autodistill为标记图像。一旦图像被注释,可以添加和修改预处理和增强,然后生成一个版本。创建版本后,可以一键训练模型。然后,按照本指南的相同方式继续,但将模型替换为自己的,以下载项目。
步骤2:评估模型性能
一旦有了模型和评估数据集,可以测试模型,并使用监督的mAP基准测试功能为两个模型产生mAP。首先,将导入`roboflow`和`supervision`包。然后,将下载评估数据集,并使用`DetectionDataset.from_coco()`方法将其导入监督。
from roboflow import Roboflow
rf = Roboflow(api_key="**YOUR API KEY HERE**")
project = rf.workspace("shreks-swamp").project("coco-dataset-limited--person-only")
dataset = project.version(1).download("coco")
要使用自己的数据集或自己的数据集进行此操作,请在Universe上的任何对象检测数据集上点击“下载此数据集”按钮,并以COCO格式导出。
测试Cloud Vision模型
首先,需要设置与Google的认证。如果以前没有使用过Google Cloud的API,请按照此Google指南创建服务帐户JSON文件,然后继续本指南。
from google.oauth2.service_account import Credentials
credentials = Credentials.from_service_account_file(
filename="tester-1490046330330-d33ad7bf6f84.json" # Replace with the file name of your service account file
)
然后,设置一个回调函数,以便监督可以运行模型与评估数据集中的图像。
def callback(np_image):
img = Image.fromarray(np_image)
buffer = io.BytesIO()
img.save(buffer, format='PNG') # You can change the format as needed, e.g., JPEG
buffer.seek(0)
image_bytes = buffer.read()
image = vision.Image(content=image_bytes)
objects = client.object_localization(image=image).localized_object_annotations
sv_result = sv.Detections.from_gcp_vision(gcp_results=objects, size=(img.height,img.width))
image = cv2.cvtColor(np_image, cv2.COLOR_RGB2BGR)
bounding_box_annotator = sv.BoundingBoxAnnotator(color=sv.Color.from_hex("#FF0000"))
annotated_frame = bounding_box_annotator.annotate(
scene=image,
detections=sv_result
)
sv.plot_image(image=image, size=(3, 3))
return sv_result
现在可以通过将模型传递给监督的mAP基准测试函数来计算模型的mAP。
mean_average_precision = sv.MeanAveragePrecision.benchmark(
dataset = sv_dataset,
callback = callback
)
然后,对评估数据集运行Cloud Vision API,并得到了64.7%的结果。
测试Roboflow Universe模型
接下来,将比较另一个模型。可以通过完成刚刚完成的相同过程来评估该模型,但通过修改回调并填写模型信息。将使用API密钥和模型的项目ID来加载第一个模型。
api_key = "YOUR API KEY HERE"
project_id = "people-detection-o4rdr"
rf = Roboflow(api_key)
project = rf.workspace().project(project_id)
model = project.version(1).model
然后,再次设置一个回调函数。
def callback(np_image):
image = cv2.cvtColor(np_image, cv2.COLOR_RGB2BGR)
result = model.predict(image, confidence=45, overlap=50).json()
sv_result = sv.Detections.from_inference(result)
bounding_box_annotator = sv.BoundingBoxAnnotator(color=sv.Color.from_hex("#FF0000"))
annotated_frame = bounding_box_annotator.annotate(
scene=image,
detections=sv_result
)
sv.plot_image(image=image, size=(3, 3))
return sv_result
然后,再次使用监督的mAP基准测试计算mAP。
mean_average_precision = sv.MeanAveragePrecision.benchmark(
dataset = sv_dataset,
callback = callback
)
然后,再次对Roboflow模型进行评估。
结果
刚刚用来评估模型的COCO(数据集)的结果,以及GCP Vision的API与Universe模型相比的改进性能,超出了预期,特别是考虑到对API的有限手动测试。
因此,进行了另外三个实验,以确定三件事:这种性能是否在其他数据/数据集中保持?Google Cloud Vision的对象检测API是否由Microsoft COCO提供支持?如果是这样,Google的模型的实际有效性如何?
Roboflow人物数据集评估
为了确定Google的模型性能是否在其他数据集中保持,评估了它在刚刚使用的Universe人物检测模型的测试数据集上的表现。还评估了另一个模型,一个在COCO上训练的Universe上的对象检测模型,一个上传的笔记本训练的YOLOv8n模型。
Google Cloud Vision结果,Universe COCO模型结果,Universe人物模型结果(从左到右)。
虽然这些结果远非确定Google Cloud Vision运行在Microsoft COCO模型上,但性能的惊人相似性表明他们可能使用了类似的数据集,或者Google可能已经从COCO检查点训练了他们的模型。这可能解释了GCP Vision模型在之前的测试中的改进性能。模型通常在图像上预测的准确性更高,这些图像已经被看到过或与“以前看到过”/训练过的图像相似。这就是为什么mAP并不总是提供完整的画面。
替代评估数据集
为了公平地评估所有三个模型,将在所有模型可能都未见过的数据集上第三次也是最后一次评估这些模型。使用了另一个来自Roboflow Universe的人物检测数据集。这些是在新数据集上再次运行先前测试的结果:
能够正确评估不同平台上的不同模型可以是决定哪个模型最适合任何特定用例的有效工具。虽然最终的评估数据集确实导致了Universe上的一个模型的性能更高,但这并不一定等同于在用例中的好性能。鼓励收集现实世界数据,不仅要评估模型在数据上的表现,还要能够训练自己的模型。