kimia faryadi
kimia faryadi
خواندن ۱۳ دقیقه·۲ سال پیش

آموزش مدل YOLO v7 روی دیتاست دلخواه / Training YOLO v7 Model on Custom Dataset

مدل Yolo V7 توسط WongKinYiu و AlexeyAB خالقان YOLOv4 Darknet ساخته شده است. این مدل بسیار شگفت انگیز که در فریمورک PyTorch ساخته شده، دارای عملکردی پیشرفته روی دیتاست MS COCO برای تشخیص اشیاء در زمان واقعی است . سرعت آن طبق تعریف، ۵ فریم در ثانیه یا سریع‌تر در GPU V100 است.

ارزیابی مدل‌ YOLO v7 نشان می‌دهد که این مدل سریع‌تر (محور x) و با دقت بیشتری (محور y) نسبت به سایر مدل‌های تشخیص اشیاء نزدیک به همزمان (real time object detection) است. یعنی با صرف زمان بسیار کوتاهی نسبت به تشخیص اشیا اقدام می نماید. این مدل روی دیتاست COCO آموزش داده شده است. این دیتاست دارای ۸۰ کلاس است، بدین معنی که این مدل قادر است ۸۰ شی(Object)مختلف تعریف شده را تشخیص دهد.

جهت استفاده مستقیم از مدل YOLO V7 برای تشخیص یک یا دو object ، نیاز است که مدل YOLO V7 روی دیتاست مورد نظر، که اصطلاحا custom data set نامیده می شود، مجددا آموزش ببیند تا وزن های مدل برای شی جدید منطبق (customize) شود.

بدین منظور کافی است مراحل زیر گام به گام اجرا شود تا در نهایت مدل آموزش دیده، قادر باشد اشیا مد نظر را به راحتی و با دقت قابل قبولی تشخیص دهد.

مراحل پیش رو جهت آموزش دیتاست دلخواه، شامل دو قسمت کلی می باشد که عبارتند از:

  1. آماده کردن دیتاست
  2. آموزش مدل با دیتاست دلخواه

آماده کردن دیتا شامل مراحل زیر می باشد:

۱.جمع آوری عکس از شی مورد نظر

۲. Annotate سمپل های دیتا با فرمت مورد قبول برای yolo

۳. آپلود کردن دیتا روی سرور مد نظر جهت آموزش مدل yolo

Annotate دیتاهای تصویری در واقع فرایند لیبل گذاری آن هاست تا مدل ها بتوانند تصاویر ورودی را درک کنند. برای یادگیری نظارت شده، لیبل گذاری دیتاست بسیار حائز اهمیت است چرا که مدل‌های ML تحت نظارت، از داده‌های لیبل گذاری شده یاد میگیرند. بنابراین عملکرد و دقت چنین مدل هایی به کیفیت و کمیت داده های Annotate شده بستگی دارد.

نتیجه ی annotation کردن دیتا ها در فایل جداگانه در فرمت های JSON, XML, CSV و TXT (متناسب با فرمت مورد نیاز )ذخیره می شود؛ که می بایست هم تصاویر و هم فایل دیتاهای annotate شده به مدل داده شود. در واقع مدل yolo v7 علاوه بر تصاویر، به YOLO TXT annotations، یک فایل custom YAML و مسیر های سازماندهی شده نیز نیاز دارد. یکی از روش های annotation کردن تصاویر و ایجاد فایل های مورد نیاز ، استفاده از API سایت Roboflow و از نرم افزار تحت وب این سایت است. در این آموزش ما از این روش برای لیبل گذاری تصاویر یا اصطلاحا annotation کردن تصاویر استفاده می کنیم. این آماده سازی به صورت زیر است:

۱- برای شروع وارد لینک https://app.roboflow.com/login شوید و یک حساب کاربری بسازید. پس از آن شما در صفحه اصلی پروژه خود قرار خواهید گرفت.

۲- روی Create New Project کلیک کرده، نام پروژه و آنچه را که می خواهید تشخیص دهید؛ مشخص کنید و روی create public project کلیک کنید.

۳- سپس دیتاهای خود را آپلود کنید و در نهایت روی finished uploading (گوشه ی بالا سمت راست)کلیک کنید.

پس از آن پنجره ی زیر باز می شود و با انتخاب گزینه ی assign images وارد مرحله ی اصلی annotation کردن تصاویر می شوید.

۴- اکنون روی اولین تصویر کلیک کرده با تشخیص هر object ، آن را داخل یک کادر قرار دهید.

بخشی از دقت کار شما به همین کادربندی تصاویر بر می گردد. لذا می بایست تمام اشیا را به طور کامل در کادر قرار دهید، حتی اشیایی که تنها بخشی از آن در تصویر وجود دارد. می بایست همان بخش از شی مورد نظر در کادر قرار گیرد. بنابراین اگر اشتباهی در این بخش رخ داد؛ کادر را حذف و مجددا ایجاد کنید.

