YOLO入門:物体検出AIの基礎知識

YOLO入門:物体検出AIの基礎知識

はじめに

現代社会において、人工知能(AI)技術は様々な分野で活用されており、その中でも「物体検出」は、自動運転、防犯カメラ、産業用ロボット、医療画像解析など、私たちの生活に密接に関わる重要な技術です。物体検出AIは、画像や動画の中から特定の物体がどこに、どれくらいの大きさで写っているかを特定し、その物体の種類(クラス)を識別します。

物体検出は、コンピュータビジョン分野における中心的なタスクの一つであり、長年にわたり研究が進められてきました。初期の手法から始まり、ディープラーニングの登場によってその精度は飛躍的に向上しました。その中でも、特に高速性と高い精度を両立させた画期的な手法として登場し、現在でも広く使われているのが「YOLO(You Only Look Once)」シリーズです。

「You Only Look Once」、つまり「一度だけ見る」という名前が示す通り、YOLOは画像を一度だけニューラルネットワークに通すだけで、画像内のすべての物体を同時に検出するというユニークなアプローチを採用しています。これにより、従来の物体検出手法に比べて圧倒的な高速性を実現し、リアルタイムでの物体検出を可能にしました。

この記事では、物体検出AIの基礎から始まり、YOLOがどのような技術革新をもたらしたのか、初代YOLO(YOLOv1)の仕組み、そしてその後のYOLOシリーズの進化について、詳細かつ分かりやすく解説します。AIやディープラーニングの初心者の方でも理解できるよう、専門用語を丁寧に説明しながら進めていきます。物体検出に興味がある方、YOLOについて深く知りたい方にとって、この記事がその第一歩となることを願っています。

物体検出AIの基礎

コンピュータビジョンにおける物体検出の役割を理解するためには、関連するいくつかのタスクを知っておく必要があります。

コンピュータビジョンにおける主なタスク:

  • 画像分類 (Image Classification): 画像全体に写っている物体のクラス(例:猫、犬、車)を一つだけ予測するタスクです。画像内に複数の物体が写っていても、最も主要な物体や、指定された一つのクラスを予測します。
  • 物体検出 (Object Detection): 画像内に写っている複数の物体のクラスを識別し、それぞれの物体が画像内のどこに位置しているかを示すバウンディングボックス(矩形の枠)を予測するタスクです。画像分類と位置特定を組み合わせたものです。
  • セマンティックセグメンテーション (Semantic Segmentation): 画像内のすべてのピクセルを、それぞれが属するクラス(例:空、道路、建物、人)に分類するタスクです。これにより、画像がピクセル単位で意味のある領域に分割されます。
  • インスタンスセグメンテーション (Instance Segmentation): セマンティックセグメンテーションに加えて、同じクラスに属する個々のインスタンス(例:画像内に複数の人がいる場合、それぞれの「人」を区別してセグメンテーションする)を識別するタスクです。

物体検出は、これらのタスクの中でも特に実用的な応用範囲が広く、多くの分野で重要な役割を果たしています。

従来の物体検出手法の課題:

ディープラーニングが登場する以前や、その初期には、様々な物体検出手法が提案されていました。代表的なものとしては、以下のようなものがあります。

  • Viola-Jones検出器: 顔検出で有名になった手法で、Haar-like特徴とAdaBoost分類器を組み合わせたものです。非常に高速ですが、検出できる物体の種類が限定的でした。
  • HOG + SVM (Histogram of Oriented Gradients + Support Vector Machine): 画像内の特徴(HOG)を抽出し、SVMを用いて物体を分類する手法です。検出ウィンドウを画像全体にスライドさせながら物体を検出します。
  • DPM (Deformable Part Model): 物体を複数のパーツに分解し、それぞれのパーツと全体構造の関係性をモデル化する手法です。ある程度の変形に対応できます。

これらの手法は、特定の条件下では有効でしたが、検出精度や検出できる物体の種類に限界があり、特に画像内の様々なスケールやアスペクト比の物体、複雑な背景に対応することが困難でした。また、画像全体に対して何度も検出処理を行う必要があり、処理速度も十分ではありませんでした。

YOLO登場以前の物体検出手法(2-Stage Detector)

ディープラーニングがコンピュータビジョン分野で成功を収めるようになると、物体検出にもディープラーニングが応用されるようになりました。YOLOが登場する以前のディープラーニングを用いた主要な物体検出手法は、「2-Stage Detector(2段階検出器)」と呼ばれるファミリーに属していました。これらの手法は、物体検出タスクを大きく二つの段階に分けて処理します。

2-Stage Detectorの基本的な流れ:

  1. 領域候補の生成 (Region Proposal): 画像の中から物体が存在しそうな領域(Region of Interest, RoI)をいくつか生成します。この段階では、まだそれが何であるかは区別せず、単に「ここに何か物体がありそうだ」という候補領域を洗い出します。手法としては、Selective SearchやEdge Boxesなどが使われました。
  2. 領域候補の分類と位置調整 (Classification and Bounding Box Regression): 生成された各領域候補に対して、畳み込みニューラルネットワーク(CNN)を用いて特徴を抽出し、それがどのクラスの物体であるかを分類します。同時に、候補領域のバウンディングボックスを実際の物体の位置に合わせて微調整(回帰)します。

R-CNNファミリー:

