谷歌云视觉与春季开机


在这篇文章中,我们将看看如何从春季启动应用程序中使用谷歌云视觉。有了谷歌云视觉,可以从图像中获得各种各样的东西,比如标签、人脸和文本识别等等。另外,还提供了一些Python示例。

1.介绍

开始进行云视觉实验的一个很好的切入点是Cloud Vision API Documentation。文档是全面的,示例实际上是有效的;-)。在接下来的段落中,我们将探索一些图像处理功能。我们将执行以下操作:

  • 检索图像的标签
  • 检测图像中的文本
  • 认出一个地标
  • 检测图像中的人脸

您可以使用所提供的运行良好的客户端库,但是如果您已经在使用Spring Boot,您也可以使用所提供的starter,这使得使用该应用编程接口变得更加容易。我们将使用Spring starter,最后我们用Python创建了相同的例子,利用了谷歌提供的客户端。

样本的一个很好的参考是Spring Cloud GCP Vision API Sample

Java source code以及Python source code本文中使用的,可在GitHub上找到。

2.创建GCP项目

在开始之前,我们需要在谷歌云平台(GCP)上设置一些东西。如果你还没有账户,你可以免费创建一个。如果你只是在做实验,就不会被收费。

在GCP创建一个新项目。

Cloud Vision - new project

在菜单中,导航到“应用程序接口和服务-仪表板”,然后单击“启用应用程序接口和服务”按钮。

Cloud Vision - Enable APIs and Services button

搜索视力在搜索栏中,单击“云视觉应用编程接口”。

Cloud Vision - Cloud Vision API search result

单击“启用”按钮以启用应用编程接口。

Cloud Vision - Enable API

我们将从我们的开发机器上运行应用程序。因此,我们需要设置一个服务帐户。见aprevious post关于如何做到这一点的第3.4段。

3.春季靴和云视觉

一如既往,我们的出发点是Spring Initializr。我们选择JDK11和Spring Web MVC。我们将创建一些端点,以便开始我们正在尝试做的实验。

pom,我们需要添加spring-cloud-gcp-starter-vision依赖性,我们还添加了春云GCP BOM。

<dependencies>
  ...
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-vision</artifactId>
  </dependency>
  ...
</dependencies>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-gcp-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

接下来,我们添加一个VisionController我们在那里注射CloudVisionTemplate我们将使用它来访问云视觉应用编程接口。这VisionController将在我们的实验中扩展各种端点。

@RestController
public class VisionController {

  @Autowired
  private CloudVisionTemplate cloudVisionTemplate;

}

3.1检索图像的标签

我们的第一个实验是检索图像的标签。我们将用这只可爱的小猫的形象来做这件事。

Cloud Vision - cat

我们添加了getLabelDetection方法VisionController。的CloudVisionTemplate有一个analyzeImage方法,该方法需要我们想要从云视觉中检索的图像和信息作为输入参数。为了检索标签,我们通过以下方式进行检索Feature.Type.LABEL_DETECTION。从响应中,我们可以用getLabelAnnotationsList

@RequestMapping("/getLabelDetection")
public String getLabelDetection() {

  Resource imageResource = this.resourceLoader.getResource("file:src/main/resources/cat.jpg");
  AnnotateImageResponse response = this.cloudVisionTemplate.analyzeImage(
                                      imageResource, Feature.Type.LABEL_DETECTION);

  return response.getLabelAnnotationsList().toString();

}

运行应用程序:

$ mvn spring-boot:run

转到网址http://localhost:8080/getLabelDetection要检索结果:

[
mid: "/m/01yrx" 
description: "Cat" 
score: 0.99598557 
topicality: 0.99598557 , 
...
 ]

我们只列出了一小部分检索到的结果。这mid参数是对应于实体的唯一机器生成的标识符Google Knowledge Graph入口。您可以转到知识图表并输入mid并检索有关该项目的更多信息。这description参数是一个简短的描述。这score参数给出了检测到该项目的置信度的指示(得分为1表示非常自信,得分为0表示不太自信)。这topicality参数应该给我们一个不同于score,但似乎有一个existing bug导致两个值相同。这topicality应该能告诉我们相关性。

3.2检测图像中的文本

在我们的第二个实验中,我们将尝试从图像中检索一些文本。我们使用以下图像。

Cloud Vision - Text

我们添加了getTextDetection方法添加到VisionController。与标签检测相比,我们唯一改变的是使用Feature.Type.DOCUMENT_TEXT_DETECTION表明我们这次对文本感兴趣。在响应中,我们使用getTextAnnotationsList方法。

@RequestMapping("/getTextDetection")
public String getTextDetection() {

  Resource imageResource = this.resourceLoader.getResource("file:src/main/resources/text.jpeg");
  AnnotateImageResponse response = this.cloudVisionTemplate.analyzeImage(
          imageResource, Feature.Type.DOCUMENT_TEXT_DETECTION);

  return response.getTextAnnotationsList().toString();

}

转到网址http://localhost:8080/getTextDetection要检索结果:

[
locale: "en" 
description: "MAKE\nTHIS DAY\nGREAT!\n" 
bounding_poly { 
vertices { x: 100 y: 74 } 
vertices { x: 404 y: 74 } 
vertices { x: 404 y: 272 } 
vertices { x: 100 y: 272 } } ,
...
]

现在,区域设置参数指示语言是英语,文本块的位置用边界多边形参数指示。可以找到返回参数的完整列表here

3.3识别地标

在我们的第三个实验中,我们将验证一个地标是否可以被识别。我们将使用位于比利时布鲁塞尔的原子钟。

Cloud Vision - Landmark

我们添加了getLandmarkDetection方法添加到VisionController。同样,我们唯一改变的是Feature.Type.LANDMARK_DETECTION。为了检索结果,我们调用getLandmarkAnnotationsList方法。

@RequestMapping("/getLandmarkDetection")
public String getLandmarkDetection() {

  Resource imageResource = this.resourceLoader.getResource("file:src/main/resources/landmark.jpeg");
  AnnotateImageResponse response = this.cloudVisionTemplate.analyzeImage(
          imageResource, Feature.Type.LANDMARK_DETECTION);

  return response.getLandmarkAnnotationsList().toString();
}

转到网址http://localhost:8080/getLandmarkDetection要检索结果:

[
mid: "/m/0kfhm" 
description: "Atomium" 
score: 0.65761214 
bounding_poly { 
vertices { x: 28 y: 227 } 
vertices { x: 424 y: 227 } 
vertices { x: 424 y: 595 } 
vertices { x: 28 y: 595 } } 
locations { lat_lng { latitude: 50.894919 longitude: 4.341466 } } ]

我们现在还检索纬度/经度坐标,它们是spot on;-)

3.4检测图像中的人脸

在我们最后的实验中,我们将识别图像中的人脸。我们将使用下面的图片。

Cloud Vision - Faces

我们添加了getFaceDetection方法添加到VisionController。同样,我们唯一改变的是Feature.Type.FACE_DETECTION。为了检索结果,我们调用getFaceAnnotationsList方法。

@RequestMapping("/getFaceDetection")
public String getFaceDetection() throws IOException {

  Resource imageResource = this.resourceLoader.getResource("file:src/main/resources/faces.jpeg");
  Resource outputImageResource = this.resourceLoader.getResource("file:src/main/resources/output.jpg");
  AnnotateImageResponse response = this.cloudVisionTemplate.analyzeImage(
          imageResource, Feature.Type.FACE_DETECTION);

  writeWithFaces(imageResource.getFile().toPath(), outputImageResource.getFile().toPath(), response.getFaceAnnotationsList());

  return response.getFaceAnnotationsList().toString();

}

我们还将根据返回的顶点信息在人脸周围绘制矩形,并保存图像。

private static void writeWithFaces(Path inputPath, Path outputPath, List faces)
        throws IOException {
  BufferedImage img = ImageIO.read(inputPath.toFile());
  annotateWithFaces(img, faces);
  ImageIO.write(img, "jpg", outputPath.toFile());
}

public static void annotateWithFaces(BufferedImage img, List faces) {
  for (FaceAnnotation face : faces) {
      annotateWithFace(img, face);
  }
}

private static void annotateWithFace(BufferedImage img, FaceAnnotation face) {
  Graphics2D gfx = img.createGraphics();
  Polygon poly = new Polygon();
  for (Vertex vertex : face.getFdBoundingPoly().getVerticesList()) {
      poly.addPoint(vertex.getX(), vertex.getY());
  }
  gfx.setStroke(new BasicStroke(5));
  gfx.setColor(new Color(0x00ff00));
  gfx.draw(poly);
}

转到网址http://localhost:8080/getFaceDetection以便检索结果。我们没有在这里列出输出,它相当大,与之前的结果相似。这是我们最终的输出图像,很酷,不是吗?

Cloud Vision - faces recognized

4.蟒蛇样本

我们还试图用Python创建上面的例子。Python代码可以在以下位置找到GitHub这些例子主要取自provided samples from Google

我们将只列出我们为了让他们运行所做的事情。

我们已经使用了PyCharm,并在我们的Python 3项目中建立了一个虚拟环境。我们在PyCharm终端中验证了Python版本:

$ python --version
Python 3.7.1

我们已经安装了谷歌云愿景软件包:

$ pip install google-cloud-vision

我们添加了service-account.json文件,并将GOOGLE_APPLICATION_CREDENTIALS环境变量:

$ export GOOGLE_APPLICATION_CREDENTIALS=<path to the service-account.json file>/service-account.json

我们还需要安装枕头包:

$ pip install Pillow

现在运行Python文件和detect_labels函数向我们显示了以下结果:

$ python cloudvision.py 
#################
# Detect Labels #
#################
Labels:
Cat
Mammal
Small to medium-sized cats
Felidae
Whiskers
Carnivore
Kitten
Domestic long-haired cat
Somali
Norwegian forest cat

5.结论

在这篇文章中,我们研究了如何从春季启动应用程序中使用谷歌云视觉应用编程接口。我们尝试了标签检测、文本检测、地标检测和人脸检测等功能。该应用编程接口非常容易使用,文档也非常好。为不同的编程语言提供了全面的示例代码,可以按原样使用。