1はじめに
より高速なrcnnに続いて、RGBマスターはターゲット検出の分野にズームインし、芸術的なパフォーマンスに近いものに依存します。RGB Great Godは、その有名な言葉をうまく示しました。改善を続ける人は誰でも、昨日の自分をゴミだと思っています。より高速なrcnnは、RCNN + RPNネットワークの2つの段階で学習されることは誰もが知っています。しかし、偉大な神の芸術的本能は、いや、いや、あなたは一度だけ見ると彼に告げています。暗くて風の強い一ヶ月の夜、このインスピレーションは偉大な神を興奮させて一晩中目覚めさせました。あなたの人生には何百年もあります、なぜ今起きてそれをしませんか、それであなたは何千もの言葉でこの傑作を持っています。
2.あなたは一度だけ見る
1.全体的な概要
素人の言葉で言えば、yolo、コンピューターは本質的に人間の拡張であるため、人間を超えても、可能な限り人間に近づけます。高速に基づく2段階のターゲット検出理論は、そのようなものです。表示されているオブジェクトの位置を知りたい場合は、それがどのような形状とサイズであるかを想像する必要があります。しかし、常識では、人々がオブジェクトを見るとき、立ち止まってオブジェクトの可能な形状とサイズについて考える必要はありません。だから、あなたは一度だけ見る。
2.テストプロセス
検出プロセス全体も非常に簡単です。図に示すように、3つのステップがあります。最初のステップは、ネットワークに受け入れられるサイズ(448 * 448)に画像をスケーリングすることです。2番目のステップは、畳み込みネットワークを使用して特徴を抽出し、次に完全に接続された出力を使用します。予測ボックス; 3番目のステップは、最大値以外を抑制し、冗長なボックスを削除することです。
3.ネットワーク構造
以下は、ネットワーク構造全体の概略図です。合計24の畳み込み層、2つの完全に接続された層、それに続く出力層があります。残留ネットワークのアイデアを利用して、1 * 1の畳み込みレイヤーを使用して前のレイヤーの機能をダウンサンプリングします。同時に、24層の畳み込みの代わりに9層の畳み込みを使用して、高速ヨーロがトレーニングされました。
最終出力は7 * 7 * 30テンソルです。このデータを説明するために、yoloは元の画像をS * S(7 * 7)セルのグリッドに分割します。各セルは、1つのカテゴリオブジェクトの予測のみを担当します。 C;各セルは2つの候補フレームを予測しますB;各候補フレームは5つの値x、y、w、h、Pr(オブジェクト)を出力する必要があります。これらには、ボックスの中心点位置(x、y)(セルの左上隅に対する)、幅と高さw、h、およびパスカルデータセットで20であるため、信頼レベルPr(オブジェクト* IOUがあるかどうかの確率)が含まれます。分類、各カテゴリには対応する確率情報があります。したがって、最終的な出力は上記のS * S *(2 * 5 + 20)= 7 * 7 * 30です。
4.損失機能
面倒に思えるこの損失関数は、実際には候補ボックス、信頼度、分類の3つの部分に分けることができます。すべて、二乗差損失を使用します。その中で、λcoord(5)とλnoobj(0.5)は、損失に対する正の例が少なすぎる場合と負の例が多すぎる場合の影響のバランスを取ることです。wとhのルート記号は、異なるサイズのボックスのバランスを取ることです(同じギャップが小さなボックスに大きな影響を与えます)。ボックス、この不一致を軽減するための平方根);次に、肯定的な例では3つの損失があり、否定的な例では信頼性の損失のみがあります。
5.アクティベーション機能
yolov1は、従来のreluの代わりにリーキーreluを使用します。つまり、0未満の値は0として扱われませんが、0.1を掛けます。
6.トレーニング
1.トレーニング中、データの前処理には、色域をHSVに変換した後のランダムなスケーリング、回転、露出と彩度の調整が含まれます。
2.これで、最初の20個の畳み込みレイヤーがimagenetデータセットで事前トレーニングされ、最終的なトレーニングとテストがdarknetを使用して実行されます。
3.学習率を75ラウンドで0.001から0.01に増やし、次に30ラウンドで0.001を使用し、最後に30ラウンドで0.0001を使用します。
4.最初の完全に接続されたレイヤーで0.5のドロップアウト率が使用されました
5.最後にyoloはvocデータセットMAP(精度率とリコール率の計算)で63.4に達し、速度は45FPSに達しました。バックボーンがVGG16を使用する場合、MAPは66.4に達することができますが、速度は21FPSに低下し、リアルタイムにはほとんど到達できません。グレートヨーロの精度は高速よりも低くなりますが、その速度は定性的に向上しており、ほとんどのシナリオでリアルタイムの要件を満たすことができます。ただし、リコール率を改善する必要があります。今年発売されたばかりのyolov2、yolov3、yolov4と、発売されたばかりで他の人からyolo5という名前にふさわしくないと評価されたyolov5がまだ残っていることを心配しないでください。とにかく、4と5は偉大な神ではありません。ジェイ・チョウがもう歌わないように、RGBはそれ自体でそれをしました、RGBはなくなりました。
3.関連する問題
1.論文は、オブジェクトの中心が配置されているセルがオブジェクトを予測する責任があると述べています。これを達成するにはどうすればよいですか?
これはエンジニアリングにおける特定の実装の問題であり、実際には頭痛の種ですが、この問題を理解すれば、基本的にyoloコードの内部処理ロジックを理解できます。
ソースコードを通じて、yoloが画像S * S * 25(S * S *(信頼度+実フレーム(x、y、w、h)+分類))の実フレームに対応する情報を事前に整理することがわかっています。比較してください。予測フレームS * S *(2 * 5 + 20)。実際の画像のセルは1つのフレームの予測のみを担当するため、2を掛ける必要はありません。次に、x *(cell_size / image_size)の方法を使用して、実際のフレームの中心点座標がどのセルに含まれるかを計算します。たとえば、実フレームの中心点は(224 * 224)であり、この実フレームの予測を担当するセルは(int(224 * 7/448)= 3、int(224 * 7/448)= 3)であり、これは3番目です。行の3番目のセル。
def load_pascal_annotation(self, index):
"""
Load image and bounding boxes info from XML file in the PASCAL VOC
format.
"""
imname = os.path.join(self.data_path, 'JPEGImages', index + '.jpg')
im = cv2.imread(imname)
h_ratio = 1.0 * self.image_size / im.shape[0]
w_ratio = 1.0 * self.image_size / im.shape[1]
# im = cv2.resize(im, [self.image_size, self.image_size])
label = np.zeros((self.cell_size, self.cell_size, 25))
filename = os.path.join(self.data_path, 'Annotations', index + '.xml')
tree = ET.parse(filename)
objs = tree.findall('object')
for obj in objs:
bbox = obj.find('bndbox')
# Make pixel indexes 0-based
#如果图像进行了缩放 框也要进行相应的缩放
x1 = max(min((float(bbox.find('xmin').text) - 1) * w_ratio, self.image_size - 1), 0)
y1 = max(min((float(bbox.find('ymin').text) - 1) * h_ratio, self.image_size - 1), 0)
x2 = max(min((float(bbox.find('xmax').text) - 1) * w_ratio, self.image_size - 1), 0)
y2 = max(min((float(bbox.find('ymax').text) - 1) * h_ratio, self.image_size - 1), 0)
#name属性代表了类别
cls_ind = self.class_to_ind[obj.find('name').text.lower().strip()]
#中心点坐标 宽 高
boxes = [(x2 + x1) / 2.0, (y2 + y1) / 2.0, x2 - x1, y2 - y1]
#计算中心点的坐标落在哪一个cell单元格内
x_ind = int(boxes[0] * self.cell_size / self.image_size)
y_ind = int(boxes[1] * self.cell_size / self.image_size)
if label[y_ind, x_ind, 0] == 1:
continue
#置信度为1 框的坐标 对应的类别为1
label[y_ind, x_ind, 0] = 1
label[y_ind, x_ind, 1:5] = boxes
label[y_ind, x_ind, 5 + cls_ind] = 1
return label, len(objs)
最後に、損失を計算するとき、応答は実際のボックスの信頼度に対応します。損失を計算するとき、セル内のIOUが最大のボックスは、予測の信頼度で1に設定されます。応答は、予測に関与しないすべてのセルをフィルタリングします。 IOUの最大値は、予測が不正確なボックスを除外します.2を掛けると、調整する必要のあるボックスになります。
2.元の画像をS * Sセルに分割する方法
最初の質問から、実際のフレームをS * S * 25に分割し、次に実際のフレームを領域分割の形式で表現し、最後にこのように領域を分割して損失を計算できます。これにより、エリアを分割して予測する機能が実現します。
4.まとめ
この記事では、かつては非常に素晴らしいyoloV1を紹介しました。これは、統合ネットワークを使用して、ターゲット検出のエンドツーエンド処理を実現します。最初にダークネットネットワークを使用して特徴を抽出し、次に完全に接続されたレイヤーに接続して予測します。元の画像はS * Sエリアセルに分割され、オブジェクトの中心が配置されているセルが調整されます。NMSの非最大値が抑制されると、しきい値を保持する以前の方法とは異なりますが、調整のためにIOUが最大のボックスを直接取得します。yoloの3段階損失機能も紹介されています。このような簡潔な形式により、yoloは予測速度の点でリアルタイムのパフォーマンスを満たしますが、唯一の欠点は、yoloが精度の点でより努力する必要があることです。後で紹介するように、彼らは一生懸命働いて成功しました。乞うご期待!
くそー、それはまたとても遅いです。遅く寝て遅く起きるのが仕事と休息のための私の最も快適な時間だと思います。私は今、勉強せず、盲目的にゲームをプレイしないという罪悪感が特に好きです。何年もの間、私はこの罪に苦しめられました、そして今、私はついにそれを首尾よく取り除きました。言葉はかっこいいです。今では私はもはや学習の奴隷ではありませんが、学習は私の弟です。明日は何もしないように挑戦し、映画を見て死ぬまで見ます。私はただ寝るだけです、とにかく、私はぼんやりしています、私はただ勉強しません。すごい、本当にすごい!
GiaoとXuZhenzhenが最新シングル「HappyRealGiao」でコラボレーション