问题:
用新版mmdetection跑通自己的数据集。数据集的格式是voc格式的。
解决办法:
一、数据集准备
将所有的图片放在
./data/VOCdevkit/VOC2007/JPEGImage
将所有的标签放在
./data/VOCdevkit/VOC2007/Annotations
将图片划分训练集、验证集和测试集,名字存在txt文件里
./data
└── VOCdevkit
└── VOC2007
├── Annotations # 标注的VOC格式的xml标签文件
├── JPEGImages # 数据集图片
└── ImageSet
└── Main
├── test.txt # 划分的测试集
├── train.txt # 划分的训练集
├── trainval.txt
└── val.txt # 划分的验证集
划分代码在下面,将生成4个txt文件:
#读取文件夹下的文件并将其文件名(无后缀)分成4份保存在保存在一个txt文件中
#作者:阿玉
#时间:2020.5.12
#说明:文件分为训练集、验证集和测试集,tranval为训练集和验证机的合集。
#为了划分数据集写的
#可修改参数:将被划分的文件夹路径,存储txt文件的路径及4个文件的名字,固定随机数的seed,
#训练集和验证集的占比,共8个参数
import os
import random
trainval_percent = 0.8 #确定用于训练的数据占比
train_percent = 0.75 #确定在用于训练的数据中,训练集的占比
xmlfilepath = r'F:\AdatabaseForGraduation\vocModify\all_voc' #将被划分的xml文件
txtsavepath = r'F:\AdatabaseForGraduation\vocModify' #划分后 得到的txt保存的地方
#固定随机数的生成
random.seed(4)
total_xml = os.listdir(xmlfilepath) #读取文件夹下所有文件的名字
num = len(total_xml) #文件夹下文件的数目
list = range(num)
tv = int(num * trainval_percent) #trainval的数目
tr = int(tv * train_percent) #train的数目
trainval = random.sample(list, tv) #被选中的文件编号
train = random.sample(trainval, tr)
ftrainval = open(os.path.join(txtsavepath,'trainval.txt'), 'w') #打开文件等待写入
ftest = open(os.path.join(txtsavepath,'test.txt'), 'w')
ftrain = open(os.path.join(txtsavepath,'train.txt'), 'w')
fval = open(os.path.join(txtsavepath,'val.txt'), 'w')
for i in list:
name = total_xml[i][:-4] + '\n' #去后缀,换行
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
附
坏图检测程序,程序报 NoneType has no attribute to shape
很可能数据集中有坏图,可以先查一遍是不是数据出错,再考虑程序问题。
# coding=utf-8
import os.path
import cv2 #导入opencv库
path = r'/data/scratchData/VOCdevkit/VOC2007/JPEGImages'
# 得到文件夹下所有文件名称
pics