برای حذف کردن کادر کافیست در قسمت چپ رو گزینه ی LAYERS کلیک کرده و از منو موجود Delete را انتخاب کنید.

۵- پس از اتمام annotation کردن تصاویر، باید به صفحه ی پروژه برگردید. برای این کار روی نام پروژه در گوشه ی بالا سمت چپ کلیک کنید.

در صفحه ی جدید گوشه ی بالا سمت راست روی گزینه ی Add images to Dataset کلیک کنید.

پنجره ی جدیدی باز خواهد شد که می توانید در همین بخش دیتا هایتان را split کنید. اگر در این مرحله مقدار پیش فرض train test , valid را تغییر ندادید در مراحل بعدی می توانید آن را به صورت دلخواه تقسیم کنید. اکنون روی add images کلیک کنید.

در ادامه روی دکمه ی گوشه سمت راست Generate new version کلیک کنید.

در مرحله ی بعد می توانید در هر بخش تغییرات مورد نظر خود را روی دیتاست خود ایجاد کنید. اگر می خواهید با تنظیمات اتوماتیک جلو بروید، در هر مرحله Continue را انتخاب کرده، در غیر این صورت می توانید تغییرات دلخواه را اعمال کنید. به عنوان مثال در بخش Train/Test Spilt تصاویر به سه بخش train, valid و test تقسیم می شود.

ما در اینجا تنها دو تصویر را برای test انتخاب می کنیم تا تصاویر بیشتری برای train و validation استفاده شود. شما هم میتوانید با انتخاب دکمه ی Rebalance نسبت به تغییر آن اقدام کنید. بدین شکل که با حرکت دادن کردن موس ، می توانید مقدار train, valid و test را تغییر دهید.

در قدم بعدی می توانید تعداد تصاویر خود نیز را با استفاده از آپشن های پیش رو شامل Augmentation و Preprocessing افزایش دهید. این دو گزینه برای مواقعی است که تعداد تصاویر شما کم است و به تصاویر بیشتری دسترسی ندارید. در بخش Preprocessing به عنوان مثال می توانید با انتخاب Resize ،سایز هر تصویر را تغییر دهید. در این حالت در دیتاست نهایی، هم تصویر اصلی و هم resize شده را خواهید داشت. بعد از هر مرحله برای ادامه ی فرایند روی continue کلیک کنید.

همان طور که گفته شد Augmentation نیز برای افزایش تعداد تصاویر است ، با این تفاوت که شامل آپشن های بیشتری برای تغییر تصویر است. به عنوان مثال:

  • rotation: تصویر را می چرخاند
  • crop: تصویر را برش می زند
  • Flip: تصویر را برعکس می کند
  • Blur: تصویر را تار میکند
  • cut out: بخشی از تصویر را بر می دارد

و … . برای اعمال این تغییرات کافی است روی بخش Augmentation کلیک کرده و Add Augmentation step را انتخاب کنید. پنجره ی زیر باز خواهد شد.

با انتخاب هر option پنجره ی جدیدی برای اعمال تغییرات به میزان دلخواه باز می شود. به عنوان مثال اگر گزینه ی Blur را انتخاب کنید پنجره ی زیر باز شده که می توانید میزان تار شدن را تعیین و در نهایت Apply کنید. با این کار این تغییر بر روی هر یک از تصاویر train شما اعمال خواهد شد.

بعد از مرحله ی Augmentation نیز برای ادامه ی فرایند continue و در پایان آن ها، Generate را انتخاب کنید تا دیتاست شما آماده شود .

۶- پس از آن پنجره ی زیر باز می شود و می بایست روی Export کلیک کنید.

در این مرحله می خواهیم تصاویر را export کنیم. شما می توانید تصاویر خود را در فرمت های مختلف export کنید. اما متناسب با فرمت انتخابی، فایل Ammotation خروجی شما برای training نیز متفاوت خواهد بود. فرمت انتخابی می بایست متناسب با مدل باشد. در اینجا مدل مورد استفاده، yolo v7 است. بنابراین در پنجره ی پیش رو فرمت را می بایست YOLO v7 PyTorch انتخاب کنید. در همین پنجره گزینه ی show download code را انتخاب و سپس روی continue کلیک کنید.

۷- پس از آن پنجره ی جدید باز می شود که می بایست محتوای درون کادر (snippet) را به منظور دانلود و unzip کردن دیتاستی که حاوی تصاویر, YOLO TXT annotations و فایل custom YAML است، کپی کنید تا در محل مناسب در کد اصلی معرفی کنیم. توجه داشته باشید api key محرمانه است لذا snippet یا api key خود را در اختیار دیگران قرار ندهید.

