39、使用NCNN+YOLOFast/YOLOV5,实现视频流/图片的自动化的labelme标注数据&python labelimg自动化

本文介绍了如何结合NCNN和YOLO进行视频流及图片的自动化标注,利用C++调用NCNN框架,并借助rapidjson生成labelme格式的json数据。同时提到了python的labelimg工具作为辅助,以及更新到YOLOv5的标注数据处理。

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

基本思想: 首先使用c++调用了腾讯的开源框架NCNN,然后使用腾讯的rapidjson实现自动化的labelme格式化json生成,实现了自动化识别和标注数据,人工稍微修正存在错误的数据集即可;(可以python调用该静态包,但是比较喜欢c++O(∩_∩)O哈哈~)该工程的源代码:

https://github.com/sxj731533730/Autolabel.git

第一步:首先下载NCNN源代码:GitHub - Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform

ubuntu@ubuntu:~$ git clone https://github.com/Tencent/ncnn.git
ubuntu@ubuntu:~$ cd ncnn/
ubuntu@ubuntu:~/ncnn$ ./build.sh  

然后在目录/home/ubuntu/ncnn/build-host-gcc-linux/src/ 会生成一个静态包libncnn.a

第二步:下载android版本的对应包:

<think>嗯,用户提到了一个关于Android开发中的错误,具体是“Lcom/tencent/yolov5ncnn/YoloV5Ncnn;)V”标红线。首先,我需要确定这个错误出现的上下文。通常,在Android开发中,Java或Kotlin代码里如果引用了一个不存在的类或方法,IDE(比如Android Studio)会标红线提示错误。 接下来,分析这个错误的组成部分。字符串“Lcom/tencent/yolov5ncnn/YoloV5Ncnn;)V”看起来像是一个方法签名或类引用。在Java字节码中,类名通常以“L”开头,后面跟包名和类名,用斜杠分隔,最后以分号结束。例如,“Lcom/tencent/yolov5ncnn/YoloV5Ncnn;”表示类com.tencent.yolov5ncnn.YoloV5Ncnn。后面的“)V”可能表示方法的参数和返回类型,其中“V”代表void。 所以,可能的错误场景是,在某个地方调用了YoloV5Ncnn类的方法,但方法签名不正确,或者类本身不存在。可能的原因包括: 1. **类未正确导入或不存在**:检查项目中是否确实存在YoloV5Ncnn类,并且包路径正确。如果使用了第三方库,可能需要检查依赖是否正确添加。 2. **方法签名错误**:如果是在JNI或反射中调用,方法签名必须严格匹配。例如,方法参数类型或返回类型不匹配会导致错误。 3. **ProGuard混淆问题**:如果启用了代码混淆,可能该类被混淆或移除了,需要在ProGuard规则中保留。 4. **编译问题**:有时候项目没有正确编译或同步,重新构建或清理项目可能有帮助。 用户可能需要按照以下步骤排查: - 确认YoloV5Ncnn类存在,并且包路径正确。 - 检查方法调用处的代码,确认方法名和参数是否正确。 - 如果使用了JNI,检查方法签名是否符合JNI规范。 - 检查构建配置,确保相关依赖项正确添加。 - 查看编译日志或运行时的错误堆栈,获取更多信息。 可能还需要用户提供更多上下文,比如错误出现的具体代码位置,以及相关的代码片段,以便更准确地诊断问题。</think>在Android开发中,遇到类似 `Lcom/tencent/yolov5ncnn/YoloV5Ncnn;)V` 的标红错误,通常与 **JNI方法签名不匹配** 或 **类/方法未正确加载** 有关。以下是逐步排查指南: --- ### 一、错误原因分析 1. **格式解析** - `Lcom/tencent/yolov5ncnn/YoloV5Ncnn;` 表示一个类引用,对应Java类路径:`com.tencent.yolov5ncnn.YoloV5Ncnn` - `)V` 表示方法签名:参数列表结束符`)` + 返回类型`V`(void) 2. **常见触发场景** - 在JNI调用时,C++代码中的方法签名与Java层声明不一致 - 动态反射调用类方法时,类路径或方法签名拼写错误 - 依赖的JAR/AAR未正确引入,导致类找不到 --- ### 二、排查步骤 #### 1. 检查类是否存在 - 确认项目中存在 `com.tencent.yolov5ncnn.YoloV5Ncnn` 类: - 如果是第三方库(如ncnnYOLOv5封装),检查 `build.gradle` 是否添加依赖: ```groovy dependencies { implementation files(&#39;libs/yolov5ncnn.aar&#39;) // 或具体路径 } ``` - 如果是本地代码,检查包路径和文件名是否匹配。 #### 2. 验证方法签名 - 如果涉及JNI调用,需严格匹配签名格式: - **Java方法示例**: ```java public native void detectYolo(byte[] data); // 假设返回void ``` - **对应的JNI签名**应为:`([B)V` - **签名工具验证**:使用 `javap -s` 生成准确签名: ```bash javap -s com.tencent.yolov5ncnn.YoloV5Ncnn ``` #### 3. 检查JNI注册代码 - 如果是通过动态注册(`RegisterNatives`),检查C++代码中的签名: ```cpp static JNINativeMethod methods[] = { {"detectYolo", "([B)V", (void*)detectYolo} // 方法名、签名、函数指针 }; ``` #### 4. 排查ProGuard混淆 - 在 `proguard-rules.pro` 中添加保留规则: ```proguard -keep class com.tencent.yolov5ncnn.YoloV5Ncnn { *; } ``` #### 5. 清理并重新构建 - 执行以下操作清除缓存: - **菜单栏** → `Build` → `Clean Project` - **菜单栏** → `Build` → `Rebuild Project` - 删除 `.gradle` 和 `build` 文件夹后重试 --- ### 三、典型解决方案 #### 场景1:JNI签名不匹配 - **错误代码**: ```cpp env->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(JNINativeMethod)); ``` - **修复方法**:确保 `methods` 数组中的签名与Java层完全一致。 #### 场景2:类未正确引入 - 如果依赖本地SO库,检查 `CMakeLists.txt` 或 `Android.mk` 是否包含: ```cmake add_library(yolov5ncnn SHARED IMPORTED) set_target_properties(yolov5ncnn PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libyolov5ncnn.so) ``` --- ### 四、扩展建议 - 使用 **Android Studio的NDK调试工具** 检查JNI调用栈 - 在 `logcat` 中过滤关键字 `NoSuchMethodError` 或 `ClassNotFoundException` 定位问题 如果问题仍未解决,请提供 **完整错误日志** 和 **相关代码片段** ,以便进一步分析。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sxj731533730

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值