最近、ILSVRC_DET データセットの研究をしており、特定のカテゴリのモデルのみをトレーニングしたいと考えています。以下のシェルスクリプトを作成し、2011 年から 2014 年のトレーニングセットとバリデーションセットから特定のカテゴリに関連するすべての画像と注釈ファイルを抽出します。
#!/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 $path を作成中...
find $data_path/xml/ . -type f | xargs grep -l "<name>$num</name>" > $year_path/$path
#元のxmlデータファイルの下で再帰的にディレクトリを検索し、指定されたコードを含むファイルの絶対パスをpath.txtファイルに保存
echo $name を作成中...
cd $year_path/
cat $path | awk -F '/' '{print $NF}' > $name #拡張子を含むファイル名のみを抽出
find -name $name | xargs perl -pi -e 's|.xml||g' #拡張子を削除
echo temp.txt を作成中...
cat $name >> $all_path/temp.txt #重複しないすべてのファイル名を一時ドキュメントに保存
# .xmlドキュメントをコピー
echo ${class}_${year}.xml ドキュメントをコピー中...
cat $path | xargs -i cp -r {} $year_path/Annotations/
#絶対パスに基づいて元のデータを各年のディレクトリにコピー
/bin/cp -rf $year_path/Annotations/*.xml $all_path/Annotations/ #プロンプトなしでコピー
#各年の指定された.xmlファイルをファイル名で検索し、すべての年のデータを1つのディレクトリに統合し、重複する項目を上書き
# .JPEG画像をコピー
echo ${class}_${year}.JPEG 画像をコピー中...
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/
#ファイル名と指定された拡張子を基に各年のデータを検索し、すべての年のデータを1つのディレクトリに統合し、重複する項目を上書き
echo
done
echo ${class}_all_name.txt を作成中...
cd $all_path/
cat temp.txt |sort|uniq > ${class}_all_name.txt
#すべての年のデータ名をソートし、重複するファイル名を削除し、新しいドキュメントに保存
echo 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