Win10 faster-rcnn pytorch1.0入坑记录及数据集准备

环境:win10 py36 cuda10 pytorch1.0
源代码:pytorch1.0
(如果是pytorch0.4可以看pytorch0.4
两个代码都是linux下的,win10坑很多……
1、遇到的cl.exe找不到或者.cu导致setup.py编译不成功
网上解决问题很多 ,参考链接:参考1以及参考2 修改setup.py文件及一些ROIPooling等cu文件。
也可以去源码的issue将faster-rcnn.pytorch-pytorch-1.0\lib\model\csrc\cuda中的两个ROIXXXXX.cu进行修改。
要修改的就是这两个.cu文件的dim3 grid函数
首先,添加一个函数:

int ceil_div(int a, int b):
    return (a + b - 1) / b;

再将原来的dim3 grid函数修改为:

dim3 grid(std::min(ceil_div((int)grad.numel(), 512), 4096));

然后在执行一下 python setup.py build develop或者python setup.py install。
实在不行,重装cuda或者vs2017我重装完了路径都不用配置直接好了。
2、数据集及预训练模型准备
这个比较坑人,要下voc2007和coco太慢了,不如自制……我使用的是男票给“基情”提供的东北大学的缺陷数据集,一共20m,voc格式,很多博客有链接,就不放上来了。具体怎么准备,看这篇博客
还有就是预训练模型的准备,这个虽然作者给出的链接中的.pth文件后缀是caffe但是不影响使用,各种预训练模型参考pytorch预训练模型
3、代码修改及代码解读
因为在win10下进行训练,相对于linux下面可以使用带参数命令行进行跑代码,很多参数可以在def parse_args()中进行修改,改变defaul值即可,比如使用cuda的话,
parser.add_argument('--cuda', dest='cuda', help='whether use CUDA',default=True, action='store_true')
在原来的基础上加了default=True,不然跑的时候报错(可能我脸黑)。
代码解读
[1]名词解释:AP及mAP
参考知乎
AP:Average Precision
Precision:准确率
Recall:召回率

None Postive(置信度) Negative(置信度)
IOU>X TP TN
IOU<X FP FN
	Preecison=TP/(TP+FP)
	Recall=TP/(TP+FN)
	Interplolated AP(Pascal Voc 2008 的AP计算方式)
	mAP(coco):AP值在所有类别下的均值

[2]代码解读,引用作者提供的口令(应该叫他什么……)

CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
                    --dataset pascal_voc --net res101 \
                    --bs $BATCH_SIZE --nw $WORKER_NUMBER \
                    --lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
                    --cuda

-net :backbone 可以是vgg也可以是resnet
-bs :batch size,一次训练所选取的样本数,参数更新所需要损失函数一组数据加权得到的,这一组数据的数量就是batchsize。
-nw :worker number 我也不知道是啥……
-epoch :1个epoch等于使用训练集中的全部样本训练一次,通俗的讲epoch的值就是整个数据集被轮几次
在网上发现一个大大写的详解,搬运一下!

def parse_args():
  """
  Parse input arguments
  """
  parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')
  parser.add_argument('--dataset', dest='dataset',
                      help='training dataset',
                      default='pascal_voc', type=str) #数据集
  parser.add_argument('--net', dest='net',
                    help='vgg16, res101', #backbone
                    default='vgg16', type=str)
  parser.add_argument('--start_epoch', dest='start_epoch',
                      help='starting epoch',
                      default=1, type=int) #训练的时候epoch从哪开始
  parser.add_argument('--epochs', dest='max_epochs',
                      help='number of epochs to train',
                      default=100, type=int) #迭代多少次
  parser.add_argument('--disp_interval', dest='disp_interval',
                      help='number of iterations to display',
                      default=10, type=int) #在一个迭代中,间隔多少个batch显示
  parser.add_argument('--checkpoint_interval', dest='checkpoint_interval',
                      help='number of iterations to display',
                      default=20, type=int) #每多少个迭代显示
 
  parser.add_argument('--save_dir', dest='save_dir',
                      help='directory to save models', default="/home/faster-rcnn.pytorch/models",
                      type=str)
  parser.add_argument('--nw', dest='num_workers',
                      help='number of worker to load data',
                      default=0, type=int) #加载数据要多少个worker
  parser.add_argument('--cuda', dest='cuda',
                      help='whether use CUDA',default=True,
                      action='store_true') #是否使用cuda
  parser.add_argument('--ls', dest='large_scale',
                      help='whether use large imag scale',
                      action='store_true')  #学习率                    
  parser.add_argument('--mGPUs', dest='mGPUs',
                      help='whether use multiple GPUs',default=True,#我自己加了default默认使用cuda
                      action='store_true') #是否使用cuda
  parser.add_argument('--bs', dest='batch_size',
                      help='batch_size',
                      default=4, type=int)
  parser.add_argument('--cag', dest='class_agnostic',
                      help='whether perform class_agnostic bbox regression',
                      action='store_true') #是否执行类无关的bbox回归
 
# config optimization
  parser.add_argument('--o', dest='optimizer',
                      help='training optimizer',
                      default="sgd", type=str) #优化算法
  parser.add_argument('--lr', dest='lr',
                      help='starting learning rate',
                      default=0.001, type=float) #初始学习率
  parser.add_argument('--lr_decay_step', dest='lr_decay_step',
                      help='step to do learning rate decay, unit is epoch',
                      default=5, type=int)
  parser.add_argument('--lr_decay_gamma', dest='lr_decay_gamma',
                      help='learning rate decay ratio',
                      default=0.1, type=float) #学习率下降率
 
# set training session
  parser.add_argument('--s', dest='session',
                      help='training session',
                      default=1, type=int) #训练会话,针对多gpu
 
# resume trained model #使用训练好的模型
  parser.add_argument('--r', dest='resume',
                      help='resume checkpoint or not',
                      default=False, type=bool)
  parser.add_argument('--checksession', dest='checksession',
                      help='checksession to load model',
                      default=1, type=int)
  parser.add_argument('--checkepoch', dest='checkepoch',
                      help='checkepoch to load model',
                      default=1, type=int)
  parser.add_argument('--checkpoint', dest='checkpoint',
                      help='checkpoint to load model',
                      default=0, type=int)
# log and diaplay
  parser.add_argument('--use_tfboard', dest='use_tfboard',
                      help='whether use tensorflow tensorboard',
                      default=False, type=bool)
 
  args = parser.parse_args()
  return args

4、test_net.py: IOError: [Errno 2] No such file or directory: 'XXXXXX.xml’
在跑test_net.py时候,出现了这个错误,参考进行修改。
在lib/datasets/pascal_voc.py.中修改annopath,直接改成了xml文件的绝对位置,就跑通了。

    def _do_python_eval(self, output_dir='output'):

        # annopath = os.path.join(
        #     self._devkit_path,
        #     'VOC' + self._year,
        #     'Annotations',
        #     '{:s}.xml')
        annopath='D:/Coding/python/faster-rcnn.pytorch-pytorch-1.0/data/VOCdevkit2007/VOC2007/Annotations/'+'{:s}.xml'

5、volatile was removed and now has no effect. Use with torch.no_grad(): instead.
跑demo.py的时候碰见的问题,方法是

 # make variable
  im_data = Variable(im_data, volatile=True)
  im_info = Variable(im_info, volatile=True)
  num_boxes = Variable(num_boxes, volatile=True)
  gt_boxes = Variable(gt_boxes, volatile=True)
  #改为以下四行
  im_data = Variable(im_data)
  im_info = Variable(im_info)
  num_boxes = Variable(num_boxes)
  gt_boxes = Variable(gt_boxes)

发布了42 篇原创文章 · 获赞 16 · 访问量 2871

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/104348041