معرفی
تشخیص اشیا در حال افزایش است و چندین رویکرد برای حل آن بهبود یافته است. در چند سال گذشته، روشهای مبتنی بر YOLO با پیشرفتهای اخیر مانند YOLOv7 و YOLOv6 (که به طور مستقل پس از YOLOv7 منتشر شد) از نظر دقت و سرعت بهتر از سایرین عمل کردهاند.
با این حال - همه اینها نگران کننده هستند تشخیص اشیاء دو بعدی، که به خودی خود کار دشواری است. اخیراً توانستیم با موفقیت اجرا کنیم تشخیص اشیاء دو بعدیو در حالی که این آشکارسازها هنوز در مرحله ناپایدارتری نسبت به آشکارسازهای شی دو بعدی هستند، دقت آنها در حال افزایش است.
در این راهنما، ما تشخیص اشیاء سه بعدی را در پایتون با Objectron MediaPipe انجام خواهیم داد.
توجه داشته باشید: MediaPipe چارچوب متن باز گوگل برای ساخت خطوط لوله یادگیری ماشینی برای پردازش تصاویر، ویدئوها و جریان های صوتی، عمدتا برای دستگاه های تلفن همراه است. هم به صورت داخلی و هم خارجی استفاده می شود و مدل های از پیش آموزش دیده ای را برای کارهای مختلف از جمله تشخیص چهره، مش بندی چهره، تخمین دست و پوز، تقسیم بندی مو، تشخیص اشیا، ردیابی جعبه و غیره ارائه می دهد.
همه اینها میتوانند و برای کارهای پاییندستی استفاده میشوند - مانند اعمال فیلترها بر روی چهرهها، فوکوس خودکار دوربین، تأیید بیومتریک، روباتیک کنترلشده با دست، و غیره. بیشتر پروژهها با API برای Android، iOS، C++، Python و JavaScript در دسترس هستند. برخی فقط برای زبان های خاصی در دسترس هستند.
در این راهنما، ما با آن کار خواهیم کرد Objectron MediaPipe، برای اندروید، سی پلاس پلاس، پایتون و جاوا اسکریپت موجود است.
MediaPipe و 3D Object Detection
La Objectron راه حل در مورد آموزش داده شد مجموعه داده Objectron، که حاوی ویدیوهای شی محور کوتاه است. مجموعه داده فقط شامل 9 شیء است: دوچرخه، کتاب، بطری، دوربین، جعبه غلات، صندلی، فنجان، لپتاپ و کفش، بنابراین یک مجموعه داده خیلی کلی نیست، اما پردازش و تهیه این ویدیوها نسبتاً گران است (ژستهای دوربین، پراکنده نقطه-ابرها، خصوصیات سطوح مسطح، و غیره برای هر فریم از هر ویدیو)، مجموعه داده را نزدیک به 2 ترابایت اندازه می کند.
مدل Objectron آموزش دیده (معروف به a راه حل برای پروژه های MediaPipe) در چهار دسته - کفش، صندلی، لیوان و دوربین آموزش داده شده است.
تشخیص اشیاء دوبعدی از اصطلاح "جعبه های محدود" استفاده می کند، در حالی که آنها در واقع مستطیل هستند. تشخیص اشیاء سه بعدی در واقع پیش بینی می کند جعبه در اطراف اشیاء، که می توانید جهت گیری، اندازه، حجم ناهموار و غیره آنها را استنباط کنید. این کار نسبتاً دشواری است، به ویژه با توجه به نبود مجموعه داده های مناسب و هزینه ایجاد آنها. اگرچه مشکل است، اما این مشکل برای افراد مختلف نوید می دهد واقعیت افزوده (AR) برنامه های کاربردی!
راه حل Objectron می تواند در حالت یک مرحله ای یا دو مرحله ای اجرا شود - که در آن حالت یک مرحله ای در تشخیص چندین شی بهتر است، در حالی که حالت دو مرحله ای در تشخیص یک شی اصلی واحد در صحنه بهتر است و به طور قابل توجهی اجرا می شود. سریعتر خط لوله تک مرحله ای از ستون فقرات MobileNetV2 استفاده می کند، در حالی که خط لوله دو مرحله ای از TensorFlow Object Detection API استفاده می کند.
هنگامی که یک شی در یک ویدیو شناسایی می شود، به دو دلیل پیش بینی های بیشتری برای آن در هر فریم انجام نمی شود:
- پیشبینیهای پیوسته، بیقراری بالا را ایجاد میکنند (به دلیل تصادفی بودن ذاتی در پیشبینیها)
- اجرای مدل های بزرگ روی هر فریم گران است
این تیم پیشبینیهای سنگین را برای اولین بار فقط برای برخورد بارگذاری میکند و سپس آن جعبه را تا زمانی که جسم مورد نظر هنوز در صحنه است، ردیابی میکند. هنگامی که خط دید شکسته شد و شی دوباره معرفی شد، یک پیش بینی دوباره انجام می شود. این امکان استفاده از مدل های بزرگتر را با دقت بالاتر و در عین حال پایین نگه داشتن نیازهای محاسباتی و کاهش نیازهای سخت افزاری برای استنتاج بلادرنگ را ممکن می سازد!
بیایید پیش برویم و MediaPipe را نصب کنیم، راه حل Objectron را وارد کنیم و آن را روی تصاویر ثابت و فید ویدیویی که مستقیماً از دوربین میآید اعمال کنیم.
نصب MediaPipe
بیایید ابتدا MediaPipe را نصب کنیم و یک روش کمکی برای واکشی تصاویر از یک URL داده شده آماده کنیم:
! pip install mediapipe
با نصب چارچوب، اجازه دهید آن را در کنار کتابخانه های رایج وارد کنیم:
import mediapipe as mp
import cv2
import numpy as np
import matplotlib.pyplot as plt
بیایید یک روش کمکی برای واکشی تصاویری که یک URL داده شده و یک آرایه RGB را نشان دهنده آن تصویر برمی گرداند، تعریف کنیم:
import PIL
import urllib
def url_to_array(url):
req = urllib.request.urlopen(url)
arr = np.array(bytearray(req.read()), dtype=np.int8)
arr = cv2.imdecode(arr, -1)
arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
return arr
mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)
در نهایت، ما می خواهیم هم راه حل Objectron و هم ابزارهای طراحی را برای تجسم پیش بینی ها وارد کنیم:
mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils
تشخیص اشیاء سه بعدی در تصاویر استاتیک با MediaPipe
La Objectron
کلاس به چندین آرگومان اجازه می دهد، از جمله:
static_image_mode
: چه در یک تصویر یا جریانی از تصاویر تغذیه می کنید (ویدئو)max_num_objects
: حداکثر تعداد قابل شناسایی اشیاءmin_detection_confidence
: آستانه اطمینان تشخیص (چقدر شبکه باید مطمئن باشد تا یک شی برای کلاس داده شده طبقه بندی شود)model_name
: کدام مدل را می خواهید در بین آن بارگذاری کنید'Cup'
,'Shoe'
,'Camera'
و'Chair'
.
با در نظر گرفتن آنها - بیایید یک نمونه Objectron و process()
تصویر ورودی:
objectron = mp_objectron.Objectron(
static_image_mode=True,
max_num_objects=5,
min_detection_confidence=0.2,
model_name='Cup')
results = objectron.process(mug)
La results
شامل نشانه های دوبعدی و سه بعدی شی(های) شناسایی شده و همچنین چرخش، ترجمه و مقیاس برای هر کدام است. ما میتوانیم نتایج را پردازش کرده و با استفاده از ابزارهای ترسیمی ارائه شده، جعبههای مرزبندی را به راحتی ترسیم کنیم:
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
if not results.detected_objects:
print(f'No box landmarks detected.')
annotated_image = mug.copy()
for detected_object in results.detected_objects:
mp_drawing.draw_landmarks(annotated_image,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(annotated_image,
detected_object.rotation,
detected_object.translation)
fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()
این نتیجه در:
تشخیص اشیاء سه بعدی از ویدئو یا وب کم با MediaPipe
یک برنامه هیجان انگیز تر روی فیلم ها است! برای قرار دادن ویدیوها، چه از وب کم یا یک فایل ویدیویی موجود، نیازی به تغییر کد زیادی ندارید. OpenCV یک تناسب طبیعی برای خواندن، دستکاری و تغذیه فریم های ویدئویی به مدل Objectron است:
cap = cv2.VideoCapture(0)
objectron = mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.4,
min_tracking_confidence=0.70,
model_name='Cup')
while cap.isOpened():
success, image = cap.read()
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = objectron.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detected_objects:
for detected_object in results.detected_objects:
mp_drawing.draw_landmarks(image,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(image,
detected_object.rotation,
detected_object.translation)
cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
غیرقابل نوشتن تصویر با image.flags.writeable = False
باعث می شود فرآیند تا حدودی سریعتر اجرا شود و یک تغییر اختیاری است. آخرین cv2.flip()
در تصویر حاصل نیز اختیاری است - و به سادگی خروجی را آینه ای می کند تا کمی بصری تر شود.
هنگامی که روی یک دوربین و یک لیوان معمولی جهانی Ikea اجرا میشود، نتایج زیر است:
خروجی کمی لرزان است، اما ترجمه چرخشی را به خوبی انجام می دهد، حتی با دست لرزان دوربین با وضوح پایین. وقتی یک شی از کادر خارج می شود چه اتفاقی می افتد؟
پیشبینیها برای شی در اولین تشخیص متوقف میشوند و ردیابی جعبه به وضوح متوجه میشود که جسم از کادر خارج شده است و به محض اینکه جسم دوباره وارد کادر شد، یک بار دیگر پیشبینی و ردیابی را انجام میدهد. به نظر می رسد که ردیابی زمانی که مدل بتواند آن را ببیند تا حدودی بهتر عمل می کند دسته لیوان، زیرا هنگامی که دسته قابل مشاهده نیست، خروجی ها لرزش بیشتری دارند (احتمالاً به این دلیل که تشخیص دقیق جهت گیری واقعی لیوان دشوارتر است).
علاوه بر این، به نظر می رسد برخی از زوایا در شرایط نوری چالش برانگیز خروجی های پایدارتری نسبت به سایرین تولید می کنند. مخصوصاً برای لیوانها، به جای دیدن برآمدگی متعامد جسم، به دیدن لبه لیوان کمک میکند.
بهعلاوه، وقتی روی یک لیوان شفاف آزمایش شد، این مدل در تشخیص آن بهعنوان یک لیوان مشکل داشت. این احتمالاً نمونه ای از یک است خارج از توزیع چون اکثر لیوان ها مات هستند و رنگ های متنوعی دارند.
نتیجه
تشخیص اشیاء سه بعدی هنوز تا حدودی جوان است و Objectron MediaPipe یک نمایش توانمند است! در حالی که نسبت به شرایط نوری، انواع اشیاء (شفاف در مقابل لیوانهای مات و غیره) و کمی لرزان حساس است - Objectron یک نگاه اجمالی به آنچه که به زودی با دقت و دسترسی بالاتر از همیشه امکانپذیر خواهد بود، است.