遇到的错误以及参考的博客
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,不然每个文件夹下会出现一个自动保存的文件夹,然后在进行数据处理的时候会报错。需要先选择不要自动保存或者手动删掉文件夹。
- 还有一个小坑就是【如果出现路径的错误,那么请仔细对比,可以使用一下==判断两个路径是否相同,真的就是莫名其妙卡了很久,死活看不出来,我是笨蛋。。。】
一些遇到的报错,在这个博客里面完美解决了
使用faster-rcnn.pytorch训练自己数据集(完整版) - 然后我在训练过程中还出现了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
但是 针对我的数据集,跑出来的结果并不太好,不是很理解出了什么问题。