2-Stage Detectorの代表格は、Girshickらによって提案されたR-CNN(Region-based Convolutional Neural Network)とその改良版です。

  • R-CNN:

    • Selective Searchを用いて約2000個の領域候補を生成します。
    • 各領域候補を固定サイズにリサイズし、事前に学習されたCNN(例:AlexNet)に入力して特徴を抽出します。
    • 抽出された特徴を用いて、SVMにより各候補領域のクラスを分類します。
    • 別途、線形回帰モデルを用いてバウンディングボックスの微調整を行います。
    • 課題: 各領域候補に対して独立してCNNを計算するため、処理が非常に遅い。SVMとバウンディングボックス回帰がCNNとは別に学習されるため、全体として最適化が難しい。
  • Fast R-CNN:

    • R-CNNの処理速度を大幅に改善した手法です。
    • 画像全体を一度だけCNNに通し、特徴マップを生成します。
    • 領域候補(Selective Searchで生成)を、画像全体の特徴マップ上のRoIに対応付けます(RoI Projection)。
    • RoI Poolingという手法を用いて、様々なサイズのRoIから固定サイズの(特徴ベクトル)を抽出します。
    • 抽出された特徴ベクトルを全結合層に通し、Softmax分類器とバウンディングボックス回帰を同時に行います。
    • 改善点: 特徴抽出が画像全体に対して一度で済むため高速化。分類と回帰が単一のネットワーク内で学習されるため、エンドツーエンドでの学習が可能。ただし、領域候補の生成(Selective Search)自体はGPUによる高速化の恩恵を受けにくく、全体のボトルネックとなっていました。
  • Faster R-CNN:

    • Fast R-CNNのボトルネックであった領域候補の生成プロセスもネットワーク内に組み込んだ手法です。
    • 画像全体から生成された特徴マップ上で、RPN(Region Proposal Network)と呼ばれる小さなネットワークを用いて領域候補を生成します。RPNは、アンカーボックス(事前に定義された様々なサイズやアスペクト比の基準となる矩形)をスライドさせながら、各位置で物体が存在しそうかどうかの二値分類(前景/背景)とバウンディングボックスの微調整を行います。
    • 生成された領域候補を用いて、Fast R-CNNと同様にRoI Pooling、分類、回帰を行います。
    • 改善点: 領域候補の生成もディープラーニングによって行われるため、全体としてほぼエンドツーエンドでのGPUによる高速処理が可能になりました。R-CNNファミリーの中で最も広く使われた手法の一つです。

2-Stage Detectorのメリットとデメリット:

  • メリット:
    • 領域候補ごとに詳細な分析を行うため、一般的に高い検出精度を達成します。
    • 特に小物体の検出に強い傾向があります。
  • デメリット:
    • 検出プロセスが領域候補生成とそれに続く分類・回帰の2段階に分かれているため、処理速度が比較的遅く、リアルタイム処理には向かない場合があります。
    • パイプラインが複数のステップから構成されるため、学習や実装がやや複雑になります。

YOLOは、この2-Stage Detectorとは根本的に異なるアプローチを採用することで、高速性という課題を解決しようとしました。

YOLO(You Only Look Once)の革新性

YOLOが画期的だったのは、物体検出タスクを「画像を一度だけ見て、画像全体に対して直接的にバウンディングボックスとクラス確率を予測する」という、全く新しいアプローチで解決しようとした点です。従来の2-Stage Detectorが「どこに物体があるか候補を挙げてから、それが何かを判断する」というステップを踏んでいたのに対し、YOLOは画像全体を一括して解析し、複数の物体の位置とクラスを同時に予測します。

「Once」の意味:画像を一度だけ見て検出

YOLOの「You Only Look Once」という名前は、このアプローチを端的に表しています。入力画像を一度だけ畳み込みニューラルネットワーク(CNN)に通す(順伝播させる)だけで、最終的な検出結果(バウンディングボックスとクラス確率)が得られます。これにより、領域候補生成のステップを完全に排除し、推論速度を大幅に向上させることが可能となりました。

物体検出を回帰問題として捉える

YOLOは、物体検出タスクを分類問題ではなく、主に「回帰問題」として捉えます。ネットワークの最終層は、画像内の各位置に対して、そこに物体が存在するかどうかの信頼度、バウンディングボックスの座標とサイズ、そして各クラスに属する確率を直接的に「回帰」(予測)します。

グリッドシステムによる検出

YOLOは入力画像を固定サイズのグリッド(例:7×7)に分割します。そして、ネットワークは各グリッドセルに対して、以下のような予測を行います。

  • そのグリッドセルが物体の中心を含んでいるかどうか。
  • そのグリッドセルが含む(または中心を含む)物体に対するバウンディングボックス。
  • そのグリッドセルが含む物体のクラス確率。

このグリッドシステムにより、画像内の様々な位置に対して、並列に検出処理を行うことができます。

バウンディングボックス予測と信頼度スコア

各グリッドセルは、複数のバウンディングボックスを予測します。YOLOv1では、各グリッドセルがB個のバウンディングボックスを予測しました。それぞれのバウンディングボックス予測は、以下の5つの値から構成されます。

  1. 中心座標 (x, y): バウンディングボックスの中心が、そのグリッドセル内のどこにあるか(グリッドセルの左上を(0,0)、右下を(1,1)とした正規化された座標)。
  2. 幅と高さ (w, h): バウンディングボックスの幅と高さ(画像全体の幅・高さを1とした正規化されたサイズ)。
  3. 信頼度スコア (confidence score): このバウンディングボックスが物体を含んでおり、かつその物体がどのクラスであるかを正しく予測できる確率の自信度合い。これは、(バウンディングボックスに物体が含まれる確率) * (予測されたバウンディングボックスと正解バウンディングボックスのIoU) として定義されます。物体が存在しないグリッドセルでは、信頼度スコアは0に近づきます。

クラス確率

各グリッドセルは、それが画像内の物体を含んでいるという条件の下で、その物体が各クラス(C個のクラスがある場合)に属する確率P(Class_i | Object)を予測します。

最終的な各バウンディングボックスに対するクラスごとの信頼度スコアは、以下の式で計算されます。
Class-specific confidence score = (バウンディングボックスの信頼度スコア) * (そのグリッドセルのクラス確率)
= P(Object) * IoU(predicted, ground truth) * P(Class_i | Object)
= P(Class_i) * IoU(predicted, ground truth)

このスコアは、バウンディングボックス内に特定のクラスの物体が存在する可能性と、その位置予測の精度(IoU)の両方を考慮した値となります。通常、このスコアが一定の閾値以上のバウンディングボックスのみを最終的な検出結果として採用します。

画像全体を考慮した検出

YOLOは、入力画像を一度だけ通す際に、画像全体を一度に処理します。これは、畳み込みネットワークの広い receptive field(受容野)によって実現されます。これにより、YOLOは検出を行う際に、物体とその周囲の文脈情報(contextual information)を同時に考慮することができます。これは、画像の一部だけを見て検出を行うスライディングウィンドウ方式や、候補領域だけを切り出して個別に処理するR-CNN系列の手法とは異なる重要な特徴です。この文脈情報の利用は、背景の誤検出を減らし、検出精度を向上させるのに役立ちます。

YOLOのこの革新的なアプローチは、物体検出における速度と精度のトレードオフに新たな選択肢を提示し、リアルタイム応用の可能性を大きく広げました。

YOLOのアーキテクチャ(YOLOv1)

