2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

すぐ使えてなんでも検出

またすごいの出てきたよ。
物の名前を入れたらなんでも検出してくれる。

たとえば、「サーフボード(青ボックス)」と「波(赤ボックス)」を検出してみる。

output (9).jpg

あるいは、「横笛」を検出してみる。

output (12).jpg

まあたいしたものである。

お気づきかもしれないが、COCO datasetにないクラスも余裕で探せる。

しかもCPUでも2、3秒。
GPUで実行すれば0.5秒以下である(T4)。
クラス数が多くなるとだんだん処理も長くなるけど。

使い方

モデルの初期化

from PIL import Image, ImageDraw, ImageFont
import torch
from transformers import OwlViTProcessor, OwlViTForObjectDetection

# モデルとプロセッサの読み込み
processor = OwlViTProcessor.from_pretrained("google/owlvit-base-patch32")
model = OwlViTForObjectDetection.from_pretrained("google/owlvit-base-patch32")
processor.cuda()
model.cuda()

実行

import time
import torch
from PIL import Image, ImageDraw, ImageFont
from transformers import OwlViTProcessor, OwlViTForObjectDetection

# 画像の読み込み
image = Image.open("animal.jpg")
texts = [["a photo of a dog",
          "a photo of a cat"]]

# モデル処理
start = time.time()
inputs = processor(text=texts, images=image, return_tensors="pt")
inputs = {k: v.to("cuda") if isinstance(v, torch.Tensor) else v for k, v in inputs.items()}
outputs = model(**inputs)
print(f"Inference time: {time.time() - start} seconds")

# ボックスのスケーリング設定
target_sizes = torch.Tensor([image.size[::-1]])
results = processor.post_process_object_detection(outputs=outputs, target_sizes=target_sizes, threshold=0.1)

# ラベルごとの色設定
label_colors = {
    "a photo of a dog": "red",
    "a photo of a cat": "blue"
}

# 描画設定
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()  # デフォルトフォントを使用

# 各検出結果にボックスとラベルを描画
i = 0  # 1枚目の画像
text = texts[i]
boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]

for box, score, label in zip(boxes, scores, labels):
    if score >= 0.2:  # 信頼度0.2以上のみ描画
        box = [round(i, 2) for i in box.tolist()]
        label_text = text[label]
        color = label_colors.get(label_text, "red")  # デフォルト色を赤に設定

        # ボックスとラベルの描画
        draw.rectangle(box, outline=color, width=3)  # ボックスの描画
        draw.text((box[0], box[1] - 10), f"{label_text}: {round(score.item(), 2)}", fill=color, font=font)  # ラベルの描画

# 結果の保存
image.save("output.jpg")  # 画像を保存

みんな仕事いそがしいと思うけど、
てきとうに仕事以外のこともやって、
人生がんばっていこうね。

🐣


フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?