用PaddlePaddle 实现目标检测任务——Paddle Fluid v1.1深度测评
2. 如果数据没有按要求保存,则需要在reader.py修改数据路径: class Settings(object): def __init__(self, dataset=None, data_dir=None, label_file=None, resize_h=300, resize_w=300, mean_value=[127.5, 127.5, 127.5], apply_distort=True, apply_expand=True, ap_version='11point'): self._dataset = dataset self._ap_version = ap_version # 把data_dir替换为数据所在路径 self._data_dir = data_dir if 'pascalvoc' in dataset: self._label_list = [] label_fpath = os.path.join(data_dir, label_file) for line in open(label_fpath): self._label_list.append(line.strip()) 1. 如果遇到NoneType is not iterable的错误,一般是由于数据读取错误导致的,仔细检查文件路径应该可以解决。 2. 读取PascalVOC数据集用reader.py文件中的pascalvoc()函数,两个数据集的文件结构和标注不太一样,Paddle为我们写好了两个版本数据集的读取方法,可以直接调用。 4.5模型训练数据读取完成后,就可以着手开始模型的训练了,这里直接使用PaddlePaddle SSD model里面的train.py进行训练: python -u train.py train.py里为所有的超参数都设置了缺省值,不熟悉PaddlePaddle参数调整的工程师可以直接用缺省参数进行训练,非常方便。如果需要,可以根据下表进行对应超参数的修改: 在执行脚本时,传入相应的参数值即可,例如: python -u train.py --batch_size=16 --epoc_num=1 --dataset='pascalvoc' --pretrained_model='pretrain/ssd_mobilenet_v1_coco/' 4.5.1单机多卡配置单机多卡的配置相较于多机多卡配置较为简单,参数需要先在GPU0上初始化,再经由fluid.ParallelExecutor() 分发到多张显卡上。这里可以使用fluid.core.get_cuda_device_count()得到可用显卡数量,也可以自己定义用几张显卡。 train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name, main_program=fluid.default_main_program()) train_exe.run(fetch_list=[loss.name], feed={...}) 4.5.2参数调整PaddlePaddle这一套SSD模型给了使用者非常大的自由度,可以对网络结构、损失函数、优化方法等多个角度对模型进行调整。本文采用的是基于MobileNet的SSD,如果想使用基于VGG的SSD,可以自己修改工程中的mobilenet_ssd.py文件,把里面定义的MobileNet Program更改为VGG的Program描述就可以了;如果需要修改损失函数或优化方法,则在train.py中找到build_program()函数,在 with fluid.unique_name.guard("train"): loss = fluid.layers.ssd_loss(locs, confs, gt_box, gt_label, box, box_var) loss = fluid.layers.reduce_sum(loss) optimizer = optimizer_setting(train_params) optimizer.minimize(loss) 里修改损失函数或优化器即可;修改batch_num、epoch_num、learning rate等参数可以直接在train.py传入参数中进行。 4.5.3模型保存模型在COCO数据集上训练完后,可以用fluid.io.save_persistables()方法将模型保存下来,我们实现了如下save_model()函数来将模型保存到指定路径。 def save_model(postfix, main_prog, model_path): model_path = os.path.join(model_save_dir, postfix) if os.path.isdir(model_path): shutil.rmtree(model_path) print('save models to %s' % (model_path)) fluid.io.save_persistables(exe, model_path, main_program=main_prog) 4.5.4继续训练(编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |