当前位置: 首页 > news >正文

用商标做网站名字珍珠设计制作培训

用商标做网站名字,珍珠设计制作培训,重庆十大装饰公司排名,wordpress时间邀请码在这里我们主要实现了一个多目标跟踪器#xff0c;管理多个卡尔曼滤波器对象#xff0c;主要包括以下内容#xff1a; 初始化#xff1a;最大检测数#xff0c;目标未被检测的最大帧数 目标跟踪结果的更新#xff0c;即跟踪成功和失败的目标的更新 初始化 def __init_… 在这里我们主要实现了一个多目标跟踪器管理多个卡尔曼滤波器对象主要包括以下内容 初始化最大检测数目标未被检测的最大帧数 目标跟踪结果的更新即跟踪成功和失败的目标的更新 初始化 def __init__(self, max_age1, min_hits3):初始化设置SORT算法的关键参数 # 最大检测数目标未被检测到的帧数超过之后会被删 self.max_age max_age# 目标命中的最小次数小于该次数不返回self.min_hits min_hits # 卡尔曼跟踪器self.trackers [] # 帧计数self.frame_count 0 1、目标跟踪结果的更新: 该方法实现了SORT算法输入是当前帧中所有物体的检测框的集合包括目标的score输出是当前帧标的跟踪框集合包括目标的跟踪的id要求是即使检测框为空也必须对每一帧调用此方法返回一个类似的输出数组最后一列是目标对像的id。需要注意的是返回的目标对象数量可能与检测框的数量不同. def update(self, dets):self.frame_count 1# 在当前帧逐个预测轨迹位置记录状态异常的跟踪器索引# 根据当前所有的卡尔曼跟踪器个数即上一帧中跟踪的目标个数创建二维数组行号为卡尔曼滤波器的标识索引列向量为跟踪框的位置和IDtrks np.zeros((len(self.trackers), 5)) # 存储跟踪器的预测to_del [] # 存储要删除的目标框ret [] # 存储要返回的追踪目标框# 循环遍历卡尔曼跟踪器列表for t, trk in enumerate(trks):# 使用卡尔曼跟踪器t产生对应目标的跟踪框pos self.trackers[t].predict()[0]# 遍历完成后trk中存储了上一帧中跟踪的目标的预测跟踪框trk[:] [pos[0], pos[1], pos[2], pos[3], 0]# 如果跟踪框中包含空值则将该跟踪框添加到要删除的列表中if np.any(np.isnan(pos)):to_del.append(t)# numpy.ma.masked_invalid 屏蔽出现无效值的数组NaN 或 inf# numpy.ma.compress_rows 压缩包含掩码值的2-D 数组的整行将包含掩码值的整行去除# trks中存储了上一帧中跟踪的目标并且在当前帧中的预测跟踪框trks np.ma.compress_rows(np.ma.masked_invalid(trks))# 逆向删除异常的跟踪器防止破坏索引for t in reversed(to_del):self.trackers.pop(t)# 将目标检测框与卡尔曼滤波器预测的跟踪框关联获取跟踪成功的目标新增的目标离开画面的目标matched, unmatched_dets, unmatched_trks associate_detections_to_trackers(dets, trks)# 将跟踪成功的目标框更新到对应的卡尔曼滤波器for t, trk in enumerate(self.trackers):if t not in unmatched_trks:d matched[np.where(matched[:, 1] t)[0], 0]# 使用观测的边界框更新状态向量trk.update(dets[d, :][0])# 为新增的目标创建新的卡尔曼滤波器对象进行跟踪for i in unmatched_dets:trk KalmanBoxTracker(dets[i, :])self.trackers.append(trk)# 自后向前遍历仅返回在当前帧出现且命中周期大于self.min_hits除非跟踪刚开始的跟踪结果如果未命中时间大于self.max_age则删除跟踪器。# hit_streak忽略目标初始的若干帧i len(self.trackers)for trk in reversed(self.trackers):# 返回当前边界框的估计值d trk.get_state()[0]# 跟踪成功目标的box与id放入ret列表中if (trk.time_since_update 1) and (trk.hit_streak self.min_hits or self.frame_count self.min_hits):ret.append(np.concatenate((d, [trk.id 1])).reshape(1, -1)) # 1 as MOT benchmark requires positivei - 1# 跟踪失败或离开画面的目标从卡尔曼跟踪器中删除if trk.time_since_update self.max_age:self.trackers.pop(i)# 返回当前画面中所有目标的box与id,以二维矩阵形式返回if len(ret) 0:return np.concatenate(ret)return np.empty((0, 5)) 我们将上述两个方法封装在一个类中。 总结 了解sort进行多目标跟踪的实现 功能实现 # 1.SORT目标跟踪 # 1.第一帧刚开始时对第一帧所有的检测框生成对应的新跟踪框。 # 2.第二帧开始到以后所有帧 # 上一帧成功跟踪并且保留下来的的跟踪框 在当前帧中 进行新一轮的预测新的跟踪框 # 并且针对所预测的新跟踪框和当前帧中的检测框进行iou计算和使用匈牙利算法对该两者进行关联匹配 # 通过上述操作后成功返回跟踪目标成功的跟踪框(即和当前帧中的目标检测框相匹配的跟踪框) # 并且另外发现了新出现目标的检测框、跟踪目标失败的跟踪框(即目标离开了画面/两者匹配度IOU值小于iou阈值) # 那么首先使用当前帧中的检测框对“成功关联匹配的跟踪框中的”状态向量进行更新 # 然后对新增目标的检测框生成对应新的跟踪框最后把跟踪目标失败的跟踪框从跟踪器链列表中移除出去。 # 2.传入的检测框dets[检测框的左上角的x/y坐标, 检测框的右下角的x/y坐标, 检测框的预测类别的概率值] # 3.返回值tracks # 当前帧中跟踪目标成功的跟踪框/预测框的集合包含目标的跟踪的id(也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个) # 第一种返回值方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度, trk.id] ...] # 第二种返回值方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, trk.id] ...] # d[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标] # trk.id卡尔曼滤波器的个数/目标框的个数也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个。 #Sort多目标跟踪 管理多个卡尔曼滤波器 class Sort(object):Sort 是一个多目标跟踪器的管理类管理多个 跟踪器链中的多个 KalmanBoxTracker 卡尔曼滤波对象#设置Sort算法的参数def __init__(self,max_age 1,min_hits 3):初始化设置SORT算法的关键参数:param max_age: 最大检测数目标未被检测到的帧数超过之后会被删除:param min_hits: 目标命中的最小次数小于该次数update函数不返回该目标的KalmanBoxTracker卡尔曼滤波对象max_age跟踪框的最大连续跟丢帧数。如果当前跟踪框连续N帧大于最大连续跟丢帧数的话则从跟踪器链中删除该卡尔曼滤波对象的预测框(跟踪框)。min_hits跟踪框连续成功跟踪到目标的最小次数(目标连续命中的最小次数)也即跟踪框至少需要连续min_hits次成功跟踪到目标。trackers卡尔曼滤波跟踪器链存储多个 KalmanBoxTracker 卡尔曼滤波对象frame_count当前视频经过了多少帧的计数# 最大检测数目标未被检测到的帧数超过之后会被删set.max_age max_age# 目标连续命中的最小次数小于该次数update函数不返回该目标的KalmanBoxTracker卡尔曼滤波对象self.min_hitsmin_hits# 卡尔曼滤波跟踪器链存储多个 KalmanBoxTracker 卡尔曼滤波对象self.trackers []#帧计数self.frane_count 0update(dets)输入dets当前帧中yolo所检测出的所有目标的检测框的集合包含每个目标的score以[[x1,y1,x2,y2,score][x1,y1,x2,y2,score]...]形式输入的numpy.arrayx1、y1 代表检测框的左上角坐标x2、y2代表检测框的右上角坐标score代表检测框对应预测类别的概率值。输出ret当前帧中跟踪目标成功的跟踪框/预测框的集合包含目标的跟踪的id(也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个)第一种返回值方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度, trk.id] ...]第二种返回值方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, trk.id] ...]d[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]trk.id卡尔曼滤波器的个数/目标框的个数也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个。注意即使检测框为空也必须对每一帧调用此方法返回一个类似的输出数组最后一列是目标对像的id。返回的目标对象数量可能与检测框的数量不同。#更新数值def update(self,dets):该方法实现了SORT算法输入是当前帧中所有物体的检测框的集合包括目标的score,输出是当前帧目标的跟踪框集合包括目标的跟踪的id要求是即使检测框为空也必须对每一帧调用此方法返回一个类似的输出数组最后一列是目标对像的id注意返回的目标对象数量可能与检测框的数量不同:param dets:以[[x1,y1,x2,y2,score][x1,y1,x2,y2,score]...]形式输入的numpy.array:return: 每经过一帧frame_count1self.frane_count 11.trackers上一帧中的跟踪器链(列表)保存的是上一帧中成功跟踪目标的跟踪框也即上一帧中成功跟踪目标的KalmanBoxTracker卡尔曼滤波对象。2.trks np.zeros((len(trackers), 5))上一帧中的跟踪器链(列表)中的所有跟踪框(卡尔曼滤波对象)在当前帧中成功进行predict预测新跟踪框后返回的值。所有新跟踪框的左上角的x坐标和y坐标、右下角的x坐标和y坐标、置信度 的一共5个值。1.因为一开始第一帧时trackers跟踪器链(列表)仍然为空所以此时的trks初始化如下np.zeros((0, 5)) 输出值array([], shape(0, 5), dtypefloat64)输出值类型class numpy.ndarray2.np.zeros((len(trackers), 5)) 创建目的1.用于存储上一帧中的跟踪器链中所有跟踪框(KalmanBoxTracker卡尔曼滤波对象)在当前帧中进行predict预测新跟踪框后返回的值之所以创建的numpy数组的列数为5是因为一个跟踪框在当前帧中进行predict预测新跟踪框后返回的值为1行5列的矩阵返回值分别为新跟踪框的左上角的x坐标和y坐标、右下角的x坐标和y坐标、置信度 的一共5个值。2.如果是在视频的第一帧中那么因为跟踪器链不存在任何跟踪框(KalmanBoxTracker卡尔曼滤波对象)因此np.zeros((len(trackers), 5))创建的是空列表array([], shape(0, 5), dtypefloat64)。3.trackers跟踪器链(列表)1.跟踪器链中存储了上一帧中成功跟踪目标并且在当前帧中的预测框(跟踪框)同时也存储了“为了当前帧中的检测框中的新增目标所创建的”新预测框(新跟踪框)但是同时不存储当前帧中预测跟踪失败的预测框(跟踪框)同时也不存储2.跟踪器链实际就是多个的卡尔曼滤波KalmanBoxTracker自定义类的实例对象组成的列表。每个目标框都有对应的一个卡尔曼滤波器(KalmanBoxTracker实例对象)KalmanBoxTracker类中的实例属性专门负责记录其对应的一个目标框中各种统计参数并且使用类属性负责记录卡尔曼滤波器的创建个数增加一个目标框就增加一个卡尔曼滤波器(KalmanBoxTracker实例对象)。把每个卡尔曼滤波器(KalmanBoxTracker实例对象)都存储到跟踪器链(列表)中。# 存储跟踪器在当前帧逐个预测轨迹位置记录状态异常的跟踪器索引# 根据当前所有的卡尔曼跟踪器个数即上一帧中跟踪的目标个数创建二维数组行号为卡尔曼滤波器的标识索引列向量为跟踪框的位置和IDtrks np.zeros(len(self.trackers),5)#跟踪器对当前帧的图像预测结果 to_del存储“跟踪器链中某个要删除的”KalmanBoxTracker卡尔曼滤波对象的索引 to_del []#存储要删除的目标框ret []#返回的跟踪目标#遍历卡尔曼滤波器中的跟踪框for t, trk in enumerate(ndarray类型的trks)t为从0到列表长度-1的索引值trkndarray类型的trks中每个(1, 5)形状的一维数组 遍历trks 用于存储上一帧中的跟踪器链中所有跟踪框(KalmanBoxTracker卡尔曼滤波对象)在当前帧中进行predict预测新跟踪框后返回的值 for t,trk in enumerate(trks): 上一帧中的跟踪器链中所有跟踪框(KalmanBoxTracker卡尔曼滤波对象)在当前帧中进行predict预测新跟踪框 #使用卡尔曼跟踪器t产生对应目标的跟踪框即对目标进行预测pos self.trackers[t].predict()[0] 新跟踪框的左上角的x坐标和y坐标、右下角的x坐标和y坐标、置信度 的一共5个值。trk中存储了上一帧中目标的跟踪框在当前帧中新的跟踪框的信息值。# 遍历完成后trk中存储了上一帧中跟踪的目标的预测结果的跟踪框trk[:] [pos[0],pos[1],pos[2],pos[3],0] 如果预测的新的跟踪框的信息(1行5列一共5个值)中包含空值的话则将该跟踪框在跟踪器链(列表)中的索引值t放到to_del列表中。使用np.any(np.isnan(pos))即能判断这1行5列一共5个值是否包含空值。后面下一步将会根据to_del列表中保存的跟踪框的索引值到跟踪器链(列表)中将该跟踪框从其中移除出去。#若预测结果pos中包含空值添加到del中if np.any(np.isnan(pos)):to_del.append(t) np.ma.masked_invalid(跟踪器链trks矩阵)将会对跟踪器链trks矩阵中出现了NaN或inf的某行进行生成掩码用于屏蔽出现无效值该整行的跟踪器框。np.ma.compress_rows(包含掩码值的跟踪器链trks矩阵)将包含掩码值的整行从中进行移除出去。最终跟踪器链trks矩阵只包含“上一帧中的跟踪器链中所有跟踪框在当前帧中成功进行predict预测”的新跟踪框。#trks中去除无效值的行保存根据上一帧结果预测当前帧的内容# numpy.ma.masked_invalid 屏蔽出现无效值的数组NaN 或 inf# numpy.ma.compress_rows 压缩包含掩码值的2-D 数组的整行将包含掩码值的整行去除# trks中存储了上一帧中跟踪的目标并且在当前帧中的预测跟踪框trks np.ma.compress_rows(np.ma.masked_invalid(trks))1.for t in reversed(列表)1.t列表中的元素值2.要想从List列表中删除任意索引位置的元素的话必须不能从列表头开始遍历删除元素必须从列表尾向列表头的方向进行遍历删除元素因为如果从列表头开始遍历删除元素的话便会导致后面的元素会移动补充到被删除元素的索引位置上那么再向后进行遍历时便会出现漏遍历的元素也即防止破坏索引因此删除列表中元素时需要从列表尾向列表头的方向进行遍历。2.for t in reversed(to_del)1.t列表中的元素值2.此处to_del列表中的元素值保存的是trackers跟踪器链(列表)中要删除元素的索引值因此从to_del列表的列表尾向列表头的方向进行遍历出“trackers跟踪器链(列表)中要删除元素的”索引值。然后使用trackers.pop(t)根据trackers跟踪器链(列表)中元素的索引值t自动从列表中移除该元素。3.List pop()方法1.pop()方法语法list.pop([index-1])2.pop()函数用于移除列表中的一个元素默认最后一个元素并且返回该元素的值。3.pop(可选参数)中参数可选参数要移除列表元素的索引值不能超过列表总长度默认为 index-1删除最后一个列表值。4.pop()返回值该方法返回从列表中被移除的元素对象。5.pop(要移除的列表中元素的索引值)根据列表中元素的索引值自动从列表中移除#删除nan的结果逆向删除异常的跟踪器防止破坏索引for t in reversed(to_del):根据to_del列表中保存的跟踪框的索引值到跟踪器链(列表)中将该跟踪框从其中移除出去。trackers上一帧中的跟踪器链(列表)保存的是上一帧中成功跟踪目标的跟踪框也即成功跟踪目标的KalmanBoxTracker卡尔曼滤波对象。trackers.pop(要移除的某个跟踪框的索引值)即能根据该索引值从跟踪器链(列表)中把该跟踪框移除出去# pop(要移除的列表中元素的索引值)根据列表中元素的索引值自动从列表中移除self.trackers.pop(t)matches[[检测框的索引值, 跟踪框的索引值] [检测框的索引值, 跟踪框的索引值] 。。。]跟踪成功并且两两匹配组合的IOU值大于iou阈值的检测框和跟踪框组成的矩阵unmatched_detections[检测框的索引值,。。。]1.新增目标的检测框在detections检测框列表中的索引位置2.两两匹配组合的IOU值小于iou阈值的检测框在detections检测框列表中的索引位置unmatched_trackers[跟踪框的索引值,。。。]1.跟踪失败的跟踪框/预测框在trackers跟踪框列表中的索引位置2.两两匹配组合的IOU值小于iou阈值的跟踪框/预测框在trackers跟踪框列表中的索引位置1.matched跟踪成功目标的矩阵。即前后帧都存在的目标并且匹配成功同时大于iou阈值。2.unmatched_detections(列表)1.检测框中出现新目标但此时预测框(跟踪框)中仍不不存在该目标那么就需要在创建新目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象)然后把新目标对应的KalmanBoxTracker类的实例对象放到跟踪器链(列表)中。2.同时如果因为“跟踪框和检测框之间的”两两组合的匹配度IOU值小于iou阈值则也要把目标检测框放到unmatched_detections中。3.unmatched_trackers(列表)1.当跟踪目标失败或目标离开了画面时也即目标从检测框中消失了就应把目标对应的跟踪框(预测框)从跟踪器链中删除。unmatched_trackers列表中保存的正是跟踪失败即离开画面的目标但该目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象)此时仍然存在于跟踪器链(列表)中因此就需要把该目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象)从跟踪器链(列表)中删除出去。2.同时如果因为“跟踪框和检测框之间的”两两组合的匹配度IOU值小于iou阈值则也要把跟踪目标框放到unmatched_trackers中。#使用匈牙利算法将目标检测框和卡尔曼滤波器预测的跟踪框进行匹配分别获取跟踪成功的目标新增的目标离开画面的目标matched,unmatched_dets,unmatche_trkes associate_detection_to_tracker(dets,trks)for t, trk in enumerate(trackers列表)t为从0到列表长度-1的索引值trktrackers列表中每个KalmanBoxTracker卡尔曼滤波对象#将跟踪成功的目标更新到对应的卡尔曼滤波器for t,trk in enumerate(self.trackers): 1.trackers上一帧中的跟踪器链(列表)保存的是上一帧中成功跟踪目标的跟踪框也即成功跟踪目标的KalmanBoxTracker卡尔曼滤波对象。2.for t, trk in enumerate(trackers)遍历上一帧中的跟踪器链(列表)中从0到列表长度-1的索引值t 和 每个KalmanBoxTracker卡尔曼滤波对象trk。3.if t not in unmatched_trks如果上一帧中的跟踪框(KalmanBoxTracker卡尔曼滤波对)的索引值不在当前帧中的unmatched_trackers(列表)中的话即代表上一帧中的跟踪框在当前帧中成功跟踪到目标并且代表了“上一帧中的跟踪框在当前帧中的”预测框和当前帧中的检测框的匹配度IOU值大于iou阈值。4.matched[:, 1]获取的是跟踪框的索引值即[[检测框的索引值, 跟踪框的索引值] 。。。]中的跟踪框的索引值。5.np.where(matched[:, 1] t)[0]where返回的为符合条件的“[检测框的索引值, 跟踪框的索引值]”数组在matched矩阵中的索引值即行值。因此最后使用[0]就是从array([索引值/行值])中把索引值/行值取出来。6.matched[索引值/行值, 0]根据索引值/行值获取出matched矩阵中的[检测框的索引值, 跟踪框的索引值]然后获取出第一列的“检测框的索引值”。7.dets[d, :]根据检测框的索引值/行值从当前帧中的dets检测框列表获取出该检测框的所有列值最终返回的是一个二维矩阵如下所示第一种方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度]]第二种方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]]8.dets[d, :][0]获取出[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]9.trk.update(检测框的5个值的列表)使用检测框进行更新状态更新向量x(状态变量x)也即使用检测框更新跟踪框。if t not in unmatche_trkes:d matched[np.where(matched[:, 1] t)[0], 0]# 使用观测的边界框更新状态向量trk.update(dets[d, :][0])unmatched_detections(列表)保存了出现新目标的检测框的索引值还保存了“因为跟踪框和检测框之间的两两组合的匹配度IOU值小于iou阈值的”目标检测框的索引值。dets[i, :]根据索引值从当前帧中的检测框列表dets中获取对应的检测框即该行的所有列值。该检测框的值为第一种方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度]]第二种方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]]KalmanBoxTracker(dets[i, :])传入检测框进行创建该新目标对应的跟踪框KalmanBoxTracker卡尔曼滤波对象trk。每个目标框都有对应的一个卡尔曼滤波器(KalmanBoxTracker实例对象)增加一个目标框就增加一个卡尔曼滤波器(KalmanBoxTracker实例对象)。trackers.append(trk)把新增的卡尔曼滤波器(KalmanBoxTracker实例对象trk)存储到跟踪器链(列表)trackers中#为新增目标创建新的卡尔曼滤波器的跟踪器for i in unmatched_dets:trk KalmanBoxTracker(dets[i,0])self.trackers.append(trk)# 自后向前遍历仅返回在当前帧出现且命中周期大于self.min_hits除非跟踪刚开始的跟踪结果如果未命中时间大于self.max_age则删除跟踪器。# hit_streak忽略目标初始的若干帧 i为trackers跟踪器链(列表)长度从列表尾向列表头的方向 每遍历trackers跟踪器链(列表)一次 即进行 i-1 i len(self.trackers) reversed逆向遍历trackers跟踪器链(列表)目的为删除列表中的元素的同时不会造成漏遍历元素的问题 # 逆向遍历for trk in reversed(self.trackers): (跟踪框)KalmanBoxTracker卡尔曼滤波对象trk.get_state()获取跟踪框所预测的在当前帧中的预测结果已经从[x,y,s,r]转换为[x1,y1,x2,y2] [x1,y1,x2,y2]即为[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]。get_state()[0] 中使用[0] 是因为返回的为二维矩阵如下 第一种方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度]]第二种方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]]#返回当前边界框的估计值d trk.get_state()[0]1.trk.time_since_update 11.time_since_update记录了该目标对应的卡尔曼滤波器中的预测框(跟踪框)进行连续预测的次数每执行predict一次即进行time_since_update1。在连续预测(连续执行predict)的过程中一旦执行update的话time_since_update就会被重置为0。2. time_since_update 1该目标对应的卡尔曼滤波器一旦update更新的话该变量值便重置为0因此要求该目标对应的卡尔曼滤波器必须执行update更新步骤。update更新代表了使用检测框来更新状态更新向量x(状态变量x)的操作实际即代表了使用“通过yoloV3得到的并且和预测框(跟踪框)相匹配的”检测框来更新该目标对应的卡尔曼滤波器中的预测框(跟踪框)。2.trk.hit_streak min_hits1.hit_streak1.连续更新的次数每执行update一次即进行hit_streak1。2.在连续更新(连续执行update)的过程中一旦开始连续执行predict两次或以上的情况下当连续第一次执行predict时因为time_since_update仍然为0并不会把hit_streak重置为0然后才会进行time_since_update1当连续第二次执行predict时因为time_since_update已经为1那么便会把hit_streak重置为0然后继续进行time_since_update1。 2.min_hits跟踪框连续成功跟踪到目标的最小次数也即跟踪框至少需要连续min_hits次成功跟踪到目标。3.hit_streak min_hits跟踪框连续更新的次数hit_streak必须大于等于min_hits。而小于该min_hits次数的话update函数不返回该目标的KalmanBoxTracker卡尔曼滤波对象。3.frame_count min_hits因为视频的一开始frame_count为0而需要每经过一帧frame_count才会1。因此在视频的一开始前N帧中即使frame_count 小于等于min_hits 也可以。# 跟踪成功目标的box与id放入ret列表中if (trk.time_since_update 1) and (trk.hit_streak self.min_hits or self.frame_count self.min_hits): 1.ret当前帧中跟踪目标成功的跟踪框/预测框的集合包含目标的跟踪的id(也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个)第一种返回值方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度, trk.id] ...]第二种返回值方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, trk.id] ...]d[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]trk.id卡尔曼滤波器的个数/目标框的个数也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个。2.np.concatenate((d, [trk.id 1])).reshape(1, -1)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, 该跟踪框是创建出来的第几个]]ret.append(np.concatenate((d, [trk.id 1])).reshape(1, -1)) # 1 as MOT benchmark requires positive i为trackers跟踪器链(列表)长度从列表尾向列表头的方向 每遍历trackers跟踪器链(列表)一次 即进行 i-1 i - 1trk.time_since_update max_age1.time_since_update记录了该目标对应的卡尔曼滤波器中的预测框(跟踪框)进行连续预测的次数每执行predict一次即进行time_since_update1。在连续预测(连续执行predict)的过程中一旦执行update的话time_since_update就会被重置为0。2.max_age最大跟丢帧数。如果当前连续N帧大于最大跟丢帧数的话则从跟踪器链中删除该卡尔曼滤波对象的预测框(跟踪框)。3.time_since_update max_age每预测一帧time_since_update就会1只有预测的跟踪框跟踪到目标(即预测的跟踪框和检测框相似度匹配)才会执行update更新那么time_since_update才会被重置为0。那么当连续time_since_update帧都没有跟踪到目标的话即当连续time_since_update帧大于最大跟丢帧数时那么就需要根据该跟踪失败的跟踪器框的索引把该跟踪器框从跟踪器链(列表)trackers中进行移除出去。# 跟踪失败或离开画面的目标从卡尔曼跟踪器中删除if trk.time_since_update self.max_age:trackers上一帧中的跟踪器链(列表)保存的是上一帧中成功跟踪目标的跟踪框也即成功跟踪目标的KalmanBoxTracker卡尔曼滤波对象。trackers.pop(要移除的某个跟踪框的索引值)即能根据该索引值从跟踪器链(列表)中把该跟踪框移除出去# pop(要移除的列表中元素的索引值)根据列表中元素的索引值自动从列表中移除self.trackers.pop(i)# 返回当前画面中所有目标的box与id,以二维矩阵形式返回if len(ret) 0: ret当前帧中跟踪目标成功的跟踪框/预测框的集合包含目标的跟踪的id(也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个)第一种返回值方案[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度, trk.id] ...]第二种返回值方案(当前使用的为该种)[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, trk.id] ...]d[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标]trk.id卡尔曼滤波器的个数/目标框的个数也即该跟踪框(卡尔曼滤波实例对象)是创建出来的第几个。[[左上角的x坐标, 左上角的x坐标y坐标, 右下角的x坐标, 右下角的y坐标, yolo识别目标是某种物体的可信度, 该跟踪框是创建出来的第几个] [...][...]]return np.concatenate(ret)return np.empty((0, 5))
http://www.pierceye.com/news/38555/

