【在mmdetection中,利用YOLOv3训练、测试自己的数据集——voc格式转换为coco格式】

voc格式的数据集转换为coco格式数据集

本人最近在mmdetection中学习深度学习,记录一下遇到的问题和解决方法。
之前呢,利用faster rcnn在自己的voc格式的数据集上进行了训练和测试,效果一般。现在计划换用yolov3进行训练。
而mmdetection中yolov3模型使用的数据集格式为coco数据集格式,因此首先要进行数据的格式转换。网上的其他教程大都不全,因此自己整理一下。
【在mmdetection中,利用YOLOv3训练、测试自己的数据集——voc格式转换为coco格式】
如上图,即为coco数据集的格式。
其中train2017、val2017、test2017里面分别放置用于训练、验证、测试的图片。
annotations中包含instances_train.json、instances_val.json以及instances_test.json文件。.json里面包括了“images”,“annotations”,“type”,"categories"等信息。"images"存放每个图像的名字宽高及图像id;"annotations"存放对应相同图像id的图像box的四个坐标位置及该框的类别id;"categories"则表示每个类别id到该类真实名字的对应关系。
————————————————
原文链接:https://blog.csdn.net/qq_45584615/article/details/115802378

1.voc_to_coco

可参考:
voc_to_coco https://github.com/Stephenfang51/VOC_to_COCO

根据提示,修改三类img的数量及路径之后,发现出现以下错误,而原文也没给出答复。
【在mmdetection中,利用YOLOv3训练、测试自己的数据集——voc格式转换为coco格式】
该报错应该是操作权限问题,在修改文件夹权限无果之后,将原文程序中"voc_annotations“的相对路径改为绝对路径,即可解决这个问题。

2. 图片分割成三个文件夹

然而在运行上述程序之后,发现只按要求生成了annotations文件夹下的三个.json文件、images文件夹(所有的img)以及三个xml文件夹(里边分别是用于train、val、test的图片的xml文件),并没有生成用于train、val、test的三类img图片的文件夹。因此我自己写了一个程序,根据xml文件名(或者.json文件中的file_name)对images文件夹进行分割。`
代码

#本程序用于img文件分割,根据train、val以及test的xml文件目录生成对应的jpg文件夹  2022/02/19 phil
import os
import cv2
xml='/database/phy/code/mmdetection/data/VOCdevkit/xml/'  #train、val、test三个xml文件夹的根目录
xmltrain_path=os.path.join(xml,'xml_train/')
xmlval_path=os.path.join(xml,'xml_val/')
xmltest_path=os.path.join(xml,'xml_test/')
img_path='/database/phy/code/mmdetection/data/VOCdevkit/VOC2007_COCO/images/' #所有img的目录
#目标目录,包括三类img的文件夹
splitimg_path='/database/phy/code/mmdetection/data/VOCdevkit/VOC2007_COCO/splitimages/'
os.mkdir(splitimg_path)   #创建新目录
print(xmltrain_path)
print(xmlval_path)
print(xmltest_path)
traindirs=os.listdir(xmltrain_path)
valdirs=os.listdir(xmlval_path)
testdirs=os.listdir(xmltest_path)
print(traindirs)
print(valdirs)
print(testdirs)
trainimg=os.path.join(splitimg_path,'train2017/')
valimg=os.path.join(splitimg_path,'val2017/')
testimg=os.path.join(splitimg_path,'test2017/')
os.mkdir(trainimg)
os.mkdir(valimg)
os.mkdir(testimg)
for i in os.listdir(img_path):
    ixml=i[0:-3]+'xml'
    if ixml in traindirs:
        img=cv2.imread(os.path.join(img_path,i))
        cv2.imwrite(os.path.join(trainimg,i),img)
    elif ixml in valdirs:
        img=cv2.imread(os.path.join(img_path,i))
        cv2.imwrite(os.path.join(valimg,i),img)
    elif ixml in testdirs:
        img=cv2.imread(os.path.join(img_path,i))
        cv2.imwrite(os.path.join(testimg,i),img)

将路径以及文件名进行简单修改后,就可以生成三个对应的文件夹了,分别是train2017、val2017以及test2017,里边分别是三类用途的img图片。加上之前生成的annotations文件夹中的三个.json文件,coco格式的数据集就制作好了。亲测可用。
至此,voc格式数据集就成功地转换为coco格式的数据集了!虽然有点麻烦,但是达到目的就好。接下来就可以在此coco数据集上进行yolov3的训练和测试啦。

参考:
[1]: https://blog.csdn.net/qq_45584615/article/details/115802378?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-1-115802378.pc_agg_new_rank&utm_term=mmdetection+yolov3%E8%AE%AD%E7%BB%83&spm=1000.2123.3001.4430

上一篇:出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误的筛查


下一篇:指定mybatis-generator使用的配置文件