custom_evaluator.py

import numpy as np
from pycocotools.cocoeval import COCOeval

# 自定义COCOeval类,继承自COCOeval
class CustomCOCOeval(COCOeval):
    # 重写computeIoU方法
    def computeIoU(self, imgId, catId):
        p = self.params
        if p.useCats:
            gt = self._gts[imgId, catId]
            dt = self._dts[imgId, catId]
        else:
            gt = [g for cId in p.catIds for g in self._gts[imgId, cId]]
            dt = [d for cId in p.catIds for d in self._dts[imgId, cId]]
        if len(gt) == 0 and len(dt) == 0:
            return []
        ious = np.zeros((len(dt), len(gt)))

        for j, gt_obj in enumerate(gt):
            gx, gy, gwidth, gheight = gt_obj['bbox']
            gx2, gy2 = gx + gwidth, gy + gheight
            gt_area = gwidth * gheight
            for i, dt_obj in enumerate(dt):
                dx, dy, dwidth, dheight = dt_obj['bbox']
                dx2, dy2 = dx + dwidth, dy + dheight
                dt_area = dwidth * dheight

                inter_w = min(dx2, gx2) - max(dx, gx)
                inter_h = min(dy2, gy2) - max(dy, gy)
                if inter_w <= 0 or inter_h <= 0:
                    continue

                inter_area = inter_w * inter_h
                union_area = dt_area + gt_area - inter_area
                ious[i, j] = inter_area / union_area
        return ious

# 使用自定义的COCOeval进行评估
def evaluate_model(coco_gt, coco_dt):
    coco_eval = CustomCOCOeval(coco_gt, coco_dt, 'keypoints')
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
    return coco_eval.stats

# 示例:加载你的COCO格式的ground truth和detection结果
# coco_gt = COCO("path/to/ground_truth.json")
# coco_dt = coco_gt.loadRes("path/to/detections.json")

# 调用评估函数
# stats = evaluate_model(coco_gt, coco_dt)
# print(stats)
import numpy as np
from pycocotools.cocoeval import COCOeval

# 自定义COCOeval类,继承自COCOeval
class CustomCOCOeval(COCOeval):
    # 重写computeIoU方法
    def computeIoU(self, imgId, catId):
        p = self.params
        if p.useCats:
            gt = self._gts[imgId, catId]
            dt = self._dts[imgId, catId]
        else:
            gt = [g for cId in p.catIds for g in self._gts[imgId, cId]]
            dt = [d for cId in p.catIds for d in self._dts[imgId, cId]]
        if len(gt) == 0 and len(dt) == 0:
            return []
        ious = np.zeros((len(dt), len(gt)))

        for j, gt_obj in enumerate(gt):
            gx, gy, gwidth, gheight = gt_obj['bbox']
            gx2, gy2 = gx + gwidth, gy + gheight
            gt_area = gwidth * gheight
            for i, dt_obj in enumerate(dt):
                dx, dy, dwidth, dheight = dt_obj['bbox']
                dx2, dy2 = dx + dwidth, dy + dheight
                dt_area = dwidth * dheight

                inter_w = min(dx2, gx2) - max(dx, gx)
                inter_h = min(dy2, gy2) - max(dy, gy)
                if inter_w <= 0 or inter_h <= 0:
                    continue

                inter_area = inter_w * inter_h
                union_area = dt_area + gt_area - inter_area
                ious[i, j] = inter_area / union_area
        return ious

# 使用自定义的COCOeval进行评估
def evaluate_model(coco_gt, coco_dt):
    coco_eval = CustomCOCOeval(coco_gt, coco_dt, 'keypoints')
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
    return coco_eval.stats