初代YOLO(YOLOv1)は、その革新的なアプローチを実現するために設計された特定のニューラルネットワークアーキテクチャを持っています。以下に、その主要な要素を詳しく説明します。

入力画像:

YOLOv1は、入力画像を固定サイズ(論文では448×448ピクセル)にリサイズしてネットワークに入力します。

ネットワーク構造:

YOLOv1のネットワークは、主に畳み込み層とMaxプーリング層から構成されており、画像全体から特徴を抽出します。ネットワークの後半には、これらの特徴を用いて最終的な予測を行うための全結合層が配置されています。論文では、GoogLeNet(Inceptionモジュール)に似た構造を採用していると述べられていますが、よりシンプルな構成になっています。全体として、24個の畳み込み層と4個のMaxプーリング層、そして2個の全結合層から構成されます。

  • 畳み込み層: 画像の特徴(エッジ、テクスチャ、パターンなど)を抽出します。層が深くなるにつれて、より抽象的で高レベルな特徴が抽出されます。
  • Maxプーリング層: 特徴マップのサイズを小さくし、位置のずれに対して頑健な特徴を抽出します。また、計算量を削減する効果もあります。
  • 全結合層: 抽出された特徴を用いて、最終的な予測(バウンディングボックスの座標、信頼度、クラス確率)を行います。

多くの畳み込み層とプーリング層を経て、ネットワークは入力画像全体に対応する低解像度の特徴マップを生成します。この特徴マップが、最終的な予測の根拠となります。

出力テンソル (S x S x (B*5 + C)) の詳細:

YOLOv1の最も特徴的な出力は、その構造です。ネットワークの最終層は、単一のテンソル(多次元配列)を出力します。このテンソルのサイズは S x S x (B*5 + C) です。それぞれの要素の意味は以下の通りです。

  • S x S: これは、入力画像を分割したグリッドの数を表します。YOLOv1では、S=7として入力画像を7×7のグリッドに分割しました。したがって、出力テンソルの最初の2次元は、このグリッドに対応します。出力テンソルの各「セル」は、入力画像の対応するグリッドセルに関する予測情報を含んでいます。
  • B: 各グリッドセルが予測するバウンディングボックスの数です。YOLOv1では、B=2としました。つまり、各7×7のグリッドセルは、それぞれ2つのバウンディングボックス予測を行います。
  • 5: 各バウンディングボックス予測に関する5つの値です。これらは (x, y, w, h, confidence) です。
    • (x, y): バウンディングボックスの中心座標です。これは、そのバウンディングボックスが責任を持つグリッドセルからの相対位置としてエンコードされます(例:グリッドセルの左上を(0,0)、右下を(1,1)とした正規化座標)。これにより、座標は0から1の間に収まります。
    • (w, h): バウンディングボックスの幅と高さです。これは、画像全体の幅と高さに対する相対サイズとしてエンコードされます(例:画像全体の幅・高さを1とした正規化サイズ)。YOLOv1では、この値を予測する際に、正解の幅と高さの平方根を予測するという工夫をしています。これは、大きな物体と小さな物体で、座標やサイズの誤差が検出精度に与える影響が異なるため、誤差関数で大きな物体の誤差の影響を相対的に小さくするためです。
    • confidence: そのバウンディングボックスが物体を含んでおり、かつ位置も正確であるという信頼度スコアです。上述の通り、P(Object) * IoU(predicted, ground truth) を予測します。
  • C: 物体検出の対象となるクラスの総数です。例えば、Pascal VOCデータセット(20クラス)を使う場合はC=20です。各グリッドセルは、そのグリッドセルが物体を含んでいるという条件の下での、C個のクラスそれぞれの確率 P(Class_i | Object) を予測します。このクラス確率は、バウンディングボックスの数(B)によらず、グリッドセルごとに一つだけ予測されます。

したがって、YOLOv1の出力テンソルは、例えばPascal VOCデータセットの場合、7 x 7 x (2*5 + 20)、つまり 7 x 7 x 30 のサイズとなります。

この出力テンソルの構造が、YOLOの「Once」の肝です。ネットワークは、最終的にこのテンソルを一つだけ出力することで、画像内の全てのグリッドセルに対して、複数のバウンディングボックス予測(位置、サイズ、信頼度)とクラス確率を同時に行います。

活性化関数:

YOLOv1では、畳み込み層の活性化関数としてリーキーReLU(Leaky Rectified Linear Unit)を使用しています。全結合層の最終層では、バウンディングボックスの座標に対しては線形活性化、信頼度に対してはシグモイド関数(確率を0から1の間に出力するため)、クラス確率に対してはSoftmax関数(各クラスの確率の合計が1になるようにするため)を使用しています。

損失関数:

YOLOv1の学習は、このS x S x (B*5 + C)の出力テンソルと、教師データとして与えられる正解のバウンディングボックスとクラスラベルとの差を計算する損失関数を最小化することを目指します。YOLOv1の損失関数は、複数の誤差項の合計として定義されます。

損失関数は主に以下の要素から構成されます。

  1. バウンディングボックスの位置とサイズの誤差 (Localization Loss):

    • これは、正解のバウンディングボックスと予測されたバウンディングボックスの位置(中心座標 x, y)およびサイズ(幅 w, 高さ h)の差に対する誤差です。
    • 特に、物体が存在するグリッドセルによって予測されたバウンディングボックス(そしてその予測が最も正解バウンディングボックスと一致するバウンディングボックス)に対して計算されます。
    • YOLOv1では、座標誤差にはSum of Squared Errors (SSE) を使用し、サイズ誤差には幅と高さの「平方根」の差に対するSSEを使用します。平方根を使うのは、小さな物体のサイズの誤差と大きな物体のサイズの誤差を、相対的に重要度を均一にするためです。
    • λ_{coord}という重みを付けて、位置・サイズ誤差を他の誤差よりも重視します。
  2. 信頼度スコアの誤差 (Confidence Loss):

    • これは、各バウンディングボックス予測の信頼度スコアに対する誤差です。
    • 物体が存在するバウンディングボックス: 正解の信頼度スコアは、予測されたバウンディングボックスと正解バウンディングボックスの間のIoU (Intersection over Union) です。予測された信頼度スコアがこのIoUに近づくように学習します。
    • 物体が存在しないバウンディングボックス: 正解の信頼度スコアは0です。予測された信頼度スコアが0に近づくように学習します。
    • 物体が存在しないバウンディングボックスは、画像中に多数存在するため、その誤差が支配的にならないように、物体が存在しないボックスに対する信頼度誤差には小さな重み λ_{noobj} を付けます(λ_{noobj} < 1)。物体が存在するボックスに対する信頼度誤差には重み1を付けます。
  3. クラス分類の誤差 (Classification Loss):

    • これは、物体が存在するグリッドセルに対する、予測されたクラス確率と正解のクラスラベルの差に対する誤差です。
    • softmaxの出力に対してSSEを使用します。
    • これは、そのグリッドセルが物体を含んでいると判断された場合にのみ計算されます。

