diff --git a/modules/video/multiple_object_tracking/fairmot_dla34/dataset.py b/modules/video/multiple_object_tracking/fairmot_dla34/dataset.py index 5f6a9dd8ddcc19d59bd0f7821b9adaf7a4c02c45..ef6fd193c7020e26a1388e5bacc74c017168e570 100644 --- a/modules/video/multiple_object_tracking/fairmot_dla34/dataset.py +++ b/modules/video/multiple_object_tracking/fairmot_dla34/dataset.py @@ -64,7 +64,7 @@ def default_collate_fn(batch): if isinstance(sample, np.ndarray): batch = np.stack(batch, axis=0) return batch - elif isinstance(sample, (paddle.Tensor, core.eager.Tensor)): + elif isinstance(sample, (paddle.Tensor)): return paddle.stack(batch, axis=0) elif isinstance(sample, numbers.Number): batch = np.array(batch) diff --git a/modules/video/multiple_object_tracking/fairmot_dla34/modeling/mot/matching/jde_matching.py b/modules/video/multiple_object_tracking/fairmot_dla34/modeling/mot/matching/jde_matching.py index bf2e891c391c98ed8944f88377f62c9722fa5155..5a02f3e1c57c0f7cc3886209daa172cc83537c28 100644 --- a/modules/video/multiple_object_tracking/fairmot_dla34/modeling/mot/matching/jde_matching.py +++ b/modules/video/multiple_object_tracking/fairmot_dla34/modeling/mot/matching/jde_matching.py @@ -12,22 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. """ -This code is borrow from https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/tracker/matching.py +This code is based on https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/tracker/matching.py """ -import lap +try: + import lap +except: + print( + 'Warning: Unable to use JDE/FairMOT/ByteTrack, please install lap, for example: `pip install lap`, see https://github.com/gatagat/lap' + ) + pass + import scipy import numpy as np from scipy.spatial.distance import cdist from ..motion import kalman_filter +import warnings -from ppdet.utils.logger import setup_logger -logger = setup_logger(__name__) +warnings.filterwarnings("ignore") __all__ = [ 'merge_matches', 'linear_assignment', - 'cython_bbox_ious', + 'bbox_ious', 'iou_distance', 'embedding_distance', 'fuse_motion', @@ -52,6 +59,12 @@ def merge_matches(m1, m2, shape): def linear_assignment(cost_matrix, thresh): + try: + import lap + except Exception as e: + raise RuntimeError( + 'Unable to use JDE/FairMOT/ByteTrack, please install lap, for example: `pip install lap`, see https://github.com/gatagat/lap' + ) if cost_matrix.size == 0: return np.empty((0, 2), dtype=int), tuple(range(cost_matrix.shape[0])), tuple(range(cost_matrix.shape[1])) matches, unmatched_a, unmatched_b = [], [], [] @@ -65,18 +78,24 @@ def linear_assignment(cost_matrix, thresh): return matches, unmatched_a, unmatched_b -def cython_bbox_ious(atlbrs, btlbrs): - ious = np.zeros((len(atlbrs), len(btlbrs)), dtype=np.float) - if ious.size == 0: +def bbox_ious(atlbrs, btlbrs): + boxes = np.ascontiguousarray(atlbrs, dtype=np.float) + query_boxes = np.ascontiguousarray(btlbrs, dtype=np.float) + N = boxes.shape[0] + K = query_boxes.shape[0] + ious = np.zeros((N, K), dtype=boxes.dtype) + if N * K == 0: return ious - try: - import cython_bbox - except Exception as e: - logger.error('cython_bbox not found, please install cython_bbox.' 'for example: `pip install cython_bbox`.') - raise e - ious = cython_bbox.bbox_overlaps( - np.ascontiguousarray(atlbrs, dtype=np.float), np.ascontiguousarray(btlbrs, dtype=np.float)) + for k in range(K): + box_area = ((query_boxes[k, 2] - query_boxes[k, 0] + 1) * (query_boxes[k, 3] - query_boxes[k, 1] + 1)) + for n in range(N): + iw = (min(boxes[n, 2], query_boxes[k, 2]) - max(boxes[n, 0], query_boxes[k, 0]) + 1) + if iw > 0: + ih = (min(boxes[n, 3], query_boxes[k, 3]) - max(boxes[n, 1], query_boxes[k, 1]) + 1) + if ih > 0: + ua = float((boxes[n, 2] - boxes[n, 0] + 1) * (boxes[n, 3] - boxes[n, 1] + 1) + box_area - iw * ih) + ious[n, k] = iw * ih / ua return ious @@ -91,7 +110,7 @@ def iou_distance(atracks, btracks): else: atlbrs = [track.tlbr for track in atracks] btlbrs = [track.tlbr for track in btracks] - _ious = cython_bbox_ious(atlbrs, btlbrs) + _ious = bbox_ious(atlbrs, btlbrs) cost_matrix = 1 - _ious return cost_matrix diff --git a/modules/video/multiple_object_tracking/fairmot_dla34/requirements.txt b/modules/video/multiple_object_tracking/fairmot_dla34/requirements.txt index 8e327df2acddea95260bb92551cfc9afee06b642..dea328171cd9f4f61f4671aff75da9f1e8fcc389 100644 --- a/modules/video/multiple_object_tracking/fairmot_dla34/requirements.txt +++ b/modules/video/multiple_object_tracking/fairmot_dla34/requirements.txt @@ -2,3 +2,4 @@ cython paddledet >= 2.2.0 opencv-python imageio +pillow==7.1.2 diff --git a/modules/video/multiple_object_tracking/jde_darknet53/dataset.py b/modules/video/multiple_object_tracking/jde_darknet53/dataset.py index 028ff4a6b63d36b87b0cb104afb699232d88d3a5..a252fbcf40fdf431c20c63c579d34e2bcfd5c6de 100644 --- a/modules/video/multiple_object_tracking/jde_darknet53/dataset.py +++ b/modules/video/multiple_object_tracking/jde_darknet53/dataset.py @@ -65,7 +65,7 @@ def default_collate_fn(batch): if isinstance(sample, np.ndarray): batch = np.stack(batch, axis=0) return batch - elif isinstance(sample, (paddle.Tensor, core.eager.Tensor)): + elif isinstance(sample, (paddle.Tensor)): return paddle.stack(batch, axis=0) elif isinstance(sample, numbers.Number): batch = np.array(batch) diff --git a/modules/video/multiple_object_tracking/jde_darknet53/modeling/mot/matching/jde_matching.py b/modules/video/multiple_object_tracking/jde_darknet53/modeling/mot/matching/jde_matching.py index bf2e891c391c98ed8944f88377f62c9722fa5155..5a02f3e1c57c0f7cc3886209daa172cc83537c28 100644 --- a/modules/video/multiple_object_tracking/jde_darknet53/modeling/mot/matching/jde_matching.py +++ b/modules/video/multiple_object_tracking/jde_darknet53/modeling/mot/matching/jde_matching.py @@ -12,22 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. """ -This code is borrow from https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/tracker/matching.py +This code is based on https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/tracker/matching.py """ -import lap +try: + import lap +except: + print( + 'Warning: Unable to use JDE/FairMOT/ByteTrack, please install lap, for example: `pip install lap`, see https://github.com/gatagat/lap' + ) + pass + import scipy import numpy as np from scipy.spatial.distance import cdist from ..motion import kalman_filter +import warnings -from ppdet.utils.logger import setup_logger -logger = setup_logger(__name__) +warnings.filterwarnings("ignore") __all__ = [ 'merge_matches', 'linear_assignment', - 'cython_bbox_ious', + 'bbox_ious', 'iou_distance', 'embedding_distance', 'fuse_motion', @@ -52,6 +59,12 @@ def merge_matches(m1, m2, shape): def linear_assignment(cost_matrix, thresh): + try: + import lap + except Exception as e: + raise RuntimeError( + 'Unable to use JDE/FairMOT/ByteTrack, please install lap, for example: `pip install lap`, see https://github.com/gatagat/lap' + ) if cost_matrix.size == 0: return np.empty((0, 2), dtype=int), tuple(range(cost_matrix.shape[0])), tuple(range(cost_matrix.shape[1])) matches, unmatched_a, unmatched_b = [], [], [] @@ -65,18 +78,24 @@ def linear_assignment(cost_matrix, thresh): return matches, unmatched_a, unmatched_b -def cython_bbox_ious(atlbrs, btlbrs): - ious = np.zeros((len(atlbrs), len(btlbrs)), dtype=np.float) - if ious.size == 0: +def bbox_ious(atlbrs, btlbrs): + boxes = np.ascontiguousarray(atlbrs, dtype=np.float) + query_boxes = np.ascontiguousarray(btlbrs, dtype=np.float) + N = boxes.shape[0] + K = query_boxes.shape[0] + ious = np.zeros((N, K), dtype=boxes.dtype) + if N * K == 0: return ious - try: - import cython_bbox - except Exception as e: - logger.error('cython_bbox not found, please install cython_bbox.' 'for example: `pip install cython_bbox`.') - raise e - ious = cython_bbox.bbox_overlaps( - np.ascontiguousarray(atlbrs, dtype=np.float), np.ascontiguousarray(btlbrs, dtype=np.float)) + for k in range(K): + box_area = ((query_boxes[k, 2] - query_boxes[k, 0] + 1) * (query_boxes[k, 3] - query_boxes[k, 1] + 1)) + for n in range(N): + iw = (min(boxes[n, 2], query_boxes[k, 2]) - max(boxes[n, 0], query_boxes[k, 0]) + 1) + if iw > 0: + ih = (min(boxes[n, 3], query_boxes[k, 3]) - max(boxes[n, 1], query_boxes[k, 1]) + 1) + if ih > 0: + ua = float((boxes[n, 2] - boxes[n, 0] + 1) * (boxes[n, 3] - boxes[n, 1] + 1) + box_area - iw * ih) + ious[n, k] = iw * ih / ua return ious @@ -91,7 +110,7 @@ def iou_distance(atracks, btracks): else: atlbrs = [track.tlbr for track in atracks] btlbrs = [track.tlbr for track in btracks] - _ious = cython_bbox_ious(atlbrs, btlbrs) + _ious = bbox_ious(atlbrs, btlbrs) cost_matrix = 1 - _ious return cost_matrix diff --git a/modules/video/multiple_object_tracking/jde_darknet53/requirements.txt b/modules/video/multiple_object_tracking/jde_darknet53/requirements.txt index 8e327df2acddea95260bb92551cfc9afee06b642..dea328171cd9f4f61f4671aff75da9f1e8fcc389 100644 --- a/modules/video/multiple_object_tracking/jde_darknet53/requirements.txt +++ b/modules/video/multiple_object_tracking/jde_darknet53/requirements.txt @@ -2,3 +2,4 @@ cython paddledet >= 2.2.0 opencv-python imageio +pillow==7.1.2