前言
闲来无事,想来对目标跟踪过程中的目标大小,旋转,缩放等因素对KCF的相关峰的影响进行分析,给工程实践中KCF算法的优化做一些参考。
实验条件设置
输入图像大小:128 X 128
初始目标大小:32 X 32
模板大小:64 X 64
实验采用图像的灰度特征,进行高斯相关计算。
目标尺度变化
目标尺度变化范围 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 |
---|---|---|---|---|---|---|---|---|---|---|---|
响应图最大值 | 0.066848084 | 0.11180894 | 0.23202664 | 0.5710017 | 0.83284974 | 1.0000001 | 0.8825439 | 0.64844704 | 0.35616958 | 0.27528566 | 0.20936146 |
响应图最小值 | -0.04672203 | -0.04553543 | -0.03989693 | -0.029312855 | -0.017185785 | -2.0157451e-05 | -0.012943685 | -0.020009845 | -0.028667688 | -0.032690994 | -0.033392116 |
预测x位置 | 24.0 | 69.5099654559023 | 64.0 | 64.0 | 64.53960919092253 | 64.00000039085732 | 64.36957004422374 | 64.00000103960652 | 64.00001260233093 | 61.29893409448043 | 67.88682475606274 |
预测y位置 | 64.0 | 69.5099614607033 | 64.0 | 64.0 | 64.53960919092253 | 64.0 | 64.37043850242 | 64.0 | 64.00000630122898 | 61.297607455835305 | 60.113167608012546 |
从实验图中可以看出,目标尺度变换对峰值响应的大小以及位置的影响较大,当目标的尺度变化在30%以内(0.7~1.3)之间的时候,从KCF的峰值响应还是能比较准确预测出目标的位置。当目标的尺度变化大于30%时,KCF的响应图中会出现多个峰值,导致目标的位置预测出错。因此KCF建议的目标尺度变化的适应范围为30%。
目标旋转变换
def rotate_image(angle, img_in):
img = np.array(img_in)
h,w,c= img.shape
# 内置函数获取旋转矩阵M,正值表示逆时针旋转,假设左上角是坐标原点
M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1)
# 执行旋转, 任意角度旋转
result = cv2.warpAffine(img, M, (w, h))
return result
def kcf_rotate_test(angle_list,im_w,t_w,im_path,tracker):
img_init = np.zeros((im_w,im_w,3),dtype=np.uint8)
sx_i= (im_w-t_w)/2
sx_i= int(sx_i)
img_init[sx_i:sx_i+t_w,sx_i:sx_i+t_w,:]= np.zeros((t_w,t_w,3),dtype=np.uint8) + 255
tracker.init([sx_i,sx_i,t_w,t_w], img_init)
x_list = []
y_list = []
max_list = []
min_list = []
for angle in angle_list:
img_test = rotate_image(angle,img_init)
tracker.init([sx_i, sx_i, t_w, t_w], img_init)
# plt.imshow(img_test)
# plt.show()
boundingbox, res = tracker.update(img_test)
x_list.append(boundingbox[0] + boundingbox[2] / 2)
y_list.append(boundingbox[1] + boundingbox[3] / 2)
M = np.max(res)
N = np.min(res)
max_list.append(M)
min_list.append(N)
res = (res - N) / (M - N) * 255
res = res.astype(int)
cv2.imwrite(im_path + str(angle) + '.png', res)
return x_list, y_list, max_list, min_list
目标角度变化范围 | 0 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 |
---|---|---|---|---|---|---|---|---|---|---|
响应图最大值 | 1.0000001 | 0.98029983 | 0.91365874 | 0.8333846 | 0.7561013 | 0.69219345 | 0.6405884 | 0.6041597 | 0.58341753 | 0.57602036 |
响应图最小值 | -2.0157451e-05 | -0.008251084 | -0.016885508 | -0.022890527 | -0.025615571 | -0.025575582 | -0.024337143 | -0.025989398 | -0.027248029 | -0.027552575 |
预测x位置 | 64.00000039085732 | 63.9629294060215 | 63.92491617331168 | 63.89541218112316 | 63.87061873104602 | 63.85624284747516 | 63.838823813312814 | 63.82587914998713 | 63.82379345860332 | 63.86116787894965 |
预测y位置 | 64.0 | 64.0406446092413 | 64.08090664441639 | 64.12221971816513 | 64.16585490665521 | 64.21332704864378 | 64.25915503921463 | 64.30749268138672 | 64.35825579554381 | 64.40825158684362 |
从实验数据看,KCF算法对目标旋转的适应性较好。由于本实验采用的是对称的方块目标作为测试,目标的旋转范围设定为0~45°。在目标旋转变化的过程中,相关相应图中的相关峰值有较大程度的降低,但与尺度变换带来的相关峰值的降低相比,要小得多。从相关图的形状中也可以看出,相关图的形状变化较小,说明KCF算法对目标旋转的适应性较强。这个特性推测与KCF采用的循环核原理相关。
参考博客
python plt.plot的用法:
Python OpenCV getRotationMatrix2D()实例讲解
后记
本文只是一些粗浅的分析,实际上我们在使用的过程中,还遇到过一些工程问题,希望能在以后的时间里进行归纳和总结。