Python 適用的圖片區隔指南

MediaPipe Image Segmenter 工作可根據預先定義的選項將圖片分成多個區域 以便套用背景模糊處理等視覺效果這些 指示顯示如何使用 Python 語言使用 Image Segmenter。適用對象 進一步瞭解 請參閱總覽

程式碼範例

Image Segmenter 範例程式碼提供 執行相關作業這個程式碼可協助您測試這項工作 即可開始建構自己的影像分割應用程式您可以查看、執行 編輯影像分割器 程式碼範例 只要使用網路瀏覽器即可。

設定

本節說明設定開發環境的重要步驟,以及 以及專門使用 Image Segmenter 的程式碼專案如需 設定開發環境以使用 MediaPipe 工作,包括: 平台版本需求,請參閱 Python 設定指南。 您可以查看本範例的原始碼 GitHub

套件

MediaPipe Image Segmenter 工作需要 mediapipe 套件。如要安裝 附加必要的依附元件:

$ python -m pip install mediapipe

匯入

匯入下列類別以存取 Image Segmenter 工作函式:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

型號

MediaPipe Image Segmenter 工作需要經過訓練且與此模型相容的模型。 工作。如要進一步瞭解圖片區隔工具可用的已訓練模型,請參閱: 工作總覽的「Models」(模型) 區段。

選取並下載模型,然後將模型儲存在專案目錄中:

model_path = '/absolute/path/to/model.tflite'

在 Model Name 參數中指定模型的路徑,如下所示:

base_options = BaseOptions(model_asset_path=model_path)

建立工作

MediaPipe Image Segmenter 工作會使用 create_from_options 函式來 設定工作。create_from_options 函式接受值 來處理設定選項如要進一步瞭解工作設定 請參閱設定選項

這些樣本還會顯示圖片的工作建構方式的不同版本, 影片檔案和直播影片串流

圖片

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

影片

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

直播

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

設定選項

這項工作有下列 Python 應用程式設定選項:

選項名稱 說明 值範圍 預設值
running_mode 設定任務的執行模式。在架構中 模式:

圖片:單一圖片輸入模式。

VIDEO:影片已解碼的影格模式。

LIVE_STREAM:輸入串流模式 擷取的資訊等。 在此模式下, resultListener 設定接聽程式來接收結果 以非同步方式載入物件
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask 如果設為 True,則輸出結果會包含區隔遮罩 視為 uint8 圖片,其中每個像素值都代表勝出的類別 值。 {True, False} False
output_confidence_masks 如果設為 True,則輸出結果會包含區隔遮罩 視為浮點值圖片,其中各浮點值代表信心值 分數圖。 {True, False} True
display_names_locale 設定標籤語言,供 工作模型的中繼資料 (如有)。以下項目的預設值為 en: 英語。您可以在自訂模型的中繼資料中加入經本地化的標籤 使用 TensorFlow Lite Metadata Writer API 語言代碼 en
result_callback 設定結果監聽器以接收區隔結果 圖片片段工具處於 LIVE_STREAM 模式時,以非同步方式顯示。 只有在執行模式設為「LIVE_STREAM」時才能使用 不適用 不適用

準備資料

準備輸入圖片檔案或 numpy 陣列 然後將其轉換為 mediapipe.Image 物件如果輸入內容是影片檔案 或透過網路攝影機直播,可以使用如 OpenCV,會將輸入影格載入為 numpy 陣列。

圖片

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

影片

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate to calculate the timestamp for each frame.
# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

直播

# Use OpenCV’s VideoCapture to start capturing from the webcam.
# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

如需關於 Image Segmenter 資料準備的程式碼範例,請參閱 程式碼範例

執行工作

圖片區隔工具使用 segmentsegment_for_videosegment_async 函式,用於觸發推論。對影像分割而言 預先處理輸入資料、執行區隔模型和後續處理 原始模型會輸出至分段遮罩

以下程式碼範例顯示如何使用工作模型執行處理程序。

圖片

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

影片

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

直播

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

注意事項:

  • 以錄影模式或直播模式執行時,你也必須 提供 Image Segmenter 工作,做為輸入影格的時間戳記。
  • 以圖片或影片模型執行時,圖片區隔工具工作 封鎖目前的執行緒,直到處理完成輸入圖片, 相框。

如需更完整的圖像區隔工具推論範例,請參閱 程式碼範例

處理及顯示結果

圖片區隔工具會輸出 Image 資料清單。如果 output_typeCATEGORY_MASK,輸出值為清單 ,以 uint8 圖片呈現單一區隔遮罩。像素代表 辨識出輸入圖片的類別索引。如果 output_typeCONFIDENCE_MASK,輸出是類別編號大小的向量。每項 區段遮罩是 [0,1] 範圍內的浮動圖片,代表 該類別的像素可信度分數。

下列各節說明這項工作的輸出資料範例:

類別可信度

下圖顯示特定類別的工作輸出圖表 以及圖片辨識結果可信度遮罩輸出內容包含介於 [0, 1]

原始圖片和類別可信度遮罩輸出內容。來源映像檔 2012 年 Pascal VOC 資料集。

類別值

下圖顯示特定類別的工作輸出圖表 值遮罩。類別遮罩範圍是 [0, 255],每個像素值 代表模型輸出的獲勝類別索引。優勝獎項 索引是模型能辨識的類別分數最高。

原始圖片和類別遮罩輸出內容。來源映像檔 2012 年 Pascal VOC 資料集。