@mayokaok

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

yolov8を利用した物体検出からの色識別

解決したいこと

YoloV8で画像内の物体検出を行った後、用意した正解画像との色比較。

例えば、車と犬が映った画像内で犬を検出。
その後、犬の色が予めトリミングしておいた、犬と色が一致しているか確認したい。

発生している問題・エラー

エラー箇所:bboxes = results.xyxy[0]

'tuple' object has no attribute 'xyxy'
  File "D:\yolov8 色比較.py", line 48, in <module>
    bboxes = results.xyxy[0]  # 検出されたバウンディングボックス
AttributeError: 'tuple' object has no attribute 'xyxy'

該当するソースコード

import cv2
import numpy as np
from PIL import Image
import torch
import torchvision.transforms as transforms
import os



# YOLOv5モデルのロード
model_path = r'd:\ultralytics-main\ultralytics\yolov8s.pt'

# モデルのロード
loaded_model = torch.load(model_path, map_location='cuda' if torch.cuda.is_available() else 'cpu')
model = loaded_model['model']
model.eval()

# GPUが利用可能かどうかをチェック
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# モデルを適切なデバイスに移動
model.to(device)

# 検出用画像の読み込みと変換
img_path = "d:\dog.jpg"
img = Image.open(img_path).convert("RGB")  # RGBAからRGBへ変換

# 正解画像のパス
target_img_path = "d:\correct_image.jpg"  # 正解画像のパスを指定

# PIL画像をTensorに変換する前にリサイズ
resize = transforms.Resize((640, 640))
img_resized = resize(img)

# PIL画像をTensorに変換
transform = transforms.Compose([
    transforms.ToTensor(),
])
img_tensor = transform(img_resized).unsqueeze(0)  # バッチ次元の追加

# 入力画像を適切なデバイスに移動し、データタイプを変換
img_tensor = img_tensor.to(device).type(torch.cuda.HalfTensor if device.type == 'cuda' else torch.FloatTensor)

# 物体検出の実行
results = model(img_tensor)
bboxes = results.xyxy[0]  # 検出されたバウンディングボックス

# 切り抜きと色比較の関数定義
def compare_colors(img1, img2):
    # 画像をRGBに変換し、numpy配列に変換
    img1 = np.array(img1.convert("RGB"))
    img2 = np.array(img2.convert("RGB"))

    # 画像の平均色を計算
    avg_color1 = np.mean(img1, axis=(0, 1))
    avg_color2 = np.mean(img2, axis=(0, 1))

    # 色の差を計算
    color_diff = np.linalg.norm(avg_color1 - avg_color2)
    print("Color difference:", color_diff)

# 切り抜きと色比較
for bbox in bboxes:
    x1, y1, x2, y2 = map(int, bbox[:4])
    cropped_img = img.crop((x1, y1, x2, y2))
    
    # 正解画像との色比較
    target_img = Image.open(target_img_path)
    compare_colors(cropped_img, target_img)

print("処理終了")

自分で試したこと

chatGPTに聞いたところ、yolov8モデルの出力形式に関する情報を参照してくださいと返ってきました。

公式のHPを確認しても、モデルの出力形式に関する情報が書かれている場所が分からず困っています。

0 likes

1Answer

chatGPTに聞いたところ、yolov8モデルの出力形式に関する情報を参照してくださいと返ってきました。
公式のHPを確認しても、モデルの出力形式に関する情報が書かれている場所が分からず困っています。

こちらが参考になるかと思います。
Working with Results

0Like

Comments

  1. @mayokaok

    Questioner

    ありがとうございます!
    参考にさせて頂きます!!

Your answer might help someone💌