深度学习中大数据整理问题

————————————————————————————————————————————
这段时间一直在整理数据用于训练,但是从网上找到的数据集往往很凌乱,不能满足使用要求。这些数据集少则几万,多则几十万几百万。如果手动去整理这些数据集无疑是一个繁重的工作,甚至无法去做!
这个时候则需要我们写脚本去帮助我们做这件事情!本文作者使用的是shell脚本在linux下面进行文件整理。其他脚本诸如javascript,PHP,Python等应该也可以。
作者仅仅是为了工作而去学习的,作为初学者也是充满了迷茫,写的不好,但是问题总算解决了,现在将个人感悟和学习总结如下。
————————————————————————————————————————————+

一、本文作者整理的数据集

三个关于人脸年龄的数据集:分别是FG-NET,MORPH和CACD2000.
拿MORPH数据集为例,下载的原始数据是所有人物数据都在一个文件夹内。如下图所示:
深度学习中大数据整理问题_第1张图片

而我所需要的结果是:

深度学习中大数据整理问题_第2张图片
也就是说,我需要将一个人放在一个子文件夹内,并以其名字命名。

本文所写的脚本是以处理CACD2000数据集为例子,该数据集有2000人,照片共计有16w张。
所写shell脚本主要思路如下:
1.观察数据集合的各个文件名字特点,比如CACD中名字命名规则为:
深度学习中大数据整理问题_第3张图片

2.命名规则如,42_Adam_Baldwin_0001.jpg, 则我只需要该子文件名字为Adam_Baldwin,那么在检测的时候就需要读取该文件的名字,然后删除左边数第一个左边的字符和从右边数第一个出现符号的字符。

3.删除之后,则该字符串只剩下Adam_Baldwin这个名字,以这个名字为变量mkdir建立新的子文件夹,然后mv,将文件移到该文件夹内即可。

具体shell脚本代码如下:

#!/bin/bash

echo "start..."

#定义文件的路径
folder="/media/cc/科研盘/2016春季科研2/dataset/age data/CACD2000/CACD2000/1"

#这里注意加上*.jpg,这样表示文件内所有.jpg结尾的文件,可以避免将文件夹或者其他文件读取。
for file in $folder/*.jpg

do
#这里`是esc下面的符号,不是单引号
temp=`basename $file`
#移除左边的字符,%表示移除,_表示该符号左侧
var=${temp%_*}
#移除右边的字符,#表示移除,_右边字符
var1=${var#*_}

mkdir $var1
#echo $var1
#mv表示移动文件夹,cp表示复制
mv $temp $var1 
#echo $var
done

有的时候显示augment list too long,解决办法网上说有4种,我这里采用两种供参考!
1.将脚本写成shell函数,然后调用,即上面的脚本变幻为:

#定义函数
function mv()
#!/bin/bash

echo "start..."

#定义文件的路径
folder="/media/cc/科研盘/2016春季科研2/dataset/age data/CACD2000/CACD2000/1"

#这里注意加上*.jpg,这样表示文件内所有.jpg结尾的文件,可以避免将文件夹或者其他文件读取。
for file in $folder/*.jpg

do
#这里`是esc下面的符号,不是单引号
temp=`basename $file`
#移除左边的字符,%表示移除,_表示该符号左侧
var=${temp%_*}
#移除右边的字符,#表示移除,_右边字符
var1=${var#*_}

mkdir $var1
#echo $var1
#mv表示移动文件夹,cp表示复制
mv $temp $var1 
#echo $var
done
#调用mv函数
mv()

2.继续写脚本,将某些年龄段的图像建立子文件夹,然后将图像移到该文件夹内,分批处理。
比如文件名为23_Amia_brain_0001.jpg,则我只需要读取23,即将——符号右边字符删除,将该文件移到23年龄段对应的子文件夹即可。
作者写的一个脚本如下(不同情况不同对待,只是提供一个思路而已!):

#!/usr/bin/env sh
echo "start.."
folder="/home/cc/Age/data/11111"
#mkdir 1 2 3 4 5 6 
for file in $folder/*
do
temp=`basename $file`
var=${temp%_*}
#定义20,30,40,50,60,70年龄段
var1 =20
var2=30
var3=40
var4=50
var5=60
var7=70
#var1=${temp#*_}
echo "$var"
#依据不同的情况建立1,2,3,4,5,6,7文件夹,并且分别将不同的文件移动到对应的文件夹。
if [$var<$var1]
then
mkdir 1
mv $temp 1
else
mkdir 2
mv $temp 2
elif [20<$var&&$var<=30]
then
mv $temp 2
elif [30<$var&&$var<= 40]
then
mv $temp 3
elif [40<$var&&$var<= 50]
then
mv $temp 4
elif [50<$var&&$var<= 60]
then
mv $temp 5
elif [60<$var&&$var<= 70]
then
mv $temp 6
else
mkdir 7
mv $temp 7
#echo "wrong..."
fi
echo "done...."
done

你可能感兴趣的:(Shell)