Example #1
0
    def test_iou(self):
        rects1 = np.random.rand(1000, 4) * 100
        rects2 = np.random.rand(1000, 4) * 100
        bound = (50, 100)
        ious1 = rect_iou(rects1, rects2, bound=bound)
        ious2 = poly_iou(rects1, rects2, bound=bound)
        self.assertTrue((ious1 - ious2).max() < 1e-14)

        polys1 = self._rect2corner(rects1)
        polys2 = self._rect2corner(rects2)
        ious3 = poly_iou(polys1, polys2, bound=bound)
        self.assertTrue((ious1 - ious3).max() < 1e-14)
Example #2
0
def anchor_ratio_performances(dataset, trackers, vot_un=False, disc=True):
    ratios = []
    mean_ratio = 0
    performances = []
    mean_performance = 0
    video_perf = []
    total_length = 0
    video_ranks = []

    if isinstance(dataset, ExperimentVOT):
        for s, (img_files, anno, _) in enumerate(dataset.dataset):
            seq_name = dataset.dataset.seq_names[s]
            bound = Image.open(img_files[0]).size

            if vot_un:
                anchor_file = os.path.join(
                    dataset.result_dir,
                    "Ours",
                    "unsupervised",
                    seq_name,
                    "%s_anchor.pkl" % seq_name,
                )
                perf = get_performance(dataset, trackers[0],
                                       "performance_un.json")
                video_per = perf[
                    trackers[0]]["seq_wise"][seq_name]["success_score"]
                succ_rank = [
                    perf[name]["seq_wise"][seq_name]["success_score"]
                    for name in trackers
                ]
                succ_rank = len(succ_rank) + 1 - rankdata(succ_rank,
                                                          method="ordinal")
            else:
                anchor_file = os.path.join(
                    dataset.result_dir,
                    "Ours",
                    "baseline",
                    seq_name,
                    "%s_anchor.pkl" % seq_name,
                )
                perf = get_performance(dataset, trackers[0])
                video_per = perf[
                    trackers[0]]["seq_wise"][seq_name]["success_score"]
                succ_rank = [
                    perf[name]["seq_wise"][seq_name]["success_score"]
                    for name in trackers
                ]
                succ_rank = len(succ_rank) + 1 - rankdata(succ_rank,
                                                          method="ordinal")
            with open(anchor_file, "rb") as f:
                anchors = pickle.load(f)
            performance = 0
            ratio = 0
            for f, _ in enumerate(img_files):
                if anchors[f] is not None and ~np.any(np.isnan(anno[f])):
                    iou = (poly_iou(np.array(anchors[f][-1]), anno[f],
                                    bound)[0]
                           if len(anchors[f][-1]) > 1 else np.NaN)
                    performance += iou
                    ratio += 1
            if ratio != 0:
                mean_performance += performance
                performance /= ratio
            video_perf.append(video_per)
            video_ranks.append(succ_rank[0])
            performances.append(performance)
            mean_ratio += ratio
            total_length += len(img_files)
            ratio /= len(img_files)
            ratios.append(ratio)
    else:
        for s, (img_files, anno) in enumerate(dataset.dataset):
            seq_name = dataset.dataset.seq_names[s]
            bound = Image.open(img_files[0]).size

            anchor_file = os.path.join(dataset.result_dir, trackers[0],
                                       "anchor/%s_anchor.pkl" % seq_name)
            with open(anchor_file, "rb") as f:
                anchors = pickle.load(f)
            perf = get_performance(dataset, trackers[0])
            video_per = perf[
                trackers[0]]["seq_wise"][seq_name]["success_score"]
            succ_rank = [
                perf[name]["seq_wise"][seq_name]["success_score"]
                for name in trackers
            ]
            succ_rank = len(succ_rank) + 1 - rankdata(succ_rank,
                                                      method="ordinal")
            ratio = 0
            performance = 0
            for f, _ in enumerate(img_files):
                if anchors[f] is not None and ~np.any(np.isnan(anno[f])):
                    iou = rect_iou(np.array(anchors[f][-1])[None, :],
                                   anno[f][None, :],
                                   bound=bound)[0]
                    performance += iou
                    ratio += 1
            if ratio != 0:
                mean_performance += performance
                performance /= ratio
            video_perf.append(video_per)
            video_ranks.append(succ_rank[0])
            performances.append(performance)
            mean_ratio += ratio
            total_length += len(img_files)
            ratio /= len(img_files)
            ratios.append(ratio)
    mean_performance /= mean_ratio
    mean_ratio /= total_length
    return (
        ratios,
        mean_ratio,
        performances,
        mean_performance,
        video_perf,
        dataset.dataset.seq_names,
        video_ranks,
    )
