コード解読レコード


データセットの調整:merge_data.py --> select.py --> order.py
Dataset: image_info=[{"source":[id]:[path]:[width]:[height]:[mask_path]:[yaml_path]:},{},{}...]用**add_イメージ()classの追加info=[{"source":"id":"name":},{},{},{}...]用add_class()**追加
image_meta = np.array([image_id] + list(original_image_shape) + list(image_shape) + list(window) + [scale] + list(active_class_ids))
入出力のフォーマット(ndarray):rpn_class_logits:[batch,anchors,2]2は[FG,BG]rpn_probs:[batch,anchors,2]2は[FG,BG]rpn_bbox:[batch,anchors,4]4は[x,y,log(w),log(h)]anchors:[N,(y 1,x 1,y 2,x 2)]
boxes: [num_instance, (y1, x1, y2, x2, class_id)] in image coordinates. masks: [height, width, num_instances] class_ids: [num_instances]
data_generator
  • images: [batch, H, W, C]
  • image_meta: [batch, (meta data)] Image details.
  • rpn_match: [batch, N] Integer (1=positive anchor, -1=negative, 0=neutral)
  • rpn_bbox: [batch, N, (dy, dx, log(dh), log(dw))] Anchor bbox deltas.
  • gt_class_ids: [batch, MAX_GT_INSTANCES] Integer class IDs
  • gt_boxes: [batch, MAX_GT_INSTANCES, (y1, x1, y2, x2)]
  • gt_masks: [batch, height, width, MAX_GT_INSTANCES].

  • トレーニングパラメータ
    steps_per_epochは何個のbatchが1つのepochを計算するのか、このときのepochは必ずしも全体の訓練集ではない.
    トレーニングプロセス##
    1、MirrorDatasetオブジェクトdataset_を作成するtrainとdataset_val 2、このオブジェクトを呼び出すload_mirror(),Image.Open()label 8を読み出す.png,add_でclass()鏡類を加えadd_image()maskとyamlのパス情報をMirrorデータセット3に加え、そのオブジェクトを呼び出すprepare()メソッドは、複数のデータセットを扱う場合、ここではMirrorの1つのデータセットしかないので、実質的な役割はない4、MaskRCNNを作成するmodel 5、初期化の重みを設定:coco、imagenet、or last 6、model.train()でdata_generator()–>load_image_gt()–>mirror.load_image, mirror.load_mask, and utils.extract_bboxes(mask). data_generator()は、データ拡張パラメータload_を設定できます.イメージ()はskimageを使用する.io.imread()rgbピクチャload_を読み込むmask()が自分で定義したdraw_を呼び出すmask()maskを描画する、最後の層から前へocclusionでmaskに乗じる順に前のmaskを得る.
    7、model_の設定path,modelを呼び出す.keras_model.save_Weights()モデルウェイトの保存
    テストプロセス
    compute_ap_mask()解読まずcomputeを呼び出すmatches()sort(x)は、ndarrayの小さいインデックス値から大きいインデックス値を返します.タイプはndarray、[:-1]すべての要素が逆1.gt_boxesはすべて0の行を削除します.2.pred_によるscores大から小へのソートpred_boxes.class_ids.scores.masks. 3.predとgt maskの間のoverlapsを計算し、行列であり、predは行であり、gtは列である.2つの座標軸の方向はいずれも高さから低さまで並べ替えられています.縦軸predはscores降順、横軸gtはoverlaps降順で並べ替えられる.4.2つのレイヤループは、各ローが予測のインスタンス(2)を表すscore_を設定するため、overlapsの各ローを一致させる(1)ことを探します.threshold(現在設定されているのは0)は、このscoreより下の列は不要です(3)各行について、前から後(つまり数値が大きいから小さい)の順に検索し、iouが設定されたバルブ値iou_より小さい場合thresholdでは、スキップして-1に維持します.予測カテゴリがgtのカテゴリとちょうど同じであればmatch_countプラス1,gt_match[列数]=予測行数,pred_match[行数]=gtの列数、つまり列ごとのgt,gt_matchは予測のインスタンスの予測結果の数行目を保存する.pred_matchもそうです.
    そしてnp.Cumsum()関数はpred_に従いますmatchは各ステップのprecisionsとrecallsを計算し、precisionsを調整して増加しないだけで、次にrecallsが変化したステップを見つけて、横座標の幅で×縦座標のprecision、最後にmAPはすべて計算しました!
    compute_ap_box()の実現原理は、予測されたbox(行)ごとに、それに対応するgt_を見つけることである.boxは、この予測boxのiouと最大のgt_box. 各行についてiouがバルブ値より大きい場合は、正しいと考えられます.カテゴリはミラーのみなので、予測カテゴリと実際のカテゴリが一致しているかどうかを判断する必要はありません(必ず一致しているため)、各行のすべての列に対して最大値を取り、gt_が存在する可能性があります.boxは複数pred_に対応boxの場合.そしてcompute_ap_mask()関数では要素ごとに判断され,カテゴリが一致してこそ見つかったと考えられ,いずれも正確に対応している.
    RPN
    Level 0. Anchors: 76800 Feature map Shape: [160 160] Level 1. Anchors: 19200 Feature map Shape: [80 80] Level 2. Anchors: 4800 Feature map Shape: [40 40] Level 3. Anchors: 1200 Feature map Shape: [20 20] Level 4. Anchors:300 Feature map Shape:[1010]合計102300個のanchor.
    Generate Proposalsプロセス(1940行)##
    生成されたproposalの数を設定する:トレーニング2000、テスト1000 ProposalLayerを呼び出し、[rpn出力のカテゴリの確率、rpn出力境界ボックスのdelta,anchors]を入力し、カテゴリのスコアに基づいて6000個以下のanchorを選択し、選択した対応するdeltaをanchorに適用し、これらのanchorをclip(画像の境界を超えないように)、nmsを行い、proposalsを得る.2000個足りなければ、0で揃えます.ここではanchorの順序とrpn出力の順序はデフォルトで一致するはずです.rpnは、各anchorの前景/背景スコア、deltaを順番に生成します.Proposalsは図全体に対する割合で、deltaではありません.
    Generate Detection Targets(1968行)
    DetectionTargetLayer入力:[target_rois,input_gt_class_ids,gt_boxes,input_gt_masks]呼び出しdetection_targets_graph
    asserts = [tf.Assert(tf.greater(tf.shape(proposals)[0], 0), [proposals], name="roi_assertion"),]
    with tf.control_dependencies(asserts):
        proposals = tf.identity(proposals)
    

    Assert(condition,data,summarize=None,name=None)はproposals=tfを実行する.identity(proposals)の前にassertsを実行します.まず0のpaddingを除去して、混雑しているbboxがあるかどうかを探して、rpnの発生するproposalsとgt_を計算しますboxes間のoverlaps、proposalは行、gt_boxはカラムで、各行に最大値が見つかり、0.5より大きい場合はこのproposalがpositiveであり、そうでない場合はnegativeであると考えられます.positiveのインデックスを乱して、前のX個(Xは自分で設定した)、negativeのも.インデックスに基づいてproposalsでpositiveとnegativeを選択します.入力したgtでインデックスに対応するboxとidを見つけます.呼び出しbox_refinement_graph,proposalのboxとgtのboxを計算するdelta[dy,dx,dh,dw](proposalはこれらのデータからgtのboxを計算することができる).そしてstdを除いてdev.gtのmaskを見つけ,proposalに対応する領域をほじくり,二値化処理する.最後にpositiveとnegativeをつなぎ合わせ、さらに0を足して出力を得る:[予測のroi(正負の割合を調整した)、予測のroiのgtカテゴリ番号、予測のroiからgt_boxのdelta、予測のroiに対応するgtのmask]
    データセット拡張
    画像のサイズ(width,height)
    One
    build_fpn_mask_graph()呼び出しPyramidROIAlign_mask()は固定寸法の特徴図を生成しdecoderに送り込む.関数PyramidROIAlign_mask()でroi_レベルのサイズはbatch行、box_number列、マトリクス内の各要素はlevelを表し、ixはroi_levelフィルタリングの結果、ixに対して最初の次元ranhouをとるとtfである.image.crop_and_resize関数のbox_indicesは、各boxがmini_に来ることを記録します.batchのどれですか.
    数量
    トレーニング時POST_NMS_ROIS_TRAINING(2000)個のproposalsは、DetectionTargetLayerを経て100個(TRAIN_ROIS_PER_IMAGE)になってからclassifierとmaskに送られるのでsharedの数は100である.テスト時POST_NMS_ROIS_INFERENCE(1000)個のproposalsは、まずclassifierに送られ、1000のsharedが生成され、その後DetectionLayerを過ぎて100(DETECTION_MAX_INSTANCES)になり、その後maskブランチに送られ、sharedの数とmaskの数が一致しない(1000 vs 100)ためfusion_context_guided_decoderでは両方が同じに設定されています.
    maskについて
    DetectionTargetLayerでは、proposalに対応するmaskを生成し、bilinearを使用して64 x 64,mrcnn_maskはmask_branchが生成したのも64 x 64で、最後に両者がbinary lossテストを計算したとき、proposalごとに64 x 64のmask結果を生成し、bilinear(utils.unmold_maskの中)でproposalのサイズに再スケールします.