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