最近在研究 ILSVRC_DET 的数据集,想只训练检测某些指定类别的模型。写了下面 shell 脚本用来提取 2011-2014 年比赛 train sets 和 val
sets 中所有有关指定类别的图片和注释文件。
#!/bin/sh
stage=val #我把训练集和验证集分在不同文件夹下面了
classes=(person)
nums=(n00007846) #ILSVRC对应的编码
years=(2011 2012 2013)
root="/media/hans/000DABD1000BEFA8/ImageNet" #存放所有文件的第一层目录
i=0 #递归编码用
for class in ${classes[@]};
do
all_path="$root/Home/${class}/all"
mkdir -p $all_path/Annotations/ #最后所有文件集中放在一起的目录
mkdir -p $all_path/JPEGImages/
num=${nums[$i]} #配合class,递归编码用,使它们保持指定同一类别
for year in ${years[@]};
do
data_path="$root/ILSVRC$year/$stage" #指定原始数据位置
year_path="$root/Home/${class}/${year}" #指定每一年数据位置
name="${class}_${year}_name.txt" #每一年所有文件名目录,无后缀名
path="${class}_${year}_path.txt" #绝对路径
mkdir -p $year_path/Annotations/
mkdir -p $year_path/JPEGImages/
echo creat $path ...
find $data_path/xml/ . -type f | xargs grep -l "<name>$num</name>" > $year_path/$path
#在原始xml数据文件下递归搜索所有目录,寻找包含指定编码的文件,并把该文件绝对路径保存到path.txt文件中
echo creat $name ...
cd $year_path/
cat $path | awk -F '/' '{print $NF}' > $name #把包含后缀名的文件名提取出来
find -name $name | xargs perl -pi -e 's|.xml||g' #删掉后缀名
echo creat temp.txt ...
cat $name >> $all_path/temp.txt #把所有文件名不覆盖的保存到临时文档中
# copy .xml ducoments
echo copy ${class}_${year}.xml documents ...
cat $path | xargs -i cp -r {} $year_path/Annotations/
#根据绝对路径复制原始数据到每一年目录中
/bin/cp -rf $year_path/Annotations/*.xml $all_path/Annotations/ # cp without prompt
#根据文件名搜索每一年指定.xml文件,整合所有年份数据到一个目录中,覆盖重复项
#copy .JPEG images
echo copy ${class}_${year}.JPEG images ...
cat $name | xargs -i find $data_path/img/ . -name {}.JPEG | xargs -i cp {} $year_path/JPEGImages/
#根据文件名和指定的后缀名搜索原始数据,并保存到每一年的目录中
/bin/cp -rf $year_path/JPEGImages/*.JPEG $all_path/JPEGImages/
#根据文件名和指定后缀名搜索每一年数据,整合所有年份数据到一个目录中,覆盖重复项
echo
done
echo create ${class}_all_name.txt ...
cd $all_path/
cat temp.txt |sort|uniq > ${class}_all_name.txt
#将包含所有年份的数据名排序,删除重复文件名,保存到新文档中。
echo delete temp.txt ...
rm temp.txt
let i+=1 #配合class,递归编码用,使它们保持指定同一类别 #i=$i+1
done
刚开始接触并尝试写脚本,在网上查了很多资料。发现脚本的世界很大,很多不同的命令可以实现相同的效果。慢慢学。
目录设计比较多,因为这样可以大大缩短递归搜索所用的时间。另外压缩文件是放到每一年份目录下的,解压后的东西放到对应子目录中。上面脚本是放到 Home 目录下。
下面是目录设置树
ImageNet -|
|- Home
|- ILSVRC2011 -|
| |- train -|
| | |- img
| | |- xml
| |- val -|
| |- img
| |- xml
|- ILSVRC2012 -|
| |- train -|
| | |- img
| | |- xml
| |- val -|
| |- img
| |- xml
|- ILSVRC2013 -|
| |- train -|
| | |- img
| | |- xml
| |- val -|
| |- img
| |- xml
|- ILSVRC2014 -|
| |- train -|
| | |- img
| | |- xml
| |- val -|
| |- img
| |- xml