これらの誤差項を合計し、バックプロパゲーションによってネットワークの重みを更新することで、モデルを学習させます。

NMS (Non-Maximum Suppression):

YOLOv1は、各グリッドセルから複数のバウンディングボックス予測を出力し、さらに異なるグリッドセルからも同じ物体に対するバウンディングボックス予測が出力される可能性があります。そのため、最終的な検出結果には多くの重複したバウンディングボックスが含まれることになります。

これらの重複を排除し、一つの物体に対して一つの最適なバウンディングボックスを選択するために、「Non-Maximum Suppression (NMS)」という後処理を行います。

NMSの手順は以下の通りです。

  1. 検出された全てのバウンディングボックス予測を、そのクラスごとの信頼度スコア(Class-specific confidence score)で降順に並べ替えます。
  2. 最もスコアの高いバウンディングボックスを、最終的な検出結果のリストに追加します。
  3. 最終リストに追加されたバウンディングボックスに対して、その他のバウンディングボックス全てとの間でIoUを計算します。
  4. 計算したIoUが一定の閾値(例えば0.5)を超えているバウンディングボックスは、同じ物体を検出している重複したボックスと見なし、リストから削除します。
  5. 残ったバウンディングボックスの中で、最もスコアが高いものを選択し、手順2-4を繰り返します。
  6. 全てのバウンディングボックスが処理されるまで、または残っているバウンディングボックスがなくなるまで、この処理を繰り返します。

これにより、各物体に対して最も信頼度スコアの高い(そして他のボックスと大きく重複しない)バウンディングボックスだけが最終的な検出結果として残ります。

YOLOv1のメリットとデメリット

YOLOv1はその革新的なアプローチにより、いくつかの大きなメリットをもたらしましたが、同時にいくつかの課題も抱えていました。

メリット:

  • 高速性: 最大のメリットは圧倒的な処理速度です。画像を一度だけ通すシングルステージ方式により、当時の他の高性能な手法(Faster R-CNNなど)と比較して数十倍、あるいはそれ以上の高速性を実現しました。これにより、リアルタイムでの物体検出が可能になり、多くの応用分野への道が開かれました。
  • 画像全体を考慮した検出: グリッドベースのアプローチと広い受容野を持つCNNにより、検出を行う際に画像全体の文脈情報を考慮することができます。これは、画像の一部だけを見て判断する手法に比べて、背景の誤検出を減らすのに役立ちます。
  • 汎化性能: 自然画像ではない芸術作品などの画像に対しても、他の手法よりも高い検出性能を示すことが論文で報告されています。これは、物体そのものの特徴だけでなく、その周囲の文脈情報も考慮しているためと考えられます。

デメリット:

  • 位置特定精度(特に小物体の検出): グリッドシステムに依存しているため、一つのグリッドセルから予測できるバウンディングボックスの数(B)が少ない(YOLOv1ではB=2)ことや、小さな物体が多くのグリッドセルにまたがって存在することが少ないため、小物体の検出が苦手でした。また、バウンディングボックスの位置とサイズの予測精度が、R-CNNファミリーなどの2-Stage Detectorに比べて劣る傾向がありました。
  • アスペクト比の異なる物体への対応: 各グリッドセルが予測するバウンディングボックスの初期形状(暗黙的に学習される)が限られるため、学習データセットにないような極端なアスペクト比を持つ物体の検出が難しいという課題がありました。
  • 近い物体の検出: 一つのグリッドセルは、基本的に一つのクラスの物体だけを予測します(クラス確率がグリッドセルごとに一つであるため)。そのため、一つのグリッドセル内に中心を持つ複数の物体が存在する場合(例えば、密集している物体)、それらを個別に検出することが難しいという課題がありました。

これらのデメリットは、その後のYOLOシリーズのバージョンアップで改良されていくことになります。しかし、YOLOv1が示した「エンドツーエンドで高速に物体検出を行う」という方向性は、その後の物体検出研究に大きな影響を与えました。

YOLOシリーズの進化

YOLOv1が登場した後、その高速性とシンプルさという利点を維持しつつ、精度や様々な課題を克服するために、多くの改良が加えられた後継バージョンや派生手法が提案されました。ここでは、主要なYOLOシリーズの進化を追っていきます。

YOLOv2 (YOLO9000)

YOLOv2は、YOLOv1の精度を大幅に向上させると同時に、更なる高速化や、9000種類もの物体を検出できる「YOLO9000」という拡張版も提案したバージョンです。多くの技術的な改善が含まれています。