اگر بخواهید این دیتاست را روی سیستم خود داشته باشید، در مرحله ی ۶ با انتخاب download zip to computer ، دیتاست مستقیما روی سیستمتان دانلود می شود و برای استفاده های آتی می توانید آن را در سیستم خودتان به عنوان فایل بک آپ نگهداری کنید.

حال برای آموزش مدل YOLO v7 به ترتیب زیر عمل میکنیم:

۱. به این لینک مراجعه کنید.

۲. به منظور داشتن یک فایل نوت بوک، روی گوگل درایو خود گزینه ی File > Save a Copy in Drive را انتخاب کنید. پیشنهاد میشود که حتما از این فایل یک کپی برای خودتان تهیه کنید. بدین منظور از روش زیر میتوانید این کپی را تهیه کنید.


۳. Install Dependencies:

این بخش به منظور دانلود ریپوزیتوری و dependency های YOLO V7 است.


۴. Download Correctly Formatted Custom Data:

در این مرحله، می بایست دیتاست ما در فرمت صحیح دانلود شود. توجه داشته باشید که این مدل به YOLO TXT annotations، یک فایل custom YAML و مسیر های سازماندهی شده نیاز دارد، که خروجی روبوفلو شامل این موارد است و آن ها را در جای درست ذخیره می کند. بنابراین شما به خروجی روبوفلو در مرحله ی ۷ نیاز دارید.

اگر از ابتدای کار با فایل نوت بوک پیشنهادی پیش رفته باشید، در این مرحله با خط کد زیر مواجه خواهید شد.

اکنون آنچه را که در مرحله ی ۷ کپی کردید، "به صورت کامل"جایگزین این بخش کنید. بعد از جایگزینی خروجی تان در این بخش، با ران کردن cell ، دیتاست شما دانلود و unzip می شود. چنانچه از فایل نوت بوک مذکور استفاده نکرده باشید، کافیست آنچه را که در مرحله ی ۷ کپی کردید، در cell جدید past کنید.

۵. Begin Custom Training:

تا این مرحله، دیتاها برای training آماده شده است. اما برای YOLO V7 از طرف توسعه دهنده ها شش وزن معرفی شده که لینک دانلود همه ها آن ها به صورت زیر است.

yolov7: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt

yolov7x: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7x.pt

yolov7-w6: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6.pt

yolov7-e6: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-e6.pt

yolov7-d6: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-d6.pt

yolov7-e6e: https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-d6.pt

به منظور استفاده از وزن مورد نظر، نیاز داریم آن ها را دانلود کنیم؛ برای این کار از دستور wget استفاده می کنیم. در این مدل از اولین وزن (yolov7) استفاده شده بنابراین از اولین لینک برای دانلود وزن های آن استفاده می شود.

پس از آن نوبت ران کردن cell بعدی است که قسمت اصلی training هست:

شما می توانید تنظیمات مدل خود را تغییر دهید. بدین منظور می توانید از آپشن های زیر استفاده کنید:

1. Weight: وزن های مورد استفاده. در اینجا ما از 'yolov7.pt' استفاده کردیم. شما میتوانید از سایر وزن هایی که در قسمت قبل گفته شده است، استفاده کنید. به عنوان مثال 'yolov7x.pt'. اما دقت کنید که حتما وزن های آن را با دستور wget و لینک ار‌ايه شده، دانلود کرده باشید. ('default value: 'yolo7.pt)

2. cfg:مسیر model.yaml

3. Data: مسیر data.yaml .در این کد از {dataset.location}/data.yaml استفاده شده است. اگر با API روبوفلو، دیتاها را وارد کرده اید، لازم نیست مسیر را تغییر دهید. زیرا این مسیر همان مسیر دیتاهای فراخوانی شده از روبوفلوست. اما چنانچه قصد دارید از گوگل درایو خود دیتاها را بخوانید و یا مستقیما از سیستم خود آپلود کنید می بایست مسیر درست دیتا را در این بخش وارد کنید. ('default value: 'data/coco.yaml)

4. Batch: اگر به ارور کمبود فضا (out of memory) برخورد کردید مقدار batch را کمتر کنید. (default value: 16)

5. epoch : تعداد دفعاتی که training انجام می شود .(default value: 300)

6. hyp: مسیر هایپر پارامترها. ('default value: 'data/hyp.scratch.p5.yaml)

7. project: مسیر save شدن وزن ها: ('default value: 'runs/train)

8. name: نام فولدری که در مسیر داده شده در قسمت project، وزن ها در آن ذخیره می شود. ('default value: 'exp)