相关文章:

  • 网站建设案例完整代码有没有做网站源代码 修改的
  • 网站排名优化软件网站开发虚拟主机系统
  • 河北省住房和城市建设厅网站建设了湛江市志愿服务网站
  • 什么样企业需要网站建设北京seo优化诊断
  • asp与sql网站建设金融视频直播网站开发
  • 汶上1500元网站建设wordpress自定义
  • 网站制作小图标设计师发布作品的网站
  • 机械营销网站建设案例白银市建设局网站
  • 校园网站怎么建设wordpress 增加背景图片
  • 服务器网站后台登陆密码黄框显示 天堂资源地址在线下载
  • 织梦cms 做视频网站讯杰网站建设
  • 百度网站说明书搜索引擎营销的英文缩写
  • 长春快速建站公司百度收录排名
  • 山东网站建设公司推荐婚纱摄影手机网站欣赏
  • 程序员会搭建非法网站吗搜索引擎优化的主要工作有
  • 电子商务网站设计步骤手机视频转码vue
  • 苏州手机网站做网站的空间是啥
  • 做网站公司 陕西渭南深交所大宗交易平台
  • 4网站免费建站vi设计用什么软件做
  • 做直播网站找哪个网站好360推广 网站建设
  • 网站建设加推广优化网站建设基础流程
  • 一个网站可以做多少弹窗广告彩页设计画面元素
  • 做网站后期怎么维护wordpress无法查看站点
  • 印刷网站开发策划书关闭网站需要多久
  • 建设pc端网站是什么意思影楼管理系统
  • 建设网站设计专业服务软件开发流程pdf
  • seo网站优化对象短网址还原工具
  • 凉山州规划和建设局网站简约wordpress
  • 最新网站建设的软件公司网站建设方案书怎么写
  • 上海网站推广营销设计企业网站实名认证时间