از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تخمین ژست در زمان واقعی از ویدیو در پایتون با YOLOv7
سرفصلهای مطلب
معرفی
تشخیص اشیا میدان بزرگی در بینایی کامپیوتری است و یکی از مهمترین کاربردهای بینایی کامپیوتر در طبیعت است. از آن، تشخیص نقطه کلید (که اغلب برای تخمین پوز استفاده می شود) استخراج شد.
نقاط کلیدی می توانند نقاط مختلفی باشند – قسمت هایی از صورت، اندام های بدن و غیره. تخمین پوز یک مورد خاص برای تشخیص نقطه کلیدی است – که در آن نقاط، بخش هایی از بدن انسان هستند.
تخمین پوس یک استفاده شگفت انگیز، بسیار سرگرم کننده و عملی از بینایی کامپیوتری است. با آن، میتوانیم سختافزاری را که برای تخمین ژستها استفاده میشود (لباسهای موشن کپچر)، که پرهزینه و سختگیر هستند، حذف کنیم. علاوه بر این، ما میتوانیم حرکت انسانها را با حرکت روباتها در فضای اقلیدسی ترسیم کنیم، و حرکت موتور دقیق را بدون استفاده از کنترلکنندهها امکانپذیر میکنیم، که معمولاً اجازه سطوح بالاتری از دقت را نمیدهند. تخمین نقطه کلید را می توان برای ترجمه حرکات ما به مدل های سه بعدی در واقعیت افزوده و واقعیت مجازی استفاده کرد و به طور فزاینده ای برای انجام این کار فقط با وب کم استفاده می شود. در نهایت – تخمین پوز می تواند در ورزش و امنیت به ما کمک کند.
در این راهنما، با استفاده از مدل پیشرفته YOLOv7، تخمین ژست زمان واقعی را از یک ویدیو در پایتون انجام خواهیم داد.
به طور خاص، ما با ویدیویی از بازی های المپیک زمستانی 2018 که در پیونگ چانگ کره جنوبی برگزار شد کار خواهیم کرد:
آلجونا ساوچنکو و برونو ماسوت عملکرد شگفتانگیزی از جمله همپوشانی بدن در مقابل دوربین، حرکت سریع سیال و چرخش در هوا انجام دادند. این یک فرصت شگفتانگیز خواهد بود تا ببینیم این مدل چگونه موقعیتهای استنتاج دشوار را مدیریت میکند!
YOLO و تخمین پوس
یولو (شما فقط یک بار نگاه می کنید) یک متدولوژی و همچنین خانواده ای از مدل های ساخته شده برای تشخیص اشیا است. از زمان آغاز به کار در سال 2015، YOLOv1، YOLOv2 (YOLO9000) و YOLOv3 توسط همان نویسنده(ها) پیشنهاد شده اند – و جامعه یادگیری عمیق با پیشرفت های منبع باز در سال های ادامه دار ادامه داد.
Ultralytics’ YOLOv5 یک مخزن تشخیص اشیاء درجه صنعتی است که ساخته شده است روی بالای روش YOLO برخلاف C++ برای مدلهای قبلی YOLO، در PyTorch پیادهسازی شده است، کاملاً منبع باز است و دارای یک API بسیار ساده و قدرتمند است که به شما امکان میدهد پروژه را بهطور انعطافپذیر استنباط، آموزش و سفارشیسازی کنید. این یک عنصر اصلی است که بیشتر تلاشهای جدید برای بهبود روش YOLO ایجاد میکنند روی بالای آن
اینگونه است YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که ساخت روی top of YOLOR (همان نویسنده) نیز ایجاد شد!
YOLOv7 فقط یک معماری تشخیص اشیاء نیست – سرهای مدل جدیدی را ارائه می دهد که می توانند نقاط کلیدی (اسکلت ها) را خروجی داده و تقسیم بندی نمونه را علاوه بر رگرسیون جعبه مرزی انجام دهند، که در مدل های قبلی YOLO استاندارد نبود. این تعجب آور نیست، زیرا بسیاری از معماریهای تشخیص اشیاء برای نمونهسازی و وظایف تشخیص نقطه کلید، به دلیل معماری عمومی مشترک، با خروجیهای متفاوت بسته به قبل، مجدداً مورد استفاده قرار گرفتند. روی وظیفه
اگرچه جای تعجب نیست – پشتیبانی از تقسیمبندی نمونه و تشخیص نقطه کلید احتمالاً به استاندارد جدیدی برای مدلهای مبتنی بر YOLO تبدیل میشود، که از چند سال پیش از نظر دقت و سرعت عملاً از همه آشکارسازهای دو مرحلهای دیگر بهتر عمل کردند.
این باعث میشود که قطعهبندی نمونه و تشخیص نقطه کلید با معماری سادهتر از آشکارسازهای دو مرحلهای، سریعتر از همیشه انجام شود.
خود این مدل از طریق تغییرات معماری و همچنین بهینهسازی جنبههای آموزش ایجاد شده است که به آن «bag-of-freebies» میگویند که دقت را بدون افزایش هزینه استنتاج افزایش میدهد.
در حال نصب YOLOv7
بیایید با شبیه سازی مخزن برای دستیابی به کد منبع شروع کنیم:
! git clone https://github.com/WongKinYiu/yolov7.git
حال، بیایید به سمت yolov7
دایرکتوری که شامل پروژه است و به محتویات آن نگاهی بیندازید:
%cd yolov7
!ls
/content/yolov7
cfg figure output.mp4 test.py
data hubconf.py paper tools
deploy inference README.md train_aux.py
detect.py LICENSE.md requirements.txt train.py
export.py models scripts utils
توجه داشته باشید: صدا زدن !cd dirname
شما را به دایرکتوری در آن سلول منتقل می کند. صدا زدن %cd dirname
شما را به یک فهرست در میان سلول های آینده نیز منتقل می کند و شما را در آنجا نگه می دارد.
اکنون، YOLO یک آشکارساز شی است و به طور پیشفرض با وزنهای تخمین پوز ارسال نمیشود. ما می خواهیم وزنه ها را دانلود کنیم و یک نمونه مدل بتن را از آنها بارگیری کنیم. وزنه ها موجود است روی همان مخزن GitHub، و به راحتی از طریق CLI نیز قابل دانلود است:
! 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 23.4M 0 0:00:06 0:00:06 --:--:-- 32.3M
پس از دانلود، ما می توانیم 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
عالی! بگیریم روی با بارگذاری مدل و ایجاد یک اسکریپت که به شما امکان می دهد از ویدیوها با YOLOv7 و OpenCV استنباط کنید.
برآورد ژست در زمان واقعی با YOLOv7
ابتدا روشی برای بارگذاری مدل از وزن های دانلود شده ایجاد می کنیم. ما بررسی خواهیم کرد که چه دستگاهی در دسترس داریم (CPU یا GPU):
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def load_model():
model = torch.load('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()
بسته به روی چه پردازنده گرافیکی داشته باشیم چه نداشته باشیم، نیم دقت خواهیم کرد روی (استفاده کردن float16
بجای float32
در عملیات)، که استنتاج را به طور قابل توجهی سریعتر می کند. توجه داشته باشید که انجام این کار بسیار تشویق می شود روی یک GPU برای سرعتهای بلادرنگ، زیرا پردازندهها احتمالاً قدرت انجام این کار را ندارند مگر اینکه در حال اجرا باشند روی ویدیوهای کوچک
بیایید یک روش مناسب برای اجرای استنتاج بنویسیم. ما تصاویر را بهعنوان آرایههای NumPy میپذیریم (زیرا این همان چیزی است که بعداً هنگام خواندن ویدیو آنها را ارسال خواهیم کرد). ابتدا با استفاده از letterbox()
تابع – اندازه ویدیو را تغییر می دهیم و به شکلی اضافه می کنیم که مدل بتواند با آن کار کند. نیازی نیست که این شکل (رزولوشن) ویدیوی به دست آمده باشد و نخواهد بود!
سپس، تبدیلها را اعمال میکنیم، تصویر را به نیمه دقت تبدیل میکنیم (اگر یک GPU در دسترس باشد)، آن را دستهبندی میکنیم و آن را در مدل اجرا میکنیم:
def run_inference(image):
image = letterbox(image, 960, stride=64, auto=True)(0)
image = transforms.ToTensor()(image)
if torch.cuda.is_available():
image = image.half().to(device)
image = image.unsqueeze(0)
with torch.no_grad():
output, _ = model(image)
return output, image
پیشبینیهای مدل و همچنین تصویر را بهعنوان تانسور برمیگردانیم. اینها پیشبینیهای «تخت» هستند – آنها حاوی فعالسازیهای زیادی هستند که همپوشانی دارند، و ما میخواهیم آنها را با استفاده از Non-Max Suppression «پاکسازی کنیم» و اسکلتهای پیشبینیشده را روی خود تصویر رسم کنیم:
def draw_keypoints(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)
return nimg
با قرار دادن این موارد، جریان کلی ما به این صورت خواهد بود:
img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)
برای ترجمه آن به تنظیمات ویدیوی بلادرنگ – از OpenCV برای خواندن یک ویدیو استفاده می کنیم و این را اجرا می کنیم process برای هر فریم در هر فریم، ما همچنین فریم را در یک فایل جدید که به صورت ویدیو کدگذاری شده است، می نویسیم. این لزوما سرعت را کاهش می دهد process همانطور که ما استنتاج را اجرا می کنیم، آن را نمایش می دهیم و می نویسیم – بنابراین می توانید با اجتناب از ایجاد یک فایل جدید و نوشتن روی آن در حلقه، استنتاج و نمایش را سرعت بخشید:
def pose_estimation_video(filename):
cap = cv2.VideoCapture(filename)
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
while cap.isOpened():
(ret, frame) = cap.read()
if ret == True:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
output, frame = run_inference(frame)
frame = draw_keypoints(output, frame)
frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
out.write(frame)
cv2.imshow('Pose estimation', frame)
else:
break
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
این VideoWriter
چندین پارامتر را می پذیرد – نام فایل خروجی، FourCC (چهار کد کدک، نشان دهنده کدک مورد استفاده برای رمزگذاری ویدیو)، نرخ فریم و وضوح به صورت یک تایی. برای حدس زدن یا تغییر اندازه ویدیو – از عرض و ارتفاع ویدیوی اصلی استفاده کرده ایم که از طریق VideoCapture
نمونهای که حاوی دادههایی درباره خود ویدیو است، مانند عرض، ارتفاع، تعداد کل فریمها و غیره.
اکنون می توانیم متد را فراخوانی کنیم روی هر ویدیوی ورودی:
pose_estimation_video('../ice_skating.mp4')
با این کار یک پنجره OpenCV باز می شود و استنتاج را در زمان واقعی نمایش می دهد. و همچنین، یک فایل ویدئویی در آن می نویسد yolov7
دایرکتوری (از آنجایی که ما cd
وارد آن شدم):
توجه داشته باشید: اگر GPU شما مشکل دارد، یا اگر میخواهید نتایج مدلی مانند این را در برنامهای جاسازی کنید که دارای تأخیر بهعنوان جنبه حیاتی گردش کار است – ویدیو را کوچکتر کنید و کار کنید. روی فریم های کوچکتر این یک ویدیوی Full HD 1920×1080 است و باید بتواند سریع اجرا شود روی اکثر سیستم های خانگی، اما اگر به خوبی کار نکند روی سیستم شما، تصویر(ها) را کوچکتر کنید.
نتیجه
در این راهنما، نگاهی به روش YOLO، YOLOv7 و رابطه بین YOLO و تشخیص شی، تخمین پوز و تقسیمبندی نمونه انداختهایم. سپس نگاهی به روش نصب و کار با YOLOv7 با استفاده از API برنامهریزی کردهایم و چندین روش راحت را برای استنتاج و نمایش نتایج آسانتر ایجاد کردهایم.
در نهایت، ما یک ویدیو را با استفاده از OpenCV باز کردهایم، استنباط را با YOLOv7 اجرا کردهایم، و تابعی برای انجام تخمین پوز در زمان واقعی ایجاد کردهایم، ویدیوی حاصل را با وضوح کامل و 30 فریم در ثانیه ذخیره میکنیم. روی دیسک محلی شما
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-03 03:43:04