از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استنتاج تشخیص شی در زمان واقعی در پایتون با YOLOv7
سرفصلهای مطلب
معرفی
تشخیص اشیا میدان بزرگی در بینایی کامپیوتری است و یکی از مهمترین کاربردهای بینایی کامپیوتر در طبیعت است.
تشخیص اشیا به اندازه طبقهبندی تصویر استاندارد نیست، عمدتاً به این دلیل که بیشتر پیشرفتهای جدید بهجای کتابخانهها و چارچوبهای بزرگ، معمولاً توسط محققان، نگهداریکنندگان و توسعهدهندگان منفرد انجام میشود. بستهبندی اسکریپتهای کاربردی ضروری در چارچوبی مانند TensorFlow یا PyTorch و حفظ دستورالعملهای API که تاکنون توسعه را هدایت کردهاند، دشوار است.
این امر تشخیص اشیاء را تا حدودی پیچیدهتر، معمولاً پرمخاطبتر (اما نه همیشه) و کمتر از طبقهبندی تصویر میسازد.
خوشبختانه برای توده ها – Ultralytics یک API تشخیص شی ساده، بسیار قدرتمند و زیبا در اطراف YOLOv5 خود ایجاد کرده است که توسط سایر تیم های تحقیق و توسعه به نسخه های جدیدتر مانند YOLOv7 گسترش یافته است.
در این راهنمای کوتاه، ما تشخیص اشیاء را در پایتون با پیشرفته ترین YOLOv7 انجام خواهیم داد.
YOLO Landscape و YOLOv7
یولو (شما فقط یک بار نگاه می کنید) یک متدولوژی و همچنین خانواده ای از مدل های ساخته شده برای تشخیص اشیا است. از زمان آغاز به کار در سال 2015، YOLOv1، YOLOv2 (YOLO9000) و YOLOv3 توسط همان نویسنده(ها) پیشنهاد شده اند – و جامعه یادگیری عمیق با پیشرفت های منبع باز در سال های ادامه دار ادامه داد.
Ultralytics’ YOLOv5 اولین پیاده سازی در مقیاس بزرگ YOLO در PyTorch است که آن را بیش از هر زمان دیگری در دسترس قرار داده است، اما دلیل اصلی که YOLOv5 چنین جایگاهی را به دست آورده است API بسیار ساده و قدرتمندی است که پیرامون آن ساخته شده است. این پروژه جزئیات غیر ضروری را حذف می کند، در حالی که امکان سفارشی سازی را فراهم می کند، که عملاً همه قابل استفاده هستند export قالببندی میکند و از شیوههای شگفتانگیزی استفاده میکند که کل پروژه را هم کارآمد و هم بهینه میکند.
YOLOv5 هنوز پروژه اصلی برای ساخت مدلهای تشخیص اشیاء است، و بسیاری از مخازن که هدفشان پیشرفت روش YOLO است، با YOLOv5 به عنوان پایه شروع میشوند و یک API مشابه ارائه میکنند (یا به سادگی پروژه را فوک میکنند و میسازند. روی بالای آن). چنین موردی است YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که ساخت روی بالای YOLOR (همان نویسنده). YOLOv7 آخرین پیشرفت در متدولوژی YOLO است و مهمتر از همه، YOLOv7 سرهای مدل جدیدی را ارائه میکند که میتوانند نقاط کلیدی (اسکلتها) را خروجی داده و قطعهبندی نمونه را علاوه بر رگرسیون جعبه مرزی انجام دهند، که در مدلهای قبلی YOLO استاندارد نبود.
این باعث میشود که قطعهبندی نمونه و تشخیص نقطه کلید سریعتر از همیشه باشد!
علاوه بر این، YOLOv7 به دلیل کاهش تعداد پارامترها و راندمان محاسباتی بالاتر، سریعتر و با درجه دقت بالاتری نسبت به مدلهای قبلی عمل میکند:
خود این مدل از طریق تغییرات معماری و همچنین بهینهسازی جنبههای آموزش ایجاد شده است که به آن «bag-of-freebies» میگویند که دقت را بدون افزایش هزینه استنتاج افزایش میدهد.
در حال نصب YOLOv7
نصب و استفاده از YOLOv7 به بارگیری مخزن GitHub در دستگاه محلی شما و اجرای اسکریپت های بسته بندی شده با آن خلاصه می شود.
توجه داشته باشید: متأسفانه، تا زمان نگارش، YOLOv7 یک API برنامهریزی تمیز مانند YOLOv5 ارائه نمیکند، که معمولاً از torch.hub()
به نظر می رسد که این یک ویژگی است که باید کار کند اما در حال حاضر ناموفق است. با رفع مشکل، راهنما را به روز می کنم یا راهنما جدیدی منتشر می کنم روی API برنامه ریزی شده در حال حاضر – ما تمرکز می کنیم روی اسکریپت های استنتاج ارائه شده در مخزن.
با این وجود، می توانید تشخیص را در زمان واقعی انجام دهید روی فیلم ها، تصاویر و غیره و نتایج را به راحتی ذخیره کنید. این پروژه از همان قراردادهای YOLOv5 پیروی می کند که دارای مستندات گسترده ای است، بنابراین در صورت داشتن پاسخ به سؤالات تخصصی بیشتری در مخزن YOLOv5 احتمالاً پاسخ خواهید یافت.
بیایید مخزن را دانلود کنیم و استنباط هایی انجام دهیم:
! git clone https://github.com/WongKinYiu/yolov7.git
این باعث ایجاد یک yolov7
دایرکتوری در فهرست کاری فعلی شما که پروژه را در خود جای داده است. بیایید به آن دایرکتوری برویم و به فایل ها نگاهی بیندازیم:
%cd yolov7
!ls
/Users/macbookpro/jup/yolov7
LICENSE.md detect.py models tools
README.md export.py paper train.py
cfg figure requirements.txt train_aux.py
data hubconf.py scripts utils
deploy inference test.py runs
توجه داشته باشید: در یک نوت بوک Google Colab، باید جادو را اجرا کنید %cd
دستور در هر سلولی که می خواهید دایرکتوری خود را به آن تغییر دهید yolov7
، در حالی که سلول بعدی شما را به دایرکتوری اصلی خود باز می گرداند. بر Local Jupyter نوت بوک، تغییر دایرکتوری یک بار شما را در آن نگه می دارد، بنابراین نیازی به صدور چندباره دستور نیست.
این detect.py
اسکریپت استنتاجی است که تشخیص ها را اجرا می کند و نتایج را در زیر ذخیره می کند runs/detect/video_name
، جایی که می توانید مشخص کنید video_name
در حین تماس با detect.py
اسکریپت export.py
مدل را به فرمت های مختلف مانند ONNX، TFLite و غیره صادر می کند. train.py
می توان برای آموزش یک آشکارساز YOLOv7 سفارشی (موضوع راهنمای دیگری) استفاده کرد و test.py
می تواند برای آزمایش یک آشکارساز (بارگذاری شده از یک فایل وزن) استفاده شود.
چندین دایرکتوری اضافی تنظیمات را نگه می دارند (cfg
داده های نمونه (inference
)، داده ها روی ساخت مدل ها و تنظیمات COCO (data
)، و غیره.
سایزهای YOLOv7
مدلهای مبتنی بر YOLO به خوبی مقیاس میشوند و معمولاً به عنوان مدلهای کوچکتر و با دقت کمتر و مدلهای بزرگتر و دقیقتر صادر میشوند. آنها سپس به ترتیب در دستگاه های ضعیف تر یا قوی تر مستقر می شوند.
YOLOv7 چندین اندازه را ارائه می دهد و آنها را با MS COCO محک زده است:
مدل | اندازه تست | APتست | AP50 تست | AP75 تست | دسته ای 1 فریم در ثانیه | دسته 32 میانگین زمان |
---|---|---|---|---|---|---|
YOLOv7 | 640 | 51.4٪ | 69.7٪ | 55.9٪ | 161 فریم بر ثانیه | 2.8 میلیثانیه |
YOLOv7-X | 640 | 53.1٪ | 71.2٪ | 57.8٪ | 114 فریم بر ثانیه | 4.3 میلیثانیه |
YOLOv7-W6 | 1280 | 54.9٪ | 72.6٪ | 60.1٪ | 84 فریم بر ثانیه | 7.6 میلیثانیه |
YOLOv7-E6 | 1280 | 56.0٪ | 73.5٪ | 61.2٪ | 56 فریم بر ثانیه | 12.3 میلیثانیه |
YOLOv7-D6 | 1280 | 56.6٪ | 74.0٪ | 61.8٪ | 44 فریم بر ثانیه | 15.0 میلی ثانیه |
YOLOv7-E6E | 1280 | 56.8٪ | 74.4٪ | 62.1٪ | 36 فریم بر ثانیه | 18.7 میلیثانیه |
بسته به روی سخت افزار زیربنایی که انتظار دارید مدل اجرا شود روی، و دقت مورد نیاز – می توانید بین آنها انتخاب کنید. کوچکترین مدل بیش از 160 فریم در ثانیه میرسد روی تصاویر سایز 640 روی یک V100! شما می توانید انتظار عملکرد رضایت بخش در زمان واقعی را داشته باشید روی پردازندههای گرافیکی مصرفکننده رایجتر نیز هستند.
استنتاج ویدیویی با YOLOv7
ایجاد کنید inference-data
پوشه ای برای ذخیره تصاویر و/یا ویدیوهایی که می خواهید از آنها شناسایی کنید. با فرض اینکه در همان دایرکتوری قرار دارد، میتوانیم یک اسکریپت شناسایی را با استفاده از:
! python3 detect.py --source inference-data/busy_street.mp4 --weights yolov7.pt --name video_1 --view-img
این یک ویدیوی مبتنی بر Qt را ایجاد می کند روی دسکتاپ خود را که در آن می توانید پیشرفت و استنتاج زنده را، فریم به فریم، و همچنین خروجی وضعیت را به لوله خروجی استاندارد ما مشاهده کنید:
Namespace(weights=('yolov7.pt'), source='inference-data/busy_street.mp4', img_size=640, conf_thres=0.25, iou_thres=0.45, device='', view_img=True, save_txt=False, save_conf=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='video_1', exist_ok=False, no_trace=False)
YOLOR 🚀 v0.1-112-g55b90e1 torch 1.12.1 CPU
Downloading https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt to yolov7.pt...
100%|██████████████████████████████████████| 72.1M/72.1M (00:18<00:00, 4.02MB/s)
Fusing layers...
RepConv.fuse_repvgg_block
RepConv.fuse_repvgg_block
RepConv.fuse_repvgg_block
Model Summary: 306 layers, 36905341 parameters, 6652669 gradients
Convert model to Traced-model...
traced_script_module saved!
model is traced!
video 1/1 (1/402) /Users/macbookpro/jup/yolov7/inference-data/busy_street.mp4: 24 persons, 1 bicycle, 8 cars, 3 traffic lights, 2 backpacks, 2 handbags, Done. (1071.6ms) Inference, (2.4ms) NMS
video 1/1 (2/402) /Users/macbookpro/jup/yolov7/inference-data/busy_street.mp4: 24 persons, 1 bicycle, 8 cars, 3 traffic lights, 2 backpacks, 2 handbags, Done. (1070.8ms) Inference, (1.3ms) NMS
توجه داشته باشید که پروژه کند خواهد بود روی ماشینهای مبتنی بر CPU (مانند 1000 میلیثانیه در هر مرحله استنتاج در خروجی بالا، اجرا شدند روی مک بوک پرو 2017 مبتنی بر اینتل) و به طور قابل توجهی سریعتر روی ماشین های مبتنی بر GPU (نزدیک به ~5ms/frame روی یک V100). زوج روی سیستم های مبتنی بر CPU مانند این، yolov7-tiny.pt
اجرا می شود در 172ms/frame
، که با وجود دور بودن از زمان واقعی، هنوز برای انجام این عملیات بسیار مناسب است روی یک CPU
پس از اتمام اجرا، می توانید ویدیوی حاصل را در زیر پیدا کنید runs/video_1
(نامی که ما در detect.py
تماس)، ذخیره شده به عنوان .mp4
:
استنتاج روی تصاویر
استنتاج روی تصاویر به همین صورت خلاصه می شود process – ارائه URL به یک تصویر در سیستم فایل و فراخوانی detect.py
:
! python3 detect.py --source inference-data/desk.jpg --weights yolov7.pt
توجه داشته باشید: در زمان نوشتن، خروجی برچسب ها را به اندازه تصویر کوچک نمی کند، حتی اگر تنظیم کنید --img SIZE
. این بدان معنی است که تصاویر بزرگ دارای خطوط مرزی بسیار نازک و برچسب های کوچک خواهند بود.
نتیجه
در این راهنمای کوتاه – نگاهی کوتاه به YOLOv7، آخرین پیشرفت در خانواده YOLO، که میسازد، انداختهایم. روی بالای YOLOR. ما نگاهی به روش نصب مخزن انداخته ایم روی ماشین محلی خود را اجرا کنید و اسکریپت های استنتاج تشخیص شی را با یک شبکه از پیش آموزش دیده اجرا کنید روی فیلم ها و تصاویر
در راهنماهای بعدی، تشخیص نقاط کلیدی و تقسیمبندی نمونه را پوشش خواهیم داد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-03 20:57:06