【使用faster-rcnn训练自己的数据集记录】

遇到的错误以及参考的博客

  1. YOLO与voc格式互转,超详细

yolo的数据集格式

---datasetName
    ------images
    		------train
    				------xxx.jpg
    		------val
		    		------xxx.jpg
    ------labels
			------train
    				------xxx.txt
    		------val
		    		------xxx.txt

class, centerx, centery, w,h 其中后四个都是根据照片的长和宽进行归一化的

voc数据集的格式

---VOC2007
    ------Annotations
    ------ImageSets【就是这个拼错了 导致我卡了好久】
          -------Main
                 ----trainval.txt
                 ----train.txt
                 【里面写的是对应的图像或者xml的文件名,没有后缀】
                 ----val.txt
                 ----test.txt
    ------JPEGImages

注意:
但是在数据集进行转换的时候,不用用jupyter notebook,不然每个文件夹下会出现一个自动保存的文件夹,然后在进行数据处理的时候会报错。需要先选择不要自动保存或者手动删掉文件夹。

  1. 还有一个小坑就是【如果出现路径的错误,那么请仔细对比,可以使用一下==判断两个路径是否相同,真的就是莫名其妙卡了很久,死活看不出来,我是笨蛋。。。】
    一些遇到的报错,在这个博客里面完美解决了
    使用faster-rcnn.pytorch训练自己数据集(完整版)
  2. 然后我在训练过程中还出现了nan的情况。。。

rpn_cls: nan, rpn_box: nan, rcnn_cls: 0.0102, rcnn_box 0.0000

参考这个博客faster RCNN训练出现rpn_box: nan, rcnn_cls: nan, rcnn_box nan
需要取消这行的主是才可以看见哪个文件出错了:
print (self.image_index[i])
然后根据终端输出的最后一个文件名去修改对应的xml文件,还得要吧cache文件夹下的文件删掉,不然还是读取之前的文件,然后报错。
但是太多错误了,主要是因为是从yolo格式转成voc格式的,可能在计算的时候,四舍五入超出或者达到图片的边界了,(手动改太慢了,写个脚本对所有文件检查一遍再进行修改吧)

import os
import xml.etree.ElementTree as ET

def truncate_coords(value, max_value):
    if value > max_value:
        return max_value
    elif value < 0:
        return 0
    else:
        return value

def fix_xml_files(xml_dir):
    for filename in os.listdir(xml_dir):
        if filename.endswith('.xml'):
            xml_path = os.path.join(xml_dir, filename)
            tree = ET.parse(xml_path)
            root = tree.getroot()
            
            # Get image size
            size = root.find('size')
            width = int(size.find('width').text)
            height = int(size.find('height').text)
            
            # Truncate coordinates
            for obj in root.findall('object'):
                bbox = obj.find('bndbox')
                bbox.find('xmin').text = str(truncate_coords(int(bbox.find('xmin').text), width - 1))
                bbox.find('ymin').text = str(truncate_coords(int(bbox.find('ymin').text), height - 1))
                bbox.find('xmax').text = str(truncate_coords(int(bbox.find('xmax').text), width - 1))
                bbox.find('ymax').text = str(truncate_coords(int(bbox.find('ymax').text), height - 1))
            
            # Save modified XML file
            tree.write(xml_path)
            print(filename+' done_________________________')

if __name__ == "__main__":
    xml_folder_pth = '/root/faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations'
    xml_files = os.listdir(xml_folder_pth)
    fix_xml_files(xml_folder_pth)

训练的语句

CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --net res101 --cuda --bs 4 --nw 4

我用的是3080,但是只能设置batch size为4,以及将nw为4,一个batch size需要十五分钟左右,相较于yolo类算法慢很多。
验证的语句

python test_net.py --dataset pascal_voc --net res101 --checksession 1 --checkepoch 3 --checkpoint 1605  --cuda

其中–checkepoch表示的是第几个epoch,–checkpoint表示的是被划分成几个batch

但是 针对我的数据集,跑出来的结果并不太好,不是很理解出了什么问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值