1. 概要
525種別の鳥のデータセット BIRDS 525 SPECIES – IMAGE CLASSIFICATION を使用して Ultralytics YOLOv8の物体検出ニューラルネットワークの training を試しました。
物体検出ニューラルネットワークを training し、training 用の画像データセットに含まれる鳥の種別と位置を推定できるようにすることを目的としています。
各画像に1羽ずつ画像全体に広がるサイズで鳥が撮影された BIRDS 525 データセットのみで YOLOv8n の物体検出ニューラルネットワークを training したところ、BIRDS 525 のテスト画像を使用した鳥の種別と位置の推定はほぼ意図通り動作しました。
ただ、画像の一部の領域に鳥が位置する私のほうで撮影した画像を入力とした場合、多くの画像で推定に失敗してしまいました。そのため、学習画像のサイズを大きく変えて training するよう、学習画像に変化を付ける augmentation の scale パラメータをデフォルト値よりも大きくしました。これにより私が撮影したテスト画像を入力とする推定の結果は少し改善されました。
また、枚数は少ないですが、私が撮影した画像の一部の領域に鳥が位置するデータを training 用の train, validation データに含めるようにしました。BIRDS 525 データセットの画像サイズは 224 x 224 pixel ですが、私が撮影した画像のサイズは 6000 x 4000 pixel です。Ultralytics YOLO で、YOLOv8n を training させた際は、画像サイズをサイズの小さな BIRDS 525 データセットの画像サイズ 224 x 224 pixel に合わせないと training は期待したように進みませんでした。私が撮影した画像も解像度の低い 224 x 224 pixel (縦横の長さが異なるときはアスペクト比を保ったままリサイズし、空いたスペースは 0 で padding されるようです) に合わせることになり、この組み合わせでは推定結果はあまり改善されませんでした。
次は、私のほうで撮影した training 用の画像を多く用意し、どのような結果になるかを試せたらと考えています。近場で撮影可能な鳥の種別は季節により変化しますが、楽しみながら少しずつデータセットを充実させていけたらと考えています。
下記の手順では、NVIDIA GeForce GTX 1650 (GPGPU) をセットしたデスクトップパソコン ESPRIMO WD2/H2 を使用しました。プログラムは Windows 11 の WSL2 上の Ubuntu 22.04 で実行しました。
こちらのページの一番下の表のスペックの PC を使用しました。
2. Ultralytics YOLO format のデータセットの作成
2.1. 最新の Ultralytics YOLO をインストール
こちらのページの手順で最新の Ultralytics YOLO をインストールします。
2.2. BIRDS 525 SPECIES – IMAGE CLASSIFICATION データセットのダウンロード
こちらのページからBIRDS 525 SPECIES – IMAGE CLASSIFICATION データセットをダウンロードします。
2.3. Ultralytics YOLO format のデータセットの作成
こちらのGitHubのページに BIRDS 525 データセットから Ultralytics YOLO format のデータセットを作成する Python Script を用意しました。下記のコマンドを実行し、GitHub から Python Script を取得します。
git clone https://github.com/fukagai-takuya/birds525yolo.git
下記のコマンドを実行し、BIRDS 525 データセットから Ultralytics YOLO format のデータセットを作成します。下記のコマンドの path/to/kaggle/birds525/archive/ は BIRDS 525 データセットの置かれたディレクトリのパスです。path/to/outputdir/ は Ultralytics YOLO format データセットの出力先ディレクトリです。
python3 ./create_yolo_dataset_from_birds525_limit_bird_species.py path/to/kaggle/birds525/archive/ path/to/outputdir/
こちらのページの README に記載したように create_yolo_dataset_from_birds525_limit_bird_species.py の下記の行を修正すると、出力されるデータセットの鳥の種別を変更することができます。修正しない場合、”BLUE HERON”, “MALLARD DUCK”, “EUROPEAN TURTLE DOVE”, “ROCK DOVE” の4種別の鳥の Ultralytics YOLO format データセットが出力されます。
def update_train_valid_subdirectory_dict(subdirectories, labels, subdir_dict): ... target_bird_species = [ 'BLUE HERON', 'MALLARD DUCK', 'EUROPEAN TURTLE DOVE', 'ROCK DOVE', ] ...
2.4. 学習データ内の鳥の種別について
BIRDS 525 データセットには 525 種別の鳥のデータが用意されていますが、上記のコードの例のように私の住んでいる場所の近くで見かける鳥に近い種別の鳥を 4種別だけ選ぶことにしました。
“BLUE HERON” は私が近場で見かけるアオサギ “GREY HERON” とは異なりますが、外観は近いため学習データとして使用することにしました。マガモ “MALLARD DUCK” は近くの川で見かけます。”EUROPEAN TURTLE DOVE” は近くで見かけるキジバト “ORIENTAL TURTLE DOVE” とは異なりますが、外観は近いため学習データとして使用することにしました。カワラバト “ROCK DOVE” もよく見かけます。
学習する鳥の種別を絞り込んだ理由の一つは training 時間の短縮になります。条件を変えて何度も training を実行したかったため、種別を絞り込みました。
2.5. BIRDS 525 データセットを Ultralytics YOLO format に変換するスクリプトについて
データセットBIRDS 525 SPECIES – IMAGE CLASSIFICATIONには画像分類用の training, validation, test 画像が用意されていて、画像データは鳥の種別によって分類されていますが、鳥が画像内のどこに位置するかを示すデータは用意されていません。BIRDS 525 データセットを Ultralytics YOLO format に変換する下記の Python スクリプトは、学習済みの重みデータ yolov9c.pt を使用して、矩形領域で表される鳥の位置を推定しています。
create_yolo_dataset_from_birds525_limit_bird_species.py
BIRDS 525 データセット内の画像には、1画像に1羽ずつ画像全体に広がるサイズで鳥が写っています。また、BIRDS 525 内の鳥は下記の例のように種類別に分けられたフォルダに置かれています。
fukagai@ESPRIMO_WD2H2 MINGW64 /c/dev/data/kaggle/birds525/archive/train $ ls 'ABBOTTS BABBLER'/ CAPUCHINBIRD/ 'GREEN MAGPIE'/ 'PYGMY KINGFISHER'/ 'ABBOTTS BOOBY'/ 'CARMINE BEE-EATER'/ 'GREEN WINGED DOVE'/ PYRRHULOXIA/ 'ABYSSINIAN GROUND HORNBILL'/ 'CASPIAN TERN'/ 'GREY CUCKOOSHRIKE'/ QUETZAL/ 'AFRICAN CROWNED CRANE'/ CASSOWARY/ 'GREY HEADED CHACHALACA'/ 'RAINBOW LORIKEET'/ 'AFRICAN EMERALD CUCKOO'/ 'CEDAR WAXWING'/ 'GREY HEADED FISH EAGLE'/ RAZORBILL/ 'AFRICAN FIREFINCH'/ 'CERULEAN WARBLER'/ 'GREY PLOVER'/ 'RED BEARDED BEE EATER'/ 'AFRICAN OYSTER CATCHER'/ 'CHARA DE COLLAR'/ 'GROVED BILLED ANI'/ 'RED BELLIED PITTA'/ 'AFRICAN PIED HORNBILL'/ 'CHATTERING LORY'/ 'GUINEA TURACO'/ 'RED BILLED TROPICBIRD'/ 'AFRICAN PYGMY GOOSE'/ 'CHESTNET BELLIED EUPHONIA'/ GUINEAFOWL/ 'RED BROWED FINCH'/ ALBATROSS/ 'CHESTNUT WINGED CUCKOO'/ 'GURNEYS PITTA'/ 'RED CROSSBILL'/ 'ALBERTS TOWHEE'/ 'CHINESE BAMBOO PARTRIDGE'/ GYRFALCON/ 'RED FACED CORMORANT'/ 'ALEXANDRINE PARAKEET'/ 'CHINESE POND HERON'/ HAMERKOP/ 'RED FACED WARBLER'/ 'ALPINE CHOUGH'/ 'CHIPPING SPARROW'/ 'HARLEQUIN DUCK'/ 'RED FODY'/ 'ALTAMIRA YELLOWTHROAT'/ 'CHUCAO TAPACULO'/ 'HARLEQUIN QUAIL'/ 'RED HEADED DUCK'/ ...
BIRDS 525 の画像データを入力とし、yolov9c.pt を使用して得られた推定結果が1羽の鳥であった場合、それをこちらのページの Ultralytics YOLO format に変換して保存します。
下の画像のように1枚の画像に複数の鳥が検出された場合は、学習データとして使用しないようにしました。
下の画像のように鳥が検出されなかった場合も学習データから除外しました。
1羽の鳥のみが検出された画像が多く、それらを学習データとして用いました。
下の画像のように1羽の鳥と鳥以外の物体を推定結果に含む画像は、鳥のみを学習対象として学習データとして使用することにしました。
2.6. Ultralytics YOLO format について
こちらのページを参考に、Ultralytics YOLO format に変換する Python Script を作成しました。
“BLUE HERON”, “MALLARD DUCK”, “EUROPEAN TURTLE DOVE”, “ROCK DOVE” の4種別の鳥を検出する場合、下記の出力パスの
/mnt/c/dev/data/kaggle/birds525/ultralytics_yolo_format_limited_for_webpage/data.yaml
ファイル data.yaml の内容は下記のようになります。
path: /mnt/c/dev/data/kaggle/birds525/ultralytics_yolo_format_limited_for_webpage # dataset root dir train: images/train # train images (relative to 'path') val: images/val # val images (relative to 'path') # Classes names: 0: BLUE HERON 1: EUROPEAN TURTLE DOVE 2: MALLARD DUCK 3: ROCK DOVE
出力ディレクトリ ultralytics_yolo_format_limited_for_webpage 以下の他のファイルは下記のように配置されます。
- ultralytics_yolo_format_limited_for_webpage/ ├─ images/ │ ├─ train/ │ │ ├─ BLUE_HERON_001.jpg │ │ ├─ BLUE_HERON_002.jpg │ │ ├─ ... │ │ └─ ROCK_DOVE_132.jpg │ └─ val/ │ ├─ BLUE_HERON_1.jpg │ ├─ BLUE_HERON_2.jpg │ ├─ ... │ └─ ROCK_DOVE_5.jpg └─ labels/ ├─ train/ │ ├─ BLUE_HERON_001.txt │ ├─ BLUE_HERON_002.txt │ ├─ ... │ └─ ROCK_DOVE_132.txt └─ val/ ├─ BLUE_HERON_1.txt ├─ BLUE_HERON_2.txt ├─ ... └─ ROCK_DOVE_5.txt
labels ディレクトリ以下のラベルファイル labels/train/MALLARD_DUCK_001.txt の中身は下記のようになっています。下記のファイルの先頭の2は、ファイル data.yaml に記載した MALLARD DUCK の番号 2: MALLARD DUCK に対応しています。その後ろの4つの数値は、画像全体の縦横の長さで割って0以上1以下の数値となるように正規化された物体の中心位置と幅と高さ xywh に対応しています。下記の例では、検出された1羽の鳥はほぼ画像全体に位置しているため、中心位置は (0.5, 0,5) に近く、幅と高さは (1.0, 1.0) に近い値になっています。
2 0.5347467660903931 0.5482243299484253 0.9086593389511108 0.8864112496376038
3. 生成した Ultralytics YOLO format のデータセットを使用した training
3.1. training コマンド
Ultralytics YOLO の下記のコマンドを実行し、物体検出ネットワークを学習させました。data パラメータに渡しているのが生成した Ultralytics YOLO format データセットの data.yaml ファイルになります。
BIRDS 525 データセットの画像サイズは 224 x 224 pixel で、それよりも大きなデフォルトの画像サイズ 640 で training したときは学習が進みませんでした。そのため、imgsz=224 のように画像サイズをパラメータとして渡しています。
model パラメータにセットしている yolov8n.pt は学習済みネットワークのデータです。設定を変えて training を何度も実行するため、ネットワーク規模が比較的小さい yolov8n を学習済みネットワークとして指定しました。
epochs はエポック数です。
yolo train model=yolov8n.pt data=/mnt/c/dev/data/kaggle/birds525/ultralytics_yolo_format_limited_for_webpage/data.yaml epochs=100 imgsz=224
3.2. training 結果
training 結果は上記のコマンドを実行したディレクトリ以下の ./runs/detect/train/ に保存されます。
複数回 training コマンドを実行した場合、下記のような名前で順に train ディレクトリが作成されます。
fukagai@ESPRIMOWD2H2:/repos/birds525yolo$ ls -d ./runs/detect/train* ./runs/detect/train ./runs/detect/train13 ./runs/detect/train17 ./runs/detect/train4 ./runs/detect/train8 ./runs/detect/train10 ./runs/detect/train14 ./runs/detect/train18 ./runs/detect/train5 ./runs/detect/train9 ./runs/detect/train11 ./runs/detect/train15 ./runs/detect/train2 ./runs/detect/train6 ./runs/detect/train12 ./runs/detect/train16 ./runs/detect/train3 ./runs/detect/train7
./runs/detect/train/ の内容は下記のようになっています。
fukagai@ESPRIMOWD2H2:/repos/misc/test_clone_birds525/birds525yolo$ ls ./runs/detect/train/ F1_curve.png args.yaml labels_correlogram.jpg train_batch1.jpg train_batch2792.jpg PR_curve.png confusion_matrix.png results.csv train_batch2.jpg val_batch0_labels.jpg P_curve.png confusion_matrix_normalized.png results.png train_batch2790.jpg val_batch0_pred.jpg R_curve.png labels.jpg train_batch0.jpg train_batch2791.jpg weights
training で得られた学習済みのネットワークの重みデータは下記の名前で保存されます。last.pt は training の最後に保存された重みデータ、best.pt は training 中、最もパフォーマンスが良かった重みデータのファイルです。
fukagai@ESPRIMOWD2H2:/repos/misc/test_clone_birds525/birds525yolo$ ls runs/detect/train/weights/ best.pt last.pt
3.3. train ディレクトリの画像ファイルについて
以下の6枚の画像は、train ディレクトリに出力された画像の一部になります。
- confusion_matrix は val ディレクトリに 5枚ずつ用意した 4種別の鳥の写真 20枚の認識結果です。下の画像は 20枚とも正しく認識されていることを表しています。
- results は training を進めていったときの loss と推定精度の評価指標の変化を表しています。横軸が epoch 数で、epoch 数が増えるにつれて loss は小さくなり、推定精度を表す評価指標は増加しています。今回の training では epochs=100 としたため、横軸は 100 までになっています。
- train_batch0 と train_batch2792 は正解ラベル付きで示された training 画像の例です。 画像の彩度の変更、明るさの変更、平行移動、拡大縮小、4枚の画像の合成等、画像に変化を付ける augmentation が適用されているため、下の例のような training 画像になっています。
- val_batch0_labels は正解ラベル付きで示された validation (検証) 画像の例です。
- val_batch0_pred は training した重みデータを用いた validation (検証) 画像を対象とする推定結果の例です。鳥を囲む矩形領域の位置に少し違いがありますが、この例ではほぼ val_batch0_labels と同じ結果になっています。training に失敗したときは、推定結果は下の画像の例とは大きく異なり、val_batch0_pred には推定結果の矩形と文字が全く表示されないこともありました。
4. training 済みの重みデータを使用した鳥の種別と位置の推定
4.1. BIRDS 525 データセットのテスト画像を対象とした場合
下記のコマンドで BIRDS 525 データセットのテスト画像を対象として、鳥の種別と位置の推定を実行しました。model パラメータで training の出力として得られた重みデータ best.pt を指定しています。対象画像は source パラメータで指定しています。
yolo predict model=./runs/detect/train/weights/best.pt source=/mnt/c/dev/data/kaggle/birds525/archive/test/EUROPEAN\ TURTLE\ DOVE/1.jpg
training には、BIRDS 525 データセットの train ディレクトリと valid ディレクトリの画像を使用しましたが、test ディレクトリのテスト画像は使用していません。training に使用しなかった画像データを使用して下の画像のような鳥の種別と位置推定の結果を得ることができました。
鳥の種別と位置を推定する下記のコマンドの source パラメータでは、ディレクトリを指定することもできます。下のコマンドの例では、マガモ “MALLARD DUCK” のテスト画像 5 枚が置かれたディレクトリを指定しています。
yolo predict model=./runs/detect/train/weights/best.pt source=/mnt/c/dev/data/kaggle/birds525/archive/test/MALLARD\ DUCK/
上記のようにディレクトリを指定するとディレクトリ内の全ての画像を対象として、鳥の種別と位置の推定が実行されます。下の画像はその実行結果です。
推定結果の画像は、上記の yolo predict コマンドを実行したディレクトリ以下の ./runs/detect/predict ディレクトリに出力されます。yolo predict を二回目に実行したときには predict2, 三回目に実行したときには predict3 に出力されます。
fukagai@ESPRIMOWD2H2:/repos/misc/test_clone_birds525/birds525yolo$ ls -d ./runs/detect/predict* ./runs/detect/predict ./runs/detect/predict2
4.2. 私が撮影した鳥を含む画像を対象とした場合
物体検出ニューラルネットワークの training に使用した BIRDS 525 の画像データのように、画像全体に近い大きさで鳥が撮影された画像を使用したときは下の画像の例のように鳥の種別と位置の推定に成功しました。
ただし、画像全体の一部の領域に鳥が写っている下のような画像を入力とした場合、鳥の種別と位置の推定に失敗してしまいました。
私が撮影した画像を入力として使用した別の例になります。こちらも鳥の種別と位置の推定に失敗しています。左の画像は training データにはないヒドリガモ、右の画像はマガモ “MALLARD DUCK” です。
5. BIRDS 525 以外のテスト画像に対応するための training
5.1. augmentation のパラメータ scale を大きくした場合
こちらのページに記載されている augmentation のパラメータ scale の初期値は 0.5 になっています。
scale パラメータについては、Ultralytics YOLO のソースコード ultralytics/data/augment.py のコメントに下記のような記載があります。この scale パラメータを 0.9 にして、10% から 190% の大きさに画像を拡大縮小して training に用いることにしました。学習画像の拡大縮小により、私が用意した写真のように画像の一部の領域に鳥が写っている場合にも対応できる可能性があると考えたからです。
scale (float): Scaling factor interval, e.g., a scale factor of 0.5 allows a resize between 50%-150%.
下記のコマンドで training を実行しました。
yolo train model=yolov8n.pt data=/mnt/c/dev/data/kaggle/birds525/ultralytics_yolo_format_limited_for_webpage/data.yaml epochs=100 imgsz=224 scale=0.9
以下の6枚の画像は、上記 3.3. と同様 train ディレクトリに出力された画像の一部になります。confusion matrix が示すように、scale をデフォルトの 0.5 から scale=0.9 に変更しても全ての validation 画像を正しく認識できているようでした。
train_batch0 と train_batch2792 には上記 3.3. よりもサイズが大きく変化している画像が含まれています。
下の画像は私が撮影した4枚の画像を入力とした推定結果です。左上の画像は右側の領域に “BLUE HERON” の誤検出がありますが、カワラバト “ROCK DOVE” は正しく認識できています。右上の画像は上記 4.2. のときと同様、鳥の種別と位置を正しく推定できていません。
右下の画像は一部の領域に写った2羽のマガモ “MALLARD DUCK” のうち、1羽を検出することに成功しています。scale=0.9 に変更し、augmentation でより小さなサイズに変更された画像を使用してネットワークを training した効果が出ています。
5.2. augmentation 処理を画像が小さくなる変換のみに変更した場合
Ultralytics YOLO のソースコード ultralytics/data/augment.py を少し修正し、augmentation 処理を画像が小さくなる変換のみに変更して上記 5.1. と同様の training を実行しました。BIRDS 525 の鳥は、画像全体に広がるサイズで撮影されているため、それよりさらに大きくする変換は加えず、小さくする変換のみに限定したほうが私が撮影したような画像を入力として種別と位置の推定をする上では有効かもしれないと考えたからです。
まず、編集したソースコードを参照して Ultralytics YOLO を実行するための Ubuntu の新たなアカウントを作成しました。
sudo adduser ultralytics-git sudo gpasswd -a ultralytics-git sudo su - ultralytics-git
次に Ultralytics YOLO のインストールの説明ページの Git clone による下記のインストールコマンドを実行し、Ultralytics YOLO を新たに作成したアカウント ultralytics-git でインストールしました。
私が試した際には、下記の4つ目のコマンド pip install -e . を実行するには、下記の3つ目のコマンド python3 -m pip install –upgrade pip を実行する必要がありました。
# Clone the ultralytics repository $ git clone https://github.com/ultralytics/ultralytics # Navigate to the cloned directory $ cd ultralytics # 下記のコマンドを実行しないと次のコマンドで失敗していた $ python3 -m pip install --upgrade pip # Install the package in editable mode for development $ pip install -e .
/home/ultralytics-git/.bashrc を編集し、末尾に下記の行を追加し、
export PATH=$PATH:~/.local/bin
下記のコマンドを実行して設定を環境変数に反映させました。
$ source .bashrc
そして、Ultralytics YOLO を git clone したディレクトリの ultralytics/data/augment.py のコードを下記のように書き換えました。scale による学習画像のサイズ変更を scale を小さくさせる変換のみにする書き換えになります。
ultralytics-git@ESPRIMOWD2H2:/repos2/ultralytics$ git diff diff --git a/ultralytics/data/augment.py b/ultralytics/data/augment.py index 3a980222..e651a22d 100644 --- a/ultralytics/data/augment.py +++ b/ultralytics/data/augment.py @@ -454,7 +454,8 @@ class RandomPerspective: R = np.eye(3, dtype=np.float32) a = random.uniform(-self.degrees, self.degrees) # a += random.choice([-180, -90, 0, 90]) # add 90deg rotations to small rotations - s = random.uniform(1 - self.scale, 1 + self.scale) + # s = random.uniform(1 - self.scale, 1 + self.scale) + s = random.uniform(1 - self.scale, 1) # s = 2 ** random.uniform(-scale, scale) R[:2] = cv2.getRotationMatrix2D(angle=a, center=(0, 0), scale=s)
上記 5.1. と同様、下記のコマンドで物体検出ニューラルネットワークを training しました。
yolo train model=yolov8n.pt data=/mnt/c/dev/data/kaggle/birds525/ultralytics_yolo_format_limited_for_webpage/data.yaml epochs=100 imgsz=224 scale=0.9
以下の6枚の画像は、上記 3.3. および 5.1. と同様 train ディレクトリに出力された画像の一部になります。val ディレクトリの validation (検証) 画像を対象とした confusion matrix は、背景 background を ROCK DOVE と誤認識している例が 1つある以外は正しく認識できていそうなことを示しています。
train_batch0 と train_batch2792 を上記 5.1. の画像と比較すると、サイズが縮小されている学習画像は存在しますが、拡大されている学習画像は存在しないことが確認できます。
下の画像は私が撮影した 4枚の画像を入力とした推定結果です。左上の画像はカワラバト “ROCK DOVE” を認識できています。右上の画像は上記 4.2. および 5.1. のときと同様、鳥の種別と位置を正しく推定できていません。
左下の画像には画像の一部の領域にヒドリガモが複数写っています。そのうちの3羽をマガモ “MALLARD DUCK” として認識しています。ヒドリガモは training に使用した4種別の鳥の中ではマガモ “MALLARD DUCK” に似ているため、悪くない推定結果と考えています。
右下の画像は上記 5.1. のときと同様、一部の領域に写った2羽のマガモ “MALLARD DUCK” のうち、1羽を検出することに成功しています。
augmentation でサイズを変更した training データを生成する際、元の画像より小さなサイズのみに変更された画像のみ生成するようにしたことで、私が撮影した画像を対象とした鳥の種別と位置の推定結果は上記 5.1. のときよりも少し改善された印象を持っています。BIRDS 525 の画像では鳥がほぼ画像全体に広がったサイズで写っていたため、このような修正が有効だったのではと考えています。
6. その他
上記 1. の概要に記載した、私が撮影した画像を training 用の train, validation データに含めるようにする変更については、この Blog には記載しないことにしました。試行錯誤しながら条件を変えて試しましたが期待したような結果は得られていません。
次は BIRDS 525 のデータは使用せず、私が撮影した画像のみで training することを検討しています。
7. メモ
学習済みの YOLO の重みデータ yolov9c 等を使用して撮影した画像から鳥の位置を正しく推定できるときは、下記のコマンドのように save_txt=true オプションを加えることで鳥の位置情報をテキストファイルに出力することができます。
yolo predict model=yolov9c save_txt=true source=/mnt/c/dev/data/custom_data/
出力されるテキストファイルは下記の例のようになっています。yolov9c において鳥であることを示す行頭のラベル番号 14 を鳥の種別に応じた番号に書き換えれば、鳥の種別の判別も行う Ultralytics YOLO format の training, validation 用ラベルファイルとして使用できます。
ultralytics-git@ESPRIMOWD2H2:/repos2/ultralytics$ cat ./runs/detect/predict43/labels/Duck_DSC00154-min.txt 14 0.649205 0.246654 0.0571026 0.0965638 14 0.629693 0.66835 0.111612 0.08429 14 0.121613 0.915089 0.0674569 0.12507 14 0.328448 0.472258 0.0662099 0.100589 14 0.284406 0.400611 0.0694954 0.0906924 14 0.623863 0.538058 0.0708187 0.0899402