Example #3
0
def run_realtime(root, vot, ours, trackers, ex):
    context = zmq.Context()

    ventilators = [context.socket(zmq.PUSH) for _ in range(len(trackers))]
    for ventilator, tracker in zip(ventilators, trackers):
        ventilator.connect("tcp://%s:8888" % tracker)

    sinks = [context.socket(zmq.PULL) for _ in range(len(trackers))]
    for sink, tracker in zip(sinks, trackers):
        sink.connect("tcp://%s:6006" % tracker)

    for s, (img_files, anno, _) in enumerate(vot.dataset):
        seq_name = vot.dataset.seq_names[s]
        print("--Ex : %s, Sequence %d/%d: %s" %
              (ex, s + 1, len(vot.dataset), seq_name))

        record_files = [
            os.path.join(vot.result_dir, tracker, "realtime", seq_name,
                         "%s_001.txt" % seq_name) for tracker in trackers
        ]

        origin_files = [
            os.path.join(
                vot.result_dir,
                tracker,
                "baseline",
                seq_name,
                "%s_001_origin.txt" % seq_name,
            ) for tracker in trackers
        ]

        record_file = os.path.join(vot.result_dir, ours.name, "realtime",
                                   seq_name, "%s_001.txt" % seq_name)

        results = dict()

        results[ours.name] = {
            "boxes": [],
            "times": [],
            "anchor_frames": [],
            "weights": [],
        }

        for tracker in trackers:
            results[tracker] = {
                "boxes": [],
                "origin_boxes": [],
                "times": [],
                "failure": False,
                "next_start": 0,
                "failed_frame": -1,
                "total_time": 0.0,
                "grace": 3 - 1,
                "offset": 0,
                "current": 0,
            }

        anno_rects = anno.copy()
        if anno_rects.shape[1] == 8:
            anno_rects = vot.dataset._corner2rect(anno_rects)

        # tracking loop
        for f, img_file in tqdm(enumerate(img_files)):
            image = Image.open(img_file)
            image = image.convert("RGB")
            if f == 0:
                data = {
                    "image": image,
                    "box": anno_rects[0, :],
                    "target": "all"
                }
                message = Message(MessageType["init"], data)
                for ventilator in ventilators:
                    ventilator.send_pyobj(message)

                for i in range(len(trackers)):
                    results[trackers[i]]["boxes"].append([1])
                    results[trackers[i]]["origin_boxes"].append([1])
                    results[trackers[i]]["times"].append(0)
            else:
                data = {"image": image, "target": "all"}
                message = Message(MessageType["track"], data)
                for ventilator in ventilators:
                    ventilator.send_pyobj(message)

                for sink in sinks:
                    result = sink.recv_pyobj()
                    result = result.data
                    name = result["name"]
                    duration = result["time"]
                    box = result["box"]
                    results[name]["boxes"].append(box)
                    results[name]["origin_boxes"].append(box)
                    results[name]["times"].append(duration)

                for i in range(len(trackers)):
                    key = trackers[i]
                    value = results[key]
                    box = value["boxes"][-1]
                    if f == value["next_start"]:
                        value["failure"] = False
                        value["failed_frame"] = -1
                        value["total_time"] = 0.0
                        value["grace"] = 3 - 1
                        value["offset"] = f

                        data = {
                            "image": image,
                            "box": anno_rects[f],
                            "target": key
                        }
                        message = Message(MessageType["init"], data)
                        for ventilator in ventilators:
                            ventilator.send_pyobj(message)

                        value["boxes"][-1] = [1]
                        value["origin_boxes"][-1] = [1]
                    elif not value["failure"]:
                        # during success frames
                        # calculate current frame
                        if value["grace"] > 0:
                            value["total_time"] += 1000.0 / 25
                            value["grace"] -= 1
                        else:
                            value["total_time"] += max(
                                1000.0 / 25, value["times"][-2] * 1000.0)
                        value["current"] = value["offset"] + int(
                            np.round(
                                np.floor(value["total_time"] * 25) / 1000.0))

                        # delayed/tracked bounding box
                        if f < value["current"]:
                            value["boxes"][-1] = value["boxes"][-2]
                            value["origin_boxes"][-1] = value["origin_boxes"][
                                -2]

                        iou = poly_iou(anno[f],
                                       value["boxes"][-1],
                                       bound=image.size)
                        if iou <= 0.0:
                            # tracking failure
                            value["failure"] = True
                            value["failed_frame"] = f
                            value["next_start"] = value[
                                "current"] + vot.skip_initialize
                            value["boxes"][-1] = [2]
                    else:
                        # during failure frames
                        if f < value["current"]:
                            # skipping frame due to slow speed
                            value["boxes"][-1] = [0]
                            value["origin_boxes"][-1] = [0]
                            value["times"][-1] = np.NaN
                        elif f == value["current"]:
                            # current frame
                            iou = poly_iou(anno[f],
                                           value["boxes"][-1],
                                           bound=image.size)
                            if iou <= 0.0:
                                # tracking failure
                                value["boxes"][-1] = [2]
                                value["boxes"][value["failed_frame"]] = [0]
                                value["times"][value["failed_frame"]] = np.NaN
                        elif f < value["next_start"]:
                            # skipping frame due to failure
                            value["boxes"][-1] = [0]
                            value["origin_boxes"][-1] = [0]
                            value["times"][-1] = np.NaN

            expert_boxes = [
                results[trackers[i]]["origin_boxes"][-1]
                for i in range(len(trackers))
            ]
            if f == 0:
                ours.init(image, anno_rects[0, :])
                box = [1]
                offline_results = None
                duration = 0
            else:
                start_time = time.time()
                box, offline_results = ours.update(image, expert_boxes)
                duration = time.time() - start_time
            results[ours.name]["boxes"].append(box)
            results[ours.name]["times"].append(duration)
            results[ours.name]["anchor_frames"].append(offline_results)
            results[ours.name]["weights"].append(ours.algorithm.w)

            if f != 0 and offline_results is not None and ours.reset_tracker:
                data = {"image": image, "box": box, "target": "all"}
                message = Message(MessageType["init"], data)
                for ventilator in ventilators:
                    ventilator.send_pyobj(message)

        for i in range(len(trackers)):
            vot._record(
                record_files[i],
                results[trackers[i]]["boxes"],
                results[trackers[i]]["times"],
            )

        vot._record(record_file, results[ours.name]["boxes"],
                    results[ours.name]["times"])

        for i in range(len(trackers)):
            lines = []
            for box in results[trackers[i]]["origin_boxes"]:
                if len(box) == 1:
                    lines.append("%d" % box[0])
                else:
                    lines.append(str.join(",", ["%.4f" % t for t in box]))

            # record bounding boxes
            record_dir = os.path.dirname(origin_files[i])
            if not os.path.isdir(record_dir):
                os.makedirs(record_dir)
            with open(origin_files[i], "w") as f:
                f.write(str.join("\n", lines))

        anchor_file = record_file[:record_file.rfind("_")] + "_anchor.pkl"
        with open(anchor_file, "wb") as fp:
            pickle.dump(results[ours.name]["anchor_frames"], fp)

        weights_file = record_file[:record_file.rfind("_")] + "_weights.txt"
        np.savetxt(weights_file, results[ours.name]["weights"], fmt="%f")
