از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تخمین موقعیت/تشخیص نقطه کلید با YOLOv7 در پایتون
سرفصلهای مطلب
معرفی
تشخیص اشیا میدان بزرگی در بینایی کامپیوتری است و یکی از مهمترین کاربردهای بینایی کامپیوتر در طبیعت است. از آن، تشخیص نقطه کلید (که اغلب برای تخمین پوز استفاده می شود) استخراج شد.
تشخیص اشیاء و تشخیص نقاط کلیدی به اندازه طبقهبندی تصویر استاندارد نیست، عمدتاً به این دلیل که بیشتر پیشرفتهای جدید بهجای کتابخانهها و چارچوبهای بزرگ، معمولاً توسط محققان، نگهداریکنندگان و توسعهدهندگان منفرد انجام میشود. بستهبندی اسکریپتهای کاربردی ضروری در چارچوبی مانند TensorFlow یا PyTorch و حفظ دستورالعملهای API که تاکنون توسعه را هدایت کردهاند، دشوار است.
این امر تشخیص اشیاء را تا حدودی پیچیدهتر، معمولاً پرمخاطبتر (اما نه همیشه) و کمتر از طبقهبندی تصویر میسازد.
خوشبختانه برای توده ها – Ultralytics یک API تشخیص شی ساده، بسیار قدرتمند و زیبا در اطراف YOLOv5 خود ایجاد کرده است که توسط سایر تیم های تحقیق و توسعه به نسخه های جدیدتر مانند YOLOv7 گسترش یافته است.
در این راهنمای کوتاه، ما تخمین پوس (تشخیص نقطه کلید) را در پایتون، با پیشرفته ترین YOLOv7 انجام خواهیم داد.
نقاط کلیدی میتوانند نقاط مختلفی باشند – قسمتهایی از صورت، اندامهای بدن و غیره. تخمین پوز یک مورد خاص برای تشخیص نقطه کلیدی است – که در آن نقاط بخشهایی از بدن انسان هستند و میتوانند برای جایگزینی سختافزار گران قیمت ردیابی موقعیت استفاده شوند. کنترل روباتیک هوایی را فعال کنید و عصر جدیدی از بیان خود انسان را از طریق واقعیت افزوده و واقعیت مجازی تقویت کنید.
YOLO و تخمین پوس
یولو (شما فقط یک بار نگاه می کنید) یک متدولوژی و همچنین خانواده ای از مدل های ساخته شده برای تشخیص اشیا است. از زمان آغاز به کار در سال 2015، YOLOv1، YOLOv2 (YOLO9000) و YOLOv3 توسط همان نویسنده(ها) پیشنهاد شده اند – و جامعه یادگیری عمیق با پیشرفت های منبع باز در سال های ادامه دار ادامه داد.
Ultralytics’ YOLOv5 اولین پیاده سازی در مقیاس بزرگ YOLO در PyTorch است که آن را بیش از هر زمان دیگری در دسترس قرار داده است، اما دلیل اصلی که YOLOv5 چنین جایگاهی را به دست آورده است API بسیار ساده و قدرتمندی است که پیرامون آن ساخته شده است. این پروژه جزئیات غیر ضروری را حذف می کند، در حالی که امکان سفارشی سازی را فراهم می کند، که عملاً همه قابل استفاده هستند export قالببندی میکند و از شیوههای شگفتانگیزی استفاده میکند که کل پروژه را هم کارآمد و هم بهینه میکند.
YOLOv5 هنوز پروژه اصلی برای ساخت مدلهای تشخیص اشیاء است، و بسیاری از مخازن که هدفشان پیشرفت روش YOLO است، با YOLOv5 به عنوان پایه شروع میشوند و یک API مشابه ارائه میکنند (یا به سادگی پروژه را فوک میکنند و میسازند. روی بالای آن). چنین موردی است YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که ساخت روی بالای YOLOR (همان نویسنده) که آخرین پیشرفت در روش YOLO است.
YOLOv7 فقط یک معماری تشخیص اشیاء نیست – سرهای مدل جدیدی را ارائه می دهد که می توانند نقاط کلیدی (اسکلت ها) را خروجی داده و تقسیم بندی نمونه را علاوه بر رگرسیون جعبه مرزی انجام دهند، که در مدل های قبلی YOLO استاندارد نبود. این تعجب آور نیست، زیرا بسیاری از معماریهای تشخیص اشیاء برای نمونهسازی و وظایف تشخیص نقطه کلید، به دلیل معماری عمومی مشترک، با خروجیهای متفاوت بسته به قبل، مجدداً مورد استفاده قرار گرفتند. روی وظیفه اگرچه جای تعجب نیست – پشتیبانی از تقسیمبندی نمونه و تشخیص نقطه کلید احتمالاً به استاندارد جدیدی برای مدلهای مبتنی بر YOLO تبدیل میشود، که از چند سال پیش عملاً عملکرد بهتری از همه آشکارسازهای دو مرحلهای دیگر را آغاز کردهاند.
این باعث میشود که قطعهبندی نمونه و تشخیص نقطه کلید با معماری سادهتر از آشکارسازهای دو مرحلهای، سریعتر از همیشه انجام شود.
خود این مدل از طریق تغییرات معماری و همچنین بهینهسازی جنبههای آموزش ایجاد شده است که به آن «bag-of-freebies» میگویند که دقت را بدون افزایش هزینه استنتاج افزایش میدهد.
در حال نصب YOLOv7
بیایید پیش برویم و پروژه را از GitHub نصب کنیم:
! 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
توجه داشته باشید: هنگام تماس !cd dirname
، فقط برای آن سلول اعمال می شود. هنگام تماس %cd dirname
، برای تمام سلول های بعدی نیز به خاطر سپرده می شود.
هر زمان که کدی را با مجموعه ای از وزن ها اجرا می کنید – آنها در این دایرکتوری دانلود و ذخیره می شوند. برای انجام تخمین پوز، می خواهیم وزنه های مدل YOLOv7 از پیش آموزش دیده را برای آن کار دانلود کنیم که در زیر /releases/download/
برگه روی GitHub:
! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 153M 100 153M 0 0 3742k 0 0:00:42 0:00:42 --:--:-- 4573k
عالی است، ما آن را دانلود کردیم yolov7-w6-pose.pt
فایل وزن، که می تواند برای بارگذاری و بازسازی یک مدل آموزش دیده برای تخمین پوز استفاده شود.
در حال بارگیری مدل تخمین پوس YOLOv7
اجازه دهید import کتابخانه هایی که برای انجام تخمین پوزی نیاز داریم:
import torch
from torchvision import transforms
from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts
import matplotlib.pyplot as plt
import cv2
import numpy as np
torch
و torchvision
به اندازه کافی ساده هستند – YOLOv7 با PyTorch پیاده سازی شده است. این utils.datasets
، utils.general
و utils.plots
ماژول ها از پروژه YOLOv7 می آیند و روش هایی را در اختیار ما قرار می دهند که به پیش پردازش و آماده سازی ورودی برای مدل برای اجرای استنتاج کمک می کند. روی. از جمله آنها هستند letterbox()
برای قرار دادن تصویر، non_max_supression_keypoint()
برای اجرای الگوریتم Non-Max Suppression روی خروجی اولیه مدل و تولید یک خروجی تمیز برای تفسیر ما، و همچنین output_to_keypoint()
و plot_skeleton_kpts()
روش هایی برای افزودن نقاط کلیدی به یک تصویر مشخص، پس از پیش بینی آنها.
ما می توانیم مدل را از فایل وزن با torch.load()
. بیایید یک تابع ایجاد کنیم تا بررسی کنیم که یک GPU در دسترس است، مدل را بارگذاری کنیم، آن را در حالت استنتاج قرار دهیم و در صورت وجود آن را به GPU منتقل کنیم:
def load_model():
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = torch.load('yolov7/yolov7-w6-pose.pt', map_location=device)('model')
model.float().eval()
if torch.cuda.is_available():
model.half().to(device)
return model
model = load_model()
با بارگذاری مدل، اجازه دهید a ایجاد کنیم run_inference()
روشی که رشته ای را می پذیرد که به یک فایل اشاره می کند روی سیستم ما این روش تصویر را با استفاده از OpenCV می خواند (cv2
)، آن را با پد letterbox()
، تبدیل ها را روی آن اعمال کنید و آن را به یک دسته تبدیل کنید (مدل آموزش داده شده است روی و طبق معمول انتظار دسته ها را دارد):
def run_inference(url):
image = cv2.imread(url)
image = letterbox(image, 960, stride=64, auto=True)(0)
image = transforms.ToTensor()(image)
image = image.unsqueeze(0)
output, _ = model(image)
return output, image
در اینجا، تصویر تبدیل شده را برگردانده ایم (زیرا می خواهیم اصل و نمودار را استخراج کنیم روی آن) و خروجی های مدل. این خروجی ها حاوی 45900 پیش بینی نقطه کلیدی هستند که اکثر آنها همپوشانی دارند. ما میخواهیم Non-Max Suppression را برای این پیشبینیهای خام اعمال کنیم، درست مانند پیشبینیهای تشخیص اشیا (که در آن بسیاری از جعبههای مرزی پیشبینی میشوند و سپس با توجه به اطمینان و آستانه IoU، آنها «محل میشوند»). پس از سرکوب، می توانیم هر نقطه کلیدی را رسم کنیم روی تصویر اصلی و نمایش آن:
def visualize_output(output, image):
output = non_max_suppression_kpt(output,
0.25,
0.65,
nc=model.yaml('nc'),
nkpt=model.yaml('nkpt'),
kpt_label=True)
with torch.no_grad():
output = output_to_keypoint(output)
nimg = image(0).permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
for idx in range(output.shape(0)):
plot_skeleton_kpts(nimg, output(idx, 7:).T, 3)
plt.figure(figsize=(12, 12))
plt.axis('off')
plt.imshow(nimg)
plt.show()
در حال حاضر، برای برخی از تصویر ورودی، مانند karate.jpg
در دایرکتوری اصلی می توانیم استنتاج را اجرا کنیم، Non-Max Suppression را انجام دهیم و نتایج را با استفاده از:
output, image = run_inference('../basketball.jpg')
visualize_output(output, image)
این نتیجه در:
یا یکی دیگر:
output, image = run_inference('../karate.jpg')
visualize_output(output, image)
استنباط این تصویر نسبتاً دشوار است! بیشتر بازوی راست تمرین کننده روی سمت راست پنهان است و میتوانیم ببینیم که مدل استنباط میکند که مخفی است و در سمت راست بدن است، بدون اینکه آرنج خم شده باشد و بخشی از بازو در جلو باشد. تمرین کننده روی سمت چپ، که بسیار واضحتر دیده میشود، حتی با یک پای پنهان به درستی استنباط میشود.
در واقع – شخصی که در پشت نشسته است، تقریباً به طور کامل برای دوربین نامرئی است ژست آنها ظاهراً درست تخمین زده شده است روی وضعیت باسن در هنگام نشستن کار عالی روی از طرف شبکه!
نتیجه
در این راهنما – نگاهی کوتاه به YOLOv7 انداختهایم، آخرین پیشرفت در خانواده YOLO، که میسازد. روی در بالای YOLOR، و همچنین قابلیتهای تقسیمبندی نمونه و تشخیص نقطه کلید را فراتر از قابلیتهای استاندارد تشخیص اشیا در اکثر مدلهای مبتنی بر YOLO ارائه میدهد.
سپس نگاهی انداختیم به اینکه چگونه میتوانیم فایلهای وزن منتشر شده را دانلود کنیم، آنها را بارگذاری کنیم تا یک مدل بسازیم و استنتاج تخمین پوز را برای انسان انجام دهیم، که نتایج قابل توجهی به دست آورد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-03 18:48:03