【已解决】detectron2安装失败: error: identifier “single_box_iou_rotated“ is undefined

部署运行你感兴趣的模型镜像

1、问题描述

当我在detectron2的Github上把安装包下载到本地后,我在Anaconda中通过以下命令对detectron2进行安装:

python -m pip install -e path_to_detectron2_Directory

但是会安装失败并有以下报错:

2、解决办法

修改源码"detectron2\layers\csrc\nms_rotated\nms_rotated_cuda.cu":

修改前:

// Copyright (c) Facebook, Inc. and its affiliates.
#include <ATen/ATen.h>
#include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/CUDAApplyUtils.cuh>
#ifdef WITH_CUDA
#include "../box_iou_rotated/box_iou_rotated_utils.h"
#endif
// TODO avoid this when pytorch supports "same directory" hipification
#ifdef WITH_HIP
#include "box_iou_rotated/box_iou_rotated_utils.h"
#endif

修改后:

// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
#include <ATen/ATen.h>
#include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/CUDAApplyUtils.cuh>
//NOTE: replace relative import
/*#ifdef WITH_CUDA
#include "../box_iou_rotated/box_iou_rotated_utils.h"
#endif
// TODO avoid this when pytorch supports "same directory" hipification
#ifdef WITH_HIP
#include "box_iou_rotated/box_iou_rotated_utils.h"
#endif*/
#include "box_iou_rotated/box_iou_rotated_utils.h"

相关链接:

文章参考1

文章参考2

detectron2_Github

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们之前已经讨论过这个错误,用户再次遇到同样的错误提示,说明问题可能尚未解决。 需要进一步分析可能的原因和提供更详细的解决方案。 回顾:错误是因为编译器在编译时找不到"DEFAULT_APP_ADDR"的定义。 可能的原因: 1. 宏定义确实没有在工程中的任何地方定义。 2. 宏定义在某个头文件中,但该头文件没有被包含到使用它的源文件中。 3. 宏定义被条件编译指令包围,当前编译条件不满足,因此没有被定义。 4. 宏定义拼写错误(例如,在定义和使用时大小写不一致,或者有拼写错误)。 5. 包含宏定义的头文件路径没有添加到编译器的包含路径中。 解决方案: 1. 检查是否在源文件或包含的头文件中定义了DEFAULT_APP_ADDR。如果没有,则需要手动定义(如之前建议)。 2. 检查包含关系:确保在使用DEFAULT_APP_ADDR的源文件中有包含定义它的头文件。 3. 检查条件编译:如果定义是在条件编译中(如#ifdef STM32F4),请确认条件成立。 4. 检查拼写:确认定义和使用的拼写完全一致(包括大小写)。 5. 检查工程设置:在Keil中,检查包含路径是否包含了定义宏的头文件所在目录。 另外,还可以尝试在源文件中显式定义它(作为临时解决方案): #define DEFAULT_APP_ADDR (0x08000000 + 0x8000) // 例:0x08008000 但是,为了工程规范化,建议在合适的头文件中定义,并根据芯片型号进行条件定义。 如果用户已经按照之前的建议做了,但仍然报错,那么需要检查: - 定义宏的位置是否在调用代码之前? - 是否多个地方定义了同一个宏导致冲突?(如果有,编译器可能会给出重定义警告) 调试技巧: - 在Keil中,可以使用“Go To Definition”功能(右键点击标识符)来查看定义位置(如果已经定义且能被Keil识别的话)。 - 如果无法跳转,说明定义确实不存在或者不在当前作用域。 因此,我们给出以下步骤来解决: 步骤1:在源文件顶部添加临时定义(用于验证) 步骤2:编译确认错误是否消失 步骤3:如果消失,说明之前定义未生效,需要将定义移到合适的头文件中,并确保包含该头文件 步骤4:如果工程中已有定义,检查是否被包含,以及是否被条件编译指令包裹 另外,注意在Keil中,可能需要重新加载工程或重新扫描文件(Rebuild)才能使改动生效。 如果用户使用的是分散加载文件(scatter file)定义符号,那么需要在代码中声明外部符号,例如: extern uint32_t Image$$APP$$Base; #define DEFAULT_APP_ADDR ((uint32_t)&Image$$APP$$Base) 并确保在链接时这个符号确实存在(通过.sct文件生成)。 最后,如果用户是在不同的编译环境下(如IAR、GCC等),方法可能不同,需要针对具体环境调整。 现在,根据上述分析,我们给出一个综合回答。 </think> 根据错误信息 `error: #20: identifier "DEFAULT_APP_ADDR" is undefined`,这表明编译器无法识别该标识符。以下是详细解决方案和实施步骤: ### 核心解决方法 #### 1. 明确定义应用程序起始地址 在头文件或源文件中添加宏定义(根据实际芯片型号调整): ```c /* 在 bootloader.h 或 main.c 开头添加 */ #define DEFAULT_APP_ADDR 0x08008000 // STM32F4常用值 /* 如果是STM32F1系列 */ // #define DEFAULT_APP_ADDR 0x08002000 ``` #### 2. 确认内存布局 通过调试器获取实际应用程序地址: 1. 打开编译生成的.map文件 2. 搜索应用程序入口点(通常标记为`Reset_Handler`) 3. 记录其地址作为`DEFAULT_APP_ADDR`的值 #### 3. 检查包含路径 确保定义该宏的文件已被包含: ```c #include "bootloader.h" // 包含宏定义的头文件 ``` #### 4. 链接脚本集成(专业方案) 在分散加载文件(.sct)中添加: ```scatter LR_IROM1 0x08000000 0x00080000 { ; 512KB flash ER_IROM1 0x08000000 0x00010000 { ; Bootloader区域(64KB) *.o (RESET, +First) *bootloader*(+RO) } ER_IROM2 0x08010000 0x00070000 { ; 应用程序区域 .ANY (+RO) } } ``` 然后在代码中引用: ```c extern uint32_t Load$$ER_IROM2$$Base; #define DEFAULT_APP_ADDR ((uint32_t)&Load$$ER_IROM2$$Base) ``` ### 验证步骤 1. **预处理检查**: ```bash armclang -E main.c > preprocessed.c grep "DEFAULT_APP_ADDR" preprocessed.c ``` 查看宏是否被正确展开 2. **内存浏览器验证**: - 在Keil中按`Ctrl+D`打开内存窗口 - 输入`DEFAULT_APP_ADDR`的值 - 确认前4字节是有效的栈顶指针(非`0xFFFFFFFF`) 3. **反汇编确认**: ```c printf("Jump Address: 0x%08X\n", *((volatile uint32_t*)(DEFAULT_APP_ADDR + 4))); ``` 应输出应用程序的复位处理函数地址 ### 常见陷阱排查 1. **大小写问题**: - 检查是否误写为`default_app_addr`(C语言区分大小写) 2. **作用域问题**: - 确保宏定义在使用它的函数之前 3. **条件编译问题**: ```c #if defined(STM32F4) #define DEFAULT_APP_ADDR 0x08008000 #elif defined(STM32F1) #define DEFAULT_APP_ADDR 0x08002000 #else #error "Unsupported chip series" #endif ``` 4. **路径问题**: - 在Keil工程设置中检查头文件包含路径 - 右键点击报错文件 → Options → C/C++ → Include Paths
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值