hans

hans

【Shell】从ILSVRC_DET数据集中单独拿出某一类图片和注释文件


最近在研究 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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。