iT邦幫忙

2022 iThome 鐵人賽

DAY 21
2
AI & Data

Python x AI 影像辨識好好玩系列 第 21

( Day 21 ) Mediapipe 人物去背 ( Selfie Segmentation )

  • 分享至 

  • xImage
  •  

這篇教學會使用 MediaPipe 的自拍分割模型 ( Selfie Segmentation ) 偵測人物主體後,將背景去除,再透過 OpenCV 讀取攝影鏡頭影像加入虛擬背景,即時將去背的人物與背景合成。

原文參考:Mediapipe 人物去背 ( Selfie Segmentation )

因為程式使用 Jupyter 搭配 Tensorflow 進行開發,所以請先閱讀「使用 Anaconda」和「使用 MediaPipe」,安裝對應的套件,如果不要使用 Juputer,也可參考「使用 Python 虛擬環境」,建立虛擬環境進行實作。

Mediapipe 人物去背 ( Selfie Segmentation )

使用 MediaPipe,偵測人物主體並去背

Mediapipe Selfie Segmentation 使用基於 MobileNetV3 的模型,可以將場景中的突出人物與背景分離,雖然能做到即時的去背效果,但如果是「複雜」的的背景,然後會出現偵測錯誤的狀況,因此仍然建議使用「單純」的背景,才能看出比較好的效果 ( 有時甚至需要打光,強化主體人物,達到更好的去背效果 )。

下方的程式碼延伸「讀取並播放影片」文章的範例,搭配 mediapipe ,偵測人物主體並去背的方法,透過攝影鏡頭獲取影像後,將人物和 windows 的經典背景進行合成。

參考:numpy.where()

import cv2
import mediapipe as mp
import numpy as np
mp_drawing = mp.solutions.drawing_utils                    # mediapipe 繪圖功能
mp_selfie_segmentation = mp.solutions.selfie_segmentation  # mediapipe 自拍分割方法

cap = cv2.VideoCapture(0)
bg = cv2.imread('windows-bg.jpg')   # 載入 windows 經典背景

# mediapipe 啟用自拍分割
with mp_selfie_segmentation.SelfieSegmentation(
    model_selection=1) as selfie_segmentation:

    if not cap.isOpened():
        print("Cannot open camera")
        exit()
    while True:
        ret, img = cap.read()
        if not ret:
            print("Cannot receive frame")
            break
        img = cv2.resize(img,(520,300))               # 縮小尺寸,加快演算速度
        img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)   # 將 BGR 轉換成 RGB
        results = selfie_segmentation.process(img2)   # 取得自拍分割結果
        condition = np.stack((results.segmentation_mask,) * 3, axis=-1) > 0.1 # 如果滿足模型判斷條件 ( 表示要換成背景 ),回傳 True
        output_image = np.where(condition, img, bg)
        # 將主體與背景合成,如果滿足背景條件,就更換為 bg 的像素,不然維持原本的 img 的像素

        cv2.imshow('oxxostudio', output_image)
        if cv2.waitKey(5) == ord('q'):
            break     # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()

Python 教學 - 人物去背 ( Selfie Segmentation )

參考資料 {end}

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 20 ) Mediapipe 物體偵測 ( Objectron )
下一篇
( Day 22 ) Mediapipe 手勢辨識
系列文
Python x AI 影像辨識好好玩32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言