iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
AI & Data

我不太懂 AI,可是我會一點 Python 和 Azure系列 第 8

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 來取得圖片的連結。


上一篇
Day 07 Azure cognitive service- 於是,Chatbot 也有了智慧
下一篇
Day 09 Azure Storage Account- 給照片找個家
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30

尚未有邦友留言

立即登入留言