cocomini-search遇到的坑总结

前段时间突然有了用u版yolov3训练用咱们官方的cocomini数据集的想法,并且咱们官方的数据集一点开就能看到cocomini,不把他弄出来折腾一下,心里总觉得空落落的。
我最先想到的加载查看数据集的方式就是用json,以及for循环,因为我看到了cocomini数据集里面有json格式的数据集说明。具体做法就是:用json.loads()读入,但是。。。。读入之后输出查看时却报错了。


报错提示,用json.loads读的话,字典只能是一行一列的!由此可见,cocomini数据集的json说明是多行多列。
至于for循环查看数据集图片的话就不细说了,用matplotlib,opencv,以及PIL都可以,基本也就是plt.imread(),plt.imshow()
cv2.imread(),cv2.imshow()
Image.open(),Image.show()之类的俩到三行代码。

紧接着我又试了试百度搜索一下关于json格式文件如何处理,基本也就是json.loads;json.dumps;但是也找到了不一样的:使用with open as f:json.load(f).尝试了一下:


没输出成功,也看不太懂警告的含义。

因为使用json包查看读取失败,后来又想到了官方是不是可能有关于cocomini数据集的使用案例,但是找了半天发现,官方没有cocomini数据集的使用教程,但是找到了MNIST数据集的使用教程,查看了之后推测,可能cocomini的使用方法和MNIST类似,于是想到了官方API。紧接着在官方API里面里找到了类似下面的字眼,感觉里面可能找到关于cocomini的说明,所以打算找找看。


在找了一番后,果然找到了相关的介绍:

在查看了文档后,觉得可能需要给这个类传入"root,anno_file"这俩个参数,然后试了一下,

没想到自己粗心大意,丢了“cocomini.json”这个字眼。最后加上后读入成功。紧接着试着用print输出一下,读入结果。但是也只能输出他的长度,类型之类的,print(train_dataset)输出的话,发现他是个惰性对象。

然后我又试了一下print(train_dataset[0]),结果显示:(None,)!呜呜。。。太难了

后来柴老师提醒我看一下官方源码。果然,在里面发现了正确打开cocomini数据集的方式:




通过上面的几行代码我们可以大致推断,使用with open是可以读入cocomini数据集的json说明的,并且读入后他是个字典,需要使用key,value的方式读取里面的内容。

至此,读入查看问题已经得到解决,下面贴上代码:

在查看过后,我想用u版yolov3在cocomini数据集上训练,虽然柴老师提示,megengine和pytorch处理数据都用的是numpy ndarray,但是我上面的方式加载了数据集后,还是不能成功训练。。。可能是我水平有限吧!呜呜呜。。。。


紧接着,我又想,要是把cocomini处理成像官方的自带的coco128数据集那样的格式,可能成功训练的概率会更大一些!说干就干。

官方的label文件夹下存放的txt文件长这样,所以需要把咱们刚才读入的json里面的“anno”的内容合并一下。因为一个“anno”里面保存着一个待检测物体的位置等信息,而一张图片上可能存在多个待检测物体。所以需要用代码合并不同“anno”的内容M,合并时根据“img_id”来判断是否是同一张图片就好了!下面贴上代码:

因为“img_id”很大,所以需要初始化的字典索引也很大,大到六十万!在将不同“anno”的内容合并到同一个txt文件中时,会存在换行问题。起初我打算每读入一个“anno”,就写一次txt,可能是自己代码写错了吧!呜呜呜。。。,不管怎么弄,就是无法在txt里面实现换行,换行的代码是:f.write(s + ‘\n’)。后来干脆放弃了这个想法,想着直接把所有的“anno”都处理完后,再写txt。所以才有了上面的代码,就是把每次读入的“anno”都保存到字典里,将“img_id”作为key,物体的位置信息转换成字符串作为value,并在“s”后面加上“\n”换行。这样的话,假如一张图片上有四个待检测物体,那么“s”里面就会有3个“\n”换行。

在成功的输出了txt文件后,我打算在咱们的megstdio上改改代码试试看看能不能跑。但是突然发现,数据集里面,有14111张图片,但是txt文件只有13992个,突然有点懵!


后来我想着去看看官网文档,看看里面有没有解释。果然,我看到了之前一直没重视的一个参数:“remove_images_without_annotations=False”,我猜测,之所以图片的数量多于txt(也就是“anno”)文件的数量,是因为有的图片没有“anno“。至此,所有的问题都解决了!唯一有点可惜的是,用官方yolov3代码跑cocomini还说没实现,可能是官方的代码太复杂了吧!所以我打算接下来的时间把它用megengine复现一下,写的简单点,这样应该问题不大了吧!哈哈

写得非常好,是一篇带有个人思考和实际练习的笔记。 :grinning:

1赞