面部跟踪:通过计算连续帧之间的IOU(Intersection over Union)来跟踪面部,确保检测到的面部在多个连续帧中保持一致。
def bb_intersection_over_union(boxA, boxB):
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[2], boxB[2])
yB = min(boxA[3], boxB[3])
interArea = max(0, xB - xA) * max(0, yB - yA)
boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])
iou = interArea / float(boxAArea + boxBArea - interArea)
return iou
def track_shot(opt, scenefaces):
iouThres = 0.5
numFail = 3
minSize = 0.05
tracks = []
while True:
track = []
for faces in scenefaces:
for face in faces:
if track == []:
track.append(face)
faces.remove(face)
elif face[0] - track[-1][0] <= numFail:
iou = bb_intersection_over_union(face[1], track[-1][1])
if iou > iouThres:
track.append(face)
faces.remove(face)
continue
else:
break
if track == []:
break
elif len(track) > opt.min_track:
framenum = np.array([ f[0] for f in track ])
bboxes = np.array([np.array(f[1]) for f in track])
frame_i = np.arange(framenum[0],framenum[-1]+1)
bboxes_i = []
for ij in range(0,4):
interpfn = interp1d(framenum, bboxes[:,ij])
bboxes_i.append(interpfn(frame_i))
bboxes_i = np.stack(bboxes_i, axis=1)
if np.mean(bboxes_i[:,3]-bboxes_i[:,1]) > minSize:
tracks.append([frame_i,bboxes_i])
return tracks