node.js - 使用 Google Cloud Vision 查找图像中特定类型的每个对象
问题描述
我想使用 Google Vision 和 Nodejs 检测大照片中的每个车牌,以便我可以模糊它们并使它们不可读,以保护隐私。
const client = new Vision.ImageAnnotatorClient();
const [result] = await client.objectLocalization(fileUrl);
return result.localizedObjectAnnotations;
问题:这不会返回图像中的每个对象。它只返回一些。所以如果我过滤“车牌”,我不会在图片中找到每个车牌。我试过像这样使用文本检测:
const client = new Vision.ImageAnnotatorClient();
const [result] = await client.textDetection(fileUrl);
return result.textAnnotations;
这效果更好,但仍有一些车牌未被检测到。这些牌照是人眼可读的。如果我只裁剪车牌并通过对象检测功能运行它,人工智能会将其识别为车牌。
总结一下:视觉 API 能够识别具有少量物体的小图像中的车牌,但我想进行搜索以找到大图片中的每个车牌。这甚至可以通过 Vision API 实现吗?
解决方案
在 Cloud Vision API 中,对象定位功能主要用于检测图像中的多个对象。您使用此功能并且没有在输出中获得所有车牌的原因是因为在 Vision API 中,您可以在图像中的每个类别中获得最多 10 个对象。
例如 -
如果图像具有多个类别,例如自行车、自行车、手机等,则使用对象本地化功能,每个类别最多可以获得 10 个对象,这意味着 Cloud Vision API 返回总体上超过 10 个对象,而不是超过 10 个对象一个特定的类别。
我使用图像尝试了您的用例,其中图像中有大约 24 个车牌。当我尝试运行代码并进行计数时,我得到了 10 个车牌对象。
您可以查看以下代码片段和相关输出:
async function localizeObjectsGCS(gcsUri) {
const vision = require('@google-cloud/vision');
const client = new vision.ImageAnnotatorClient();
const data =[]
const [result] = await client.objectLocalization(gcsUri);
const objects = result.localizedObjectAnnotations;
objects.forEach(object => {
console.log(`Name: ${object.name}`);
data.push(`Name: ${object.name}`);
});
console.log(data.length);
}
localizeObjectsGCS(`gs://mybucket/img.jpg`)
输出:
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
Name: License plate
10
这意味着对于每个类别,根据此文档,您将拥有最大数量的对象。在响应字段中有一个名为maxResults的参数,我们可以在其中定义每个类别的最大对象数,但它应该小于或等于 10。
如果您想使用对象本地化功能,您必须拥有最多包含 10 个车牌的图像,具体取决于您的用例。
关于您正在应用过滤器车牌并进行文本检测但未在输出中获取所有数字的第二点,在这里您也可以尝试使用针对密集文本进行优化的文档文本检测来代替文本检测。
你可以参考下面的python片段:
from google.cloud import vision
client = vision.ImageAnnotatorClient()
l1=[]
image = vision.Image()
response = client.annotate_image({
'image': {'source': {'image_uri': 'gs://mybucket/img.jpg'}},
'features': [{'type_': vision.Feature.Type.OBJECT_LOCALIZATION},
{'type_': vision.Feature.Type.DOCUMENT_TEXT_DETECTION}
]
})
lo_annotations = response.localized_object_annotations
for obj in lo_annotations:
if obj.name == 'License plate':
for page in response.full_text_annotation.pages:
for block in page.blocks:
for paragraph in block.paragraphs:
for word in paragraph.words:
words = ''.join([
symbol.text for symbol in word.symbols
])
print('Words: {} (confidence: {})'.format(
words, word.confidence))
输出(全部输出的一部分):
推荐阅读
- arrays - 如何将二维数组作为C函数的参数传递?
- javascript - 如何在作为函数一部分的 PHP 变量中的 html 代码中运行 Javascript
- asp.net - AjaxControlToolkit AutoCompleteExtender 不显示建议
- android - REST API - Android Studio、Node.js、Firebase
- maven - 错误:无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.7.0
- java - 测试用例的断言错误导致所有后续测试用例在批处理运行中执行脚本时失败
- sql - 包括联结表的 SELECT 查询
- angular - Angular mat-table - 如何使用双向绑定将 JSON 对象绑定到两个不同的选择元素?
- swift - 命令 CompileSwiftSources 失败,退出代码非零 Xcode 10
- javascript - 如何减少动画的每次点击