主な改善点 (Improvements):

  • Batch Normalization: 各畳み込み層の後にバッチ正規化を追加しました。これにより、学習が安定し、収束が速くなり、正則化の効果も得られるため、Dropoutのような他の正則化手法を省略しても精度が向上しました。全ての畳み込み層にバッチ正規化を適用することで、mAP (mean Average Precision) が2%向上しました。
  • High Resolution Classifier: YOLOv1は学習時に224×224の画像で分類器を事前学習し、検出時に448×448の画像でファインチューニングを行いました。YOLOv2では、まず224×224で分類器を学習した後、高解像度(448×448)の画像を用いて分類器を10エポックほどファインチューニングする期間を設けました。これにより、ネットワークが高解像度の入力に慣れ、物体検出の精度が向上しました(mAPが約4%向上)。
  • Anchor Boxes: YOLOv1はグリッドセルごとにバウンディングボックスを直接予測しましたが、YOLOv2ではFaster R-CNNで導入されたアンカーボックスの概念を取り入れました。事前に定義されたいくつかのアンカーボックス(基準となる矩形)を用意し、ネットワークは各グリッドセルにおいて、これらのアンカーボックスからのオフセット(ずれ)とスケールファクターを予測します。これにより、物体の形状やサイズに対する検出能力が向上しました。
  • Dimension Clusters: アンカーボックスのサイズを手動で決めるのではなく、学習データセット中の正解バウンディングボックスに対してk-meansクラスタリングを行い、最も代表的な形状・サイズのアンカーボックスを自動的に決定しました。これにより、データセットの特性に合ったより適切なアンカーボックスを使用できるようになり、検出性能が向上しました。論文では、Pascal VOCで5個、COCOで9個のアンカーボックスを使用した場合に、手動で選ぶよりもIoUが高くなることを示しています。
  • Direct location prediction: YOLOv1ではバウンディングボックスの中心座標をグリッドセルからのオフセットとして直接予測しましたが、不安定になる場合がありました。YOLOv2では、中心座標の予測に対してシグモイド関数を適用し、予測値が常にグリッドセル内に収まるように制約を付けました。これにより、予測が安定しました。
  • Fine-grained features: よりきめ細かい特徴を利用するために、浅い層の特徴マップを深い層の特徴マップと結合するPassthrough層を導入しました。これにより、ネットワークは空間的な情報(位置精度)をより保持できるようになり、特に小物体の検出精度が向上しました。浅い層の26×26の特徴マップを、深い層の13×13の特徴マップと組み合わせることで、特徴マップの解像度を事実上向上させました。
  • Multi-scale training: 様々なサイズの入力画像でネットワークを学習させることで、様々なスケールの物体に対する検出性能を向上させました。数エポックごとに異なる入力画像サイズ(例:320×320, 352×352, …, 608×608)にリサイズして学習を行いました。これにより、様々なスケールでの頑健性が増しました。
  • Darknet-19: より強力な特徴抽出器として、19個の畳み込み層と5個のMaxプーリング層からなる新しいネットワーク構造「Darknet-19」を設計・採用しました。Darknet-19は、それまでの標準的なVGGモデルなどと比較して、より少ない計算量で同等以上の性能を発揮することを目指しました。

YOLO9000:

YOLOv2の拡張版として提案されたYOLO9000は、ImageNet(画像分類データセット、約2200万画像、9000種類以上のクラス)とCOCO(物体検出データセット、約12万画像、80クラス)という性質の異なる2つのデータセットを組み合わせて学習することで、9000種類もの物体を検出できるようにすることを試みました。これは、分類データセットの豊富さと検出データセットの少なさを補う画期的なアプローチでした。

このために、著者らはWordTreeという手法を開発しました。これは、ImageNetのクラス階層構造を利用して、分類データセットと検出データセットのクラスを組み合わせるためのツリー構造です。ネットワークは、このWordTree構造に沿って階層的にクラス確率を予測します。これにより、例えば「犬」という大カテゴリだけでなく、「ゴールデンレトリバー」や「プードル」といったより詳細なカテゴリを、それらの画像がImageNetに分類データとして含まれている場合に検出できるようになります。

YOLO9000は、分類データセットの豊富なクラス情報を物体検出に活用するという、当時は非常に先進的な試みでした。

YOLOv3

YOLOv3は、YOLOv2からいくつかの重要な改良が加えられ、特に精度をさらに向上させたバージョンです。

主な改善点 (Improvements):

  • Darknet-53: より深く強力な特徴抽出ネットワークとして、残差接続(ResNetで導入されたスキップ接続)を取り入れたDarknet-53を導入しました。Darknet-53は、53個の畳み込み層から構成され、ResNet-101やResNet-152と同等以上の精度を、より少ない浮動小数点演算数で実現しました。
  • Multi-scale detection (Feature Pyramids): YOLOv3は、特徴マップの異なる3つのスケール(解像度)で物体検出を行います。深い層で得られる低解像度の特徴マップ(大物体の検出に適している)に加えて、浅い層からアップサンプリングされた特徴マップと深い層の特徴マップを結合することで得られる中解像度・高解像度の特徴マップ(小物体の検出に適している)を利用します。これにより、様々なサイズの物体に対する検出性能が大幅に向上しました。これは、Feature Pyramid Networks (FPN) と同様の考え方です。
  • Independent logistic classifiers (Multi-label classification): YOLOv1/v2では、各グリッドセルに対してSoftmax関数を用いてクラス確率を計算していましたが、これは各物体が単一のクラスに属するという前提に基づいています。しかし、例えば「人」と「犬」が乗った「バイク」といったように、一つのバウンディングボックスが複数のラベルを持つ可能性がある(Multi-label)場合には適していません。YOLOv3では、Softmax関数を廃止し、各クラスに対して独立したロジスティック分類器を使用しました。これにより、一つの物体が複数のクラスに同時に属する可能性をモデル化できるようになりました(ただし、COCOデータセットなどでは各物体は単一クラスとして扱われるため、この変更の恩恵は限定的かもしれません)。
  • Bounding Box prediction (logistic activation for confidence): YOLOv3では、信頼度スコアの予測にシグモイド関数(ロジスティック活性化)を使用します。これにより、出力が0から1の間に収まります。

YOLOv3は、これらの改良により、当時の最先端の2-Stage Detector(例:RetinaNet)に匹敵する精度を、大幅に高速な速度で実現しました。特に、様々なスケールでの検出能力の向上は、実用上大きなメリットでした。YOLOv3は、その高い性能と実装のしやすさから、長らく物体検出のデファクトスタンダードの一つとして広く利用されました。Darknetという独自のフレームワークで実装されていたことも特徴です。

YOLOv4

YOLOv4は、従来のYOLOシリーズのアーキテクチャをベースに、近年提案された多くの画像認識技術(”Bag of Freebies”や”Bag of Specials”と呼ばれる様々な改良テクニック)を取り入れて、物体検出の性能をさらに向上させたバージョンです。Darknetフレームワークで実装されました。

主な改善点 (Improvements):

