用自己的数据集训练faster-rcnn时出现的一些问题及总结(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37203756/article/details/79939093

关于faster-rcnn的原理训练流程及其数据集的制备,已经都已完成。那么问题来了,“自己制备的数据集,比如说自己为了增强数据集,进行图片翻转操作,然后记录坐标这样的数据集,在训练的过程中出现的问题”

一、在调用append_flipped_images函数时出现: assert (boxes[:, 2] >= boxes[:, 0]).all()

网上查资料说:出现这个问题主要是自己的数据集标注出错。由于我们使用自己的数据集,可能出现x坐标为0的情况,而pascal_voc数据标注都是从1开始计数的,所以faster rcnn代码里会转化成0-based形式,对Xmin,Xmax,Ymin,Ymax进行-1操作,从而会出现溢出,如果x=0,减1后溢出为65535。更有甚者,标记坐标为负数或者超出图像范围。红色标注的确实是可能出现的问题,因为我在图像增强的时候,在对图片坐标取值,确实没有考虑到坐标出现为0和标记坐标超图图像范围。这两种情况通过自己的数据集看确实出现了,但是自己的数据集量又太大,不可能进行一一查找。解决方案如下:

  1. 修改lib/datasets/imdb.py,在boxes[:, 2] = widths[i] - oldx1 - 1后插入:
for b in range(len(boxes)):  
    if boxes[b][2]< boxes[b][0]:  
        boxes[b][0] = 0  

      2.修改lib/datasets/pascal_voc.py中_load_pascal_annotation函数,该函数是读取pascal_voc格式标注文件的,下面几句中的-1全部去掉(pascal_voc标注是1-based,所以需要-1转化成0-based,如果我们的数据标注是0-based,再-1就可能溢出,所以要去掉)。如果只是0-based的问题(而没有标注为负数或超出图像边界的坐标),这里就应该解决问题了.但是我的问题还没有解决,显然因为我的标记坐标有超出图像的范围了。

二、运行程序时出现:InternalError: Dst tensor is not initialized.

这个问题的主要原因是,我在jupyter notebook上跑的程序,查找资料才发现出现这个错误一般是GPU内存耗尽,挂在后台进程中的IPython内核会这样做。

解决方案如下:

1.重启 -------------最为简单粗暴的做法

2.运行程序之前,先运行export CUDA_VISIBLE_DEVICES=1,仅显卡设备1GPU可见,tensorflow 算是一个比较贪心的工具了就算用device_id指定gpu 也会占用别的GPU的显存资源 必须在执行程序前执行export CUDA_VISIBLE_DEVICES=n(n为可见的服务器编号)再去执行 代码.py 才不会占用别的GPU资源


展开阅读全文

没有更多推荐了,返回首页