Cách chuyển đổi ImageFrames và GpuBuffers
Ứng dụng Máy tính ImageFrameToGpuBufferCalculator
và GpuBufferToImageFrameCalculator
chuyển đổi qua lại giữa các gói loại ImageFrame
và GpuBuffer
. ImageFrame
đề cập đến dữ liệu hình ảnh trong bộ nhớ CPU ở một số định dạng hình ảnh bitmap bất kỳ. GpuBuffer
đề cập đến dữ liệu hình ảnh trong bộ nhớ GPU. Bạn có thể tìm thêm thông tin chi tiết trong phần Khái niệm khung là GpuBuffer to ImageFrame Transition. Bạn có thể xem một ví dụ trong:
Cách trực quan hoá kết quả nhận thức
AnnotationOverlayCalculator
cho phép các kết quả nhận biết (chẳng hạn như hộp giới hạn, mũi tên và hình bầu dục) được xếp chồng lên những khung hình video được căn chỉnh với các đối tượng đã được nhận dạng. Kết quả có thể hiển thị trong cửa sổ chẩn đoán khi chạy trên máy trạm hoặc trong khung hoạ tiết khi chạy trên thiết bị. Bạn có thể xem ví dụ về cách sử dụng AnnotationOverlayCalculator
trong:
Cách chạy song song các máy tính
Trong biểu đồ tính toán, MediaPipe thường xuyên chạy song song các nút tính toán riêng biệt. MediaPipe duy trì một nhóm các luồng và chạy từng máy tính ngay khi có sẵn luồng và tất cả dữ liệu đầu vào của máy tính đã sẵn sàng. Tại mỗi thời điểm, mỗi phiên bản máy tính chỉ chạy cho một tập hợp dữ liệu đầu vào. Vì vậy, hầu hết các trình tính toán chỉ cần tương thích với luồng chứ không an toàn cho luồng.
Để cho phép một máy tính xử lý song song nhiều dữ liệu đầu vào, có hai phương pháp khả thi:
- Xác định nhiều nút tính toán và gửi các gói dữ liệu đầu vào đến tất cả các nút.
- Đảm bảo bộ tính toán an toàn cho luồng và định cấu hình chế độ cài đặt
max_in_flight
.
Bạn có thể làm theo phương pháp đầu tiên bằng cách sử dụng máy tính được thiết kế để phân phối gói trên các máy tính khác, chẳng hạn như RoundRobinDemuxCalculator
. Một RoundRobinDemuxCalculator
duy nhất có thể phân phối các gói liên tiếp trên một số nút ScaleImageCalculator
được định cấu hình giống hệt nhau.
Phương pháp thứ hai cho phép gọi tối đa max_in_flight
phương thức CalculatorBase::Process
trên cùng một nút tính toán. Các gói đầu ra từ CalculatorBase::Process
được tự động sắp xếp theo dấu thời gian trước khi được chuyển đến các công cụ tính tiếp theo.
Dù có áp dụng cách nào, bạn cũng phải lưu ý rằng máy tính chạy song song không thể duy trì trạng thái nội bộ theo cách giống như máy tính tuần tự thông thường.
Dấu thời gian đầu ra khi sử dụng DisabledInputStreamHandler
ImmediateInputStreamHandler
phân phối từng gói ngay khi đến luồng đầu vào. Do đó, phương thức này có thể phân phối một gói có dấu thời gian cao hơn từ một luồng đầu vào trước khi phân phối một gói có dấu thời gian thấp hơn từ một luồng đầu vào khác. Nếu cả hai dấu thời gian đầu vào này đều được dùng cho các gói được gửi đến một luồng đầu ra, thì luồng đầu ra đó sẽ khiếu nại rằng các dấu thời gian không tăng đơn điệu. Để khắc phục lỗi này, máy tính phải chú ý chỉ xuất một gói sau khi quá trình xử lý cho dấu thời gian của gói hoàn tất.
Bạn có thể thực hiện việc này bằng cách chờ cho đến khi các gói đầu vào được nhận từ tất cả các luồng đầu vào cho dấu thời gian đó hoặc bằng cách bỏ qua một gói đến có dấu thời gian đã được xử lý.
Cách thay đổi chế độ cài đặt trong thời gian chạy
Có hai phương pháp chính để thay đổi chế độ cài đặt của biểu đồ máy tính trong khi ứng dụng đang chạy:
- Khởi động lại biểu đồ tính toán với
CalculatorGraphConfig
được sửa đổi. - Gửi các tuỳ chọn tính toán mới thông qua các gói trên luồng đầu vào của biểu đồ.
Phương pháp đầu tiên có lợi thế là tận dụng các công cụ xử lý CalculatorGraphConfig
như "biểu đồ con". Phương pháp thứ hai có ưu điểm là cho phép các máy tính và gói đang hoạt động duy trì hoạt động khi chế độ cài đặt thay đổi. Các bên đóng góp cho Mediapipe hiện đang nghiên cứu các phương pháp thay thế để đạt được cả hai ưu điểm này.
Cách xử lý luồng dữ liệu đầu vào theo thời gian thực
Bạn có thể sử dụng khung mediapipe để xử lý luồng dữ liệu trực tuyến hoặc ngoại tuyến. Để xử lý ngoại tuyến, các gói được đẩy vào biểu đồ ngay khi máy tính sẵn sàng xử lý các gói đó. Đối với quá trình xử lý trực tuyến, một gói cho mỗi khung hình sẽ được đẩy vào biểu đồ khi khung đó được ghi.
Khung MediaPipe chỉ yêu cầu các gói liên tiếp được chỉ định dấu thời gian tăng dần đơn điệu. Theo quy ước, trình tính toán và biểu đồ theo thời gian thực sử dụng thời gian ghi hoặc thời gian trình bày làm dấu thời gian cho mỗi gói, với mỗi dấu thời gian biểu thị micrô giây kể từ Jan/1/1970:00:00:00
. Điều này cho phép các gói từ nhiều nguồn được xử lý theo thứ tự nhất quán trên toàn cầu.
Thông thường, đối với quá trình xử lý ngoại tuyến, mọi gói dữ liệu đầu vào đều được xử lý và quá trình xử lý vẫn tiếp tục khi cần. Để xử lý trực tuyến, thông thường, bạn cần phải bỏ các gói đầu vào để bắt kịp với sự xuất hiện của các khung dữ liệu đầu vào.
Khi dữ liệu đầu vào đến quá thường xuyên, bạn nên sử dụng máy tính MediaPipe được thiết kế riêng cho mục đích này, chẳng hạn như FlowLimiterCalculator
và PacketClonerCalculator
.
Đối với quá trình xử lý trực tuyến, bạn cũng cần phải nhanh chóng xác định thời điểm có thể xử lý. MediaPipe hỗ trợ việc này bằng cách truyền giới hạn dấu thời gian giữa các máy tính. Giới hạn dấu thời gian cho biết các khoảng thời gian dấu thời gian sẽ không chứa gói dữ liệu đầu vào và cho phép máy tính bắt đầu xử lý các dấu thời gian đó ngay lập tức. Các máy tính được thiết kế để xử lý theo thời gian thực phải tính toán cẩn thận giới hạn về dấu thời gian để bắt đầu xử lý nhanh nhất có thể. Ví dụ: MakePairCalculator
sử dụng API SetOffset
để truyền các giới hạn dấu thời gian từ luồng đầu vào sang luồng đầu ra.
Tôi có thể chạy MediaPipe trên MS Windows không?
Hiện tại, khả năng di chuyển của MediaPipe hỗ trợ Debian Linux, Ubuntu Linux, MacOS, Android và iOS. Phần cốt lõi của khung MediaPipe là một thư viện C++ tuân theo tiêu chuẩn C++11, vì vậy, việc chuyển đổi sang các nền tảng khác tương đối dễ dàng.