我的设置是
python 3.9 numpy 1.21.0 cuda 10.2
现在我在接收两条错误消息时遇到问题。
一个是: 错误:pycocotools 无法运行:“numpy.float64”对象不能被解释为整数
第二个是: 错误:pycocotools 无法运行:numpy.ndarray 大小已更改,可能表示二进制不兼容。预期来自 C 标头的 88,从 PyObject 获得 80
情况是,我寻找封闭的问题并找到了解决方案。对于第一个错误,降级 numpy是许多人的解决方案。(下至 1.16.5)
对于第二个错误,升级 numpy是许多人的解决方案。(最高 1.21.0)
因此,如果我升级 numpy,会出现第一个问题,降级,会出现第二个问题。相反的解决方案。
我一直在尝试在不降级我的 numpy 的情况下解决第一个错误,但进展并不顺利。
这是下面的问题代码。
# Save JSON
if save_json and len(jdict):
f = 'detections_val2017_%s_results.json' % \
(weights.split(os.sep)[-1].replace('.pt', '') if isinstance(weights, str) else '') # filename
print('\nCOCO mAP with pycocotools... saving %s...' % f)
with open(f, 'w') as file:
json.dump(jdict, file)
try: # https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoEvalDemo.ipynb
# THIS IS WHERE THE CODE STOPS WHEN SECOND ERROR OCCURS
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
imgIds = [int(Path(x).stem) for x in dataloader.dataset.img_files]
cocoGt = COCO(glob.glob('../coco/annotations/instances_val*.json')[0]) # initialize COCO ground truth api
cocoDt = cocoGt.loadRes(f) # initialize COCO pred api
#THIS IS WHERE THE CODE STOPS WHEN FIRST ERROR OCCURS
cocoEval = COCOeval(cocoGt, cocoDt, 'bbox')
cocoEval.params.imgIds = imgIds # image IDs to evaluate
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()
map, map50 = cocoEval.stats[:2] # update results (mAP@0.5:0.95, mAP@0.5)
except Exception as e:
print('ERROR: pycocotools unable to run: %s' % e)
下面是每个 cocoGt 和 cocoDt 的值和类型
<pycocotools.coco.COCO 对象位于 0x000002351F4CE6A0> <class 'pycocotools.coco.COCO'>
<pycocotools.coco.COCO 对象位于 0x000002351F4E58E0> <class 'pycocotools.coco.COCO'>
cocoEval = COCOeval(cocoGt, cocoDt, 'bbox') 我认为这部分是代码中最可疑的部分我试图用 int 覆盖值 (cocoGt, cocoDt) 但它没有显示错误: int()参数必须是字符串、类似字节的对象或数字,而不是 'COCO'。
下面是 cocoeval.py 的一部分,其中包含cocoEval = COCOeval(cocoGt, cocoDt, 'bbox')的定义,以防它可能是有用的信息。
def __init__(self, cocoGt=None, cocoDt=None, iouType='segm'):
'''
Initialize CocoEval using coco APIs for gt and dt
:param cocoGt: coco object with ground truth annotations
:param cocoDt: coco object with detection results
:return: None
'''
if not iouType:
print('iouType not specified. use default iouType segm')
self.cocoGt = cocoGt # ground truth COCO API
self.cocoDt = cocoDt # detections COCO API
self.params = {} # evaluation parameters
self.evalImgs = defaultdict(list) # per-image per-category evaluation results [KxAxI] elements
self.eval = {} # accumulated evaluation results
self._gts = defaultdict(list) # gt for evaluation
self._dts = defaultdict(list) # dt for evaluation
self.params = Params(iouType=iouType) # parameters
self._paramsEval = {} # parameters for evaluation
self.stats = [] # result summarization
self.ious = {} # ious between all gts and dts
if not cocoGt is None:
self.params.imgIds = sorted(cocoGt.getImgIds())
self.params.catIds = sorted(cocoGt.getCatIds())
非常感谢您的宝贵时间