質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.69%
YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

4207閲覧

YOLOv8でのオリジナルデータの学習について

chem_search

総合スコア30

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/22 07:58

質問の概要

YOLOv8で、オリジナルデータを使って学習をし、
画像認識をさせたいのですが、うまく学習できません。
やり方に問題がないか、間違って理解している点がないかを
教えていただきたいです。

できていること

①YOLOv8をインストールし、フリーの画像(りんごが映っている画像)
の認識を試みたところ、成功

python

1from ultralytics import YOLO 2 3model = YOLO("yolov8n.pt") 4results = model("./test_image/apple13.jpg",save=True, task="detect") 5#認識成功

イメージ説明

できていない(実現したい)こと

②オリジナルデータで学習・認識を行いたく、以下のような学習の準備を行った。
まず、以下のコードでフォルダを作成した。

python

1#学習検討 2import os 3 4train_dir = "./original_dataset/images" 5val_dir = "./original_dataset/labels" 6 7if not os.path.exists("./original_dataset"): 8 os.mkdir("./original_dataset") 9 10if not os.path.exists(train_dir): 11 os.mkdir(train_dir) 12 os.mkdir(train_dir+"/train") 13 os.mkdir(train_dir+"/val") 14 15if not os.path.exists(val_dir): 16 os.mkdir(val_dir) 17 os.mkdir(val_dir+"/train") 18 os.mkdir(val_dir+"/val")

次に、フリーのすいかが映っている画像を11枚ほど収集し、別途インストールしたlabelImgで
YOLOの形式でアノテーションを行い、バウンディングボックスの位置情報が記載されたテキストファイルを生成した。
画像ファイルをimagesフォルダ内のtrainフォルダに7枚、valフォルダに4枚格納し、
それに対応する上記テキストファイルをlabelsフォルダ内のtrain, valフォルダに格納した。

③以下のようなyamlファイルを作成し、上記のimages, labelsがあるフォルダに格納した。(ファイル名はwatermelon.yaml)

# train and val data train: C:\Users\〇〇\original_dataset\images\train val: C:\Users\〇〇\original_dataset\images\val #フォルダ名は一部省略させて頂いています。 # number of classes nc: 1 # class names names: ['watermelon']

④ ②、③の準備を終えた後、以下のコードで学習を実行した。

python

1results = model.train(data="./original_dataset/watermelon.yaml", epochs=30)

(学習ログは下記に記載)

⑤学習を終えた後、学習後のモデルを用いて以下のコードを実行した。
以下のソースコード中のwatermelon4.jpgは学習に用いた画像だが、
出力結果では認識されていなかった。

python

1model = YOLO("./runs/detect/train/weights/best.pt") 2results = model("./test_image/watermelon4.jpg",save=True, task="detect")

また、このモデルを用いると、上記①でうまく検出できた以下のファイルも
認識されなかった。

python

1results = model("./test_image/apple13.jpg",save=True, task="detect")

学習ログ

python

