hans

hans

【シェル】ILSVRC_DETデータセットから特定のクラスの画像と注釈ファイルを分離する


最近、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

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。