解决目标检测API在GPU下训练出现两遍log的问题

https://github.com/tensorflow/models/issues/4881


问题二:

GPU训练对显存与内存使用是基于贪心算法,它会一直尝试获取更多内存,大概训练了100左右step就会爆出如下的错误:

tensorflow.python.framework.errors_impl.InternalError: Dst tensor is not initialized.

网络使用GPU训练时,一般当GPU显存被占满的时候会出现这个错误
解决的方法,就是在训练命令执行之前,首先执行下面的命令行:

Windows SET CUDA_VISIBLE_DEVICES=0

Linux export CUDA_VISIBLE_DEVICES=0

然后训练就会很顺利的执行下去

 

### 实现VOC2012数据集上目标检测 #### 数据预处理 对于VOC2012数据集,在准备阶段,需要确保数据被正确解析并转换成适合模型输入的形式。通常情况下,这涉及到将原始图片及其对应的标注文件加载到内存中,并执行必要的预处理步骤。 - **读取图像和标签** 需要编写代码来遍历指定目录下的所有JPEG格式的图片以及XML形式存储的对象边界框信息。可以借助`xml.etree.ElementTree`库解析这些XML文档,提取出每个物体的位置坐标和其他属性。 - **标准化与增强** 图像尺寸可能不一致,因此有必要统一大小以便于后续批量处理。此外,为了提高泛化能力,还可以引入随机裁剪、翻转等变换作为数据扩增手段之一[^2]。 ```python import os from PIL import Image, ImageEnhance import xml.etree.ElementTree as ET def load_image_and_labels(image_dir, annotation_dir): images = [] labels = [] for filename in os.listdir(image_dir): if not (filename.endswith('.jpg') or filename.endswith('.jpeg')): continue img_path = os.path.join(image_dir, filename) anno_filename = os.path.splitext(filename)[0]+'.xml' anno_path = os.path.join(annotation_dir, anno_filename) tree = ET.parse(anno_path) root = tree.getroot() objects = [] for obj in root.findall('object'): bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) ymin = int(bbox.find('ymin').text) xmax = int(bbox.find('xmax').text) ymax = int(bbox.find('ymax').text) label_name = obj.find('name').text objects.append([label_name, xmin, ymin, xmax, ymax]) image = Image.open(img_path).convert('RGB') # Apply transformations here like resizing and augmentation. enhancer = ImageEnhance.Brightness(image) enhanced_img = enhancer.enhance(1.5) # Example of simple brightness adjustment. resized_image = enhanced_img.resize((300, 300), resample=Image.BILINEAR) images.append(resized_image) labels.append(objects) return images, labels ``` #### 模型选择 当考虑用于VOC2012这样的通用视觉识别任务时,YOLO系列因其高效性和准确性而成为流行的选择。特别是YOLOv3结合MobileNet V1骨干网不仅能够保持较高的精度而且计算成本较低,非常适合资源受限环境下的部署需求。 #### 训练过程最佳实践 在配置训练流程之前,应该先熟悉所选框架的具体要求。例如,在PaddleDetection中,可以通过编辑`.yaml`配置文件来定制各项超参数: - 设置合适的批次大小(batch size),考虑到硬件条件合理分配显存; - 调整初始学习率(initial learning rate),依据经验或网格搜索找到最优解; - 定义损失函数(loss function),一般采用交叉熵加权求和的方式衡量预测值同真实值之间的差距; - 设定最大迭代次数(maximum iterations),即整个训练周期内更新权重的最大循环数目; 最后一步就是调用API启动训练程序了。这里给出一段简化版伪代码示意如何集成上述组件完成最终的任务设定。 ```python from paddle.vision.models.detection.yolo import YOLOv3 from paddle.io import DataLoader from paddlevideo.utils.parser import parse_dataset_config from paddlevideo.engine.trainer import TrainerConfigurator dataset_cfg = '.../datasets/voc.yml' # Path to dataset configuration file runtime_cfg = './runtime.yml' train_loader = DataLoader( ..., batch_size=8, shuffle=True, num_workers=4 ) model = YOLOv3(num_classes=len(class_names)) trainer_conf = TrainerConfigurator( model=model, train_dataloader=train_loader, optimizer='sgd', lr_scheduler='cosine_decay_warmup', epochs=270, save_interval_epochs=10, log_interval_steps=10, work_dir='./output/', resume_checkpoint=None, pre_train_weights=None, use_gpu=True ) trainer_conf.train() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值