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

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

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

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

ตั้งค่า

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

แพ็กเกจ JavaScript

โค้ดตัวแบ่งส่วนรูปภาพมีให้ใช้งานผ่านแพ็กเกจ @mediapipe/tasks-vision NPM ของ MediaPipe คุณสามารถค้นหาและดาวน์โหลดไลบรารีเหล่านี้ได้จากลิงก์ที่ระบุไว้ในคู่มือการตั้งค่าของแพลตฟอร์ม

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

npm install --save @mediapipe/tasks-vision

หากต้องการนําเข้าโค้ดงานผ่านบริการเครือข่ายนำส่งข้อมูล (CDN) ให้เพิ่มโค้ดต่อไปนี้ในแท็ก ในไฟล์ HTML

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

รุ่น

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

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

<dev-project-root>/app/shared/models/

สร้างงาน

ใช้ฟังก์ชัน Image Segmenter createFrom...() อย่างใดอย่างหนึ่งเพื่อเตรียมงานสำหรับการเรียกใช้การอนุมาน ใช้ฟังก์ชัน createFromModelPath() ด้วยเส้นทางสัมพัทธ์หรือเส้นทางสัมบูรณ์ไปยังไฟล์โมเดลที่ผ่านการฝึก หากโหลดโมเดลลงในหน่วยความจําแล้ว คุณจะใช้เมธอด createFromModelBuffer() ได้

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

โค้ดต่อไปนี้แสดงวิธีสร้างและกําหนดค่างานด้วยตัวเลือกที่กําหนดเอง

runningMode = "IMAGE";

async function createImageSegmenter() {
  const vision = await FilesetResolver.forVisionTasks(
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
  );

  imageSegmenter = await ImageSegmenter.createFromOptions(vision, {
    baseOptions: {
      modelAssetPath:
        "https://storage.googleapis.com/mediapipe-assets/deeplabv3.tflite?generation=1661875711618421",
    },
    outputCategoryMask: true,
    outputConfidenceMasks: false
    runningMode: runningMode
  });
}
createImageSegmenter();

ดูการใช้งานที่สมบูรณ์ยิ่งขึ้นของการสร้างงานโปรแกรมแบ่งกลุ่มรูปภาพได้ที่ตัวอย่างโค้ด

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

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

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
outputCategoryMask หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่มเป็นรูปภาพ uint8 โดยที่ค่าพิกเซลแต่ละค่าจะระบุค่าหมวดหมู่ที่ชนะ {True, False} False
outputConfidenceMasks หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่มเป็นรูปภาพค่าลอยตัว โดยค่าลอยตัวแต่ละค่าแสดงแผนที่คะแนนความเชื่อมั่นของหมวดหมู่ {True, False} True
displayNamesLocale ตั้งค่าภาษาของป้ายกำกับที่จะใช้สำหรับชื่อที่แสดงซึ่งระบุไว้ในข้อมูลเมตาของโมเดลของงาน (หากมี) ค่าเริ่มต้นคือ en สำหรับภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้โดยใช้ TensorFlow Lite Metadata Writer API รหัสภาษา en
resultListener ตั้งค่าโปรแกรมรับฟังผลลัพธ์ให้รับผลลัพธ์การแบ่งกลุ่มแบบไม่พร้อมกันเมื่อเครื่องมือแบ่งกลุ่มรูปภาพอยู่ในโหมด LIVE_STREAM ใช้ได้เมื่อตั้งค่าโหมดการทํางานเป็น LIVE_STREAM เท่านั้น ไม่มี ไม่มี

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

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

การเรียกใช้เมธอด segment() และ segmentForVideo() ของเครื่องมือแบ่งกลุ่มรูปภาพจะทำงานพร้อมกันและบล็อกเธรดอินเทอร์เฟซผู้ใช้ หากคุณแบ่งกลุ่มวัตถุในเฟรมวิดีโอจากกล้องของอุปกรณ์ งานแบ่งกลุ่มแต่ละงานจะบล็อกเธรดหลัก คุณสามารถป้องกันปัญหานี้ได้โดยใช้ Web Worker เพื่อเรียกใช้ segment() และ segmentForVideo() ในอีกเธรดหนึ่ง

เรียกใช้งาน

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

โค้ดต่อไปนี้แสดงวิธีประมวลผลด้วยโมเดลงาน

รูปภาพ

const image = document.getElementById("image") as HTMLImageElement;
imageSegmenter.segment(image, callback);

วิดีโอ

async function renderLoop(): void {
  const video = document.getElementById("video");
  let startTimeMs = performance.now();

  imageSegmenter.segmentForVideo(video, startTimeMs, callbackForVideo);

  requestAnimationFrame(() => {
    renderLoop();
  });
}

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

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

เมื่อทำการอนุมาน งานตัวแบ่งกลุ่มรูปภาพจะแสดงผลข้อมูลรูปภาพกลุ่มไปยังฟังก์ชันการเรียกกลับ เนื้อหาของเอาต์พุตจะขึ้นอยู่กับ outputType ที่คุณตั้งค่าไว้เมื่อกําหนดค่างาน

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

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

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

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

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

ค่าหมวดหมู่

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

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

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

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