Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 741|回复: 0

【目标检测-网络测试1】RFBNet代码复现及问题解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-21 20:49:59 | 显示全部楼层 |阅读模式

    为理解空洞卷积的详细作用以及对应的操作,对RFBNet进行复现。

    代码位置:https://github.com/ruinmessi/RFBNet

     

    完成下载后,执行./make.sh时出现下面的错误:

     

    根据网上一篇博客说是Cython模块没有安装的原因,但是安装后,仍然没有效果

     

    看着错误一步步进行更改:

     

     

    1、根据错误提示,(PyObject **)(PyObject *PyObject * const *Py_ssize_t))meth函数给的参数太多,根据需要删除一个参数,而看一下每个参数的概念以及对应的类型名称,最后决定应当删除NULL

     

    2、显示在PyThreadState中没有exc_typeexc_valueexc_traceback成员变量,通过查阅资料,以及看PyThreadState的源码了解到在版本1.5,变量名称使用curexc_typecurexc_value以及curexc_traceback代替。所以这个错误只需要直接进行对应变量名的替换即可。

     

    需要改的内容分别在utils/nms/cpu_nms.cutils/nms/gpu_nms.cutils/pycocotools/_mask.c,将这些文件进行上述修改即可。

     

    此时执行完成./make.sh

    在完成make.sh,配置好相关信息后,使用train_RFB.py文件进行训练,此时我是直接使用RFB_mobile版本的checkpoints,使用VOC数据集进行训练,同时设置size300

    python train_RFB.py -d VOC -v RFB_mobile -s 300
    -d:dataset的格式,VOC或COCO
    -v:使用的RFBNet的版本,RFB_vgg、RFB_mobile、RFB_E_vgg
    -s:图片的size

    其中还有一些其他的参数,可以从train_RFB.py代码中详细查看,其中最主要的要设定网络的basenet

     

    在此基础上,通过对应的github下载了mobilenet_feature.pth,当然下载vgg16的操作也是类似的,这些都只是一个预训练的模型。

     

    在这个过程中,我也遇到了一些问题,因为当时的服务器上的0GPU已经被两个程序占用,剩余的内容非常小,而且RFBNet中的代码使用CUDA又是从服务器中的第一个GPU开始启动的,所以最后出现了

    RumtimeError: CUDA Error, out of memory.

     

    当时我很奇怪,明明还有其他的GPU卡没有被占用,为什么不能直接调用,最后发现是程序本身的问题,或者也可以说是CUDA配置的问题。默认的CUDA_VISIBLE_DEVICES是包含所有的GPU卡的,而且没有预先定义CUDA_VISIBLE_DEVICES在使用时也会出错;在网上看到的一个解决方法就是更改默认的可见GPU的序号,使用如下代码:

    import os
    os.environ[‘CUDA_VISIBLE_DEVICES’]=’2,3’

    在程序设置过程中,CUDA_VISIBLE_DEVICES被视为一个字符串,需要用引号进行赋值,但是在设置过程中,一直出现大致是说CUDA_VISIBLE_DEVICES不存在的意思,最后查看了一下声明的变量里面确实没有这个,所以需要在命令行中执行一下命令:

    export CUDA_VISIBLE_DEVICES=0,1,2,3,4

    不管其他,我觉得系统的变量还是最好能将整个服务器所有的GPU的序号都包括进去是比较好的,在使用的时候可以在当前程序中直接指定修改使用哪个GPU会更好。

     

    之后就可以按照自己的需要进行训练或者测试了

    1)我在训练时,使用RFB_mobile,共进行了epoch=200多次,最后保存的pth在205次。这个训练代码可以每10次进行保存一次。

     2)然后使用最后的训练结果进行测试 

    python test_RFB.py -d VOC -v RFB_mobile -s 300

    当然在test_RFB.py文件中也需要对对应的checkpoints的路径进行更改。

     这里的mAP仅有70.2%,我觉得一方面是因为我只训练了200多个epoch,总共有1500个左右,训练不够充分,同时也有使用了RFB_mobile模型的缘故,如果直接使用RFB_vgg可能效果会更好。

     

     

    最后,我认为对于复现代码,最好是能够自己独立解决报错的信息,在这个过程中可以发现以前编辑的代码与现在的不同之处,同时也能够锻炼一下自己解决问题的能力,而不是直接就上网开始搜对应的教程什么的。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 10:13 , Processed in 0.063199 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表