目次
ターゲット検出操作とステージの概要
01.NMSのお仕事
問題の説明
答え
最初の質問と答え
# 加载盘
from google.colab import drive
drive.mount('/content/drive/')
# 指定当前的工作文件夹
import os
# 此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上
os.chdir("/content/drive/My Drive/Colab/Notebooks/")
注: コードは Colab で実行されます。ローカルで実行する場合、上記のコードを実行する必要はありません。
# 单类别的NMS实现
import numpy as np
def nms(bboxes,confidence_score,threshold):
"""非极大抑制过程
:param bboxes: 同类别候选框坐标
:param confidence: 同类别候选框分数
:param threshold: iou阈值
:return:
"""
# 1.传入无候选框返回空
if len(bboxes) == 0:
return [],[]
# 强转数组
bboxes = np.array(bboxes)
score = np.array(confidence_score)
# 取出n个的极坐标点
x1 = bboxes[:,0]
y1 = bboxes[:,1]
x2 = bboxes[:,2]
y2 = bboxes[:,3]
# 2.对候选框进行NMS筛选
# 返回的框坐标和分数
picked_boxes = []
picked_score = []
# 对置信度进行排序,获取排序后的下标序号,argsort默认从小到大排序
order = np.argsort(score)
areas = (x2 - x1) * (y2 - y1)
while order.size > 0:
# 将当前置信度最大的框加入返回值列表中
index = order[-1]
# 保留该类剩余box中得分最高的一个
picked_boxes.append(bboxes[index])
picked_score.append(confidence_score[index])
# 获取当前置信度最大的候选框与其他任意候选框的相交面积
x11 = np.maximum(x1[index], x1[order[:-1]])
y11 = np.maximum(y1[index], y1[order[:-1]])
x22 = np.minimum(x2[index], x2[order[:-1]])
y22 = np.minimum(y2[index], y2[order[:-1]])
# 计算相交的面积,不重叠时面积为0
w = np.maximum(0.0, x22 - x11)
h = np.maximum(0.0, y22 - y11)
intersection = w * h
# 利用相交的面积和两个框自身的面积计算框的交并比
ratio = intersection / (areas[index] + areas[order[:-1]] - intersection)
# 保留IOU小于阈值的box
keep_boxes_indics = np.where(ratio < threshold)
# 保留剩余的框
order = order[keep_boxes_indics]
#返回NMS后的框及分类结果
return picked_boxes,picked_score
# 输入数据测试
bounding = [(187, 82, 337, 317), (150, 67, 305, 282), (246, 121, 368, 304)]
confidence_score = [0.9, 0.75, 0.8]
threshold = 0.4
picked_boxes, picked_score = nms(bounding, confidence_score, threshold)
print('阈值threshold为:', threshold)
print('NMS后得到的bbox是:', picked_boxes)
print('NMS后得到的bbox的confidences是:', picked_score)
运行结果:
阈值threshold为: 0.4
NMS后得到的bbox是: [array([187, 82, 337, 317])]
NMS后得到的bbox的confidences是: [0.9]
2番目の質問への回答
ターゲット検出方法の分類、2 段階 (2 段階) と 1 段階 (1 段階) に分けられる
- 二段階アルゴリズム
プロセス: 最初に候補フレームを生成し、次にそれらを CNN で分類し、CNN 畳み込み特徴を抽出し、候補領域のスクリーニングとターゲット検出を実行します。
特徴:精度は高いが遅い
二段アルゴリズムの代表:RCNNシリーズ(RCNN—Faster RCNN)
- 1 段階のアルゴリズム
プロセス:バックボーンネットワークを介して、対象のカテゴリと位置情報を見つけます
特徴: 高速だが精度が低い
二段アルゴリズムの代表:YOLOシリーズ(yolov1—yolov3)、SSDなど
3番目の質問への回答
RCNN ターゲット検出のプロセス: 候補領域生成、CNN 特徴抽出、ターゲット分類、ターゲット ポジショニング
短所: トレーニング段階が多く、トレーニングに時間がかかる、予測速度が遅い、ディスク容量が大きく占有される、データの形状が変化する
02.アンカーの考え方
問題の説明
最初の質問と答え
アンカーは、オブジェクト検出における固定参照フレームを表します。最初に、さまざまなスケールとさまざまなアスペクト比を持つ一連の固定参照フレームが事前設定され、ほぼすべての位置をカバーします; 各参照フレームは、交差比がしきい値 (トレーニング プリセット値、一般的に使用される 0.5 または 0.7) より大きいターゲットを検出する役割を果たします。 ; アンカー テクノロジは、候補領域生成の問題を「この固定参照フレームにターゲットが存在するか、ターゲット フレームが参照フレームからどれだけ離れているか」に変換し、スライディング ウィンドウのマルチスケール トラバーサルは不要になります。必要。
2番目の質問への回答
RPN ネットワークの主なプロセスは次のとおりです。
まず、画像の任意の位置をカバーする一連の固定参照フレーム アンカーを生成し、それを分類と回帰のために後続のネットワークに送信します; 分類分岐: ソフトマックス分類によってアンカーにターゲットが含まれているかどうかを判断します; 回帰分岐: アンカーのターゲット フレームを計算する 正確な候補領域を取得するためのオフセット; 最後に、提案レイヤーを介して、ターゲットを含むアンカーと対応する bbox 回帰オフセットを組み合わせて、候補領域と、小さすぎて範囲を超える候補領域を取得します。境界が解消されます。
画像を検出するには、バックボーンを使用して特徴マップを生成し、特徴マップ上で生成されたアンカーがターゲットに属する確率を計算し、対応する位置パラメーター (アンカーに対するオフセットとスケール変換) を計算します。高い確率で 6000 個のアンカーを選択し、回帰の位置パラメーターを使用し、これらの 6000 個のアンカーの位置を修正し、Rols を取得し、非最大抑制 (非最大抑制、NMS) 抑制を使用し、確率が最も高い 2000 を次のように選択します。生成された候補領域。
03. FasterRCNNのプロセスとトレーニング方法
よくある質問
FasterRCNN のフローチャートは次のとおりです。
ネットワークは、次の 4 つの主要部分に分けることができます。
-
バックボーン: バックボーンは一連の畳み込みニューラル ネットワークで構成されています. より高速な RCNN は、最初に一連の基本的な conv+relu+pooling レイヤーを使用して画像内の特徴を抽出し、画像の特徴マップ featuremap を取得します. 特徴マップは、後続の RPN レイヤーと完全に接続されたレイヤーで共有されます。主に特徴抽出を実行し、最後の完全に接続されたレイヤーを破棄し、特徴マップを取得して後続のネットワークに送信して処理します。
-
RPN ネットワーク: RPN ネットワークは、候補地域の地域提案を生成するために使用されます。この部分では、ソフトマックスによってアンカーが正か負か、つまりターゲットが含まれているかどうかを判断し、バウンディング ボックス回帰を使用してアンカーを修正し、正確な提案を取得します。主に候補領域を生成します。
-
Roi Pooling: この部分は、入力画像の特徴マップと提案を収集し、情報を統合した後に提案の特徴ベクトルを抽出し、それを後続の全結合層に送信して、ターゲット カテゴリを決定し、ターゲット位置を決定します。主に、RPN ネットワークによって生成された候補領域を収集し、それらを特徴マップにマッピングして次元を修正し、分類と回帰のために後続のネットワークに送信します。
-
head: この部分は、特徴ベクトルを使用して提案のカテゴリを計算し、バウンディング ボックス回帰によって検出フレームの最終的な正確な位置を取得します。
Faster-RCNN ネットワークのトレーニング方法:
トレーニング プロセス全体は、次の 4 つのステップに分かれています。
-
最初のステップ: ImageNet の事前トレーニング済みモデルで初期化された RPN ネットワークのトレーニング、および地域提案タスク用のエンドツーエンドの微調整。
-
2 番目のステップ: 最初のステップで RPN によって生成された提案ボックスを使用して、別の検出ネットワークが Fast RCNN によってトレーニングされます. この検出ネットワークも ImageNet 事前トレーニング済みモデルによって初期化されます. この時点で、2 つのネットワークは畳み込み層を共有しました。
-
ステップ 3: 検出ネットワークで RPN トレーニングを初期化しますが、共有畳み込み層を修正し、RPN 固有層のみを微調整します. これで、2 つのネットワークが畳み込み層を共有します.
-
ステップ 4: 共有畳み込み層を固定したままにして、Fast RCNN の fc 層を微調整します。このようにして、両方のネットワークが同じ畳み込み層を共有し、統合されたネットワークを形成します。
Faster RCNN には、一度に完了することができるエンドツーエンドのトレーニング方法もあり、RPN 損失と Fast RCNN 損失を追加してから、勾配降下最適化を実行してパラメーターを更新します。
04.ヨロの宿題
最初の質問と答え
まずはyoloV3の構造図をご覧ください
この写真は、このブログへの参照ですhttps://www.cnblogs.com/yymn/articles/13674816.html
前に書いたyoloシリーズの記事の写真は、主にDBLとCBLということで少し違いますが、意味は同じです。
DBL: 図 1 の左下隅に示されているように、コードでは Darknetconv2d_BN_Leaky であり、yolo_v3 の基本コンポーネントです。コンボリューション+BN+リーキーレルです。v3 では、BN とリーキー relu は既に畳み込み層の不可分な部分 (畳み込みの最後の層を除く) であり、一緒になって最小のコンポーネントを構成します。
resn: n は、res1、res2、...、res8 などを含む数値を表し、この res_block に含まれる res_units の数を示します。これは yolo_v3 の大きなコンポーネントです. yolo_v3 は ResNet の残差構造を利用し始めました. この構造を使用すると、ネットワーク構造をより深くすることができます (v2 の darknet-19 から v3 の darknet-53 まで, 前者は残差構造がありません). res_block の説明については、図 1 の右下隅で、その基本コンポーネントも DBL であることが直感的にわかります。
concat: テンソル連結。ダークネットの中間層とその背後の特定の層のアップサンプリングをつなぎ合わせます。splicing の操作は、residual レイヤーの add とは異なります. splicing はテンソルの次元を拡張しますが、add はテンソルの次元を変更しません.
バックボーン、出力部分は上記の参照ブログにあります。テキストが多すぎて、読むのが面倒です。より深く学びたい方は、引き続き勉強してください!
2番目の質問
まずこの写真を見て
このうち、bx、by、bw、bh は予測フレームの中心、幅、高さです。cx, cy は現在のグリッドの左上隅から画像の左上隅までの距離です. 最初にグリッドサイズを正規化する必要があります. つまり, グリッドの幅=1, 高さ=1. pw、ph は、前のボックスの幅と高さです。σ はシグモイド関数です。tx、ty、tw、th はネットワーク出力の結果であり、境界線の中心、幅、高さをそれぞれ予測するために使用されます。
σ 関数は tx,ty を範囲 (0,1) に制限するため、予測された境界ボックスの青い中心点は、青い背景のグリッド内に制限されます。境界ボックスの位置を制限すると、モデルの学習が容易になり、予測がより安定します。
ステージ概要
ターゲット検出のこの段階では、ターゲット検出の概念、R-CNN ネットワークの基礎、Faster-RCNN ネットワーク、YOLO シリーズのアルゴリズム、YoloV3 ケース、アルゴリズム再現の実現、SSD アルゴリズムの重要な内容を主に学びました。この段階での理論的知識の不足. クラスを見ていると, いつも気が散っていました. いくつかの損失関数と正と負のサンプルの設定が本当に理解できませんでした. 見ているときになぜそうしたのかわかりませんでした.コードで。モデルのトレーニングの結果は非常に印象的です.データセットはすべて既製であり、走った後に人、ベンチ、ラベルボックスを認識できます. しかし、将来的には、人や動物のカテゴリを正確に識別する独自のコードを書きたいと思っていますが、今はそれがわかりません。. . 私は勉強を続けなければなりません、そして将来の勉強が私の既存の疑問を補うことができることを願っています!