คู่มือการแบ่งกลุ่มรูปภาพสำหรับ Python

งาน MediaPipe Image Segmenter ช่วยให้คุณแบ่งรูปภาพออกเป็นภูมิภาคตามหมวดหมู่ที่กำหนดไว้ล่วงหน้าเพื่อใช้เอฟเฟกต์ภาพ เช่น การเบลอพื้นหลัง วิธีการเหล่านี้แสดงวิธีใช้เครื่องมือแบ่งส่วนรูปภาพกับภาษา Python ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างสำหรับเครื่องมือแบ่งกลุ่มรูปภาพแสดงการใช้งานที่สมบูรณ์ของงานนี้ใน Python สำหรับใช้อ้างอิง โค้ดนี้จะช่วยคุณทดสอบงานนี้และเริ่มต้นสร้างแอปพลิเคชันแยกส่วนของรูปภาพของคุณเอง คุณสามารถดู เรียกใช้ และแก้ไขโค้ดตัวอย่างโปรแกรมแบ่งกลุ่มรูปภาพได้โดยใช้เพียงเว็บเบราว์เซอร์

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสําคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้เครื่องมือแยกแยะรูปภาพโดยเฉพาะ ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาซอฟต์แวร์เพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ Python คุณดูซอร์สโค้ดของตัวอย่างนี้ได้ใน GitHub

แพ็กเกจ

งาน MediaPipe Image Segmenter ต้องใช้แพ็กเกจ mediapipe คุณติดตั้งข้อกําหนดเบื้องต้นที่จําเป็นได้ด้วยคําสั่งต่อไปนี้

$ python -m pip install mediapipe

การนำเข้า

นําเข้าคลาสต่อไปนี้เพื่อเข้าถึงฟังก์ชันงานของเครื่องมือแยกแยะรูปภาพ

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

รุ่น

งานตัวแบ่งส่วนรูปภาพของ MediaPipe ต้องใช้โมเดลที่ผ่านการฝึกซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกอบรมแล้วสำหรับเครื่องมือแยกส่วนรูปภาพได้ที่ส่วนโมเดลในภาพรวมของงาน

เลือกและดาวน์โหลดโมเดล จากนั้นจัดเก็บไว้ในไดเรกทอรีโปรเจ็กต์

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

ระบุเส้นทางของโมเดลภายในพารามิเตอร์ชื่อโมเดล ดังที่แสดงด้านล่าง

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 ตั้งค่าโหมดการทํางานสําหรับงาน โดยโหมดมี 3 แบบ ดังนี้

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสตรีมแบบสดของข้อมูลอินพุต เช่น จากกล้อง ในโหมดนี้ คุณต้องเรียกใช้ resultListener เพื่อตั้งค่า Listener เพื่อรับผลลัพธ์แบบไม่พร้อมกัน
{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)
    

ดูตัวอย่างโค้ดที่แสดงการเตรียมข้อมูลสําหรับเครื่องมือแบ่งส่วนรูปภาพได้ที่ตัวอย่างโค้ด

เรียกใช้งาน

ตัวแบ่งส่วนรูปภาพใช้ฟังก์ชัน segment, segment_for_video และ segment_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 หาก output_type เป็น CATEGORY_MASK เอาต์พุตจะเป็นลิสต์ที่มีมาสก์แบบแบ่งกลุ่มเดียวเป็นภาพ uint8 พิกเซลจะระบุดัชนีหมวดหมู่ที่รู้จักของรูปภาพอินพุต หาก output_type คือ CONFIDENCE_MASK เอาต์พุตจะเป็นเวกเตอร์ที่มีขนาดเท่ากับจำนวนหมวดหมู่ มาสก์ที่แบ่งแต่ละส่วนเป็นรูปภาพแบบลอยตัวในช่วง [0,1] ซึ่งแสดงคะแนนความเชื่อมั่นของพิกเซลที่อยู่ในหมวดหมู่

ส่วนต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

ความเชื่อมั่นของหมวดหมู่

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงานสำหรับหมวดหมู่หน้ากากความเชื่อมั่น เอาต์พุตของหน้ากากความเชื่อมั่นมีค่าประเภท float อยู่ระหว่าง [0, 1]

เด็กหญิง 2 คนขี่ม้าและเด็กหญิงอีก 1 คนเดินข้างม้า มาสก์รูปภาพที่ร่างรูปร่างของเด็กผู้หญิงและม้าจากรูปภาพก่อนหน้า ระบบจับภาพขอบของรูปภาพครึ่งซ้ายไว้ แต่ไม่ได้จับภาพครึ่งขวา

เอาต์พุตมาสก์ความเชื่อมั่นของรูปภาพต้นฉบับและหมวดหมู่ รูปภาพต้นทางจากชุดข้อมูล Pascal VOC 2012

ค่าหมวดหมู่

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงานสำหรับมาสก์ค่าหมวดหมู่ ช่วงของมาสก์หมวดหมู่คือ [0, 255] และค่าพิกเซลแต่ละค่าแสดงถึงดัชนีหมวดหมู่ที่ชนะของเอาต์พุตโมเดล หมวดหมู่/ดัชนีที่ชนะคือหมวดหมู่/ดัชนีที่มีคะแนนสูงสุดในบรรดาหมวดหมู่ที่โมเดลจดจําได้

เด็กหญิง 2 คนขี่ม้าและเด็กหญิงอีก 1 คนเดินข้างม้า มาสก์รูปภาพที่ร่างรูปร่างของเด็กผู้หญิงและม้าจากรูปภาพก่อนหน้า มีการมาสก์รูปร่างของเด็กผู้หญิงทั้ง 3 คนและม้าอย่างถูกต้อง

เอาต์พุตมาสก์รูปภาพและหมวดหมู่ต้นฉบับ รูปภาพต้นทางจากชุดข้อมูล Pascal VOC 2012