YOLOv4は、バックボーンネットワーク、ネック(バックボーンとヘッドを接続する部分)、ヘッド(最終的な予測を行う部分)の3つの主要な部分に分けて改良を加えています。

  • バックボーン(Backbone):
    • CSPDarknet53: Darknet-53をベースに、CSPNet (Cross Stage Partial Network) の戦略を取り入れたCSPDarknet53を採用しました。CSPNetは、特徴マップを2つの部分に分割し、一方の部分を密なブロックに通し、もう一方の部分をそのまま次のステージにスキップ接続として渡すことで、計算量を削減しつつ精度を向上させる手法です。
  • ネック(Neck):
    • PANet (Path Aggregation Network): 特徴ピラミッド構造において、トップダウンパス(深い層から浅い層への特徴伝達)に加えて、ボトムアップパス(浅い層から深い層への特徴伝達)も取り入れたPANetを採用しました。これにより、浅い層のきめ細かい空間情報と深い層の豊かなセマンティック情報の両方を、異なるスケールの特徴マップ間で効果的に融合させることができます。
    • SPP (Spatial Pyramid Pooling): 様々なサイズのプーリングを行い、異なるスケールの特徴を抽出・結合するSPPブロック(またはSPPF: Spatial Pyramid Pooling – Fast)を導入しました。これにより、物体のスケール変動に対する頑健性が向上しました。
  • ヘッド(Head):
    • YOLOv3と同様に、アンカーベースの検出ヘッドを使用します。
  • Bag of Freebies (BoF): 学習段階でのみ計算コストを増加させることで、推論時の速度を犠牲にせずに精度を向上させる様々なテクニックの集合です。
    • Data Augmentation (データ拡張): CutMix, Mosaic (複数の画像をモザイク状に結合する新しいデータ拡張手法) など。
    • DropBlock: Dropoutの改良版で、特徴マップ上の連続した領域をドロップアウトします。
    • CIoU Loss: バウンディングボックス回帰の損失関数として、従来のL2損失やIoU損失よりも高精度なCIoU (Complete IoU) Lossを採用しました。CIoU Lossは、IoUだけでなく、バウンディングボックスの中心間の距離やアスペクト比の違いも考慮します。
  • Bag of Specials (BoS): 主にモデルのアーキテクチャを改善することで、推論時のコストをわずかに増加させる代わりに精度を大きく向上させる様々なテクニックの集合です。
    • Mish activation: Leaky ReLUやSwishよりも高性能な活性化関数として提案されたMish関数を採用しました。
    • DIoU-NMS: NMSにおいて、バウンディングボックス間のIoUだけでなく、中心間の距離も考慮するDIoU-NMSを採用しました。これにより、大きく重複しているにも関わらず中心が近いボックス(同じ物体に対する予測である可能性が高い)を適切に抑制し、検出性能を向上させます。
    • その他、様々な正規化手法、レイヤー構造などの改良。

YOLOv4は、これらの多岐にわたる最適化と最新技術の統合により、当時の他の最先端モデルと比較して、より高速でありながら同等以上の精度を達成しました。

YOLOv5

YOLOv5は、Ultralytics社によって公開されたYOLOの実装です。公式な論文は存在しませんが、非常に洗練されたPyTorchベースの実装であり、コミュニティで広く利用されています。YOLOv4とほぼ同時期に公開され、YOLOv4と同様に多くの最新技術を取り入れています。

主な特徴と改善点:

  • PyTorchベースの実装: Darknetではなく、広く使われているディープラーニングフレームワークであるPyTorchで実装されています。これにより、モデルのカスタマイズや他のPyTorchエコシステムとの連携が容易になりました。
  • 幅広いモデルサイズ: YOLOv5s (small), YOLOv5m (medium), YOLOv5l (large), YOLOv5x (extra large) といった、様々なサイズのモデルが提供されており、計算リソースや要求される性能に応じて選択できます。
  • アーキテクチャ: YOLOv4と類似したCSPDarknet系のバックボーン、PANet系のネック、検出ヘッドの構造を持ちます。
    • Focus Layer: YOLOv5sなどの初期バージョンで採用された、入力画像をパッチに分割してチャンネル方向に結合するレイヤー。計算量を削減しつつ情報を保持する効果があるとされましたが、後のバージョンでConv層に置き換えられました。
    • SPP/SPPF: SPPまたはその高速版であるSPPFを採用。
    • PANet改良: YOLOv4のPANet構造にさらに改良が加えられています。
  • 学習に関する工夫:
    • AutoAnchor: 学習開始前に、データセットに合わせて最適なアンカーボックスのサイズを自動的に計算します。
    • Hyperparameter evolution: 機械学習のハイパーパラメータ探索手法を用いて、学習に最適なハイパーパラメータを自動的に探索する機能。
    • Mosaic Data Augmentation: YOLOv4で提案されたMosaicデータ拡張を引き続き採用。
  • 使いやすさ: 事前学習済みモデルの利用、独自のデータセットでの学習、推論、エクスポート(ONNX, TensorRTなど)といった一連のパイプラインが非常に簡単に実行できるよう設計されています。

YOLOv5は、その高い性能に加えて、使いやすさと柔軟性から、多くの研究者や開発者に利用されています。

YOLOv6, YOLOv7, YOLOv8

YOLOv5以降も、様々な組織や研究チームから「YOLOv6」「YOLOv7」「YOLOv8」といった名前で新しいモデルが提案されています。これらのバージョンは、YOLOの基本思想である「高速性と高精度」を追求しつつ、その時点での最新のディープラーニング技術(例:Transformerの要素の取り込み、より効率的なネットワーク構造、新しい損失関数、先進的な学習手法など)を取り入れています。

  • YOLOv6: Meituan (中国の企業) によって開発され、特にリアルタイム性能を重視しています。RepVGGやEfficientNetに似た新しいバックボーンやネック構造、Decoupled Head(分類と回帰のヘッドを分離)などを採用しています。
  • YOLOv7: YOLOv4の著者らを含むチームによって開発され、YOLOv4やYOLOv5をさらに上回る精度と速度を達成したと報告されています。ELAN (Efficient Layer Aggregation Network) と呼ばれる新しいバックボーン構造や、Model scaling for concatenation-based modelsといった独自の技術を導入しています。学習効率を高めるための様々な”Trainable bag-of-freebies”も特徴です。
  • YOLOv8: Ultralytics社によって開発され、YOLOv5の後継と位置づけられています。よりモダンなアーキテクチャ(例えば、CSP層の改良、Anchor-free detectionへの移行など)や、セグメンテーション、姿勢推定といった他のタスクへの対応も含まれています。使いやすさもさらに向上しています。

これらの新しいバージョンは、それぞれ異なるアーキテクチャ上の工夫や学習手法の改善を提案しており、物体検出の最先端の性能を常に更新し続けています。また、より軽量で高速なモデルや、より高精度なモデルなど、様々なトレードオフに対応したバリエーションが提案される傾向にあります。

