云台跟踪精准是指机器人视觉领域中一项重要的技术,即让机器人通过视觉传感器检测目标人物并锁定追踪目标。在机器人的功能有限的情况下,使用云台跟踪技术可以让机器人实现更加智能化的行为。本文将从目标检测、跟踪算法、云台控制三个方面进行详细介绍。
一、目标检测
目标检测是云台跟踪技术的前置技术,其核心是通过计算机视觉算法在图像或视频中自动检测目标,并将其位置信息传输给云台系统,从而完成云台跟踪的前期准备。目前比较流行的目标检测算法包括 Faster R-CNN、YOLO、SSD 等。其中,YOLO 是一种较为经典的目标检测算法,其核心是将图像分为若干个网格,对每个网格同时进行目标检测,从而加快了检测速度。
import cv2
import numpy as np
def detect(image):
net = cv2.dnn.readNet("yolo.weights", "yolo.cfg")
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(0, 255, size=(len(classes), 3))
img = cv2.resize(image, None, fx=0.4, fy=0.4)
height, width, channels = img.shape
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
class_ids = []
confidences = []
boxes = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = center_x - w / 2
y = center_y - h / 2
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
font = cv2.FONT_HERSHEY_PLAIN
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
color = colors[class_ids[i]]
cv2.rectangle(img, (int(x), int(y)), (int(x + w), int(y + h)), color, 2)
cv2.putText(img, label, (int(x), int(y + 30)), font, 3, color, 3)
return img, boxes
二、跟踪算法
目标跟踪是指在运动目标被检测出来后,跟踪算法不断将其位置信息更新,从而实现跟踪。跟踪算法可以分为传统的基于特征的跟踪算法和基于深度学习的跟踪算法。在处理速度上基于特征的跟踪算法具有更大的优势,其中比较经典的算法有 Boosting、KCF(Kernel Correlation Filter)等。而基于深度学习的跟踪算法则是在计算机视觉领域近年来的热点探究,其中比较经典的是用卷积神经网络(CNN)来分别实现目标的分类和位置回归。最终得到的关于目标每个时刻的位置状态信息,可以用于调整云台实现精准跟踪。
import cv2
tracker = cv2.TrackerKCF_create()
def init_tracker(img, bbox):
tracker.init(img, bbox)
def track(img):
ok, bbox = tracker.update(img)
if ok:
# Tracking success
p1 = (int(bbox[0]), int(bbox[1]))
p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
cv2.rectangle(img, p1, p2, (255, 0, 0), 2, 1)
else:
# Tracking failure
cv2.putText(img, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)
return img, bbox
三、云台控制
云台控制是指将跟踪算法得到的目标位置信息传输给云台系统,并根据位置信息实现云台的精准控制。常见的云台控制方式有两种,一种是利用云台上的步进电机完成控制,另一种是利用舵机控制云台。后者方式控制更加精准,控制效果也会更好。利用舵机控制云台主要有两种思路。一种是关键点法,即将目标人物的关键点(比如脸部轮廓、眼睛等)与预设的关键点进行匹配,并将匹配的结果作为舵机的旋转量。另外一种是深度学习法,这种方法的核心是让机器学习到目标人物的特征,并根据特征通过深度学习模型计算出正确的舵机控制量。利用云台控制算法与目标跟踪算法相结合,可以实现较为高精度的舵机控制,从而完成机器人的追踪任务。
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
def control_servo(bbox):
center_x = bbox[0] + bbox[2] / 2
center_y = bbox[1] + bbox[3] / 2
delta_x = (center_x - 320) / 640
delta_y = (center_y - 240) / 480
pan = int(delta_x * 60)
tilt = int(delta_y * 60)
ser.write(bytes([pan, tilt]))