কম্পিউটার দৃষ্টি কৃত্রিম বুদ্ধিমত্তার একটি অত্যন্ত বাধ্যতামূলক প্রয়োগ রয়ে গেছে। এটি যুদ্ধক্ষেত্রে উপাদানগুলিকে সনাক্ত করা বা ফসলের ফলনের ভবিষ্যদ্বাণী করা হোক না কেন, কম্পিউটার দৃষ্টি তর্কাতীতভাবে AI এর সবচেয়ে বাণিজ্যিকভাবে মূল্যবান (এবং সামাজিকভাবে গুরুত্বপূর্ণ) অঞ্চলগুলির মধ্যে একটি।
যাইহোক, সর্বোত্তম কম্পিউটার দৃষ্টি ক্ষমতা গ্রহণের হার-সীমা প্রায়শই একটি ডেটাসেট নির্মাণ এবং একটি সাধারণ এন্ড-টু-এন্ড সিস্টেম ডিজাইন করার সাথে সম্পর্কিত জটিলতা যা একটি নতুন চিত্রে আপনার কম্পিউটারের দৃষ্টিভঙ্গি কার্য সম্পাদন করবে।
এই ব্লগ পোস্টে, আমরা CVAT এবং MinIO বাকেট নোটিফিকেশনের মতো সেরা-শ্রেণীর সরঞ্জামগুলির সাহায্যে এই সমস্যাগুলি কীভাবে মোকাবেলা করা যায় তা ধাপে ধাপে দেখব। এই পোস্টের শেষের মধ্যে, আপনি একটি কাস্টম ডেটাসেটে একটি বস্তু সনাক্তকরণ মডেলকে প্রশিক্ষণ দিতে সক্ষম হবেন এবং যখনই একটি নতুন চিত্র প্রদর্শিত হবে তখনই ভবিষ্যদ্বাণী করতে এটি ব্যবহার করতে পারবেন৷
ধরা যাক আমরা স্যাটেলাইট ইমেজে উপস্থিত বিমানের ধরন চিনতে সক্ষম হতে চাই। আসুন ধরে নিই যে আমরা স্ক্র্যাচ থেকে শুরু করছি: কোনও পূর্ব-নির্মিত ডেটাসেট নেই, কোনও প্রাক-প্রশিক্ষিত মডেল নেই। এখানে দুটি নমুনা বিমান রয়েছে যা আমরা আমাদের স্যাটেলাইট চিত্রগুলিতে সনাক্ত করতে এবং চিনতে চাই:
এই পোস্টে বর্ণিত পদক্ষেপগুলি যে কোনও ডোমেনে সাধারণীকরণ করা যেতে পারে। বিমানের ধরন শনাক্ত করার পরিবর্তে, আমরা ফসলের ফলনের পূর্বাভাস দেওয়ার জন্য জমির ব্যবহারকে শ্রেণীবদ্ধ করতে বা রিগ্রেশন সম্পাদন করতে পারি। গতানুগতিক চিত্রের বাইরে, আমরা অন্যান্য ধরণের বহুমাত্রিক ডেটা যেমন LiDAR পয়েন্ট ক্লাউড বা 3D সিসমিক ইমেজগুলির উপর প্রশিক্ষণ এবং কার্য সম্পাদন করতে পারি; এটি প্রশিক্ষণের ডেটা কীভাবে দেখায় তা নিয়ে একটি প্রশ্ন হয়ে ওঠে (এবং YOLO এর পরিবর্তে সম্ভাব্য একটি ভিন্ন গভীর শিক্ষার মডেল)। একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি কেমন হবে সে সম্পর্কে আপনার আরও প্রশ্ন থাকলে, গিটহাব রেপোতে নির্দ্বিধায় একটি সমস্যা তৈরি করুন!
এই প্রকল্পের জন্য, একটি অন-ডিমান্ড ইমেজিং স্যাটেলাইটের মালিকানা না থাকার কারণে, আমি গুগল আর্থ-এ এয়ারফিল্ড পরিদর্শন করেছি এবং এই প্লেনগুলির কয়েকটি দৃশ্যমান ছিল এমন এলাকার একাধিক স্ক্রিনশট নিয়েছি। এই সেটের চিত্রগুলি একত্রিত করতে বেশ কিছু সময় লেগেছিল, তাই আমি সেগুলিকে আমার MinIO সার্ভারে "অবজেক্ট-ডিটেকশন" শিরোনামের একটি বালতিতে সংরক্ষণ করেছিলাম। একটি প্রোডাকশন সেটিংয়ে, আপনার সংগৃহীত নমুনাগুলি MinIO-তে সংরক্ষণ করার সুবিধাগুলি আরও বেশি প্রাজ্ঞ হয়ে ওঠে৷ সক্রিয়-সক্রিয় প্রতিলিপি, সর্বোচ্চ স্তরের এনক্রিপশন, এবং অতি দ্রুত GET/PUTs (কয়েকটির নাম বলতে) মানে হল যে আপনার অধ্যবসায়-সংগৃহীত নমুনাগুলি অত্যন্ত উপলব্ধ, নিরাপদ এবং নিরাপদ হবে।
আপনার ব্যবহারের ক্ষেত্রে একটি অবজেক্ট সনাক্তকরণ মডেলকে প্রশিক্ষণ দেওয়ার জন্য, একটি লেবেলযুক্ত (বা 'টীকাযুক্ত') ডেটাসেট প্রয়োজন। এটির জন্য একটি দুর্দান্ত সরঞ্জাম হল OpenCV দ্বারা CVAT। একটি দুর্দান্ত বৈশিষ্ট্য হল যে CVAT আপনার MinIO বালতিটিকে "ক্লাউড স্টোরেজ" হিসাবে সংযুক্ত করার জন্য একটি ইউটিলিটি প্রদান করে যাতে আপনার বালতির ছবিগুলিকে সরাসরি ডেটাসেট টীকা টুলে ফিড করা যায়। এটি করার জন্য, নিশ্চিত করুন যে আপনার MinIO সার্ভারের হোস্ট CVAT সার্ভারে অ্যাক্সেসযোগ্য, বিশেষ করে যদি আপনি আপনার ল্যাপটপে MinIO সার্ভার অন-প্রিমিস বা স্থানীয়ভাবে চালাচ্ছেন। এছাড়াও, একটি নোট হিসাবে, CVAT ব্যবহার করার দুটি উপায় রয়েছে: (1) app.cvat.ai- এ তাদের প্রদত্ত ওয়েব অ্যাপ ব্যবহার করে বা (2) স্থানীয়ভাবে এটি চালান। উভয় ক্ষেত্রেই, একবার আপনি CVAT খুললে, মেনু বারে "ক্লাউড স্টোরেজ" এ ক্লিক করুন। সেখান থেকে, আপনি আপনার (S3-সামঞ্জস্যপূর্ণ) MinIO বালতি সংযুক্ত করতে একটি ফর্ম পূরণ করতে পারেন:
আসুন এখন "টাস্ক" এর অধীনে আমাদের নতুন লেবেলিং টাস্ক তৈরি করি:
আপনাকে একটি ফর্ম পূরণ করার জন্য অনুরোধ করা উচিত:
টাস্ক তৈরি করার সময়, ক্লাস লেবেলগুলি সঠিকভাবে সংজ্ঞায়িত করা গুরুত্বপূর্ণ (আমি "SU30" এবং "TU95" শিরোনামের দুটি আয়তক্ষেত্র লেবেলকে সংজ্ঞায়িত করেছি, যে দুটি প্লেন আমি সনাক্ত করতে চেয়েছিলাম):
এখন অবশিষ্ট ধাপ হল আমাদের পূর্বে যোগ করা MinIO বাকেটটিকে ডেটা উৎস হিসেবে সংযুক্ত করা। "ফাইলগুলি নির্বাচন করুন"-এর অধীনে "ক্লাউড স্টোরেজ" এ ক্লিক করুন এবং সেই উৎসের জন্য আপনি আগে যে নাম দিয়েছেন তা পূরণ করুন। আমি উপরে "মিনিও-সিভি-বালতি" নামটি ব্যবহার করেছি।
আপলোড প্রক্রিয়া কয়েক মিনিট সময় লাগবে. এটি সম্পূর্ণ হয়ে গেলে, আপনি "চাকরি" এর অধীনে উপলব্ধ আপনার টীকা চাকরি দেখতে সক্ষম হবেন।
এখন, কাজের উপর ক্লিক করে, আপনি আপনার প্রতিটি ছবি টীকা করা শুরু করতে পারেন। সতর্কতা: এটি একটি অসামঞ্জস্যপূর্ণ সময়সাপেক্ষ প্রক্রিয়া হতে পারে। সাধারণত, বড় টীকা প্রয়োজন সহ একটি উত্পাদন পরিবেশে, একটি ডেডিকেটেড অভ্যন্তরীণ দল বা তৃতীয়-পক্ষের ডেটা লেবেলিং সংস্থার কাছে এই কাজটি অফলোড করা ভাল হতে পারে।
একবার আপনি টীকা করা হয়ে গেলে, YOLO ফর্ম্যাটে ডেটাসেট রপ্তানি করুন।
আপনার এক্সপোর্ট করা ডেটাসেট একটি জিপ ফাইল আকারে হবে। একবার আপনি এটিকে আনজিপ করলে, YOLO-ফরম্যাট করা টীকা টেক্সট ফাইলগুলি একটি বদ্ধ ফোল্ডারের মধ্যে থাকবে। তাদের একটি কটাক্ষপাত নির্দ্বিধায়. YOLO ফরম্যাটে, প্রতিটি ছবির টীকা একটি টেক্সট ফাইলে থাকে যেখানে প্রতিটি লাইনে একটি বাউন্ডিং বাক্সের দুটি কোণ এবং ক্লাস থাকে। টাস্ক তৈরি করার সময় আপনি যে ক্রম অনুসারে লেবেলগুলি সংজ্ঞায়িত করেছিলেন তার সাথে ক্লাস নম্বরটি মিলে যায়৷ সুতরাং, এই উদাহরণে, 0 Su-30 এর সাথে মিলবে এবং 1 Tu-95 এর সাথে মিলবে।
এই মুহুর্তে, একটি নতুন কার্যকারী ডিরেক্টরি তৈরি করুন (বা আপনি ইতিমধ্যে তৈরি করেছেন এমন একটি লিখুন)। এই ডিরেক্টরির মধ্যে, 'ডেটাসেট' নামে একটি সাবডিরেক্টরি তৈরি করুন। 'ডেটাসেট'-এর মধ্যে, এমন ডাইরেক্টরি তৈরি করুন যাতে আপনার ওয়ার্কিং ডাইরেক্টরি এইরকম দেখায়:
my_cv_project (WORKING DIRECTORY) |---- dataset |----images |----train |----val |----test |----annotations |----train |----val |----test
আপনাকে এখন ইমেজ এবং তাদের সংশ্লিষ্ট টীকা (টেক্সট ফাইল) উভয়ের জন্য ট্রেন, ভ্যাল এবং টেস্ট সাবডিরেক্টরিগুলিকে পপুলেট করতে হবে। আপনি কীভাবে আপনার নমুনাগুলি পুনরুদ্ধার করতে এবং বিভক্ত করতে চান তা আপনার উপর নির্ভর করে। একটি ভাল অনুশীলন হল আপনার মোট প্রশিক্ষণের নমুনাগুলিকে 80% প্রশিক্ষণ, 10% বৈধতা এবং 10% পরীক্ষায় ভাগ করা। আপনার ছবিগুলিকে বিভাজন করার আগে এলোমেলোভাবে এলোমেলোভাবে এলোমেলো করে নিন।
ব্যক্তিগতভাবে, আমি আমার 'অবজেক্ট-ডিটেকশন' বালতি থেকে দ্রুত সমস্ত ছবি পুনরুদ্ধার করতে কমান্ড লাইনে MinIO ক্লায়েন্টের mc cp ব্যবহার করেছি। বিকল্পভাবে, যদি আপনার স্থানীয় কম্পিউটারে ইতিমধ্যেই আপনার সমস্ত নমুনা চিত্র এক জায়গায় থাকে, আপনি সরাসরি এটির সাথে কাজ করতে পারেন। একবার আমার সমস্ত নমুনা এক জায়গায় পেয়ে গেলে, আমি একটি পাইথন স্ক্রিপ্ট ব্যবহার করে শাফেল, বিভক্ত, এবং আমার ছবি এবং টীকাগুলিকে ট্রেন, ভ্যাল এবং টেস্ট ডিরেক্টরিতে সরাতে পারি৷ এখানে সুবিধার জন্য স্ক্রিপ্ট দেওয়া আছে . এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আপনার কোন প্রশ্ন থাকলে, রেপোতে একটি সমস্যা তৈরি করতে দ্বিধা বোধ করুন!
শেষ পর্যন্ত, নিশ্চিত করুন যে প্রতিটি ইমেজের জন্য যেগুলি আপনি images/train, images/val, অথবা images/test এ রেখেছেন, ম্যাচিং টীকা .txt ফাইলটিও টীকা/ ডিরেক্টরির মধ্যে সংশ্লিষ্ট সাবডিরেক্টরিতে রয়েছে। উদাহরণ স্বরূপ:
my_cv_project (WORKING DIRECTORY) |---- dataset |----images |----train - 5.png - 3.png - 2.png |----val - 4.png |----test - 1.png |----annotations |----train - 5.txt - 3.txt - 2.txt |----val - 4.txt |----test - 1.txt
এখন, আমাদের তথ্য জায়গায় আছে. আমাদের অবজেক্ট ডিটেকশন মডেলটি একবার দেখে নেওয়ার এবং প্রশিক্ষণ শুরু করার সময় এসেছে৷
বস্তুর স্বীকৃতির জন্য বর্তমান গোল্ড স্ট্যান্ডার্ড (কর্মক্ষমতা এবং ব্যবহারের সহজতার দিক থেকে) হল YOLO (You Only Look One) মডেলের ক্লাস। লেখার সময়, YOLOv8 সর্বশেষ সংস্করণ এবং Ultralytics দ্বারা ওপেন সোর্স হিসাবে রক্ষণাবেক্ষণ করা হয়। YOLOv8 একটি সাধারণ API প্রদান করে যা আমরা আমাদের নতুন তৈরি টীকা (এবং শেষ পর্যন্ত অনুমানও চালাতে) মডেলকে প্রশিক্ষণ দিতে পারি।
চলুন ডাউনলোড করি YOLOv8:
$ pip install ultralytics
আমরা এখন প্রশিক্ষণ, যাচাই এবং ভবিষ্যদ্বাণী করতে YOLOv8 CLI টুল বা Python SDK ব্যবহার করতে পারি। আরও তথ্যের জন্য YOLOv8 ডক্স পড়ুন।
আপনার ওয়ার্কিং ডিরেক্টরিতে, একটি YAML ফাইল সংজ্ঞায়িত করুন যা ডেটাসেটের অবস্থান এবং ক্লাস সম্পর্কে বিশদ উল্লেখ করে। লক্ষ্য করুন কিভাবে পাথগুলো একই রকম যা আমি ওয়ার্কিং ডিরেক্টরিতে আগে তৈরি করেছি। আমি আমার ফাইলকে ' objdetect.yaml ' বলেছিলাম। এছাড়াও, লক্ষ্য করুন যে দুটি বিমান শ্রেণীর লেবেল CVAT-এর মতো একই ক্রমে সংজ্ঞায়িত করতে হবে।
train: ./dataset/images/train/ val: ./dataset/images/val/ test: ./dataset/images/test/ # number of classes nc: 2 # class names names: ["SU-30","TU-95"]
নিম্নলিখিত কমান্ডের মাধ্যমে (YOLO CLI টুল ব্যবহার করে) আমাদের ডেটাসেটে YOLOv8 মডেলের প্রশিক্ষণ শুরু করুন। আপনি প্রশিক্ষণের জন্য কনফিগার করতে পারেন এমন সমস্ত বিভিন্ন বিকল্প সম্পর্কে আরও জানতে YOLO ডক্স দেখুন। এখানে, আমি 100টি যুগের জন্য প্রশিক্ষণ শুরু করছি এবং 640 পিক্সেলের একটি চিত্রের আকার সেট করছি (প্রশিক্ষণের সময় আমাদের সমস্ত প্রশিক্ষণের চিত্র সেই অনুযায়ী স্কেল করা হবে):
$ yolo task=detect \ mode=train \ model=yolov8s.pt \ data=objdetect.yaml \ epochs=100 \ imgsz=640
প্রশিক্ষণে কিছুটা সময় লাগবে, বিশেষ করে আপনি যদি ল্যাপটপে কাজ করেন (যেমন আমি), তাই এখনই একটি বিরতি নেওয়ার (অথবা সামনে পড়ুন 😀) ভাল সময়!
প্রশিক্ষণ লুপ শেষে, আপনার প্রশিক্ষিত মডেল, অন্যান্য আকর্ষণীয় গ্রাফ এবং চার্ট সহ, 'রান' নামক একটি স্বয়ংক্রিয়-উত্পন্ন ডিরেক্টরিতে সংরক্ষণ করা হবে। টার্মিনাল আউটপুট (নীচের মত) সর্বশেষ রানের ফলাফলের নির্দিষ্ট অবস্থান নির্দেশ করবে। প্রতিবার যখন আপনি একটি মডেলকে প্রশিক্ষণ দেবেন, 'রান/ডিটেক্ট/'-এর মধ্যে একটি অনুরূপ ডিরেক্টরি তৈরি হবে।
Results saved to runs/detect/train
দ্রষ্টব্য: রান/ডিটেক্ট/ট্রেন/ওজন/-এ সঠিক প্রশিক্ষিত ওজন সহ PT ফাইল থাকবে। পরে জন্য এই অবস্থান মনে রাখবেন.
আপনি নিম্নলিখিত কমান্ড দিয়ে বৈধতা চালাতে পারেন:
$ yolo task=detect \ mode=val \ model=path/to/best.pt \ data=objdetect.yaml
ফলাফল স্বয়ংক্রিয়ভাবে আপনার কাজের ডিরেক্টরির একটি ফোল্ডারে 'runs/detect/val' ফর্মের একটি পাথ সহ সংরক্ষণ করা হবে।
পরীক্ষার সেটে অনুমান করতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:
$ yolo task=detect \ mode=predict \ model=path/to/best.pt \ conf=0.5 \ source=dataset/images/test
ফলাফল 'রান/ডিটেক্ট/প্রেডিকট'-এ সংরক্ষণ করা হবে। এখানে পরীক্ষার সেটে কিছু ভবিষ্যদ্বাণী ফলাফল রয়েছে:
এখন যেহেতু আমাদের কাছে একটি প্রশিক্ষিত মডেল রয়েছে যা একটি স্যাটেলাইট ছবিতে উপস্থিত কিছু বিমানের ধরনকে চিনতে পারে, আমরা কীভাবে এটিকে একটি সহজ উপায়ে নতুন চিত্রগুলির জন্য ব্যবহার করতে পারি ?
MinIO Backet Notifications এর জন্য একটি নিখুঁত টুল। আমরা এমন একটি সিস্টেম তৈরি করতে পারি যা ওয়েবহুকের সাহায্যে আমাদের বালতিতে ফেলে আসা একটি নতুন চিত্রের উপর স্বয়ংক্রিয়ভাবে বস্তু সনাক্তকরণ অনুমান করতে পারে।
একটি উচ্চ স্তরে, আমরা 3 ধাপ আছে. প্রথমত, আমাদের একটি এন্ডপয়েন্ট সংজ্ঞায়িত করতে হবে যা আমাদের প্রশিক্ষিত মডেলের সাথে একটি নতুন ছবিতে অবজেক্ট ডিটেকশন সঞ্চালনের জন্য একটি ওয়েবহুক হিসাবে কাজ করতে পারে। দ্বিতীয়ত, আমাদের MinIO সার্ভার স্থাপনার জন্য কিছু এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করতে হবে যা কিছু ঘটনা ঘটলে আমাদের ওয়েবহুক এন্ডপয়েন্টে আঘাত করার নির্দেশ দেয়। তৃতীয়ত, আমাদের কনফিগার করতে হবে কোন ধরনের বাকেট ইভেন্ট (যেমন PUT) আমরা কাজ করতে চাই। এর মধ্যে দিয়ে ধাপে ধাপে হাঁটা যাক।
এখানে একটি সাধারণ ফ্লাস্ক-ভিত্তিক সার্ভারের কোড ( detection_server.py ) যা MinIO বালতিতে যোগ করা একটি নতুন চিত্রের অনুমান চালায়:
""" This is a simple Flask inference server implementation that serves as a webhook for the event of a new image being added to a MinIO bucket. Object detection using YOLO will be performed on that image and the resulting predictions will be returned. """ from flask import Flask, request, abort, make_response from ultralytics import YOLO import tempfile from minio import Minio # Make sure the following are populated with your MinIO details # (Best practice is to use environment variables!) MINIO_ENDPOINT = '' MINIO_ACCESS_KEY = '' MINIO_SECRET_KEY = '' model = YOLO('/PATH/TO/best.pt') # load a custom model (path to trained weights) client = Minio( MINIO_ENDPOINT, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, ) app = Flask(__name__) @app.route('/', methods=['POST']) async def inference_bucket_webhook(): """ This endpoint will be called when a new object is placed in your inference bucket """ if request.method == 'POST': # Get the request event from the 'POST' call event = request.json bucket = event['Records'][0]['s3']['bucket']['name'] obj_name = event['Records'][0]['s3']['object']['key'] with tempfile.TemporaryDirectory() as temp_dir: temp_file_name = temp_dir+'/'+obj_name client.fget_object(bucket, obj_name, temp_file_name) # See https://docs.ultralytics.com/modes/predict/ for more information about YOLO inference options results = model.predict(source=temp_file_name, conf=0.5, stream=False) # A list of bounding boxes (if any) is returned. # Each bounding box is in the format [x1, y1, x2, y2, probability, class]. result = {"results": results[0].boxes.data.tolist()} print(result) resp = make_response(result, 200) return resp else: abort(400) if __name__ == '__main__': app.run()
অনুমান সার্ভার শুরু করা যাক:
$ python detection_server.py * Serving Flask app 'detection_server' * Debug mode: off * Running on http://127.0.0.1:5000 Press CTRL+C to quit
ফ্লাস্ক অ্যাপ্লিকেশনটি যে হোস্টনেম এবং পোর্টে চলছে তা নোট করুন।
এর পরে, আসুন MinIO পাশে ওয়েবহুকগুলি কনফিগার করার কাজ শুরু করি। প্রথমে, নিম্নলিখিত পরিবেশ ভেরিয়েবল সেট করুন। আপনার পছন্দের একটি ফাংশন নাম দিয়ে <YOURFUNCTIONNAME> প্রতিস্থাপন করুন। সরলতার জন্য, আমি 'অনুমান' দিয়ে গিয়েছিলাম। এছাড়াও, নিশ্চিত করুন যে এন্ডপয়েন্ট এনভায়রনমেন্ট ভেরিয়েবল আপনার ইনফারেন্স সার্ভারের জন্য সঠিক হোস্ট এবং পোর্টে সেট করা আছে। এই ক্ষেত্রে, http://localhost:5000 যেখানে আমাদের ফ্লাস্ক অ্যাপ্লিকেশন চলছে।
$ export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on $ export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000
এখন, mc অ্যাডমিন সার্ভিস রিস্টার্ট ALIAS কমান্ড ব্যবহার করে MinIO সার্ভার রিস্টার্ট করুন অথবা আপনি যদি প্রথমবার সার্ভারটি শুরু করেন তাহলে আপনি শুধু minio সার্ভার কমান্ডটি ব্যবহার করতে পারেন। MinIO সার্ভার পুনরায়/শুরু করার বিষয়ে আরও তথ্যের জন্য, MinIO ডক্স দেখুন। দ্রষ্টব্য: ALIAS আপনার MinIO সার্ভার স্থাপনার উপনামের সাথে প্রতিস্থাপন করা উচিত। কিভাবে একটি উপনাম সেট করতে হয় বা বিদ্যমান উপনামগুলি দেখতে হয় সে সম্পর্কে আরও তথ্যের জন্য, ডক্স দেখুন।
অবশেষে, আসুন আমরা যে বালতি এবং ইভেন্ট সম্পর্কে অবহিত হতে চাই তা যোগ করি। আমাদের ক্ষেত্রে, আমরা আমাদের বালতিতে ` পুট` ইভেন্ট (নতুন বস্তুর সৃষ্টি) সম্পর্কে অবহিত হতে চাই। আমি এই উদ্দেশ্যে "ডিটেক্ট-ইনফারেন্স" শিরোনামের জন্য একটি একেবারে নতুন, খালি বালতি তৈরি করেছি, তাই আমি এটিকে 'BUCKET'-এর জন্য প্রতিস্থাপন করব।
$ mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put
আপনি এই কমান্ডটি চালানোর সময় " s3:ObjectCreated:* " আউটপুট হয়েছে কিনা তা যাচাই করে আপনি বালতি বিজ্ঞপ্তিগুলির জন্য সঠিক ইভেন্টের ধরনটি কনফিগার করেছেন কিনা তা পরীক্ষা করতে পারেন:
$ mc event ls local/detect-inference arn:minio:sqs::<YOURFUNCTIONNAME>:webhook
ওয়েবহুকে বালতি ইভেন্ট প্রকাশ করার আরও বিস্তারিত ব্যাখ্যার জন্য, ডক্স দেখুন। আমরা এখন একটি একেবারে নতুন ছবিতে বস্তু সনাক্তকরণ চেষ্টা করার জন্য প্রস্তুত!
এখানে নতুন চিত্র ('1.png' শিরোনাম) আমি অনুমান পরিচালনা করতে চাই:
আমি আমার 'ডিটেক্ট-ইনফারেন্স' বালতিতে নতুন ছবিটি ফেলে দিই:
প্রায় সঙ্গে সঙ্গে, আমি আমার ফ্লাস্ক সার্ভারে নিম্নলিখিত ফলাফল দেখতে সক্ষম:
$ python detection_server.py * Serving Flask app 'detection_server' * Debug mode: off * Running on http://127.0.0.1:5000 Press CTRL+C to quit image 1/1 /var/folders/xf/q7x0z8sn5nvckccp1g0m1vpm0000gn/T/tmpo6jx3w8u/1.png: 448x736 2 SU-30s, 101.0ms Speed: 4.1ms preprocess, 101.0ms inference, 5.8ms postprocess per image at shape (1, 3, 448, 736) {'results': [[1927.78369140625, 627.7123413085938, 1995.090576171875, 715.3443603515625, 0.8142037987709045, 0.0], [1735.740234375, 477.2108154296875, 1809.181640625, 555.767578125, 0.7766116261482239, 0.0]]} 127.0.0.1 - - [14/Sep/2023 15:39:21] "POST / HTTP/1.1" 200 -
লক্ষ্য করুন যে ফলাফল তালিকায় প্রতিটি শনাক্ত করা বাউন্ডিং বক্স YOLO ফরম্যাটে [x1, y1, x2, y2, সম্ভাব্যতা, শ্রেণি]। এখানে বাউন্ডিং বাক্স এবং পূর্বাভাসিত ক্লাসগুলি মূল চিত্রের উপর চাপানো হয়েছে:
দ্রষ্টব্য: উৎপাদন পরিবেশ এবং/অথবা বড় মেশিন লার্নিং মডেলের জন্য, অনুমানকে আরও শক্তিশালী এবং নির্ভরযোগ্য করতে PyTorch Serve বা Triton Server-এর মতো একটি প্রতিষ্ঠিত মডেল পরিবেশন কাঠামো ব্যবহার করা ভাল ধারণা। আপনি যদি এতে আগ্রহী হন, MinIO এবং PyTorch সার্ভের সাথে অপ্টিমাইজিং এআই মডেল সার্ভিং- এর পূর্ববর্তী পোস্টটি দেখুন।
আমরা এটা করেছি! আমরা কিভাবে MinIO এবং CVAT একত্রিত হয়ে আমাদের সংগৃহীত ছবির নমুনাগুলিকে নিরাপদ ও উপলব্ধ রাখতে, সেইসাথে আমাদের কাস্টম অবজেক্ট ডিটেকশন ডেটাসেট কীভাবে তৈরি করা যায় তা দেখেছি। তারপর, আমরা আমাদের কাস্টম টাস্কের জন্য আমাদের নিজস্ব কাস্টম YOLO মডেলকে প্রশিক্ষণ দিয়েছি। পরিশেষে, মাত্র 50 লাইনের কোড সহ, আমরা MinIO বাকেট নোটিফিকেশন ব্যবহার করে একটি ইনফারেন্স সার্ভার একত্রিত করেছি যা আমাদের কাস্টম প্রশিক্ষিত বস্তু সনাক্তকরণ মডেলের আগে একটি নতুন চিত্র চালাতে পারে।
তদ্ব্যতীত, কম্পিউটার ভিশনের বেশিরভাগ মিশন সমালোচনামূলক অ্যাপ্লিকেশনের জন্য, প্রান্তে অনুমান করা ভাল। অন্যথায়, উল্লিখিত অ্যাপ্লিকেশনগুলি পাবলিক ক্লাউডে নতুন ডেটা আপলোড করার সাথে যুক্ত বিলম্বের জন্য ঝুঁকিপূর্ণ এবং ক্লাউডে একটি অনুমান সার্ভারের উত্তর পাওয়ার জন্য অপেক্ষা করছে- একটি ত্রুটিপূর্ণ নেটওয়ার্ক সংযোগের ঝুঁকির কথা উল্লেখ না করা। এই কারণে, একটি কম্পিউটার ভিশন পাইপলাইন MinIO এর চারপাশে কেন্দ্রীভূত হয় কারণ ডেটা স্তরটি অনেক বেশি অর্থবোধ করে। কল্পনা করুন যে একটি ড্রোন একটি এয়ারফিল্ডের উপর দিয়ে উড়ছে, সম্পূর্ণ-অন-বোর্ড হার্ডওয়্যার এবং সফ্টওয়্যার সহ নতুন চিত্রগুলিতে আমাদের প্রশিক্ষিত মডেল ক্যাপচার করতে, সঞ্চয় করতে এবং ব্যবহার করতে সক্ষম। MinIO সার্ভারের স্থানীয় স্থাপনার সাথে, পোস্টের শেষে আমরা যে বাকেট নোটিফিকেশন-ভিত্তিক অনুমান সিস্টেমটি তৈরি করেছি তা এই দৃশ্যের জন্য পুরোপুরি কাজ করে এবং অগণিত অন্যান্যরা এটি পছন্দ করে।
আপনার যদি কোন প্রশ্ন থাকে আমাদের স্ল্যাক চ্যানেলে যোগ দিন বা আমাদের একটি নোট পাঠান [email protected] এ। আপনাকে সাহায্য করার জন্য আমরা এইখানে।
এছাড়াও এখানে প্রকাশিত.