質問の概要
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/24 12:27
2023/01/27 05:22