آموزش یولو 8
یولو 8 واقعا تشخیص اشیا (Object Detection) و بخشبندی (Segmentation) را آسان کرده است. در این پست میخواهم نحوه کار با یولو 8 را به شما توضیح بدهم. نحوه استفاده از مدلهای مختلف و آموزش مدلها از جمله مطالبی است که در این پست توضیح میدهیم. بزن بریم…
آشنایی با یولو 8
یولو 8 یک وبسایت اختصاصی دارد. وقتی به سایت یولو بروید، با جمله زیر مواجه میشوید:
A new state-of-the-art in computer vision, supporting object detection, classification, and segmentation tasks.
شاید بد نباشد که همین ابتدا، تسکهای گفته شده در جمله بالا را توضیح بدهم. یولو یک مدل مخصوص حوزه بینایی کامپیوتر است که روی تصاویر و ویدیو کار میکند. این شبکه میتواند کارها/تسکهای زیر را انجام دهد:
- Classification: شناسایی اشیای موجود در تصویر بدون سگمنت یا ترسیم باکس (Classify در شکل 1)
- Object Detection: یافتن اشیای درون تصویر و ترسیم باکس دور اشیا (Detect در شکل 1)
- Segmentation: تعیین نواحی اشیای موجود در تصویر (Segment در شکل 1)
- Tracking: ردیابی اشیای درحال حرکت در ویدئو (Track در شکل 1)
- Pose Estimation: تخمین ژست افراد از روی تصویر (Pose در شکل 1)
در وبسایت یولو، یک ویدئوی جالب از دیتکشن مشاهده میکنید. زیر ویدئو، دو گزینه Upload و Webcam وجود دارد که با آنها میتوانید تصویر آپلود کنید و وبکم سیستم خود را به یولو متصل کنید تا دیتکشن انجام دهد.
یولو 8 را مجموعه Ultralytics توسعه داده است. این مجموعه یولو 5 را هم توسعه داده بود. یولو 8 یک داکیومنت خوب و منظم هم دارد که در سایت ultralytics قرار دارد. هرچیزی که من میخواهم بگویم، در همین داکیومنت همراه با متن و ویدئو گذاشته شده است. درهرصورت ممکن هست این داکیومنت برای شما پیچیده باشد. من در ادامه مهمترین مراحل کار با یولو 8 را به شما خواهم گفت.
نصب و فراخوانی یولو 8
در اولین گام باید یولو 8 را نصب کنیم. البته، بهتر هست بگویم باید ultralytics را نصب کنیم. نحوه نصب با پیپ و کوندا بسیار بسیار ساده هست:
# Install the ultralytics package from PyPI pip install ultralytics
این هم کوندا:
# Install the ultralytics package using conda conda install -c conda-forge ultralytics
حالا باید YOLO را از لایبرری ultralytics ایمپورت کنیم:
from ultralytics import YOLO
رسیدیم به قسمت هیجان انگیز فراخوانی مدل در یولو 8…
انواع مدل در یولو 8
در یولو 8 ما چند نوع مدل با سایزهای مختلف داریم. از مدل سبک نانو تا مدل سنگین ایکسلارج! لیست مدلهای یولو برحسب سایز به صورت زیر است:
- مدل نانو YOLOv8n
- مدل اسمال 😄 YOLOv8s
- مدل مدیوم YOLOv8m
- مدل لارج YOLOv8l
- مدل ایکسلارج YOLOv8x
این مدلها از کوچک به بزرگ چیده شدهاند. مثلا مدل نانو کوچکترین و مدل ایکس هم طبیعتا بزرگترین هست. این کوچکترین و بزرگترین به میزان حجم پارامترها یا سایز مدل اشاره دارد. در مورد مدلها این دو نکته را بدانید:
- مدل کوچکتر: زمان اجرای سریعتر و دقت پایینتر
- مدل بزرگتر: زمان اجرای کندتر و دقت بالاتر
در تصویر، اطلاعاتی از تعداد پارامترها و mAP (معیار ارزیابی) هریک از مدلها آورده شده است:
بسیارخب، حالا چگونه میتوانیم مدل لارج برای تشخیص اشیا را فراخوانی کنیم؟ کافی است که همان نام انگلیسی لیست بالا را در دستور YOLO بنویسیم. به شکل زیر:model = YOLO('yolov8l.pt')
تمرین حالا شما هم تمرین کنید؛ یک مدل دلخواه را از لیست بالا فراخوانی کنید.
اما دو سوال مهم! مدل بالا فقط برای تشخیص اشیا است؟ یا اینکه سایر کارهایی که قبلا گفتیم، مثلا سگمنتیشن را هم انجام میدهد؟ مدل بالا فقط کار تشخیص اشیا را انجام میدهد. برای اینکه سایر کارها/تسکهای بینایی کامپیوتر مثل بخشبندی تصویر را با یولو 8 انجام دهید، باید بخش بعدی را بخوانید.
انواع تسک در یولو 8
همانطور که پیش از این گفتیم، یولو 8 فقط مدل تشخیص اشیا نیست. بلکه، کارها/تسکهای مختلفی را در بینایی کامپیوتر میتواند انجام دهد. یولو 8 میتواند تسکهای زیر را انجام دهد:
- دستهبندی
- تشخیص اشیا
- بخشبندی تصویر
- تخمین ژست
نکته مهم این هست که برای تکتک تسکهای بالا یک مدل جداگانه وجود دارد. یعنی اینطور نیست که یک مدل یولو 8 (مثلا مدل نانو یا سایر مدلها) همزمان بتواند تشخیص اشیا، بخشبندی تصویر و تخمین ژست را انجام دهد. شما باید از سه مدل جداگانه برای این کار استفاده کنید.
هر تسکی یک دسته مدل اختصاصی از نسخه نانو تا ایکس را دارد. مثلا برای مدل دیتکشن شما باید از نامهای yolov8n تا yolov8x استفاده کنید. برای کار دستهبندی، باید در انتهای نام مدلها cls- بگذارید. یعنی باید بنویسید: yolov8n-cls تا yolov8x-cls. لیست نامگذاری تمامی تسکها را در ادامه آوردهام:
- اسم مدلهای تشخیص اشیا: yolov8n تا yolov8x
- اسم مدلهای دستهبندی: yolov8n-cls تا yolov8x-cls (یعنی آخر نامها cls- دارد)
- اسم مدلهای بخشبندی تصویر: yolov8n-seg تا yolov8x-seg (آخرش seg- دارد)
- اسم مدلهای تخمین ژست: yolov8n-pose تا yolov8x-pose
حالا، اگر بخواهیم مدل مدیوم برای تسک تخمین ژست را فراخوانی کنیم، چه باید بنویسیم؟ ساده است:
model = YOLO('yolov8x-pose.pt')
پس بهصورت خلاصه این شد که:
در یولو 8 برحسب سایز مدل و نوع تسک، مدلهای مختلفی داریم.
تمرین شما هم تمرین کنید و چند نمونه مدل با سایز و تسک مختلف را فراخوانی کنید.
انواع مد (Mode) در YOLOv8
اگر با یادگیری ماشین و یادگیری عمیق آشنا باشید، میدانید که در این حوزه مدهای مختلفی مانند Train Evaluation Inference وجود دارد. در یولو 8 هم مدهای زیر را داریم:
- Predict: پیشبینی و گرفتن خروجی از مدل آموزشدیده
- Train: آموزش مدل 🔥
- Val: ارزیابی مدل و نمایش معیارهای دقت و غیره
- Export: ذخیره مدل مثلا برای توسعه
- Benchmark: اجرای ارزیابیهای مختلف و رایج مانند سرعت، دقت، mAP و غیره
- Track: ردیابی اشیا در ویدئوها (چشمات قلبی شد؟! 😍)
در ادامه درمورد هریک از موارد بالا توضیح میدهم.
مد Predict در YOLOv8
مد Predict برای پیشبینی روی تصاویر یا ویدیوهای جدید استفاده میشود. در این حالت، ما از یک مدل آماده یا مدل آموزشدیده توسط خودمان استفاده میکنیم. یعنی، طبق توضیحاتی که در بخش قبل دادیم، مدل مدنظرمان را فراخوانی میکنیم. سپس، عمل Predict را با استفاده از فراخوانی آبجکت مدل اجرا میکنیم. حالاااا وقت خروجی گرفتن از مدل هست! 😍 در کد زیر، مدل نانو برای تشخیص اشیا را فراخوانی کردهام. سپس، یک تصویر را هم به عنوان ورودی به مدل دادهام.
detector = YOLO('yolov8n.pt') result = detector('https://ultralytics.com/images/bus.jpg') print(result)
نکته جالب این هست که نیازی به خواندن تصویر نیست. تنها کافی است که آدرس تصویر را بدهیم. اما نکته جالبتر این هست که یولو 8 به شدت در گرفتن ورودی منعطف هست. شما به اشکال مختلف میتوانید به این مدل ورودی بدهید. چند نمونه جالبش را آوردم:
- آدرس Local یا محلی: ‘image.jpg’
- آدرس اینترنتی: ‘https://ultralytics.com/images/bus.jpg’
- OpenCV و خواندن تصویر: cv2.imread(‘im.jpg’)
- ویدئو: ‘video.mp4’
- یوتوب: ‘https://youtu.be/LNwODJXcvt4’ 😮
- دایرکتوری یا یک پوشه: ‘path/’
- استریم: ‘rtsp://example.com/media.mp4’
مشاهده میکنید که فوقالعاده هست. شما میتوانید آدرس یک ویدئوی یوتوب را بدهید تا روی آن یولو 8 اعمال شود!
اما برویم سراغ مشاهده خروجی تشخیص اشیا؛ هنوز خروجی را ندیدهایم! در result، اطلاعات بسیار زیادی ذخیره شده است. طوری که با دیدن آن احتمالا وحشت میکنید! خب من نمیخواهم result را به شما نشان دهم. میخواهم نحوه دیدن خروجی را به شما توضیح دهم. در کنار آدرس فایل تصویر، آرگومانهای دیگری هم وجود دارد که دانستن بعضی از آنها ضروری هست. مثلا آرگومان show که بولین هست. اگر عبارت زیر را بنویسید، پنجرهای باز میشود و خروجی کار را به شما نشان میدهد. این هم کد:
result = detector('https://ultralytics.com/images/bus.jpg', show=True)
این پنجره در کولب باز نمیشود و خب بهتر است بیخیالش شویم. آرگومان دیگر save هست که اگر True کنیم، خروجی ذخیره میشود:
result = detector('https://ultralytics.com/images/bus.jpg', save=True)
با اجرای دستور بالا، همانطور که در شکل زیر نشان داده شده است، مسیری بنام runs > detect > predict ساخته میشود. تصاویر خروجی در این پوشه predict ذخیره شدهاند. با کلیک بر روی آنها، میتوانید آنها را مشاهده کنید.
بیشتر از این درباره بخش Predict توضیح نمیدهم. میتوانید از اینجا اطلاعات بیشتری درباره Predict کسب کنید.
مد Train در YOLOv8
مد Train در YOLOv8 به آموزش مدلهای یولو 8 روی دیتاست سفارشی اشاره دارد. طبیعتا، بخش جالبی است و بسیاری از شما دنبال همین بخش هستید. خوشبختانه Ultralytics فرآیند آموزش را بسیار ساده کرده است. کافی است که دیتاست شما آماده باشد. پس از آمادهسازی دیتاست، کار آموزش مدل به سادگی انجام میشود. پس آموزش مدل شامل دو گام است:
- تهیه و آمادهسازی دیتاست
- آموزش یولو 8 روی دیتاست
بیایید دو گام بالا را مرحله به مرحله برای یک نمونه مثال انجام دهیم. در گام اول، باید یک دیتاست متناسب با اهدافمان آماده کنیم. دو حالت متفاوت در دیتاست عبارت است از:
- دیتاست آماده و در اینترنت موجود هست.
- صرفا یکسری تصویر دارید و هیچگونه Ground Truth یا لیبل وجود ندارد.
اگر دیتاست شما در حالت دوم هست، میتوانید به سایت Roboflow بروید و دیتاست خود را آماده کنید. در داکیومنت یولو 8 هم توصیه شده از این سایت برای تهیه دیتاست خود استفاده کنید. به راحتی تصاویر خود را آپلود میکنید و با استفاده از ابزارهای در سایت، برای اهداف خود باکس بکشید یا سگمنت کنید یا …
اما اینجا من میخواهم از یک دیتاست آماده استفاده کنم. چون هدف ما لیبل زدن دیتاست نیست. هدف اصلی ما آموزش یولو 8 هست. من یک دیتاست آماده از سایت روبوفلو انتخاب کردم. در این آدرس میتوانید دیتاستهای متنوعی را مشاهده کنید. دیتاستی که من انتخاب کردم، نامش Aquarium Dataset هست و مربوط به تشخیص جانوران آبی هست. در شکل 3 هم نحوه لیبلگذاری این دیتاست نشان داده شده است. اما مشخصات دیتاست آکواریوم چیست؟ کلا 638 تصویر در این دیتاست وجود دارد که تعداد نمونههای آموزش، ولیدیشن و تست آن بهصورت زیر است:
- 448 تصویر برای Train
- 127 تصویر برای Valid
- 63 تصویر برای Test
من این دیتاست را در این لینک برای شما قرار دادم و نیازی نیست که به سایت روبوفلو مراجعه کنید. اما چنانچه خواستید، دیتاست دیگری را در روبوفلو دانلود کنید، باید کارهای زیر را انجام دهید:
- روی دیتاست موردنظرتان کلیک کنید تا صفحه اختصاصی و معرفی دیتاست باز شود.
- در بالای صفحه، گزینه Downloads هست. یک گزینه دارد که تعداد تصاویر و آیکون ➡️ دارد. روی آن کلیک کنید.
- از شما میخواهد که یک اکانت در سایت بسازید که با جیمیل به سادگی انجام میشود.
- سپس، وارد بخش تصاویر دیتاست میشوید. نمایی از تصاویر دیتاست قابل مشاهده هست.
- یک پنجره پاپآپ کوچک با عنوان Export بهصورت خودکار باز میشود.
- از شما میخواهد که فرمت دیتاست را مشخص کنید.
- از بین گزینهها YOLOv8 را انتخاب کنید.
- سپس، از بین گزینههای رادیویی، گزینه download zip to computer را انتخاب کنید.
- گزینه Continue را بزنید و منتظر بمانید که دانلود شروع شود.
حالا دیتاست دانلود شده و میتوانیم آموزش یولو 8 را شروع کنیم. من نمیدانم این آموزش را با چه سیستمی پیش میبرید. اما طبیعتا، از این دیتاست در سیستم شخصی، گوگل کولب یا حالتهای دیگر میتوانید استفاده کنید. من این دیتاست را در گوگل درایو قرار دادم و بعد گوگل درایوم را به کولب وصل میکنم. درمورد این کارها توضیح نمیدهم، چون قبلا در آموزش گوگل کولب گفتیم.
بعد از تعیین تکلیف دیتاست، وقت آموزش مدل یولو هست. باید کارهای زیر را انجام دهیم:
- انتخاب و ساخت نوع مدل
- آموزش مدل
در اولین گام، باید یک مدل مناسب از نظر نوع تسک و سایز انتخاب کنیم. من مدل نانو برای دیتکشن را انتخاب میکنم. در گام دوم، باید با استفاده از متد ()train، مدل مدنظرمان را روی دیتاست آموزش دهیم. کد آموزش مدل را در ادامه آوردهام:
# Load a model model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training) # Train the model results = model.train(data='/content/dataset/data.yaml', epochs=100, imgsz=640)
متد ()train در بالا کاملا ساده و سرراست هست. اما بهصورت خلاصه، آرگومانهایی که تنظیم کردهام، عبارت است از:
- data: آدرس فایل با پسوند yaml از دیتاست
- epochs: تعداد ایپوک آموزش مدل
- imgsz: سایز تصاویر برای آموزش (تصاویر دیتاست به این سایز ریسایز میشوند)
آرگومانهای متد ()train خیلی زیاد و متنوع هست. اما فعلا همین اندازه کافی هست.
مد Export در یولو 8
مدل یولو را آموزش دادیم. قاعدتا یکی از کارهای متداول این هست که این مدل آموزشدیده را ذخیره کنیم. حتما میدانید که مدل آموزشدیده خیلی عزیز هست. چون هزینه مالی و زمانی کردهایم تا این مدل بهدست آید. با استفاده از ()export میتوان به راحتی مدل آموزشدیده را به هر پسوند دلخواهی ذخیره کرد. درمورد پسوندها صحبت خواهم کرد، اما با یک مثال ساده بیایید ببینیم که این دستور چطور کار میکند. در کد زیر، مدل آموزشدیده یولو با پسوند onnx ذخیره شده است.
model.export(format='onnx')
حالا چه پسوند یا فرمتهایی داریم؟ پسوندهای متنوعی وجود دارد. ولی سه مورد هستند که داکیومنت یولو روی آنها تاکید دارد. این سه عبارت است از:
- فرمت ONNX یا OpenVINO: با این فرمتها میتوان سرعت اجرای مدل روی CPU تا سه برابر افزایش داد!
- فرمت TensorRT: با این فرمت میتوان سرعت اجرای مدل روی GPU را تا پنج برابر افزایش داد!
- فرمتهای دیگری مانند Pytorch هم داریم.
مطالب زیر را حتما مطالعه کنید
شبکه ویژن ترنسفورمر
11 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
خاص و متفاوت
ممنون 😊🙏🌹
درود
خیلی خیلی ممنونم از مطلب عالی تون. من دانشجوی دوره بینایی کامپیوتری هستم فوق العاده است. اینم خوندم یولو وی ۸ رو عالی است. وبیدار father RCNN هم عالی بود. فقط اینکه شما وبیدار جامعی چیزی برای DETECTION و SEGMENTATAION با YOLOV8 یا حتی ورژن های پایینتر یولو ندارید؟
سپاس فراوان
درود
خوشحالیم که آموزشهای هوسم رو دوست داشتین. 😊🌹
درحال حاضر دورهای شامل مطالبی که فرمودید، نداریم. 🙏
پیشنهاد میکنیم ویدئوهای آموزشی در یوتوب رو مشاهده بفرمایید.
عالی بود, خیلی خوب میشد اگ در مورد poseهم مطلب میذاشتین تا بتونیم اطلاعات ریزتر و عمیق تری ازش بیرون بکشیم
ببخشید سمینار یا دوره آموزشی برای YoloV8 ندارید؟ یادمه برای Faster RCNN و YoloV3 یه چیزایی روی سایت بود؟ ارادت فراوان
سلام
خیر، برای یولو 8 آموزش ویدئویی نداریم. 🙏
مثل همیشه عالی و آموزنده 👌
سپاس 😊
با سلام و احترام
از سال ۲۰۱۶ تا ۲۰۱۸ کارهای پردازش تصویر بصورت جسته گریخته و گاها منسجم انجام میدادم
من با الگوریتمهای یولو حدودا در سال ۲۰۱۷ و ۲۰۱۸ آشنا شدم
سالهاست کمی از پردازش تصاویر دور شده بودم و شدیدا روی سخت افزارهای FPGA و ARM و مدارات فرکانس بالا و دینامیک پرواز تمرکز داشتم.
بسته به نوع کارم مطالب جدید یاد میگیرم، و الان با توجه به پروژه های پیش روم تصمیم گرفتم که مجددا بر گردم به پردازش تصاویر، واقعا میتونم به جرات بگم آموزشهاتون بسیار عالی و کار راه بندازه، من الان دو روزه که با مطالب سایتتون آشنا شدم علاوه بر اینکه کلی مطالب قبلی یادم اومد و مرور شد، بسیاری مطالب جدید هم ازتون یاد گرفتم.
خداوند خیرتون بده به جهت کیفیت آموزشهاتون
سپاس
سلام علی عزیز،
خوشحالیم که آموزشهای هوسم رو دوست داشتید. 🥰
امیدواریم که توی کارتون موفق باشید و همواره درحال پیشرفت باشید. ✌️