কিভাবে ImageFrames এবং GpuBuffers রূপান্তর করতে হয়
ক্যালকুলেটর ImageFrameToGpuBufferCalculator
এবং GpuBufferToImageFrameCalculator
ImageFrame
এবং GpuBuffer
টাইপের প্যাকেটের মধ্যে সামনে পিছনে রূপান্তর করে। ImageFrame
সিপিইউ মেমরির যে কোনো একটি বিটম্যাপ ইমেজ ফরম্যাটে ইমেজ ডেটা বোঝায়। GpuBuffer
GPU মেমরিতে ইমেজ ডেটা বোঝায়। আপনি ফ্রেমওয়ার্ক কনসেপ্টস বিভাগে GpuBuffer থেকে ImageFrame কনভার্টারগুলিতে আরও বিস্তারিত জানতে পারেন। আপনি একটি উদাহরণ দেখতে পারেন:
উপলব্ধি ফলাফল কল্পনা কিভাবে
টীকা AnnotationOverlayCalculator
উপলব্ধি ফলাফলগুলিকে অনুমতি দেয়, যেমন বাউন্ডিং বাক্স, তীর এবং ডিম্বাকৃতি, স্বীকৃত বস্তুর সাথে সারিবদ্ধ ভিডিও ফ্রেমে সুপারইম্পোজ করা যায়৷ ফলাফলগুলি একটি ডায়াগনস্টিক উইন্ডোতে প্রদর্শিত হতে পারে যখন একটি ওয়ার্কস্টেশনে চলছে, বা ডিভাইসে চলাকালীন একটি টেক্সচার ফ্রেমে। আপনি এখানে AnnotationOverlayCalculator
এর একটি উদাহরণ ব্যবহার দেখতে পারেন:
কিভাবে সমান্তরালভাবে ক্যালকুলেটর চালানো যায়
একটি ক্যালকুলেটর গ্রাফের মধ্যে, MediaPipe নিয়মিতভাবে পৃথক ক্যালকুলেটর নোডগুলি সমান্তরালভাবে চালায়। MediaPipe থ্রেডগুলির একটি পুল বজায় রাখে এবং একটি থ্রেড উপলব্ধ হওয়ার সাথে সাথে প্রতিটি ক্যালকুলেটর চালায় এবং এর সমস্ত ইনপুট প্রস্তুত হয়। প্রতিটি ক্যালকুলেটর ইনস্ট্যান্স একবারে শুধুমাত্র এক সেট ইনপুটের জন্য চালানো হয়, তাই বেশিরভাগ ক্যালকুলেটরকে শুধুমাত্র থ্রেড-সামঞ্জস্যপূর্ণ হতে হবে এবং থ্রেড-নিরাপদ নয়।
সমান্তরালভাবে একাধিক ইনপুট প্রক্রিয়া করতে একটি ক্যালকুলেটর সক্ষম করার জন্য, দুটি সম্ভাব্য পন্থা রয়েছে:
- একাধিক ক্যালকুলেটর নোড সংজ্ঞায়িত করুন এবং সমস্ত নোডে ইনপুট প্যাকেট প্রেরণ করুন।
- ক্যালকুলেটরটিকে থ্রেড-নিরাপদ করুন এবং এর
max_in_flight
সেটিংস কনফিগার করুন।
RoundRobinDemuxCalculator
মতো অন্যান্য ক্যালকুলেটরগুলিতে প্যাকেটগুলি বিতরণ করার জন্য ডিজাইন করা ক্যালকুলেটরগুলি ব্যবহার করে প্রথম পদ্ধতিটি অনুসরণ করা যেতে পারে। একটি একক RoundRobinDemuxCalculator
বিভিন্ন অভিন্নভাবে কনফিগার করা ScaleImageCalculator
নোড জুড়ে ধারাবাহিক প্যাকেট বিতরণ করতে পারে।
দ্বিতীয় পদ্ধতিটি একই ক্যালকুলেটর নোডে CalculatorBase::Process
পদ্ধতির max_in_flight
আহ্বানের অনুমতি দেয়। CalculatorBase::Process
ডাউনস্ট্রিম ক্যালকুলেটরগুলিতে পাস করার আগে টাইমস্ট্যাম্প দ্বারা স্বয়ংক্রিয়ভাবে অর্ডার করা হয়।
যেকোনও এপ্রোচের সাথে, আপনাকে অবশ্যই সচেতন হতে হবে যে সমান্তরালভাবে চলমান ক্যালকুলেটরটি একটি সাধারণ ক্রমিক ক্যালকুলেটরের মতো একইভাবে অভ্যন্তরীণ অবস্থা বজায় রাখতে পারে না।
ImmediateInputStreamHandler ব্যবহার করার সময় আউটপুট টাইমস্ট্যাম্প
ImmediateInputStreamHandler
প্রতিটি প্যাকেট ইনপুট স্ট্রীমে পৌঁছানোর সাথে সাথে বিতরণ করে। ফলস্বরূপ, এটি একটি ভিন্ন ইনপুট স্ট্রীম থেকে একটি নিম্ন টাইমস্ট্যাম্প সহ একটি প্যাকেট সরবরাহ করার আগে একটি ইনপুট স্ট্রীম থেকে উচ্চতর টাইমস্ট্যাম্প সহ একটি প্যাকেট সরবরাহ করতে পারে৷ যদি এই ইনপুট টাইমস্ট্যাম্প দুটিই একটি আউটপুট স্ট্রীমে পাঠানো প্যাকেটের জন্য ব্যবহার করা হয়, সেই আউটপুট স্ট্রীম অভিযোগ করবে যে টাইমস্ট্যাম্পগুলি একঘেয়েভাবে বাড়ছে না। এর প্রতিকারের জন্য, ক্যালকুলেটরকে অবশ্যই প্যাকেটের টাইমস্ট্যাম্পের প্রক্রিয়াকরণ সম্পূর্ণ হওয়ার পরেই আউটপুট করার যত্ন নিতে হবে। এটি সেই টাইমস্ট্যাম্পের জন্য সমস্ত ইনপুটস্ট্রিম থেকে ইনপুট প্যাকেট প্রাপ্ত না হওয়া পর্যন্ত অপেক্ষা করে বা ইতিমধ্যে প্রক্রিয়া করা হয়েছে এমন একটি টাইমস্ট্যাম্প সহ আসা একটি প্যাকেট উপেক্ষা করে সম্পন্ন করা যেতে পারে।
রানটাইমে কীভাবে সেটিংস পরিবর্তন করবেন
অ্যাপ্লিকেশনটি চলাকালীন একটি ক্যালকুলেটর গ্রাফের সেটিংস পরিবর্তন করার দুটি প্রধান পদ্ধতি রয়েছে:
- পরিবর্তিত
CalculatorGraphConfig
দিয়ে ক্যালকুলেটর গ্রাফটি পুনরায় চালু করুন। - গ্রাফ ইনপুট-স্ট্রিমগুলিতে প্যাকেটের মাধ্যমে নতুন ক্যালকুলেটর বিকল্পগুলি পাঠান।
প্রথম পদ্ধতিতে CalculatorGraphConfig
প্রসেসিং টুল যেমন "সাবগ্রাফ" ব্যবহার করার সুবিধা রয়েছে। দ্বিতীয় পদ্ধতিতে সেটিংস পরিবর্তনের সময় সক্রিয় ক্যালকুলেটর এবং প্যাকেটগুলিকে ফ্লাইটে থাকার অনুমতি দেওয়ার সুবিধা রয়েছে। মিডিয়াপাইপ অবদানকারীরা বর্তমানে এই উভয় সুবিধা অর্জনের জন্য বিকল্প পদ্ধতির তদন্ত করছে।
কিভাবে রিয়েলটাইম ইনপুট স্ট্রীম প্রসেস করবেন
মিডিয়াপাইপ ফ্রেমওয়ার্কটি অনলাইন বা অফলাইনে ডেটা স্ট্রিম প্রক্রিয়া করতে ব্যবহার করা যেতে পারে। অফলাইন প্রক্রিয়াকরণের জন্য, ক্যালকুলেটরগুলি সেই প্যাকেটগুলি প্রক্রিয়া করার জন্য প্রস্তুত হওয়ার সাথে সাথে প্যাকেটগুলিকে গ্রাফে ঠেলে দেওয়া হয়৷ অনলাইন প্রক্রিয়াকরণের জন্য, প্রতিটি ফ্রেমের জন্য একটি প্যাকেট গ্রাফে পুশ করা হয় কারণ সেই ফ্রেমটি রেকর্ড করা হয়।
MediaPipe ফ্রেমওয়ার্কের জন্য শুধুমাত্র ক্রমাগত প্যাকেটগুলিকে একঘেয়ে ক্রমবর্ধমান টাইমস্ট্যাম্প বরাদ্দ করা প্রয়োজন। নিয়ম অনুসারে, রিয়েলটাইম ক্যালকুলেটর এবং গ্রাফ প্রতিটি প্যাকেটের জন্য টাইমস্ট্যাম্প হিসাবে রেকর্ডিং সময় বা উপস্থাপনার সময় ব্যবহার করে, প্রতিটি টাইমস্ট্যাম্প Jan/1/1970:00:00:00
থেকে মাইক্রোসেকেন্ডের প্রতিনিধিত্ব করে। এটি বিভিন্ন উত্স থেকে প্যাকেটগুলিকে বিশ্বব্যাপী সামঞ্জস্যপূর্ণ ক্রমে প্রক্রিয়াকরণের অনুমতি দেয়।
সাধারণত অফলাইন প্রক্রিয়াকরণের জন্য, প্রতিটি ইনপুট প্যাকেট প্রক্রিয়া করা হয় এবং যতক্ষণ প্রয়োজন ততক্ষণ প্রক্রিয়াকরণ চলতে থাকে। অনলাইন প্রক্রিয়াকরণের জন্য, ইনপুট ডেটা ফ্রেমের আগমনের সাথে তাল মিলিয়ে চলার জন্য প্রায়শই ইনপুট প্যাকেট ড্রপ করা প্রয়োজন। যখন ইনপুটগুলি খুব ঘন ঘন আসে, তখন প্যাকেটগুলি ফেলে দেওয়ার জন্য প্রস্তাবিত কৌশল হল এই উদ্দেশ্যে বিশেষভাবে ডিজাইন করা MediaPipe ক্যালকুলেটরগুলি ব্যবহার করা যেমন FlowLimiterCalculator
এবং PacketClonerCalculator
৷
অনলাইন প্রক্রিয়াকরণের জন্য, প্রক্রিয়াকরণ কখন এগিয়ে যেতে পারে তা অবিলম্বে নির্ধারণ করা প্রয়োজন। মিডিয়াপাইপ ক্যালকুলেটরদের মধ্যে টাইমস্ট্যাম্প সীমানা প্রচার করে এটিকে সমর্থন করে। টাইমস্ট্যাম্প বাউন্ডগুলি টাইমস্ট্যাম্পের ব্যবধানগুলি নির্দেশ করে যাতে কোনও ইনপুট প্যাকেট থাকবে না এবং তারা ক্যালকুলেটরদের সেই টাইমস্ট্যাম্পগুলির জন্য অবিলম্বে প্রক্রিয়াকরণ শুরু করার অনুমতি দেয়। রিয়েলটাইম প্রক্রিয়াকরণের জন্য ডিজাইন করা ক্যালকুলেটরগুলি যত তাড়াতাড়ি সম্ভব প্রক্রিয়াকরণ শুরু করার জন্য সাবধানে টাইমস্ট্যাম্প সীমা গণনা করা উচিত। উদাহরণস্বরূপ, MakePairCalculator
ইনপুট স্ট্রীম থেকে আউটপুট স্ট্রীমে টাইমস্ট্যাম্প সীমানা প্রচার করতে SetOffset
API ব্যবহার করে।
আমি কি MS Windows এ MediaPipe চালাতে পারি?
বর্তমানে MediaPipe পোর্টেবিলিটি ডেবিয়ান লিনাক্স, উবুন্টু লিনাক্স, ম্যাকওএস, অ্যান্ড্রয়েড এবং আইওএস সমর্থন করে। মিডিয়াপাইপ ফ্রেমওয়ার্কের মূল হল একটি C++ লাইব্রেরি যা C++11 স্ট্যান্ডার্ডের সাথে সঙ্গতিপূর্ণ, তাই অতিরিক্ত প্ল্যাটফর্মে পোর্ট করা তুলনামূলকভাবে সহজ।