MXNet中对classification任务提供了把训练图像数据转换成一个大的二进制文件的方法,但是,对于其它任务例如语义分割等,并没有提供类似的功能。这里,介绍一下如何使用LMDB的Python接口把语义分割训练数据的图像和标签转换成LMDB的文件。首先,这里简要介绍一下问什么要把图像文件转换成大的二进制文件。
为什么要转换
为什么要把很多图像文件转换成一个大文件?
简单来说,是因为读写小文件的速度太慢。那么, 不禁要问,图像数据也是二进制文件,单个大的二进制文件例如LMDB文件也是二进制文件,为什么单个图像读写速度就慢了呢?这里分两种情况解释。
机械硬盘的情况:机械硬盘的每次读写启动时间比较场,例如磁头的寻道时间占比很高,因此,如果单个小文件读写,尤其是随机读写单个小文件的时候,这个寻道时间占比就会很高,最后导致大量读写小文件的时候时间会很浪费;
NFS的情况:在NFS的场景下,系统的一次读写首先要进行上百次的网络通讯,并且这个通讯次数和文件的大小无关。因此,如果是读写小文件,这个网络通讯时间占据了整个读写时间的大部分。
固态硬盘的情况下应该也会有一些类似的开销,目前没有研究过。
LMDB 的使用方法
LMDB 是一个key value 内存映射的数据库。内存映射的意思就是说,LMDB在使用的时候,会把磁盘上的数据映射到内存中,因此,只顺序读写的情况下,相当于直接在内存中操作数据,因此速度很快。另外,在网络训练场景中存储的LMDB数据是一个二进制文件,因此,也克服了上一