?? 導語
3D目標檢測是根據(jù)物體的形狀、位置和方向來識別和定位物體的任務(wù)。在2D目標檢測中,被檢測到的物體僅表示為矩形邊界框。3D目標檢測任務(wù)通過預測物體周圍的包圍框,可以獲取物體的三維位置信息。
3D目標檢測在各行各業(yè)都有廣泛的應(yīng)用。一些常見的用途包括:
?? 機器人技術(shù)
?? 自動駕駛車輛
?? 醫(yī)學影像
MediaPipe Objectron是由Google的MediaPipe團隊開發(fā)的計算機視覺流水線,可以使用Objectron數(shù)據(jù)集實時實現(xiàn)3D目標檢測和跟蹤。該數(shù)據(jù)集包括自行車、書籍、瓶子、相機、谷物盒、椅子、杯子、筆記本電腦和鞋子等9種物體。
該流水線使用在合成數(shù)據(jù)上訓練的機器學習模型來估計場景中物體的三維包圍框和姿態(tài)。它接收來自相機或視頻流的一系列幀作為輸入,并輸出一系列的3D目標檢測和跟蹤結(jié)果。Objectron利用相機校準、三維物體模型和深度估計等技術(shù)組合,實現(xiàn)了高精度的3D目標檢測。
??MediaPipe實現(xiàn)3D目標檢測跟蹤算法原理
- 數(shù)據(jù)集和模型訓練:數(shù)據(jù)集收集和標注:使用Objectron數(shù)據(jù)集,其中包含了物體的圖像和相應(yīng)的3D邊界框和姿態(tài)標注。模型訓練:使用機器學習模型,如卷積神經(jīng)網(wǎng)絡(luò)(CNN),通過輸入圖像進行訓練,學習預測物體的3D邊界框和姿態(tài)。
- 相機校準:
- 內(nèi)部參數(shù)估計:使用相機標定板等方法,通過觀察2D圖像中已知尺寸的物體,估計相機的內(nèi)部參數(shù),如焦距和主點坐標。
- 外部參數(shù)估計:通過相機標定板的位置和姿態(tài),結(jié)合已知的世界坐標系中的點與其在圖像中的對應(yīng)關(guān)系,估計相機的外部參數(shù),包括相機的位置和姿態(tài)。
- 特征提取和匹配:
- 特征提?。菏褂锰卣魈崛∷惴ǎㄈ鏢IFT、ORB、SURF等),從圖像中提取關(guān)鍵點或特征描述符。
- 特征匹配:通過匹配不同幀之間的特征點或特征描述符,找到相應(yīng)的匹配點對。
- 3D邊界框和姿態(tài)估計:
- 相機投影:通過將2D圖像坐標轉(zhuǎn)換為歸一化設(shè)備坐標,將圖像坐標與相機的內(nèi)部參數(shù)關(guān)聯(lián)起來。
- 三角測量:通過對匹配的特征點或特征描述符進行三角測量,估計物體在3D空間中的位置。
- 姿態(tài)估計:通過對物體的3D點進行旋轉(zhuǎn)和平移操作,將物體的姿態(tài)(旋轉(zhuǎn)角度)估計出來。
- 目標跟蹤:
- 特征匹配:通過在相鄰幀之間匹配特征點或特征描述符,找到物體在不同幀之間的對應(yīng)關(guān)系。
- 運動模型:使用運動模型來預測物體在下一幀中的位置和姿態(tài)。
- 濾波算法:使用濾波算法(如卡爾曼濾波器、擴展卡爾曼濾波器等)來平滑和修正跟蹤結(jié)果。
- 結(jié)果輸出:輸出3D邊界框和姿態(tài)信息:根據(jù)估計的物體位置、尺寸和姿態(tài),生成輸出結(jié)果,包括物體的3D邊界框的中心坐標、寬度、高度以及旋轉(zhuǎn)角度等信息。
??安裝MediaPipe和OpenCV
pip install mediapipe
pip install opencv-contrib-python
下面我將使用MediaPipe在圖像幀中檢測3D物體,并使用OpenCV繪制其周圍的三維邊界框。
?? 使用MediaPipe實現(xiàn)3D目標檢測
import cv2
import mediapipe as mp
import time
mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils
首先,我們需要導入Objectron解決方案和繪圖工具,以便檢測和繪制物體的3D邊界框。
cap = cv2.VideoCapture(0)
然后,我們可以打開視頻捕獲設(shè)備。這將打開計算機上的網(wǎng)絡(luò)攝像頭,并將攝像頭捕獲的視頻存儲在cap變量中。
objectron = mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.5,
min_tracking_confidence=0.7,
model_name='Cup')
通過Objectron方法,我們可以對3D目標檢測算法進行不同的配置。
- static_image_mode: 基于我們將使用圖像或視頻進行3D檢測(對于圖像為True,對于視頻為False)
- max_num_objects: 定義我們想要在其周圍繪制邊界框的最大可識別對象數(shù)。
- min_detection_confidence: 檢測給定類別所需的閾值。
- min_tracking_confidence: 在跟蹤物體時避免誤報的閾值
- model_name: 定義我們將在3D目標檢測模型中使用哪個類別,可以是’Cup’、‘Shoe’、‘Camera’或’Chair’。
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),這會稍微提高性能。
然后,我們可以檢查圖像幀中是否存在任何檢測結(jié)果。如果有,我們可以繪制2D邊界框的標記點,并通過添加附加軸來獲取3D邊界框。通過旋轉(zhuǎn),我們可以得到物體在圖像幀中的旋轉(zhuǎn)情況,然后我們還將指定物體在圖像幀中的平移情況。
在結(jié)果中,我們可以獲得3D物體檢測結(jié)果。當我們打印它時,我們可以得到帶有x、y、z軸的標記點,這些是檢測到的物體的中心點,我們還可以以數(shù)組的形式獲得檢測到的物體的旋轉(zhuǎn)、平移和縮放情況。
Results:
??當我們將3D邊界框與2D邊界框進行比較時,存在額外的參數(shù)。?? 2D目標檢測:
- 邊界框中心的X坐標
- 邊界框中心的Y坐標
- 邊界框的寬度
- 邊界框的高度
?? 3D目標檢測:
- 邊界框中心的X坐標
- 邊界框中心的Y坐標
- 邊界框中心的Z坐標
- 邊界框的寬度
- 邊界框的高度
- 邊界框的長度
- Roll角度表示繞X軸的旋轉(zhuǎn)
- Pitch角度表示繞Y軸的旋轉(zhuǎn)
- Yaw角度表示繞Z軸的旋轉(zhuǎn)
??Mediapipe實現(xiàn)自動駕駛功能
我使用了Mediapipe編寫了一個小功能,與自動駕駛相關(guān)。該功能以第三人稱視角為基礎(chǔ)(類似于極品飛車游戲),通過分析車輛與行人之間的距離,來判斷是否可能發(fā)生碰撞,并相應(yīng)地引導汽車進行停車或轉(zhuǎn)向的動作。
文章來源:http://www.zghlxwxcb.cn/news/detail-484177.html
import cv2
import mediapipe as mp
import time
mp_objectron = mp.solutions.objectron
mp_holistic = mp.solutions.holistic
mp_drawing = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
objectron = mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.5,
min_tracking_confidence=0.7,
model_name='Car')
holistic = mp_holistic.Holistic(static_image_mode=False,
model_complexity=2,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
# 車輛狀態(tài)類
class CarState:
def __init__(self):
self.position = None
self.rotation = None
# 行人狀態(tài)類
class PedestrianState:
def __init__(self, position):
self.position = position
# 避障系統(tǒng)類
class ObstacleAvoidanceSystem:
def __init__(self):
self.car_state = CarState()
self.pedestrians = []
def update_car_state(self, car_position, car_rotation):
self.car_state.position = car_position
self.car_state.rotation = car_rotation
def update_pedestrians(self, pedestrian_positions):
self.pedestrians = []
for position in pedestrian_positions:
pedestrian = PedestrianState(position)
self.pedestrians.append(pedestrian)
def check_collision(self):
if self.car_state.position is not None:
for pedestrian in self.pedestrians:
# 在這里實現(xiàn)碰撞檢測邏輯
# 根據(jù)車輛和行人的位置進行碰撞檢測
if pedestrian.position is not None:
distance = calculate_distance(self.car_state.position, pedestrian.position)
if distance < 2.0: # 示例:定義碰撞距離為2米
return True
return False
# 輔助函數(shù):計算兩個點之間的距離
def calculate_distance(point1, point2):
x1, y1, z1 = point1
x2, y2, z2 = point2
distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2) ** 0.5
return distance
# 自動駕駛系統(tǒng)類
class AutonomousDrivingSystem:
def __init__(self):
self.obstacle_avoidance_system = ObstacleAvoidanceSystem()
def process_frame(self, frame):
frame.flags.writeable = False
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 對車輛進行檢測和姿態(tài)估計
objectron_results = objectron.process(frame)
car_position = None
car_rotation = None
if objectron_results.detected_objects:
for detected_object in objectron_results.detected_objects:
car_position = detected_object.translation
car_rotation = detected_object.rotation
mp_drawing.draw_landmarks(frame,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(frame,
detected_object.rotation,
detected_object.translation)
# 對行人進行檢測和姿態(tài)估計
holistic_results = holistic.process(frame)
pedestrian_positions = []
if holistic_results.pose_landmarks:
for landmark in holistic_results.pose_landmarks.landmark:
pedestrian_positions.append((landmark.x, landmark.y, landmark.z))
mp_drawing.draw_landmarks(frame,
holistic_results.pose_landmarks,
mp_holistic.POSE_CONNECTIONS)
# 更新避障系統(tǒng)的車輛狀態(tài)和行人狀態(tài)
self.obstacle_avoidance_system.update_car_state(car_position, car_rotation)
self.obstacle_avoidance_system.update_pedestrians(pedestrian_positions)
# 檢測碰撞
if self.obstacle_avoidance_system.check_collision():
# 在這里實現(xiàn)避免碰撞的控制邏輯
# 示例:停車和避讓行人
control_command = ControlCommand(0.0, 0.0) # 停車
else:
# 在這里實現(xiàn)正常行駛的控制邏輯
# 示例:設(shè)定一定的車速和轉(zhuǎn)向角度
control_command = ControlCommand(0.5, 0.0)
# 在圖像上顯示控制指令
cv2.putText(frame, f"Speed: {control_command.speed} m/s", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.putText(frame, f"Steering Angle: {control_command.steering_angle} deg", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
frame.flags.writeable = True
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
return frame
#主函數(shù)控制器
class MainController:
def init(self):
self.autonomous_driving_system = AutonomousDrivingSystem()
def run(self):
while cap.isOpened():
success, frame = cap.read()
if not success:
break
frame = self.autonomous_driving_system.process_frame(frame)
cv2.imshow('MediaPipe Objectron', cv2.flip(frame, 1))
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#主函數(shù)
if name == 'main':
main_controller = MainController()
main_controller.run()
這段代碼是一個基于媒體管道(MediaPipe)的自動駕駛系統(tǒng)的簡單實現(xiàn)。以下是代碼的詳細思路:文章來源地址http://www.zghlxwxcb.cn/news/detail-484177.html
- 導入所需的庫,包括cv2、mediapipe和time。
- 初始化MediaPipe的對象:Objectron和Holistic,用于檢測和跟蹤車輛和行人。
- 定義了三個類:CarState、PedestrianState和ObstacleAvoidanceSystem,分別表示車輛狀態(tài)、行人狀態(tài)和避障系統(tǒng)。
- ObstacleAvoidanceSystem類包含了更新車輛狀態(tài)和行人狀態(tài)的方法,以及碰撞檢測的方法。
- 輔助函數(shù)calculate_distance用于計算兩個點之間的距離。
- AutonomousDrivingSystem類是自動駕駛系統(tǒng)的主要類,包含了處理每幀圖像的方法。
- process_frame方法中,首先將幀轉(zhuǎn)換為RGB顏色空間,并通過Objectron檢測和估計車輛的位置和旋轉(zhuǎn)。
- 然后通過Holistic檢測和估計行人的位置。
- 更新避障系統(tǒng)的車輛狀態(tài)和行人狀態(tài)。
- 進行碰撞檢測,如果發(fā)生碰撞,執(zhí)行停車和避讓行人的控制邏輯;如果沒有碰撞,執(zhí)行正常行駛的控制邏輯。
- 在圖像上顯示控制指令,包括車速和轉(zhuǎn)向角度。
- 最后,將處理后的幀顯示在窗口中,直到按下鍵盤上的"q"鍵退出。
- 主函數(shù)MainController初始化自動駕駛系統(tǒng),并運行主循環(huán)。
到了這里,關(guān)于Mediapipe實時3D目標檢測和跟蹤(自動駕駛實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!