将图片传到服务器进行物品检测的时候,出现了如下报错:

  File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 60, in __call__
    data = t(data)
  File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmcv/transforms/base.py", line 12, in __call__
    return self.transform(results)
  File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmdet/structures/bbox/box_type.py", line 267, in wrapper
    return func(self, results)
  File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmdet/datasets/transforms/transforms.py", line 154, in transform
    self._resize_img(results)
  File "/home/zzy/mmyolo/mmyolo/datasets/transforms/transforms.py", line 112, in _resize_img
    image = mmcv.imresize(
  File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmcv/image/geometric.py", line 116, in imresize
    resized_img = cv2.resize(
cv2.error: OpenCV(4.10.0) /io/opencv/modules/imgproc/src/resize.cpp:4030: error: (-215:Assertion failed) func != 0 in function 'resize'

但直接在服务器用opencv读取相同图片进行检测确实是没有问题的。

想着可能是struct打包再解包时导致了数据不一致,于是比较了传过来的图片和本地读取的图片,类型都是numpy.arrayshape也都相同,利用numpy.array_equal比较也是相等的。

直接到geometric.py中报错的函数位置打印函数的所有输入(最终的resize.cpp文件没办法直接跳转打开),看起来也是一样。

这就真的很奇怪。

用必应查,直接查报错信息error: (-215:Assertion failed) func != 0 in function 'resize'竟然查不到相近的问题。

没办法直接打开cpp,于是想着找一下报错的那个cpp文件来查一下,搜了“opencv 4.10.0 resize.cpp:4030 代码”,结果反而找到了类似的报错一个很奇怪的 OpenCV出错:resize的坑cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal::resize‘

竟然是图片的numpy array的类型设错了。因为传的时候用了无符号短整型(H)对图片数据进行了打包,想着[0, 255]刚好能满足数据的大小需求,但这样解包得到的数据是无符号短整型,转为numpy array后的数据类型是<class 'numpy.dtype[uint8]'>,而直接imread读取图像得到的数据类型是<class 'numpy.dtype[int64]'>resize处理numpy.uint8就会报上述错误。
额外将解包得到的numpy array通过astype转为numpy.int16终于是正常运行了。

opencv的这个报错信息真的让人莫名其妙。两个array又都是整形,直接print或者保存为文件都看不出差异,怎么也想不到竟然是不同的整型。。。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