YOLOシリーズの進化は、物体検出技術の発展において非常に大きな役割を果たしており、今後もその進化は続いていくと考えられます。

YOLOの応用事例

YOLOの高速性と比較的高い精度は、様々な分野でリアルタイムでの物体検出を実現し、多くの応用を可能にしました。以下に代表的な応用事例を挙げます。

  • 自動運転: 自動運転車は、カメラ映像から車両、歩行者、自転車、信号機、標識などの物体をリアルタイムで正確に検出する必要があります。YOLOのような高速な物体検出モデルは、運転の安全性に関わるこの重要なタスクにおいて中心的な役割を果たします。
  • 防犯・監視システム: 監視カメラ映像から、不審者の侵入、置き去り荷物、異常な行動(例:転倒、争い)などをリアルタイムで検出するためにYOLOが利用されます。これにより、オペレーターの負担を軽減し、インシデントへの迅速な対応を可能にします。
  • 産業分野:
    • 不良品検出: 製造ラインを流れる製品の中から、傷や汚れ、形状異常などの不良品を自動的に検出します。高速なYOLOは、高速で流れるラインでも適用可能です。
    • 在庫管理: 倉庫内の棚にある製品の種類や数量をカメラで撮影して自動的に把握します。
    • ロボットアームによるピッキング: ロボットが対象の物体を認識し、正確に掴むために、YOLOを用いて物体の位置と種類を特定します。
  • 医療画像解析: X線画像、CT画像、MRI画像などから、病変部(腫瘍、骨折など)や臓器の位置を検出・特定するのにYOLOが用いられることがあります。これにより、医師の診断を支援したり、診断プロセスを効率化したりすることが期待されます。
  • ドローンによる空撮画像の解析: ドローンで撮影した画像から、特定の建物、車両、人員などを検出します。災害状況の把握、インフラの点検、農業での作物監視などに活用されます。
  • スポーツ分析: スポーツ選手の動きやボールの位置、戦術などを自動的に追跡・分析するために、YOLOが利用されます。例えば、サッカーやバスケットボールの試合映像から選手やボールを検出することで、選手ごとの走行距離やシュート数などを定量的に分析できます。
  • 小売業: 店舗内の客の導線分析、棚の商品欠品検出、万引き防止などに活用されます。

これらの事例からもわかるように、YOLOは単なる学術的な技術に留まらず、私たちの社会生活を豊かにし、様々な産業の効率化・自動化に貢献する重要な技術となっています。

YOLOを始めるには

YOLOを使った物体検出を実際に試してみたい、独自のデータセットで学習させてみたい、と考えている方のために、始めるためのステップと必要な環境について説明します。

必要な環境:

YOLOを含む多くのディープラーニングモデルを扱うためには、以下の環境が必要です。

  • プログラミング言語: Pythonが主流です。YOLOの様々な実装もPythonで提供されています。
  • ディープラーニングフレームワーク: PyTorchまたはTensorFlowがよく使われます。特にYOLOv5以降はPyTorchでの実装が主流です。
  • コンピュータビジョンライブラリ: OpenCVなど。画像や動画の読み込み、前処理、描画などに使用します。
  • 数値計算ライブラリ: NumPyなど。
  • GPU: ディープラーニングの学習や推論(特にリアルタイム処理)には、GPUの活用が必須です。NVIDIA製のGPUと、それに適合するCUDAおよびcuDNNライブラリが一般的に使用されます。クラウドサービス(Google Colab, Kaggle Kernels, AWS, GCPなど)のGPUインスタンスを利用するのも良い方法です。

学習済みモデルの使用:

最も手軽にYOLOを試す方法は、事前に学習されたモデルを利用することです。COCOデータセットなど、大規模なデータセットで学習されたYOLOモデルは、多くの一般的な物体(人、車、動物など)を検出できます。

  • Ultralytics社のYOLOv5/v8など、多くのYOLO実装では、学習済みモデルが公開されています。
  • 公開されているコードリポジトリをクローンし、READMEなどに従って学習済みモデルをダウンロードします。
  • 用意した画像や動画ファイルに対して、簡単なコマンドを実行するだけで物体検出を実行し、結果を可視化することができます。

これにより、コードを深く理解したり学習を行ったりすることなく、YOLOの物体検出能力を体験できます。

独自のデータセットでの学習:

特定の物体(例えば、工場で製造している特定の部品や、農業における特定の病気にかかった作物など)を検出したい場合は、独自のデータセットを作成してYOLOモデルを学習させる必要があります。

  1. データセットの準備:
    • 検出したい物体が含まれる画像を多数収集します(数百枚から数千枚、場合によってはそれ以上が必要です)。
    • 各画像に対して、検出したい物体を囲むバウンディングボックスを手動でアノテーション(ラベル付け)します。アノテーションツールとしては、LabelImg、CVAT、Roboflowなどが利用できます。YOLO形式のラベルファイル(通常はテキストファイルで、各バウンディングボックスのクラスID、中心座標、幅、高さが正規化された形式で記述されます)として保存します。
    • データセットを学習用、検証用、テスト用に分割します。
  2. モデルの選択: 学習済みモデルをベースにするか、ゼロから学習するかを決定します。一般的には、学習済みモデルをベースに独自のデータセットで追加学習(ファインチューニング)する方が、少ないデータ量で高い性能を得られます。使用するYOLOのバージョン(v3, v4, v5, v8など)を選択します。
  3. 学習:
    • 選択したYOLO実装のコードを用意します(GitHubなどで公開されています)。
    • 設定ファイル(ハイパーパラメータ、データセットのパス、クラス数など)を編集します。
    • GPUを使用して学習を実行します。学習には時間がかかります(数時間から数日、データセットの規模や使用するGPUによる)。
  4. 評価と調整: 学習中に検証用データセットでモデルの性能を評価し、必要に応じてハイパーパラメータやネットワーク構造を調整します。学習後の最終モデルをテスト用データセットで評価し、mAPなどの指標を確認します。
  5. 推論とデプロイ: 学習済みのモデルを用いて、新しい画像や動画に対して物体検出を行います。必要に応じて、PC、サーバー、エッジデバイスなど、利用したい環境に合わせてモデルを最適化(量子化、TensorRTへの変換など)し、デプロイします。