اگر در مورد ۷ و ۸ حالت پیش فرض را قرار دهیم وزن ها در مسیر runs/train/exp/weights ذخیره می شود. این مسیر هم در انتهای training دیتا نشان داده می شود.

9. img: سایز تصاویر ([640,640]:default value).

توجه کنید که در انتهای آموزش، دقت مدل تحت عنوان mAP@.5 نمایش داده می شود که در این جا دقت مدل 0.904 است.

۶. Evaluation :

اکنون نوبت به تست کردن مدل آموزش دیده است. در این مرحله از تصاویری که قبلا برای test جدا کرده ایم، استفاده می کنیم. در قسمت source باید آدرس تصاویر test را (که همان محل ذخیره سازی تصاویر test است) وارد کنید.

اگر از روش API روبوفلو برای آپلود دیتاست استفاده کرده اید، لازم نیست آدرس را تغییر دهید. چرا که این آدرس، همان آدرس دیتاهای تستی است که از طریق API سایت روبوفلو وارد کرده اید.

توجه کنید که در انتهای مرحله ی training محل ذخیره ی وزن ها، بهترین وزن و آخرین وزن گزارش می شود ؛ برای مواقعی که فراموش کردید کجا save شده اند. کافیست مسیر وزن ها (best و یا last) را در قسمت weight-- وارد کنید.

سپس ران!

اکنون تصاویر test شما متناسب با بهترین وزن ارایه توسط مدل شناسایی شده اند. همچنین در انتهای همین cell ،محل ذخیره ی تصاویر شناسایی شده نیز گزارش می شود. به مسیر مورد نظر رفته و با کلیک بر روی تصاویر، آن ها را مشاهده کنید. اما می توانید با استفاده از glob, Image , display تصاویر را به همراه دقت شناسایی اشیا به نمایش در آورید. بدین منظور از خط کد زیر استفاده کنید.

طبق تنظیمات پیش فرض که در بخش training برای مدل تعریف کرده ایم؛ مدیاهای evaluate شده ( تصاویر شناسایی شده توسط مدل ) در مسیر /content/yolov7/runs/detect قرار دارند. بنابراین در خط کد بالا تمام تصاویر evaluate شده با مسیر '/content/yolov7/runs/detect/exp/*.jpg' خوانده می شود.

تشخیص اشیا در فایل ویدیویی:

با توجه به این نکته که هر فایل ویدیویی مجموعه ای از فریم های تصویری ست که در محور زمان و با نرخ مشخصی بر حسب واحد فریم بر ثانیه، نمایش داده میشود؛ میتوان به جای عکس در قسمت تست ، ویدیو را به این مدل داد تا اشیا را تشخیص دهد. در نهایت فیلمی که اشیا در آن شناسایی شده اند را می توان تهیه کرد. بدین منظور می توان روال زیر را طی کرد:

ویدیو را مستقیم با درگ کردن روی فایل کولب آپلود کنید. و یا آن را از روی google drive بخوانید. در اینجا فایل را از روی google drive می خوانیم. بدین منظور با دستور زیر به محتوای google drive دسترسی پیدا کنید.

سپس مانند مرحله ی Evaluation، با دادن آدرس ویدیو و وزن های مدل، object های ویدیو شناسایی می شود. دقت کنید که در بخش source-- می بایست مسیر ویدیوی آپلود شده را قرار دهید. در اینجا مسیر ویدیوی آپلود شده از google drive به صورت content/drive/MyDrive/yolov7/video_test.mp4 است.

بنابراین برای شناسایی کردن اشیا در ویدیوی آپلود شده کد زیر را وارد می کنیم:

فراموش نکنید که شما می بایست مسیر ویدیو خود را آپلود کنید. برای یافتن مسیر ویدیو از طریق google drive کافیست آن را طبق شکل زیر از بخش files بیابید.

از منوی موجود، گزینه ی copy path را انتخاب و در بخش source-- کپی کنید.

همان طور که قبل تر گفته شد ویدیو یا تصویر evaluate شده در مسیر content/yolov7/runs/detect/قرار میگیرد. به عنوان مثال نتیجه ی اولین evaluate کردن در content/yolov7/runs/detect/exp1 قرار می گیرد، نتیجه ی دومین evaluate در مسیر content/yolov7/runs/detect/exp2 و همین طور تا آخر.به همین دلیل ویدیو تولید شده اکنون در content/yolov7/runs/detect/exp2 قرار دارد؛ چرا که اکنون دومین مرتبه ای است که مدل ارزیابی شد.حالا به همان مسیر رفته، ویدیو را بیابید و از منو موجود گزینه ی download را انتخاب کنید.

ویدیو را باز کرده و از تشخیص object ها توسط مدل تان لذت ببرید!














yoloannotation
شاید از این پست‌ها خوشتان بیاید