Traceback (most recent call last):
  File "/media/wagnchogn/data/logocap-main/tools/train_net.py", line 362, in <module>
    main()
  File "/media/wagnchogn/data/logocap-main/tools/train_net.py", line 202, in main
    main_worker(
  File "/media/wagnchogn/data/logocap-main/tools/train_net.py", line 339, in main_worker
    perf_indicator = run_test(cfg, InferenceShell, model, test_loader, final_output_dir, logger, use_wandb = args.wandb)
  File "/media/wagnchogn/data/logocap-main/tools/train_net.py", line 149, in run_test
    validation_msg = 'AP = {:.3f}| AP50 = {:.3f}| AP75 = {:.3f}| APM = {:.3f}| APL = {:.3f}'.format(stats[0],stats[1],stats[2],stats[3],stats[4])
UnboundLocalError: local variable 'stats' referenced before assignment

Process finished with exit code 1
import numpy as np
from pycocotools.cocoeval import COCOeval

class CustomCOCOeval(COCOeval):
    def __init__(self, cocoGt=None, cocoDt=None, iouType='keypoints', kpt_oks_sigmas=None):
        super(CustomCOCOeval, self).__init__(cocoGt, cocoDt, iouType)
        if kpt_oks_sigmas is not None:
            self.params.kpt_oks_sigmas = kpt_oks_sigmas

    def computeIoU(self, imgId, catId):
        p = self.params
        if p.useCats:
            gt = self._gts[imgId, catId]
            dt = self._dts[imgId, catId]
        else:
            gt = [g for cId in p.catIds for g in self._gts[imgId, cId]]
            dt = [d for cId in p.catIds for d in self._dts[imgId, cId]]
        if len(gt) == 0 and len(dt) == 0:
            return []
        ious = np.zeros((len(dt), len(gt)))

        for j, gt_obj in enumerate(gt):
            gx, gy, gwidth, gheight = gt_obj['bbox']
            gx2, gy2 = gx + gwidth, gy + gheight
            gt_area = gwidth * gheight
            for i, dt_obj in enumerate(dt):
                dx, dy, dwidth, dheight = dt_obj['bbox']
                dx2, dy2 = dx + dwidth, dy + dheight
                dt_area = dwidth * dheight

                inter_w = min(dx2, gx2) - max(dx, gx)
                inter_h = min(dy2, gy2) - max(dy, gy)
                if inter_w <= 0 or inter_h <= 0:
                    continue

                inter_area = inter_w * inter_h
                union_area = dt_area + gt_area - inter_area
                ious[i, j] = inter_area / union_area
        return ious

    def computeOks(self, imgId, catId):
        p = self.params
        gts = self._gts[imgId, catId]
        dts = self._dts[imgId, catId]
        inds = np.argsort([-d['score'] for d in dts], kind='mergesort')
        dts = [dts[i] for i in inds]
        if len(dts) > p.maxDets[-1]:
            dts = dts[0:p.maxDets[-1]]
        if len(gts) == 0 or len(dts) == 0:
            return []
        ious = np.zeros((len(dts), len(gts)))
        sigmas = p.kpt_oks_sigmas
        vars = (sigmas * 2)**2
        k = len(sigmas)
        for j, gt in enumerate(gts):
            g = np.array(gt['keypoints'])
            xg = g[0::3]; yg = g[1::3]; vg = g[2::3]
            k1 = np.count_nonzero(vg > 0)
            bb = gt['bbox']
            x0 = bb[0] - bb[2]; x1 = bb[0] + bb[2] * 2
            y0 = bb[1] - bb[3]; y1 = bb[1] + bb[3] * 2
            for i, dt in enumerate(dts):
                d = np.array(dt['keypoints'])
                xd = d[0::3]; yd = d[1::3]
                if k1 > 0:
                    dx = xd - xg
                    dy = yd - yg
                else:
                    z = np.zeros((k))
                    dx = np.max((z, x0 - xd), axis=0) + np.max((z, xd - x1), axis=0)
                    dy = np.max((z, y0 - yd), axis=0) + np.max((z, yd - y1), axis=0)
                e = (dx**2 + dy**2) / vars / (gt['area'] + np.spacing(1)) / 2
                if k1 > 0:
                    e = e[vg > 0]
                ious[i, j] = np.sum(np.exp(-e)) / e.shape[0]
        return ious

def evaluate_model(coco_gt, coco_dt, kpt_oks_sigmas=None):
    coco_eval = CustomCOCOeval(coco_gt, coco_dt, 'keypoints', kpt_oks_sigmas=kpt_oks_sigmas)
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
    return coco_eval.stats

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值