————————————————————————————————————————————
这段时间一直在整理数据用于训练,但是从网上找到的数据集往往很凌乱,不能满足使用要求。这些数据集少则几万,多则几十万几百万。如果手动去整理这些数据集无疑是一个繁重的工作,甚至无法去做!
这个时候则需要我们写脚本去帮助我们做这件事情!本文作者使用的是shell脚本在linux下面进行文件整理。其他脚本诸如javascript,PHP,Python等应该也可以。
作者仅仅是为了工作而去学习的,作为初学者也是充满了迷茫,写的不好,但是问题总算解决了,现在将个人感悟和学习总结如下。
————————————————————————————————————————————+
三个关于人脸年龄的数据集:分别是FG-NET,MORPH和CACD2000.
拿MORPH数据集为例,下载的原始数据是所有人物数据都在一个文件夹内。如下图所示:
而我所需要的结果是:
也就是说,我需要将一个人放在一个子文件夹内,并以其名字命名。
本文所写的脚本是以处理CACD2000数据集为例子,该数据集有2000人,照片共计有16w张。
所写shell脚本主要思路如下:
1.观察数据集合的各个文件名字特点,比如CACD中名字命名规则为:
2.命名规则如,42_Adam_Baldwin_0001.jpg, 则我只需要该子文件名字为Adam_Baldwin,那么在检测的时候就需要读取该文件的名字,然后删除左边数第一个左边的字符和从右边数第一个出现符号的字符。
3.删除之后,则该字符串只剩下Adam_Baldwin这个名字,以这个名字为变量mkdir建立新的子文件夹,然后mv,将文件移到该文件夹内即可。
具体shell脚本代码如下:
#!/负责的金鱼/bashecho "start..."#定义文件的路径folder="/media/cc/科研盘/2016春季科研2/dataset/age data/CACD2000/CACD2000/1"#这里注意加上*.jpg,这样表示文件内所有.jpg结尾的文件,可以避免将文件夹或者其他文件读取。for file in $folder/*.jpgdo#这里`是esc下面的符号,不是单引号temp=`basename $file`#移除左边的字符,%表示移除,_表示该符号左侧var=${temp%_*}#移除右边的字符,#表示移除,_右边字符var1=${var#*_}mkdir $var1#echo $var1#mv表示移动文件夹,cp表示复制mv $temp $var1 #echo $vardone有的时候显示augment list too long,解决办法网上说有4种,我这里采用两种供参考!
1.将脚本写成shell函数,然后调用,即上面的脚本变幻为:
2.继续写脚本,将某些年龄段的图像建立子文件夹,然后将图像移到该文件夹内,分批处理。
比如文件名为23_Amia_brain_0001.jpg,则我只需要读取23,即将——符号右边字符删除,将该文件移到23年龄段对应的子文件夹即可。
作者写的一个脚本如下(不同情况不同对待,只是提供一个思路而已!):