利用可能なライブラリやフレームワーク:

  • Ultralytics YOLO: YOLOv5以降の開発元であり、最も人気があり活発に開発されているYOLO実装の一つです。PyTorchベースで、使いやすく機能も豊富です。
  • Darknet: YOLOv3/v4などが開発されたオリジナルのC++ベースのフレームワークです。実行速度は非常に速いですが、PyTorchなどに比べてカスタマイズ性は低いかもしれません。
  • MMDetection: オープンソースの物体検出ツールボックスです。YOLOを含む様々な物体検出モデルが実装されており、比較や実験が容易です。PyTorchベース。

これらの情報やリソースを活用することで、YOLOを使った物体検出の学習と実践を始めることができます。

今後のYOLOと物体検出の展望

物体検出の分野は、YOLOが登場して以来、目覚ましい速さで進化を続けています。今後のYOLOや物体検出技術は、以下のような方向性で発展していくと考えられます。

  • 更なる高速化と高精度化: 常にトレードオフの関係にある速度と精度を、いかに高いレベルで両立させるかが追求されていくでしょう。より効率的なネットワーク構造、新しい学習手法、量子化や枝刈りなどのモデル圧縮技術などが研究・開発されると考えられます。
  • Transformerモデルとの融合: 自然言語処理分野で大きな成功を収めたTransformerモデルが、コンピュータビジョン分野でも注目されています。ViT(Vision Transformer)のように画像全体をトークンとして扱う手法や、DETR(Detection Transformer)のように物体検出タスク自体をTransformerベースで解く手法が登場しています。YOLOのようなCNNベースのモデルとTransformerの利点を組み合わせる研究も進む可能性があります。
  • データ効率の良い学習: 大規模なアノテーション付きデータセットの構築はコストがかかります。少ないデータで高い性能を達成するFew-shot learningや、全く見たことのないクラスの物体を検出するZero-shot learning、大量の教師なしデータや自己教師ありデータを利用する手法などが重要になってくるでしょう。
  • エッジデバイスへの展開: スマートフォン、ドローン、監視カメラ、自動車などのエッジデバイス上でリアルタイムに物体検出を実行するニーズは高まっています。限られた計算リソース、メモリ、電力で動作する軽量かつ高性能なモデルや、ハードウェアアクセラレーションを活用する技術が不可欠になります。YOLOシリーズも、軽量化されたモデルや最適化された実装が提供されることで、エッジAI分野での普及が進むと考えられます。
  • 多様なタスクへの統合と連携: 物体検出は、セグメンテーション、トラッキング、姿勢推定、3D物体検出など、他のコンピュータビジョンタスクと密接に関連しています。これらのタスクを単一のフレームワークやモデルで同時に処理する研究や、タスク間で情報を共有して性能を向上させるアプローチが進むでしょう。YOLOv8がセグメンテーションに対応したように、YOLOシリーズもタスクの範囲を広げていく可能性があります。
  • 説明可能性と頑健性: ディープラーニングモデルの「ブラックボックス」問題を解決し、検出結果の根拠を人間が理解できるようにする「説明可能なAI(XAI)」への関心が高まっています。また、悪意のある入力(Adversarial Attack)に対する頑健性の向上も重要な研究課題です。信頼性の高いAIシステムを構築するためには、これらの課題に取り組む必要があります。
  • Diffusion Modelなどの新しい生成モデルの応用: 画像生成分野で注目されているDiffusion Modelなどの新しい生成モデルが、物体検出を含む識別タスクに応用される可能性も研究されています。

YOLOは、物体検出の歴史において「高速リアルタイム検出」という新たな扉を開きました。その後の進化は、その基本思想を維持しつつ、精度、多様なスケールへの対応、使いやすさなど、様々な側面で改良を重ねてきました。今後のYOLO、そして物体検出技術全体は、これらの研究開発のトレンドを取り込みながら、さらに高性能で汎用的、そして実社会でより安全・安心に利用できる技術へと進化していくでしょう。

まとめ

この記事では、「YOLO入門:物体検出AIの基礎知識」と題して、物体検出の基本的な概念から始まり、画期的な手法であるYOLO(You Only Look Once)の詳細、そしてその後のYOLOシリーズの進化について、約5000語にわたり詳しく解説しました。

まず、コンピュータビジョンにおける物体検出の役割を確認し、従来の検出手法が抱えていた課題、特に処理速度の遅さに触れました。次に、YOLO登場以前の主流であった2-Stage Detector(R-CNNファミリー)の仕組みと限界について説明しました。

そして、YOLOv1がどのように物体検出タスクを回帰問題として捉え、画像を一度だけ見て検出を行うという革新的なアプローチを採用したかを解説しました。特に、グリッドシステム、バウンディングボックス予測、信頼度スコア、クラス確率といったYOLOv1の基本的な考え方と、S x S x (B*5 + C)という特徴的な出力テンソルの構造を詳細に説明しました。また、YOLOv1のアーキテクチャ、学習プロセス、そして検出結果の後処理に不可欠なNMSについても触れました。YOLOv1のメリットである高速性や画像全体を考慮する点、そしてデメリットである位置特定精度の課題なども整理しました。

YOLOシリーズの進化の歴史では、YOLOv2 (YOLO9000) で導入されたバッチ正規化、アンカーボックス、様々な改善手法、そしてYOLOv3で採用されたDarknet-53、マルチスケール検出(Feature Pyramids)、独立ロジスティック分類器といった主要な技術的改良点を追いました。さらに、YOLOv4で統合されたBag of FreebiesやBag of Specials、そして近年広く使われているYOLOv5、最新のYOLOv6/v7/v8におけるトレンドについても概要を説明しました。これらのバージョンアップにより、YOLOは高速性を維持しつつ、精度や汎用性を飛躍的に向上させてきました。

最後に、YOLOがどのように自動運転、監視、産業、医療など、私たちの社会の様々な分野で応用されているかを紹介し、実際にYOLOを使い始めるためのステップ(環境構築、学習済みモデル、独自データセットでの学習)と利用可能なライブラリについても案内しました。そして、Transformerとの融合、データ効率化、エッジデバイスへの展開など、今後のYOLOおよび物体検出技術の展望に触れました。

YOLOは、物体検出AIの分野におけるマイルストーンであり、その後の多くの研究開発に影響を与えました。この記事が、物体検出に興味を持った方やYOLOについて学びたい方にとって、このダイナミックな分野への理解を深める一助となれば幸いです。AI技術の進化は今後も加速していくでしょう。ぜひ、YOLOをはじめとする物体検出技術に触れ、その可能性を探求してみてください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール