คำแนะนำในการแยกประเภทรูปภาพสำหรับ Python

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

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

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

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

หากคุณใช้ตัวแยกประเภทรูปภาพสำหรับ Raspberry Pi โปรดดูแอปตัวอย่าง Raspberry Pi

ตั้งค่า

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

กล่องพัสดุ

ตัวแยกประเภทรูปภาพจะจัดการกับแพ็กเกจ Mediapไปป์ PIP คุณติดตั้ง Dependency ได้ด้วยวิธีต่อไปนี้

$ python -m pip install mediapipe
``` ### Imports

Import the following classes to access the Image Classifier task functions:

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

รุ่น

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

เลือกและดาวน์โหลดโมเดล แล้วจัดเก็บไว้ในไดเรกทอรีในเครื่อง คุณสามารถใช้โมเดล EfficientNet-Lite0 ที่แนะนำได้

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

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

base_options = BaseOptions(model_asset_path=model_path)

สร้างงาน

ใช้ฟังก์ชัน create_from_options เพื่อสร้างงาน ฟังก์ชัน create_from_options จะยอมรับตัวเลือกการกำหนดค่าต่างๆ เช่น โหมดการวิ่ง ภาษาของชื่อที่แสดง จำนวนผลลัพธ์สูงสุด เกณฑ์ความเชื่อมั่น รายการที่อนุญาตสำหรับหมวดหมู่ และรายการปฏิเสธ ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ภาพรวมการกำหนดค่า

งานตัวแยกประเภทรูปภาพรองรับอินพุต 3 ประเภท ได้แก่ ภาพนิ่ง ไฟล์วิดีโอ และสตรีมวิดีโอสด เลือกแท็บที่เกี่ยวข้องกับประเภทข้อมูลอินพุต เพื่อดูวิธีสร้างงานและเรียกใช้การอนุมาน

รูปภาพ

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

วิดีโอ

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

สตรีมแบบสด

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageClassifierResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageClassifierResult result: {}'.format(result))

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

สำหรับตัวอย่างที่สมบูรณ์ของการสร้างตัวแยกประเภทรูปภาพเพื่อใช้กับรูปภาพ โปรดดูตัวอย่างโค้ด

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอปพลิเคชัน Python

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
running_mode ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 โหมด ได้แก่

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

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

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของข้อมูลอินพุต เช่น จากกล้อง ในโหมดนี้ ต้องเรียกใช้ resultsListener เพื่อตั้งค่า Listener ให้รับผลลัพธ์ แบบไม่พร้อมกัน
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ในข้อมูลเมตาของโมเดลงาน หากมี ค่าเริ่มต้นคือ en สำหรับภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วไปยังข้อมูลเมตาของโมเดลที่กำหนดเองได้โดยใช้ TensorFlow Lite Metadata Writer API รหัสภาษา en
max_results ตั้งค่าจำนวนผลลัพธ์การจัดประเภทที่มีคะแนนสูงสุด (ไม่บังคับ) ที่จะแสดง หาก < 0 ระบบจะแสดงผลลัพธ์ที่ใช้ได้ทั้งหมด จำนวนบวกใดก็ได้ -1
score_threshold ตั้งค่าเกณฑ์คะแนนการคาดการณ์ที่ลบล้างเกณฑ์ที่ระบุไว้ในข้อมูลเมตาของโมเดล (หากมี) ผลลัพธ์ที่ต่ำกว่าค่านี้ถูกปฏิเสธ ทศนิยมใดก็ได้ ไม่ได้ตั้งค่า
category_allowlist ตั้งค่ารายการชื่อหมวดหมู่ที่อนุญาตซึ่งไม่บังคับ หากไม่ว่างเปล่า ระบบจะกรองผลลัพธ์การจัดประเภทที่มีชื่อหมวดหมู่ที่ไม่ได้อยู่ในชุดนี้ออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้จะใช้กับ category_denylist ไม่ได้ และการใช้ทั้ง 2 อย่างจะทำให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
category_denylist ตั้งค่ารายการตัวเลือกชื่อหมวดหมู่ที่ไม่ได้รับอนุญาต หากไม่ว่างเปล่า ผลการจัดประเภทที่มีชื่อหมวดหมู่อยู่ในชุดนี้จะถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้ใช้ร่วมกับ category_allowlist ไม่ได้ และการใช้ทั้ง 2 อย่างจะทําให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
result_callback ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์การจัดประเภทแบบไม่พร้อมกันเมื่อตัวแยกประเภทรูปภาพอยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น ไม่มีข้อมูล ไม่ได้ตั้งค่า

เตรียมข้อมูล

เตรียมอินพุตเป็นไฟล์ภาพหรืออาร์เรย์ numpy แล้วแปลงเป็นออบเจ็กต์ mediapipe.Image หากอินพุตของคุณเป็นไฟล์วิดีโอหรือสตรีมแบบสดจากเว็บแคม คุณจะใช้ไลบรารีภายนอก เช่น OpenCV เพื่อโหลดเฟรมอินพุตเป็นอาร์เรย์ numpy ได้

ตัวอย่างต่อไปนี้จะอธิบายและแสดงวิธีเตรียมข้อมูลเพื่อประมวลผลสำหรับข้อมูลแต่ละประเภทที่มีอยู่

รูปภาพ

import mediapipe as mp

# 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)
    

วิดีโอ

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it 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)
    

สตรีมแบบสด

import mediapipe as mp

# 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 Classifier API จะแสดงผลหมวดหมู่ที่เป็นไปได้สำหรับออบเจ็กต์ภายในรูปภาพหรือเฟรมอินพุต

รูปภาพ

# Perform image classification on the provided single image.
classification_result = classifier.classify(mp_image)
    

วิดีโอ

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image classification on the video frame.
classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
    

สตรีมแบบสด


# Send the latest frame to perform image classification.
# Results are sent to the `result_callback` provided in the `ImageClassifierOptions`.
classifier.classify_async(mp_image, frame_timestamp_ms)
    

โปรดทราบดังต่อไปนี้

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

สำหรับตัวอย่างที่สมบูรณ์ของการสร้างตัวแยกประเภทรูปภาพเพื่อใช้กับรูปภาพ โปรดดูตัวอย่างโค้ด

จัดการและแสดงผลลัพธ์

เมื่อใช้การอนุมาน งานตัวแยกประเภทรูปภาพจะแสดงผลออบเจ็กต์ ImageClassifierResult ที่มีรายการหมวดหมู่ที่เป็นไปได้สำหรับออบเจ็กต์ภายในรูปภาพหรือเฟรมอินพุต

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

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

ผลลัพธ์นี้มาจากการเรียกใช้ Bird Classifier ใน:

โค้ดตัวอย่างตัวแยกประเภทรูปภาพแสดงวิธีแสดงผลการจัดประเภทที่แสดงผลจากงาน ดูรายละเอียดได้ในตัวอย่างโค้ด