Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于数据集结构和摆放逻辑问题 #3

Open
WY51BE opened this issue Mar 12, 2020 · 7 comments
Open

关于数据集结构和摆放逻辑问题 #3

WY51BE opened this issue Mar 12, 2020 · 7 comments

Comments

@WY51BE
Copy link

WY51BE commented Mar 12, 2020

想问一下,为什仫要新建images文件夹
这是是pytorch版本的特殊要求吗
是否可以直接将.data文件中train.txt里面图片的路径直接指向JPEGImages?

@pprp
Copy link
Owner

pprp commented Mar 12, 2020

这是他数据集特殊的要求,具体你可以查看datasets.py。
所以需要按照readme中描述的格式整理数据集。

代码已经集成好了,改一下create_all中的参数即可生成。

@WY51BE
Copy link
Author

WY51BE commented Mar 13, 2020

那这个结构可以理解为,是专门为了cocoAPI而做的么
如果不需要cocoAPI操作的话,是不是就不用构造这种结构
只需要把.data的路径都写对就可以了

因为我看你的主页代码里面,voc_label.py中最后面
for image_id in image_ids:
list_file.write('JPEGImages/%s.jpg\n'%(image_id))
convert_annotation(year, image_id)
list_file.close()

os.system("cat 2007_train.txt 2007_val.txt > train.txt") #修改为自己的数据集用作训练

还是把train.txt和2007_test.txt中图片的路径指向了JPEGImages
那么也就是.data在读取图片路径的时候,实际还是从JPEGImages里面读取的

而如果要是.data中train和val两个对应的是指向这种特殊结构的话
那么train.txt中图片路径应该对应images/train2014
2007_test.txt中图片路径应该对应images/val2014
那么这样的话,voc_label.py目前这个代码不行吧

能否告知,.data中,几个txt文件对应的路径
以及您新建了一个label文件夹,那么网络是如知道从label中读取的呢这个接口在哪
看到之前应该都是从labels中读取的

最后是您给我回复的结构和您发出来的太一样
train2014

  • images
    • 1.jpg
  • labels
    • 1.txt
      val2014
  • images
    • 2.jpg
  • labels
    • 2.txt

      • images
        • train2014
          • 0001.jpg
          • 0002.jpg
        • val2014
          • 0003.jpg
          • 0004.jpg
      • labels
        • train2014
          • 0001.txt
          • 0002.txt
        • val2014
          • 0003.txt
          • 0004.txt
            应该采用哪个版本呢?

@pprp
Copy link
Owner

pprp commented Mar 13, 2020

你需要修改2007_train.txt和2007_test.txt中的内容,让其指向images/train2014/0001.jpg。
另外应该采用readme中的版本,上一个comment中的结构是不正确的。
具体为何要这么做,你可以看一下yolov3里边的datasets.py文件,你就可以明白了。

简单来说是通过.data文件找到2007_train.txt文件,访问其中的具体图片路径如:
/home/xxx/VOCdevkit/VOC2007/images/train2014/111.jpg
而对应label的获取是通过将images字段直接替换为labels字段,jpg替换为txt,也就是:
/home/xxx/VOCdevkit/VOC2007/labels/train2014/111.txt
这样访问到对应的xml文件,这就是为何要按照以上格式进行准备数据集。

@WY51BE
Copy link
Author

WY51BE commented Mar 13, 2020

还想请问一下,images/val2014/XX.jpg是由谁指向的,是哪个txt找到这里面的图片

因为既然.data是可以区分train和val的,那么放在一个文件夹images里面,不也是可以的嘛
就是太明白为什么单独又扩建了两个文件夹train2014和val2014

@pprp
Copy link
Owner

pprp commented Mar 13, 2020

images/val2014/XX.jpg由.data文件中的valid=2007_test.txt文件指向的。
对应的txt文件应该是:labels/val2014/XX.txt

第二个问题的话你说的实现方式也是可以的,这里只是遵循了原作者建议的目录结构。
我个人觉得目前这种比较方便,分开处理比较好。

@WY51BE
Copy link
Author

WY51BE commented Mar 13, 2020

感谢您的回答,我对这个结构越来越清晰了。

还有一个问题想请教您,就是在voc_label.py中
最后一行,有一个合并,有时候会将2007_train.txt和2007_val.txt合并为train.txt
然后在.data中将
train = train.txt
val = 2007_test.txt
这是为什仫

那么如果我不产生合并的情况
val是应该对应2007_val.txt还是去对应2007_test.txt呢

@pprp
Copy link
Owner

pprp commented Mar 13, 2020

机器学习中最规范的做法是划分训练集、验证集、测试集。但是有时候开发的项目的时候会选择将训练集和验证集合并,整体作为训练集,然后直接在测试集上进行测试模型效果。

将2007_train.txt和2007_val.txt合并得到train.txt代表的是以上过程。

当然也可以按照规范的做法,在训练集上训练,每个epoch结束后在验证集上测试结果。
直到选择出最好的模型,最终再到测试集上测试结果。

classes=1 
train=./data/2007_train.txt
valid=./data/2007_val.txt 
# valid=./data/2007_test.txt # 测试的时候取消注释使用2007_test.txt中内容进行测试
names=data/template.names
backup=backup/
eval=coco

@pprp pprp changed the title 关于images 关于数据集结构和摆放逻辑问题 Mar 13, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants