Day 08 Azure cognitive service: object detection- 匡出照片中的喵

Azure cognitive service: Object Detection- 匡出照片中的喵

物体侦测 (Object Detection)

物体侦测主要就做两件事情:

  • 侦测物体位置,如下图三个方框。
  • 判断物体为何 (影像辨识- Image Classification),如下图分别辨识出三个方框中的物体为何。

物体侦测算是一个相对成熟的技术,现在主要手段还是透过深度学习训练模型,在模型的训练过程中,会需要分析大量的影像与物体相对应的位置与标示,才能在训练结束後辨识影像中的物体。详细的物体辨识介绍有些复杂,这篇文章不一一解说。目前效果最好的物体辨识模型之一 YOLO- You Only Look Once,而且不断在进化,目前原作者认可的最新版本是 YOLOv4,其论文详细说明物体侦测的步骤,有兴趣的人可以到以下连结研究:

虽然物体侦测的模型有点复杂,但 Azure 有提供自己训练出来的模型提供大家使用,不需要看论文,也不需要懂原理,只要会用 API 就好,後续就是要教大家如何利用 Azure 电脑视觉服务来偷懒。

申请 Azure 电脑视觉服务

  1. 进入https://portal.azure.com/#home
  2. 点选建立资源
  3. 搜寻并选择 computer vision
  4. 自行命名。
  5. 找到可以选择定价层 Free F0 的区域,并选择 Free F0。
  6. 给予标签
  7. 检阅 + 建立

安装Python套件

需要用到以下套件:

  • azure-cognitiveservices-vision-computervision
  • Pillow
  • requests

金钥与端点

  • 取得金钥 (SUBSCRIPTION KEY) 和 端点 (ENDPOINT)
  • Azure 电脑视觉的功能都是使用同一组金钥与端点

示范程序

import os
from io import BytesIO
import requests
from PIL import Image, ImageDraw, ImageFont
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from msrest.authentication import CognitiveServicesCredentials

# 汇入必要套件,主要都是跟读档、绘图和 Azure 的相关套件 

# 一开始除了汇入套件以外,还需要利用金钥SUBSCRIPTION_KEY和端点ENDPOINT,取得使用电脑视觉服务的权限。

SUBSCRIPTION_KEY = os.getenv("SUBSCRIPTION_KEY")
ENDPOINT = os.getenv("ENDPOINT")
CV_CLIENT = ComputerVisionClient(
    ENDPOINT, CognitiveServicesCredentials(SUBSCRIPTION_KEY)
)


def main():
    """
    Azure object detection
    """
    
    # 透过图片的 URL 取得图片
    url = "https://i.imgur.com/Js5H6Qa.jpg"
    response = requests.get(url)
    img = Image.open(BytesIO(response.content))
    
    # 开始设定绘图相关的部分,由於会需要在图片上写字,需要准备字型档
    draw = ImageDraw.Draw(img)
    font_size = int(5e-2 * img.size[1])
    fnt = ImageFont.truetype("../static/TaipeiSansTCBeta-Regular.ttf", size=font_size)
    # 透过电脑视觉的功能取得物件,侦测的结果会包含匡出物体的左上角座标(x, y),以及方匡的宽跟高(w, h),过这四个值即可画出方匡,并且标示辨识结果以及辨识的信心程度。
    object_detection = CV_CLIENT.detect_objects(url)
    if len(object_detection.objects) > 0:
        for obj in object_detection.objects:
            left = obj.rectangle.x
            top = obj.rectangle.y
            right = obj.rectangle.x + obj.rectangle.w
            bot = obj.rectangle.y + obj.rectangle.h
            name = obj.object_property
            confidence = obj.confidence
            print("{} at location {}, {}, {}, {}".format(name, left, right, top, bot))
            draw.rectangle([left, top, right, bot], outline=(255, 0, 0), width=3)
            draw.text(
                [left, top + font_size],
                "{0} {1:0.1f}".format(name, confidence * 100),
                fill=(255, 0, 0),
                font=fnt,
            )
    # 最後存档
    img.save("output.png")
    print("Done!")
    print("Please check ouptut.png")


if __name__ == "__main__":
    main()

使用限制

  • 小於影像5%的物件难以侦测。
  • 同一种物件若是叠在一起或者彼此之间太靠近,可能较难侦测。
  • 无法依品牌或产品名称区分物件。

由於目前 Azure 电脑视觉的功能都只能输入图片的 URL,无法从自己的电脑输入图片,所以必须要找个地方上传图片,以便取得 URL。接下来,我们可以利用 Azure Blob 来取得图片的连结。


<<:  DAY3 圣杯布局 - 三个栏的C位争夺战(上)

>>:  Day 8:OkHttp 获取网路资料方式

Day01 什麽是Packages & Plugins ?

前言 这系列文章建议在有Flutter基础的能力後在观看,会比较好理解,关於Flutter 的介绍可...

[Day-1] 记录C++开发环境安装过程

今天我选择了"Dev-C++" 来当我学习C++的入门开发环境! 会想下载Dev...

1. 新Leader不该事必躬亲

前言 这篇适合给first time leader,特别是刚被promote成team leade...

Day 19 ( 中级 ) 电风扇 ( 控制强度 )

电风扇 ( 控制强度 ) 教学原文参考:电风扇 ( 控制强度 ) 这篇文章会介绍,如何在 Scrat...

Day 08 CSS样式改动及资料绑定详述

现在每次启动专案,预设路径都会是/,但我们目前没有Component套用这个路由,要自己切换到Pos...