概要
物体検出はコンピューター ビジョンの大きな分野であり、コンピューター ビジョンの「実際の」アプリケーションの中でも重要なアプリケーションの XNUMX つです。 一方では、タスクを実行するロボットや自動運転車など、環境内でエージェントをナビゲートする自律システムを構築するために使用できますが、これには他の分野との交差が必要です。 ただし、異常検出 (ライン上の不良品など)、画像内のオブジェクトの位置特定、顔検出、およびオブジェクト検出の他のさまざまなアプリケーションは、他のフィールドと交差することなく実行できます。
オブジェクト検出は、画像分類ほど標準化されていません。これは主に、新しい開発のほとんどが、大規模なライブラリやフレームワークではなく、通常、個々の研究者、保守担当者、および開発者によって行われるためです。 必要なユーティリティ スクリプトを TensorFlow や PyTorch などのフレームワークにパッケージ化し、これまでの開発を導いた API ガイドラインを維持することは困難です。
これにより、オブジェクト検出がやや複雑になり、通常はより冗長になり (常にではありません)、画像分類よりも親しみにくくなります。 エコシステムに参加することの主な利点の XNUMX つは、優れたプラクティス、ツール、および使用方法に関する有用な情報を検索しない方法を提供することです。 オブジェクト検出を使用すると、ほとんどの場合、適切な把握を得るために、フィールドの風景についてさらに多くの調査を行う必要があります.
PyTorch/TorchVision の RetinaNet によるオブジェクト検出
torchvision
は PyTorch のコンピューター ビジョン プロジェクトであり、変換および拡張スクリプト、事前トレーニング済みの重みを備えたモデル ズー、データセット、および実践者に役立つユーティリティを提供することにより、PyTorch ベースの CV モデルの開発を容易にすることを目的としています。
まだベータ版であり、非常に実験的ですが – torchvision
は、いくつかのモデルから選択できる比較的単純なオブジェクト検出 API を提供します。
- より高速なR-CNN
- レティナネット
- FCOS (完全畳み込み RetinaNet)
- SSD (VGG16 バックボーン…うわあ)
- SSDLite (MobileNetV3 バックボーン)
この API は他のサードパーティ API ほど洗練されていないか単純ではありませんが、慣れ親しんだエコシステム内にいることの安全性を好む人にとっては、非常に適切な出発点です. 先に進む前に、必ず PyTorch と Torchvision をインストールしてください。
$ pip install torch torchvision
次のようないくつかのユーティリティ関数をロードしましょう。 read_image()
, draw_bounding_boxes()
& to_pil_image()
画像の読み取り、描画、および出力を容易にするために、RetinaNet とその事前トレーニング済みの重み (MS COCO) をインポートします。
from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import retinanet_resnet50_fpn_v2, RetinaNet_ResNet50_FPN_V2_Weights
import matplotlib.pyplot as plt
RetinaNet は、ResNet50 バックボーンとその上に機能ピラミッド ネットワーク (FPN) を使用します。 クラスの名前は冗長ですが、アーキテクチャを示しています。 を使用して画像を取得しましょう requests
ライブラリを作成し、ローカル ドライブにファイルとして保存します。
import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)
img = read_image("obj_det.jpeg")
画像が配置されたら、モデルと重みをインスタンス化できます。
weights = RetinaNet_ResNet50_FPN_V2_Weights.DEFAULT
model = retinanet_resnet50_fpn_v2(weights=weights, score_thresh=0.35)
model.eval()
preprocess = weights.transforms()
score_thresh
引数は、オブジェクトがクラスのオブジェクトとして検出されるしきい値を定義します。 直観的には、これは信頼度のしきい値であり、オブジェクトがクラスに属しているというモデルの信頼度が 35% 未満の場合、そのオブジェクトをクラスに分類することはありません。
重みからの変換を使用して画像を前処理し、バッチを作成して推論を実行しましょう。
batch = [preprocess(img)]
prediction = model(batch)[0]
それだけです、私たちの prediction
ディクショナリには、推測されたオブジェクト クラスと場所が保持されます。 さて、結果はこの形式ではあまり役に立ちません。重みからメタデータに関するラベルを抽出し、バウンディング ボックスを描画する必要があります。これは次の方法で実行できます。 draw_bounding_boxes()
:
labels = [weights.meta["categories"][i] for i in prediction["labels"]]
box = draw_bounding_boxes(img, boxes=prediction["boxes"],
labels=labels,
colors="cyan",
width=2,
font_size=30,
font='Arial')
im = to_pil_image(box.detach())
fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()
この結果:
RetinaNet は実際に、車の後ろから覗いている人物を分類しました! かなり難しい分類です。
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
置き換えることで、RetinaNet を FCOS (完全畳み込み RetinaNet) に切り替えることができます。 retinanet_resnet50_fpn_v2
fcos_resnet50_fpn
、および FCOS_ResNet50_FPN_Weights
重み:
from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import fcos_resnet50_fpn, FCOS_ResNet50_FPN_Weights
import matplotlib.pyplot as plt
import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)
img = read_image("obj_det.jpeg")
weights = FCOS_ResNet50_FPN_Weights.DEFAULT
model = fcos_resnet50_fpn(weights=weights, score_thresh=0.35)
model.eval()
preprocess = weights.transforms()
batch = [preprocess(img)]
prediction = model(batch)[0]
labels = [weights.meta["categories"][i] for i in prediction["labels"]]
box = draw_bounding_boxes(img, boxes=prediction["boxes"],
labels=labels,
colors="cyan",
width=2,
font_size=30,
font='Arial')
im = to_pil_image(box.detach())
fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()
さらに先へ - コンピュータ ビジョンのための実用的な深層学習
あなたの好奇心旺盛な性質は、さらに先へ進みたいと思わせますか? 私たちは私たちをチェックアウトすることをお勧めします コース: 「Pythonによるコンピュータビジョンのための実践的な深層学習」.
別のコンピューター ビジョン コースですか?
MNIST 数字や MNIST ファッションの分類は行いません。 彼らはずっと前に彼らの役割を果たしました。 高度なブラックボックス アーキテクチャにパフォーマンスの負担を負わせる前に、あまりにも多くの学習リソースが基本的なデータセットと基本的なアーキテクチャに焦点を合わせています。
私たちが注目したいのは 謎解き, 実用性, 理解する, 直感 & 実際のプロジェクト. 学びたい の あなたは違いを生むことができますか? 私たちの脳が画像を処理する方法から、乳がんの研究レベルのディープ ラーニング分類器の作成、「幻覚」を起こすディープ ラーニング ネットワークまで、実際の作業を通じて原理と理論を教え、コンピュータビジョンを解決するためにディープラーニングを適用する専門家になるためのノウハウとツール。
内部には何がありますか?
- ビジョンの第一原理と、コンピューターに「見る」ことを教える方法
- コンピューター ビジョンのさまざまなタスクとアプリケーション
- あなたの仕事を楽にする貿易ツール
- コンピュータ ビジョンのためのデータセットの検索、作成、および利用
- 畳み込みニューラル ネットワークの理論と応用
- データセット内のドメイン シフト、共起、およびその他のバイアスの処理
- 転移学習と、他人のトレーニング時間と計算リソースを自分の利益のために利用する
- 最先端の乳がん分類器の構築とトレーニング
- 主流のアイデアに健全な懐疑心を適用し、広く採用されている手法の意味を理解する方法
- t-SNE と PCA を使用した ConvNet の「概念空間」の可視化
- 企業がコンピューター ビジョン技術を使用してより良い結果を達成する方法のケース スタディ
- 適切なモデル評価、潜在空間の可視化、モデルの注意の特定
- ドメイン調査の実施、独自のデータセットの処理、モデル テストの確立
- 最先端のアーキテクチャ、アイデアの進展、それらの独自性と実装方法
- KerasCV – 最先端のパイプラインとモデルを作成するための WIP ライブラリ
- 論文を解析して読み、自分で実装する方法
- 用途に応じた機種選定
- エンドツーエンドの機械学習パイプラインの作成
- Faster R-CNN、RetinaNet、SSD、YOLO を使用したオブジェクト検出のランドスケープと直感
- インスタンスとセマンティック セグメンテーション
- YOLOv5によるリアルタイム物体認識
- YOLOv5 オブジェクト検出器のトレーニング
- KerasNLP (業界で強力な WIP ライブラリ) を使用したトランスフォーマーの操作
- トランスフォーマーを ConvNets と統合して画像のキャプションを生成する
- DeepDream
まとめ
物体検出はコンピューター ビジョンの重要な分野ですが、残念ながら本来よりもアプローチしにくい分野です。
この短いガイドでは、 torchvision
、PyTorch のコンピューター ビジョン パッケージは、RetinaNet を使用して、画像のオブジェクト検出をより簡単に実行できるようにします。