mykcs / MemSAM-0415

MIT License
0 stars 0 forks source link

cannot import name 'draw_sem_seg_by_cv2_sum' from 'utils.tools' #2

Open mykcs opened 4 months ago

mykcs commented 4 months ago
/Users/myk/anaconda3/envs/seg-test-0401/bin/python /Users/myk/PyPjcts/MemSAM-0415/train_video.py 
/Users/myk/anaconda3/envs/seg-test-0401/lib/python3.8/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: dlopen(/Users/myk/anaconda3/envs/seg-test-0401/lib/python3.8/site-packages/torchvision/image.so, 0x0006): Symbol not found: __ZN3c1017RegisterOperatorsD1Ev
  Referenced from: <8E58E83E-9235-3324-9B6B-260614F85F69> /Users/myk/anaconda3/envs/seg-test-0401/lib/python3.8/site-packages/torchvision/image.so
  Expected in:     <77E8847E-95AD-3EF9-9314-BA1E83C408ED> /Users/myk/anaconda3/envs/seg-test-0401/lib/python3.8/site-packages/torch/lib/libtorch_cpu.dylib
  warn(f"Failed to load image Python extension: {e}")
Traceback (most recent call last):
  File "/Users/myk/PyPjcts/MemSAM-0415/train_video.py", line 20, in <module>
    from utils.evaluation import get_eval
  File "/Users/myk/PyPjcts/MemSAM-0415/utils/evaluation.py", line 16, in <module>
    from utils.visualization import visual_segmentation, visual_segmentation_npy, visual_segmentation_binary, visual_segmentation_sets, visual_segmentation_sets_with_pt
  File "/Users/myk/PyPjcts/MemSAM-0415/utils/visualization.py", line 11, in <module>
    from utils.tools import draw_sem_seg_by_cv2_sum
ImportError: cannot import name 'draw_sem_seg_by_cv2_sum' from 'utils.tools' (/Users/myk/PyPjcts/MemSAM-0415/utils/tools.py)

进程已结束,退出代码为 1
gemini202403 commented 4 months ago

您遇到的错误似乎是由库的兼容性和不正确的导入引起的。让我们来分解一下问题及可能的解决方法:

错误分析

解决方法

  1. 库版本兼容性:

    • 找出您安装的 PyTorch 和 Torchvision 的确切版本。您可以使用 pip listconda list 来查询。
    • 参考 PyTorch 的官方网站(https://pytorch.org/)或 Torchvision 的官方网站(https://pytorch.org/vision/stable/index.html)以找到与您的 PyTorch 版本相匹配的 Torchvision 版本。
    • 使用 pipconda 重新安装或降级库以匹配兼容的版本。例如,如果您的 PyTorch 是1.10.0,您可以尝试将 Torchvision 安装为 0.11.0: pip install torchvision==0.11.0
  2. 修复导入:

    • 检查 utils/tools.py 文件,确保其中真的存在 draw_sem_seg_by_cv2_sum 函数,并且没有拼写错误。
    • 验证 utils 目录的结构。确保该文件夹位于 Python 可以导入包的路径上。如果 MemSAM-0415 是您的项目根目录,utils 应该直接位于它的内部。
    • 了解循环导入的工作原理,以及如何断开依赖性。可以在模块之间建立清晰的依赖关系,以避免出现此问题。

提示:

如果问题仍然存在,请您提供以下附加信息以供进一步排查:

mykcs commented 4 months ago

这两个utils文件似乎都有缺失 visualization.py

image

evaluation.py

image
mykcs commented 4 months ago

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
gemini202403 commented 4 months ago

utils/tools.py 文件内容的分析:

该文件包含三个用于图像处理任务的函数:

  1. find_contours(mask: Tensor):该函数接受二值图像掩码(表示为张量)作为输入,并查找图像中前景对象的轮廓。它将掩码转换为 NumPy 数组(如果是张量),使用 OpenCV 的 cv2.findContours 函数查找轮廓,并返回一个二值边缘图像,表示对象的轮廓。

  2. find_contour_points(mask: Tensor):该函数也接受二值图像掩码作为输入,并查找前景对象的轮廓点。它遵循与 find_contours 函数类似的过程,但它不返回边缘图像,而是返回包含轮廓点 (x, y) 坐标的数组。

  3. hausdorff_distance(mask1: Tensor, mask2: Tensor, percentile: int = 95):该函数计算两个二值图像掩码之间的 Hausdorff 距离。它首先将掩码转换为 NumPy 数组(如果是张量),使用 find_contour_points 函数为每个掩码查找轮廓点,并使用 SciPy 的 cdist 函数计算一个轮廓中的所有点到另一个轮廓中最近点的成对距离。然后,它计算这些距离的百分位数(默认值为 95%)作为两个掩码之间的 Hausdorff 距离。

该代码结构良好,并正确实现了这些功能。以下是一些其他观察结果:

总的来说,utils/tools.py 中的代码似乎功能齐全,并实现了用于图像处理任务的有用实用程序,特别是与查找和分析对象轮廓相关的任务。

mykcs commented 4 months ago

通过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

没有直接结果