Maskrcnn/Faster-rcnn安装过程中使用高版本torch

文章讲述了在安装Maskrcnn/Faster-rcnn时遇到THC.h相关错误,如缺失文件、未定义函数等,提供了包括替换头文件、调整内存管理以及修复torch._six模块等问题的详细解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本项目是作者在安装Maskrcnn/Faster-rcnn时使用高版本torch 遇到的THC.h的错误总结

问题:THC相关的包很多都在pytorch更新的过程中被抛弃了,导致很多.cu文件在安装依赖项时出现了不匹配的问题

fatal error: THC/THC.h: No such file or directory

在/maskrcnn_benchmark/csrc/cuda文件夹中的所有以.cu结尾的代码文件中删除了下述头文件:

#include <THC/THC.h>

并且把所有的:

THCudaCheck(cudaGetLastError());

替换成:

AT_CUDA_CHECK(cudaGetLastError());

“THCudaCheck“ is undefined

将所有文件中的:

THCudaCheck

替换成 

C10_CUDA_CHECK

"THCCeilDiv" is undefined

将所有文件中的:

THCCeilDiv

替换成:

std::min

例如:

dim3 grid(std::min(THCCeilDiv(output_size, 512L), 4096L));
替换
dim3 grid(std::min(((int)(output_size) + 512 -1) / 512, 4096));

THCudaMalloc、THCudaFree THCState undefined

在更新过程中pytorch不再需要malloc和free,也自然不需要state用于帮助申请空间

在使用THCudaMalloc、THCudaFree THCState的文件中添加头文件:

#include <ATen/cuda/ThrustAllocator.h>

注释掉THCState:

THCState *state = at::globalContext().lazyInitCUDA();

THCudaMalloc按照下文的形式修改

//mask_dev = (unsigned long long*) THCudaMalloc(state, boxes_num * col_blocks * sizeof(unsigned long long));
mask_dev = (unsigned long long*) c10::cuda::CUDACachingAllocator::raw_alloc(boxes_num * col_blocks * sizeof(unsigned long long));

THCudaFree的替换方式:

// THCudaFree(state, mask_dev);
c10::cuda::CUDACachingAllocator::raw_delete(mask_dev);

module ‘torch._six‘ has no attribute ‘PY3‘

找到保存文件

maskrcnn_benchmark\utils\imports.py

查看确定导入了PY3

找到site-packages\torch\_six.py文件 ( 是你调用的torch )

将下述代码替换掉之前的代码

import math
import sys
 
inf = math.inf
nan = math.nan
string_classes = (str, bytes)
PY37 = sys.version_info[0] == 3 and sys.version_info[1] >= 7

至此,我的问题已经解决,如果你的问题还没有解决,可以通过减低torch版本来处理


本文是通过从网上搜索多个博客拼接而成,在此感谢:

Maskrcnn/Faster-rcnn依赖项安装过程中THC.h: No such file or directory/THCeilDiv Undefined/分配内存空间等问题的解决方案-优快云博客

identifier “THCudaCheck“ is undefined 的解决方法-优快云博客

[问题解决]module ‘torch._six‘ has no attribute ‘PY3‘_attributeerror: module 'torch._six' has no attribu-优快云博客

提供的相应工作!

### 使用 Faster R-CNN 和 PyTorch 实现实例分割 为了实现实例分割,通常会选择使用 Mask R-CNN 而不是直接使用 Faster R-CNN。这是因为 Mask R-CNN 是在 Faster R-CNN 的基础上进行了扩展和改进,不仅能够检测图像中的对象,还能为每个对象生成精确的像素级分割掩码[^4]。 然而,在某些情况下,如果确实需要利用 Faster R-CNN 来完成类似的任务,则可以通过修改其输出来近似实现简单的实例分割功能。下面是一个简化版的例子,展示如何基于 Faster R-CNN 结合额外模块来进行实例分割: #### 安装依赖库 首先确保安装必要的 Python 库: ```bash pip install torch torchvision torchaudio ``` #### 导入所需包 加载所需的 Python 包以及预训练模型: ```python import torch from PIL import Image import matplotlib.pyplot as plt from torchvision.models.detection.mask_rcnn import maskrcnn_resnet50_fpn, MaskRCNN_ResNet50_FPN_Weights ``` #### 加载预训练模型 这里我们实际上会先加载一个已经包含了实例分割能力的 Mask R-CNN 预训练模型作为起点: ```python weights = MaskRCNN_ResNet50_FPN_Weights.DEFAULT model = maskrcnn_resnet50_fpn(weights=weights) model.eval() ``` #### 准备输入图片 读取并处理要分析的目标图片文件: ```python image_path = "example.jpg" img = Image.open(image_path).convert("RGB") preprocess = weights.transforms() batch = [preprocess(img)] prediction = model(batch)[0] labels = prediction["labels"].tolist() scores = prediction["scores"].tolist() masks = prediction["masks"] > 0.5 boxes = [[(i[0], i[1]), (i[2], i[3])] for i in prediction['boxes'].detach().numpy()] ``` #### 可视化结果 最后绘制带有边界框和遮罩的结果图: ```python plt.figure(figsize=(10, 8)) ax = plt.gca() for label, score, mask, box in zip(labels, scores, masks, boxes): ax.add_patch(plt.Rectangle(*box, fill=False, edgecolor='red', linewidth=2)) ax.text(box[0][0], box[0][1], f'{label} {score:.2f}', bbox=dict(facecolor='yellow', alpha=0.5), fontsize=9, color='black') masked_image = np.zeros_like(np.array(img), dtype=np.uint8) masked_image[mask.squeeze()] = np.array([255, 0, 0]) img_with_mask = cv2.addWeighted(np.array(img), 0.7, masked_image, 0.3, 0) plt.imshow(Image.fromarray(img_with_mask)) plt.axis('off') plt.show() ``` 需要注意的是,这段代码实际上是采用了 Mask R-CNN 模型而不是纯粹意义上的 Faster R-CNN 来执行实例分割操作。对于真正的 Faster R-CNN,由于缺乏内置的支持用于创建逐像素预测的功能,因此无法直接支持完整的实例分割特性;但是可以考虑将其与自定义层或其他第三方工具相结合以达到相似的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值