Open mykcs opened 4 months ago
您遇到的错误似乎是由库的兼容性和不正确的导入引起的。让我们来分解一下问题及可能的解决方法:
错误分析
/Users/myk/PyPjcts/MemSAM-0415/utils/tools.py
文件中,找不到名为 draw_sem_seg_by_cv2_sum
的函数。可能有几种原因:
tools.py
文件中可能根本没有这个函数。utils
目录的结构可能不正确,或者 tools.py
位于一个无法正确导入的子目录中。visualization.py
和 tools.py
两者中可能存在循环依赖,导致导入问题。解决方法
库版本兼容性:
pip list
或 conda list
来查询。pip
或 conda
重新安装或降级库以匹配兼容的版本。例如,如果您的 PyTorch 是1.10.0,您可以尝试将 Torchvision 安装为 0.11.0: pip install torchvision==0.11.0
。修复导入:
utils/tools.py
文件,确保其中真的存在 draw_sem_seg_by_cv2_sum
函数,并且没有拼写错误。utils
目录的结构。确保该文件夹位于 Python 可以导入包的路径上。如果 MemSAM-0415
是您的项目根目录,utils
应该直接位于它的内部。提示:
conda
或是 venv
) 中测试,以避免在全局安装中产生冲突。requirements.txt
文件,准确列出所有依赖库及其版本。在设置新环境时,这会确保所有东西都安装正确。 如果问题仍然存在,请您提供以下附加信息以供进一步排查:
pip list
或 conda list
)。utils/tools.py
文件的内容(尤其是 draw_sem_seg_by_cv2_sum
函数周围的部分)。MemSAM-0415
的部分目录结构。这两个utils文件似乎都有缺失 visualization.py
evaluation.py
tools.py 文件克隆(2024 0427)
import cv2
import numpy as np
import torch
from scipy.spatial.distance import cdist
from torch import Tensor
def find_contours(mask: Tensor):
h,w = mask.shape
if isinstance(mask, Tensor):
mask = mask.numpy().astype(np.uint8)
edge = np.zeros((h,w), dtype=np.uint8)
contours, _ = cv2.findContours(mask, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE)
assert len(contours) == 1
contours = contours[0].squeeze()
edge[contours[:,1], contours[:,0]] = 1
# check
assert edge.sum() == (edge*mask).sum()
return edge
def find_contour_points(mask: Tensor):
'''
mask: (h,w), 0 or 1
return: contours (n,2)
the x,y of the points
'''
h,w = mask.shape
if isinstance(mask, torch.Tensor):
mask = mask.numpy().astype(np.uint8)
else:
mask = mask.astype(np.uint8)
edge = np.zeros((h,w), dtype=np.uint8)
contours, _ = cv2.findContours(mask, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE)
# assert len(contours) == 1
if len(contours) != 1:
return np.array([])
contours = contours[0].squeeze()
edge[contours[:,1], contours[:,0]] = 1
# check
assert edge.sum() == (edge*mask).sum()
return contours
def hausdorff_distance(mask1: Tensor, mask2: Tensor, percentile: int = 95):
if isinstance(mask1, torch.Tensor) and mask1.device == 'cuda':
mask1 = mask1.cpu()
mask2 = mask2.cpu()
contours1 = find_contour_points(mask1)
contours2 = find_contour_points(mask2)
if contours1.size == 0 or contours2.size == 0:
return 0
dist = cdist(contours1, contours2)
dist = np.concatenate((np.min(dist, axis=0), np.min(dist, axis=1)))
assert percentile >= 0 and percentile <= 100, 'percentile invaild'
hausdorff_dist = np.percentile(dist, percentile)
return hausdorff_dist
对 utils/tools.py
文件内容的分析:
该文件包含三个用于图像处理任务的函数:
find_contours(mask: Tensor)
:该函数接受二值图像掩码(表示为张量)作为输入,并查找图像中前景对象的轮廓。它将掩码转换为 NumPy 数组(如果是张量),使用 OpenCV 的 cv2.findContours
函数查找轮廓,并返回一个二值边缘图像,表示对象的轮廓。
find_contour_points(mask: Tensor)
:该函数也接受二值图像掩码作为输入,并查找前景对象的轮廓点。它遵循与 find_contours
函数类似的过程,但它不返回边缘图像,而是返回包含轮廓点 (x, y) 坐标的数组。
hausdorff_distance(mask1: Tensor, mask2: Tensor, percentile: int = 95)
:该函数计算两个二值图像掩码之间的 Hausdorff 距离。它首先将掩码转换为 NumPy 数组(如果是张量),使用 find_contour_points
函数为每个掩码查找轮廓点,并使用 SciPy 的 cdist
函数计算一个轮廓中的所有点到另一个轮廓中最近点的成对距离。然后,它计算这些距离的百分位数(默认值为 95%)作为两个掩码之间的 Hausdorff 距离。
该代码结构良好,并正确实现了这些功能。以下是一些其他观察结果:
find_contours
函数断言应该找到正好一个轮廓,这对于对象分割任务可能是合理的假设。hausdorff_distance
函数包括检查以确保有效的百分位数值。总的来说,utils/tools.py
中的代码似乎功能齐全,并实现了用于图像处理任务的有用实用程序,特别是与查找和分析对象轮廓相关的任务。
通过google,bing搜索引擎,github,stackoverflow搜索, 关键词:
from utils.tools import draw_sem_seg_by_cv2_sum
utils tools draw_sem_seg_by_cv2_sum
draw_sem_seg_by_cv2_sum
from utils.tools import corr, bias, std
from utils.tools import corr
没有直接结果