Example #4
0
def anchor_ratio_diff_performances(dataset, trackers, vot_un=False, disc=True):
    # function for loading results
    def read_record(filename):
        with open(filename) as f:
            record = f.read().strip().split("\n")
        record = [[float(t) for t in line.split(",")] for line in record]
        return record

    ratios = []
    mean_ratio = 0
    performances = []
    mean_performance = 0
    diffs = []
    mean_diff = 0
    total_length = 0

    if isinstance(dataset, ExperimentVOT):
        for s, (img_files, anno, _) in enumerate(dataset.dataset):
            seq_name = dataset.dataset.seq_names[s]
            bound = Image.open(img_files[0]).size

            if vot_un:
                record_files = [
                    os.path.join(
                        dataset.result_dir,
                        name,
                        "unsupervised",
                        seq_name,
                        "%s_%03d.txt" % (seq_name, 1),
                    ) for name in trackers
                ]
                anchor_file = os.path.join(
                    dataset.result_dir,
                    "Ours",
                    "unsupervised",
                    seq_name,
                    "%s_anchor.pkl" % seq_name,
                )
            else:
                record_files = [
                    os.path.join(
                        dataset.result_dir,
                        name,
                        "baseline",
                        seq_name,
                        "%s_%03d.txt" % (seq_name, 1),
                    ) for name in trackers
                ]
                anchor_file = os.path.join(
                    dataset.result_dir,
                    "Ours",
                    "baseline",
                    seq_name,
                    "%s_anchor.pkl" % seq_name,
                )
            boxes = [read_record(f) for f in record_files]
            with open(anchor_file, "rb") as f:
                anchors = pickle.load(f)
            diff = 0
            performance = 0
            ratio = 0
            for f, _ in enumerate(img_files):
                if anchors[f] is not None and ~np.any(np.isnan(anno[f])):
                    iou = (poly_iou(np.array(anchors[f][-1]), anno[f],
                                    bound)[0]
                           if len(anchors[f][-1]) > 1 else np.NaN)
                    best_iou = max([
                        poly_iou(np.array(box[f]), anno[f], bound)[0]
                        if len(box[f]) > 1 else np.NaN for box in boxes
                    ])
                    if best_iou > iou + 0.01:
                        if disc:
                            diff += 1
                        else:
                            diff += best_iou - iou
                    performance += iou
                    ratio += 1
            if ratio != 0:
                mean_diff += diff
                mean_performance += performance
                diff /= ratio
                performance /= ratio
            diffs.append(diff)
            performances.append(performance)
            mean_ratio += ratio
            total_length += len(img_files)
            ratio /= len(img_files)
            ratios.append(ratio)
    else:
        for s, (img_files, anno) in enumerate(dataset.dataset):
            seq_name = dataset.dataset.seq_names[s]
            bound = Image.open(img_files[0]).size

            record_files = [
                os.path.join(dataset.result_dir, name, "%s.txt" % seq_name)
                for name in trackers
            ]
            boxes = [
                np.loadtxt(record_file, delimiter=",")
                for record_file in record_files
            ]

            anchor_file = os.path.join(dataset.result_dir, trackers[0],
                                       "anchor/%s_anchor.pkl" % seq_name)
            with open(anchor_file, "rb") as f:
                anchors = pickle.load(f)
            ratio = 0
            performance = 0
            diff = 0
            for f, _ in enumerate(img_files):
                if anchors[f] is not None and ~np.any(np.isnan(anno[f])):
                    iou = rect_iou(np.array(anchors[f][-1])[None, :],
                                   anno[f][None, :],
                                   bound=bound)[0]
                    best_iou = max([
                        rect_iou(np.array(box[f])[None, :],
                                 anno[f][None, :],
                                 bound=bound)[0] for box in boxes
                    ])
                    if best_iou > iou + 0.01:
                        if disc:
                            diff += 1
                        else:
                            diff += best_iou - iou
                    performance += iou
                    ratio += 1
            if ratio != 0:
                mean_diff += diff
                mean_performance += performance
                diff /= ratio
                performance /= ratio
            diffs.append(diff)
            performances.append(performance)
            mean_ratio += ratio
            total_length += len(img_files)
            ratio /= len(img_files)
            ratios.append(ratio)
    mean_performance /= mean_ratio
    mean_diff /= mean_ratio
    mean_ratio /= total_length
    return (
        ratios,
        mean_ratio,
        diffs,
        mean_diff,
        performances,
        mean_performance,
        dataset.dataset.seq_names,
    )
