Pytorch复现Faster-RCNN
5月的最后一天,需要写点什么。
通过前几篇博客对Faster-RCNN算是有了一个比较全面的认识,接下来的半个月断断续续写了一些代码,基本上复现了论文。利用torchvision的VGG16预训练权重,在VOC02007trainval训练13个epoch,最后VOC2007test的map在0.69左右。当然利用caffe预训练的权重结果略好一些。
关于复现过程:起初只是对目标检测方向突然有了兴趣,想玩一玩,但是只跑跑代码看看结果带给人的新奇感仅仅持续了几分钟,所以找了份代码深究了一下,最后结合chainer的实现方案自己成功复现。
关于代码部分:需要加速的部分主要有RoI-Pooling和NMS。也简单看了看Cython,实现了C扩展。可是为了进一步加速需要cuda,这方面没有深究,所以代码可以利用自己实现的C扩展版本,也可以利用别人写好的cuda加速的版本,在调试代码的过程中,为了方便,直接利用法二。剩余其他部分都是自己完成。
关于心态方面:心血来潮想要实现Faster,可是直到实现的时候才发现有些细节根本难以顾及,断断续续写了一些子函数模块后,感觉想要放弃..可想了想以后万一需要再次接触Faster岂不又得重头看起,所以又是断断续续硬着头皮撸。代码大约不到一周写完了,痛苦的事情才刚刚开始,那就是调试。先是一些低级错误,比如类型匹配问题、路径问题等等。然后是逻辑错误,这是最难调试的,初步调试方法是眼瞅,强行瞅出一些基本的逻辑问题,然后是ipdb一行一行的过...前几天每次都能找出一些错误更正后将代码跑通然后回去睡觉,第二天满怀希望来了却发现损失不降,要不就是map太低...每晚都是带着希望回去,第二天发现还是不行... 列几个那几天陆续找出来的隐藏错误:
- PIL读进来的图像,size函数的顺序是(w,h)。而代码默认需要的顺序是(c, h, w)。
- IOU计算错误。这个是自己的算法错误...
- 损失函数计算错误,(n,c,h,w)应该先转换成(n,h,w,c)再reshape为(n,h×w,c)。
- chainer中的roi_pooling函数需要的roi坐标为(xmin, ymin,xmax,ymax),而代码里默认的顺序为(ymin, xmin, ymax, xmax)...
- RPN网络的两个卷积函数没加激活函数...
最初的目标是5月底之前实现Faster,当解决了所有bug之后,map终于正常了,也实现了既定的目标。故作文以记之...突然发现带给我的新奇感又没有了...
来张自己跑出来的测试图吧,纪念平平淡淡的五月,马上就迎来儿童节了...
然后明天就是总决赛了,詹姆斯撑住,撑住...骑士靠你了...头像是科比只是为了好玩...
知乎的两张图..
另外偶然发现了一个很棒的repo,实现了vgg和resnet两种结构,还有几种不同的roi pooling,以及多batch、多GPU,值得多多研究。
注:resnet直接用效果不升反降(当输入的图像尺寸比较小的时候,直接把vgg换成resnet效果反而会下降,但是如果提高输入图像的尺度的话,把vgg替换成resnet-101效果会更好,对于resnet这样非常深的网络,需要更大的尺度输入来让深层的feature map仍然保持空间信息),所以实现细节值得从代码里好好研究下,另外kaiming有一篇论文(Object Detection Networks on Convolutional Feature Maps)试验了rcnn系列目标检测中深层分类与深层特征的设计,以及对Network on Conv feature map (NoC)设计的方法。涉及对不同网络的设计方法,非常值得参考。
Pytorch复现Faster-RCNN的更多相关文章
- 记pytorch版faster rcnn配置运行中的一些坑
记pytorch版faster rcnn配置运行中的一些坑 项目地址 https://github.com/jwyang/faster-rcnn.pytorch 一般安装配置参考README.md文件 ...
- 从编程实现角度学习Faster R-CNN(附极简实现)
https://www.jianshu.com/p/9da1f0756813 从编程实现角度学习Faster R-CNN(附极简实现) GoDeep 关注 2018.03.11 15:51* 字数 5 ...
- Faster R-CNN代码例子
主要参考文章:1,从编程实现角度学习Faster R-CNN(附极简实现) 经常是做到一半发现收敛情况不理想,然后又回去看看这篇文章的细节. 另外两篇: 2,Faster R-CNN学习总结 ...
- Faster RCNN 学习与实现
论文 论文翻译 Faster R-CNN 主要分为两个部分: RPN(Region Proposal Network)生成高质量的 region proposal: Fast R-CNN 利用 reg ...
- 物体检测丨Faster R-CNN详解
这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...
- 实战 | 源码入门之Faster RCNN
前言 学习深度学习和计算机视觉,特别是目标检测方向的学习者,一定听说过Faster Rcnn:在目标检测领域,Faster Rcnn表现出了极强的生命力,被大量的学习者学习,研究和工程应用.网上有很多 ...
- TorchVision Faster R-CNN 微调,实战 Kaggle 小麦检测
本文将利用 TorchVision Faster R-CNN 预训练模型,于 Kaggle: 全球小麦检测 上实践迁移学习中的一种常用技术:微调(fine tuning). 本文相关的 Kaggle ...
- faster r-cnn 在CPU配置下训练自己的数据
因为没有GPU,所以在CPU下训练自己的数据,中间遇到了各种各样的坑,还好没有放弃,特以此文记录此过程. 1.在CPU下配置faster r-cnn,参考博客:http://blog.csdn.net ...
- r-cnn学习系列(三):从r-cnn到faster r-cnn
把r-cnn系列总结下,让整个流程更清晰. 整个系列是从r-cnn至spp-net到fast r-cnn再到faster r-cnn. RCNN 输入图像,使用selective search来构造 ...
- 论文阅读之:Is Faster R-CNN Doing Well for Pedestrian Detection?
Is Faster R-CNN Doing Well for Pedestrian Detection? ECCV 2016 Liliang Zhang & Kaiming He 原文链接 ...
随机推荐
- python要点简要-一日精通python
Python2.x是历史,Python3.x是这门语言的现在和未来.Python2和3大约90%的地方都很相似的. 1.注释 单行注释:在注释的前面输入#号,如下: # 这是一条注释 多行注释:使用三 ...
- nGrinder TestRunner http post json
s nGrinder学习笔记 — post请求 https://blog.csdn.net/meyoung01/article/details/50435881 import HTTPClient.H ...
- Hadoop记录-Hadoop jmx
https://cwiki.apache.org/confluence/display/EAG/Hadoop+JMX+Monitoring+and+Alerting curl http://10.11 ...
- 在Ajax返回多个值
<html> <head> <title>AjaxTest</title> <script type="text/javascript& ...
- html body 100%
html body 100% html <div class="header"> </div> <div class="main" ...
- log 的 debug()、 error()、 info()方法
log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE. ALL. 简单的说,就是 ...
- 归并排序_JAVA
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a = { 6, ...
- 051、在overlay中运行容器(2019-03-18 周一)
参考https://www.cnblogs.com/CloudMan6/p/7294501.html 我们前面创建了overlay网络 ov_net1 ,今天我们运行一个busybox容器并连接到 ...
- git多人协作式开发时分支管理策略
什么是 git-flow? Git Flow是一套使用Git进行源代码管理时的一套行为规范 主分支Master 首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上 ...
- 自定义类使用泛型and方法使用泛型
使用泛型的自定义类,泛型可以使用任意的数据类型,在创建对象的时候确定是什么数据类型,创建对象的时候不使用泛型,那就默认是Object类型 格式: 使用泛型的自定义类 package cn.zhuobo ...