1Ultralytics YOLOv8.0.6 Python-3.9.15 torch-1.13.1+cpu CPU 2yolo\engine\trainer: task=detect, mode=train, model=yolov8n.yaml, data=./original_dataset/watermelon.yaml, epochs=30, patience=50, batch=16, imgsz=640, save=True, cache=False, device=, workers=8, project=None, name=None, exist_ok=False, pretrained=False, optimizer=SGD, verbose=False, seed=0, deterministic=True, single_cls=False, image_weights=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, overlap_mask=True, mask_ratio=4, dropout=False, val=True, save_json=False, save_hybrid=False, conf=0.001, iou=0.7, max_det=300, half=True, dnn=False, plots=True, source=ultralytics/assets/, show=False, save_txt=False, save_conf=False, save_crop=False, hide_labels=False, hide_conf=False, vid_stride=1, line_thickness=3, visualize=False, augment=False, agnostic_nms=False, retina_masks=False, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=17, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.001, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, fl_gamma=0.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0, cfg=None, hydra={'output_subdir': None, 'run': {'dir': '.'}}, v5loader=True, save_dir=runs\detect\train 3Overriding model.yaml nc=80 with nc=1 4 5 from n params module arguments 6 0 -1 1 464 ultralytics.nn.modules.Conv [3, 16, 3, 2] 7 1 -1 1 4672 ultralytics.nn.modules.Conv [16, 32, 3, 2] 8 2 -1 1 7360 ultralytics.nn.modules.C2f [32, 32, 1, True] 9 3 -1 1 18560 ultralytics.nn.modules.Conv [32, 64, 3, 2] 10 4 -1 2 49664 ultralytics.nn.modules.C2f [64, 64, 2, True] 11 5 -1 1 73984 ultralytics.nn.modules.Conv [64, 128, 3, 2] 12 6 -1 2 197632 ultralytics.nn.modules.C2f [128, 128, 2, True] 13 7 -1 1 295424 ultralytics.nn.modules.Conv [128, 256, 3, 2] 14 8 -1 1 460288 ultralytics.nn.modules.C2f [256, 256, 1, True] 15 9 -1 1 164608 ultralytics.nn.modules.SPPF [256, 256, 5] 16 10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 17 11 [-1, 6] 1 0 ultralytics.nn.modules.Concat [1] 18 12 -1 1 148224 ultralytics.nn.modules.C2f [384, 128, 1] 19 13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 20 14 [-1, 4] 1 0 ultralytics.nn.modules.Concat [1] 21 15 -1 1 37248 ultralytics.nn.modules.C2f [192, 64, 1] 22 16 -1 1 36992 ultralytics.nn.modules.Conv [64, 64, 3, 2] 23 17 [-1, 12] 1 0 ultralytics.nn.modules.Concat [1] 24 18 -1 1 123648 ultralytics.nn.modules.C2f [192, 128, 1] 25 19 -1 1 147712 ultralytics.nn.modules.Conv [128, 128, 3, 2] 26 20 [-1, 9] 1 0 ultralytics.nn.modules.Concat [1] 27 21 -1 1 493056 ultralytics.nn.modules.C2f [384, 256, 1] 28 22 [15, 18, 21] 1 751507 ultralytics.nn.modules.Detect [1, [64, 128, 256]] 29Model summary: 225 layers, 3011043 parameters, 3011027 gradients, 8.2 GFLOPs 30 31Transferred 58/355 items from pretrained weights 32optimizer: SGD(lr=0.01) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.001), 63 bias 33train: Scanning C:\Users\〇〇\yolov8\original_dataset\labels\train... 7 images, 0 backgrounds, 0 corr 34train: New cache created: C:\Users\〇〇\yolov8\original_dataset\labels\train.cache 35val: Scanning C:\Users\〇〇\yolov8\original_dataset\labels\val... 4 images, 0 backgrounds, 0 corrupt: 36val: New cache created: C:\Users\〇〇\yolov8\original_dataset\labels\val.cache 37Image sizes 640 train, 640 val 38Using 0 dataloader workers 39Logging results to runs\detect\train 40Starting training for 30 epochs... 41 42 Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 43 1/30 0G 2.587 3.211 2.422 26 640: 100%|██████████| 1/1 [00:02<00:00, 2.46 44 Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<0 45 all 4 4 0.0025 0.75 0.148 0.0311 46 47(略) 48 Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 49 30/30 0G 1.535 2.549 1.739 11 640: 100%|██████████| 1/1 [00:02<00:00, 2.31 50 Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<0 51 all 4 4 0.00333 1 0.0488 0.0117 52 5330 epochs completed in 0.026 hours. 54Optimizer stripped from runs\detect\train\weights\last.pt, 6.3MB 55Optimizer stripped from runs\detect\train\weights\best.pt, 6.3MB 56 57Validating runs\detect\train\weights\best.pt... 58Ultralytics YOLOv8.0.6 Python-3.9.15 torch-1.13.1+cpu CPU 59Fusing layers... 60Model summary: 168 layers, 3005843 parameters, 0 gradients, 8.1 GFLOPs 61 Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<0 62 all 4 4 0.0025 0.75 0.149 0.0311 63Speed: 2.5ms pre-process, 85.6ms inference, 0.0ms loss, 7.5ms post-process per image 64Saving runs\detect\train\predictions.json... 65Results saved to runs\detect\train 66

教えていただきたいこと

1.なぜ今回の学習プロセスを経たモデルは学習に使用したすいかはおろか、元々認識できていたりんごも
認識できなくなってしまったのでしょうか。
どこかに間違ったプロセスがあれば教えていただきたいです。

2.今回のプロセスは、「yolov8n.pt」というモデルの転移学習によって、「best.pt」という
モデルが得られたという理解であっていますでしょうか。

3.ステップ②でlabelImgで作成したYOLO形式のデータセット(テキストファイル)は、
中身が
「0 0.491540 0.494531 0.962775 0.957812」
のようになっています。
後ろ4つの数字はバウンディングボックスの座標だと思うのですが、
先頭の0はなんでしょうか。
ここにラベルの種類がくるとおもったのですが、0であっていますでしょうか。

補足情報(FW/ツールのバージョンなど)

python 3.9.15
ultralytics 8.0.6
labelimg 1.8.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

guest

回答2

1

ベストアンサー

 転移学習は元のモデルに判定できるクラスを増やす方法ではなく,元のモデルを再利用し新たなタスク(クラス)に対応するモデルを作成する方法です。現在の方法ではスイカのみを判定するモデルが作成されています。仮に転移学習を行いスイカとリンゴを検出するモデルを作成するには,訓練データにスイカのみでなくリンゴの画像とラベルを加える必要があります。それに伴いyamlファイルも以下のように編集する必要があります。

# train and val data train: C:\Users\〇〇\original_dataset\images\train val: C:\Users\〇〇\original_dataset\images\val #フォルダ名は一部省略させて頂いています。 # number of classes nc: 2 ←判定させるクラス数 # class names names: ['watermelon','apple'] ←判定させたいクラスラベル

 また精度を上げるには各クラスの訓練データを増加させることと、学習回数(epochs)を増加させることが有効だと思います。

2.あっています。

3.0はラベルであっています。yamlファイルのnames:に1番目に入れたラベル、つまり'watermelon'を示しています。プログラムでは0から数えるため、ラベルを増やすと0,1,2,・・・と対応する数字が入ります。

投稿2023/01/23 07:15

編集2023/01/23 07:31
sousou9

総合スコア9

chem_search😄を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

chem_search

2023/01/24 12:27

ありがとうございます。転移学習について勘違いしていたため、勉強になりました。 また頂いたアドバイスに従って訓練データと学習回数を増加させた結果、無事狙い通りの動作をしてくれるようになりました。 可能であればもう一つ教えてください。 results = model("./test_image/watermelon4.jpg",save=True, task="detect") 上記のコードで結果はファイルとして保存されるのですが、何かしらの返り値として 推論結果の情報(ラベルの種類、バウンディングボックスの座標など)を受け取ることは できないのでしょうか。 (「save_txt=True」という引数でテキストファイルでラベルとバウンディングボックスの情報が記載されたテキストファイルは保存されますが・・・・・・)
sousou9

2023/01/27 05:22

テキストファイルへの出力しかやったことがないので別スレ立てて聞いてみてください。 元のコード探してprintしてあげればできるかも。
guest

0

結果の取得方法ですが
https://docs.ultralytics.com/predict/
の公式ドキュメントで座標の受け取り方等が書いてありますね
yolov5のようにresults.pandasで便利に受け取れる機能はまだ実装されていないようです。

投稿2023/01/31 09:55

編集2023/01/31 09:56
shinaxa

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

chem_search

2023/02/05 08:19

ありがとうございます。公式ドキュメントを参考に再現することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.69%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。