Example #5
0
def run_supervised(root, vot, ours, trackers, ex):
    context = zmq.Context()

    ventilators = [context.socket(zmq.PUSH) for _ in range(len(trackers))]
    for ventilator, tracker in zip(ventilators, trackers):
        ventilator.connect("tcp://%s:8888" % tracker)

    sinks = [context.socket(zmq.PULL) for _ in range(len(trackers))]
    for sink, tracker in zip(sinks, trackers):
        sink.connect("tcp://%s:6006" % tracker)

    for s, (img_files, anno, _) in enumerate(vot.dataset):
        seq_name = vot.dataset.seq_names[s]
        print("--Ex : %s, Sequence %d/%d: %s" %
              (ex, s + 1, len(vot.dataset), seq_name))

        anno_rects = anno.copy()
        if anno_rects.shape[1] == 8:
            anno_rects = vot.dataset._corner2rect(anno_rects)

        for r in tqdm(range(vot.repetitions)):
            record_files = [
                os.path.join(
                    vot.result_dir,
                    tracker,
                    "baseline",
                    seq_name,
                    "%s_%03d.txt" % (seq_name, r + 1),
                ) for tracker in trackers
            ]

            origin_files = [
                os.path.join(
                    vot.result_dir,
                    tracker,
                    "baseline",
                    seq_name,
                    "%s_%03d_origin.txt" % (seq_name, r + 1),
                ) for tracker in trackers
            ]

            record_file = os.path.join(
                vot.result_dir,
                ours.name,
                "baseline",
                seq_name,
                "%s_%03d.txt" % (seq_name, r + 1),
            )

            results = dict()

            results[ours.name] = {
                "boxes": [],
                "times": [],
                "anchor_frames": [],
                "weights": [],
                "failure": False,
                "next_start": -1,
            }

            for tracker in trackers:
                results[tracker] = {
                    "boxes": [],
                    "origin_boxes": [],
                    "times": [],
                    "failure": False,
                    "next_start": -1,
                }

            # tracking loop
            for f, img_file in tqdm(enumerate(img_files)):
                image = Image.open(img_file)
                image = image.convert("RGB")
                if f == 0:
                    data = {
                        "image": image,
                        "box": anno_rects[0, :],
                        "target": "all"
                    }
                    message = Message(MessageType["init"], data)
                    for ventilator in ventilators:
                        ventilator.send_pyobj(message)

                    for i in range(len(trackers)):
                        results[trackers[i]]["boxes"].append([1])
                        results[trackers[i]]["origin_boxes"].append([1])
                        results[trackers[i]]["times"].append(0)
                else:
                    data = {"image": image, "target": "all"}
                    message = Message(MessageType["track"], data)
                    for ventilator in ventilators:
                        ventilator.send_pyobj(message)

                    for sink in sinks:
                        result = sink.recv_pyobj()
                        result = result.data
                        name = result["name"]
                        duration = result["time"]
                        box = result["box"]
                        results[name]["boxes"].append(box)
                        results[name]["origin_boxes"].append(box)
                        results[name]["times"].append(duration)

                    for i in range(len(trackers)):
                        key = trackers[i]
                        value = results[key]
                        box = value["boxes"][-1]
                        if value["failure"]:
                            # during failure frames
                            if f == value["next_start"]:
                                value["failure"] = False

                                data = {
                                    "image": image,
                                    "box": anno_rects[f],
                                    "target": key,
                                }
                                message = Message(MessageType["init"], data)
                                for ventilator in ventilators:
                                    ventilator.send_pyobj(message)

                                value["boxes"][-1] = [1]
                                # value['origin_boxes'][-1] = [1]
                            else:
                                results[name]["times"][-1] = np.NaN
                                value["boxes"][-1] = [0]
                                # value['origin_boxes'][-1] = [0]
                        else:
                            # during success frames
                            iou = poly_iou(anno[f], box, bound=image.size)
                            if iou <= 0.0:
                                # tracking failure
                                value["failure"] = True
                                value["next_start"] = f + vot.skip_initialize
                                value["boxes"][-1] = [2]

                expert_boxes = [
                    results[trackers[i]]["origin_boxes"][f]
                    for i in range(len(trackers))
                ]
                if f == 0:
                    ours.init(image, anno_rects[0, :])
                    box = [1]
                    offline_results = None
                    duration = 0
                else:
                    if results[ours.name]["failure"]:
                        if f == results[ours.name]["next_start"]:
                            results[ours.name]["failure"] = False
                            box = [1]
                            duration = 0
                            ours.init(image, anno_rects[f])
                        else:
                            duration = np.NaN
                            box = [0]
                        offline_results = None
                    else:
                        start_time = time.time()
                        box, offline_results = ours.update(image, expert_boxes)
                        duration = time.time() - start_time
                        iou = poly_iou(anno[f], box, bound=image.size)
                        if iou <= 0.0:
                            results[ours.name]["failure"] = True
                            results[ours.name][
                                "next_start"] = f + vot.skip_initialize
                            box = [2]
                results[ours.name]["boxes"].append(box)
                results[ours.name]["times"].append(duration)
                results[ours.name]["anchor_frames"].append(offline_results)
                results[ours.name]["weights"].append(ours.algorithm.w)

                if f != 0 and offline_results is not None and ours.reset_tracker:
                    data = {"image": image, "box": box, "target": "all"}
                    message = Message(MessageType["init"], data)
                    for ventilator in ventilators:
                        ventilator.send_pyobj(message)

            for i in range(len(trackers)):
                vot._record(
                    record_files[i],
                    results[trackers[i]]["boxes"],
                    results[trackers[i]]["times"],
                )

            vot._record(record_file, results[ours.name]["boxes"],
                        results[ours.name]["times"])

            for i in range(len(trackers)):
                lines = []
                for box in results[trackers[i]]["origin_boxes"]:
                    if len(box) == 1:
                        lines.append("%d" % box[0])
                    else:
                        lines.append(str.join(",", ["%.4f" % t for t in box]))

                # record bounding boxes
                record_dir = os.path.dirname(origin_files[i])
                if not os.path.isdir(record_dir):
                    os.makedirs(record_dir)
                with open(origin_files[i], "w") as f:
                    f.write(str.join("\n", lines))

            anchor_file = record_file[:record_file.rfind("_")] + "_anchor.pkl"
            with open(anchor_file, "wb") as fp:
                pickle.dump(results[ours.name]["anchor_frames"], fp)

            weights_file = record_file[:record_file.rfind("_"
                                                          )] + "_weights.txt"
            np.savetxt(weights_file, results[ours.name]["weights"], fmt="%f")