环境: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)