赞
踩
在ByteTrack代码中添加了一个deepsort的跟踪算法,也就是实现YOLOx的检测器+deepsort的组合,可是在使用MOT17评测的过程中有些序列可以跑完,但是有些序列跑到中间就会报错
网上有很多文章指出是路径的问题,但是路径并没有出错,还是出现了这样的问题
(1)报错提示如下:
Loading weights from C:/Users/zxc/Desktop/ByteTrack-main/deep_sort/deep/checkpoint/ckpt.t7... Done! Traceback (most recent call last): File "C:/Users/zxc/Desktop/ByteTrack-main/tools/demo_track.py", line 558, in <module> main(exp, args) File "C:/Users/zxc/Desktop/ByteTrack-main/tools/demo_track.py", line 549, in main image_demo_deepsort2(predictor, vis_folder, current_time, args) File "C:/Users/zxc/Desktop/ByteTrack-main/tools/demo_track.py", line 378, in image_demo_deepsort2 outputs = deepsort.update((torch.Tensor(bbox_xywh)), (torch.Tensor(confs)), img_info['raw_img']) File "C:\Users\zxc\Desktop\ByteTrack-main\deep_sort\deep_sort.py", line 29, in update features = self._get_features(bbox_xywh, ori_img) File "C:\Users\zxc\Desktop\ByteTrack-main\deep_sort\deep_sort.py", line 99, in _get_features features = self.extractor(im_crops) File "C:\Users\zxc\Desktop\ByteTrack-main\deep_sort\deep\feature_extractor.py", line 58, in __call__ im_batch = self._preprocess(im_crops) File "C:\Users\zxc\Desktop\ByteTrack-main\deep_sort\deep\feature_extractor.py", line 42, in _preprocess im=_resize(im, self.size) File "C:\Users\zxc\Desktop\ByteTrack-main\deep_sort\deep\feature_extractor.py", line 38, in _resize return cv2.resize(im.astype(np.float32)/255., size) cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4052: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
(2)找到报错的函数位置:
位于\feature_extractor.py文件中,在deepsort的特征提取中的resize函数
def _resize(im, size):
return cv2.resize(im.astype(np.float32)/255., size)
im_batch = torch.cat([self.norm(_resize(im, self.size)).unsqueeze(0) for im in im_crops], dim=0).float()
return im_batch
通过报错的提示:
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4052: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
可知可能是在resize函数处有空帧的情况,因此解决的办法是在使用resize前先判断一下是否为空帧,代码修改如下:
def _resize(im, size):
try:
return cv2.resize(im.astype(np.float32)/255., size)
except:
pass
这是网上的其他人分享的方法,但是我在使用后并没有解决问题,可以看一下resize的下一步需要什么处理
im_batch = torch.cat([self.norm(_resize(im, self.size)).unsqueeze(0) for im in im_crops], dim=0).float()
可以看到,每一个img在经过resize后,还需要经过self.norm()函数的处理,因为我们上一步将空帧跳过了,所以它空帧经过resize之后的结果还是为空,所以在这一步仍然需要判断,代码修改如下:
def _preprocess(self, im_crops): """ TODO: 1. to float with scale from 0 to 1 2. resize to (64, 128) as Market1501 dataset did 3. concatenate to a numpy array 3. to torch Tensor 4. normalize """ def _resize(im, size): try: return cv2.resize(im.astype(np.float32)/255., size) except: pass img=[] for im in im_crops: im=_resize(im, self.size) if im is not None: im=self.norm(im).unsqueeze(0) img.append(im) im_batch=torch.cat(img, dim=0).float() #im_batch = torch.cat([self.norm(_resize(im, self.size)).unsqueeze(0) for im in im_crops], dim=0).float() return im_batch
将原函数注释掉,并按步骤拆开,对im进行判断,如果不是空,进行norm()处理,并将成功处理的im加入到img列表管理,这是img中就没有空的结果了
问题得到解决!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。