生成train.txt和val.txt的案例程序解释
该问参考自:1:https://blog.csdn.net/JACK_YOUNG007/article/details/89482265 2:https://blog.csdn.net/gaohuazhao/article/details/69568267
#!/usr/bin/env sh //在linux的一些脚本里,需在开头一行指定脚本的解释程序,脚本用env启动的原因,是因为脚本解释器在linux中可能被安装于不同的目录,
env可以在系统的PATH目录中查找。同时,env还规定一些系统环境变量。
DATA=examples/myfile4/data
MY=examples/myfile4/data
echo "Create train.txt..."
rm -rf $MY/train.txt //表示清除该路径下的train.txt文件
//下面是生成train.txt标签文件的.sh文件指令
$DATA/train其中DATA是train数据的目录,表示的是图片的具体目录,DATASAVE是train.txt保存的路径
-name ground*.jpg的意思呢是指的是以ground开头的图片名字
cut -d ‘/’ -f4-5是截取图片的路径,调整-f后面的数字可设置几级路径,
此处为cut指令的用法,具体表示请百度,此处表示以’/’为分隔符,由于该指令在caffe目录下执行,
之后路径为examples/myfile4/data/train然后是图片名字,所以要采取的图片的名字为第5个,所以为-f5,下
面val集的图片路径为examples/myfile4/data/val然后是图片名字,为第5个,所以为-f5
sed “s/$/ 1/”是在其后面加上 1(空格和1)
$MY/train.txt 表示在/examples/myself/data路径下产生train.txt,并将以上内容全部保存到此。
find $DATA/train -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/train.txt
find $DATA/train -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/train.txt
find $DATA/train -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/train.txt
find $DATA/train -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/train.txt
find $DATA/train -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/train.txt
find $DATA/train -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/train.txt
find $DATA/train -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/train.txt
find $DATA/train -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/train.txt
find $DATA/train -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/train.txt
find $DATA/train -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/train.txt
echo "Create test.txt..."
rm -rf $MY/val.txt
find $DATA/val -name 15001*.jpg | cut -d '/' -f4-5 | sed "s/$/ 0/">>$MY/val.txt
find $DATA/val -name 15059*.jpg | cut -d '/' -f4-5 | sed "s/$/ 1/">>$MY/val.txt
find $DATA/val -name 62047*.jpg | cut -d '/' -f4-5 | sed "s/$/ 2/">>$MY/val.txt
find $DATA/val -name 68021*.jpg | cut -d '/' -f4-5 | sed "s/$/ 3/">>$MY/val.txt
find $DATA/val -name 73018*.jpg | cut -d '/' -f4-5 | sed "s/$/ 4/">>$MY/val.txt
find $DATA/val -name 73063*.jpg | cut -d '/' -f4-5 | sed "s/$/ 5/">>$MY/val.txt
find $DATA/val -name 80012*.jpg | cut -d '/' -f4-5 | sed "s/$/ 6/">>$MY/val.txt
find $DATA/val -name 92002*.jpg | cut -d '/' -f4-5 | sed "s/$/ 7/">>$MY/val.txt
find $DATA/val -name 92017*.jpg | cut -d '/' -f4-5 | sed "s/$/ 8/">>$MY/val.txt
find $DATA/val -name 95005*.jpg | cut -d '/' -f4-5 | sed "s/$/ 9/">>$MY/val.txt
echo "All done"
上述的验证集文件夹 bird 图片和 cat 图片没有分开,是依靠图片名字的字符串作为区分标准。但在大数据集的情况下,建议以文件夹作为区分标准(细节之处不同,实际工作可以提高效率)。另一种实现方法实现 create_filelist.txt 文件:
准备工作:
原始数据:train文件夹下的bird图片和cat图片分别在各自的文件夹下,即train文件夹下有两个文件夹,bird和cat。
但是val文件夹目录下并没有再分开bird和cat,而是将验证集10张bird和10张cat一起放到了val文件夹下。
这是上述方法的图片数据的存储格式。
变更之处:此处需要将val文件夹下新建两个文件夹,bird和cat1 (因为在代码中需要使用该文件夹名称,
而cat是Ubuntu中的一个指令,冲突)。
同时将train文件夹下的cat文件夹重命名为cat1,将10张bird图片放到bird文件夹下,10张cat文件夹放到cat_1文件夹下,即可!
其他步骤都一样,只是将create_filelist.sh代码部分换成下列代码:
代码:
DATA=data/myself
MY=examples/myself
echo "Create train.txt..."
rm -rf $DATA/train.txt
ls $DATA/train/bird | sed "s:^:bird/:" | sed "s/$/ 1/">>$MY/train.txt
ls $DATA/train/cat1 | sed "s:^:cat1/:" | sed "s/$/ 2/">>$MY/train.txt
echo "Create val.txt..."
rm -rf $DATA/val.txt
ls $DATA/val/bird | sed "s:^:bird/:" | sed "s/$/ 1/">>$MY/val.txt
ls $DATA/val/cat1 | sed "s:^:cat1/:" | sed "s/$/ 2/">>$MY/val.txt
echo "All done"
代码解释:
此处代码和上面代码的改变之处就是将find和cut命令替换为了ls命令,ls表示列举,具体含义可以百度。
依据文件区分不同类别的数据图片,而不是图片名称中的字符串。