pytorch 1.0 faster R-CNNを実現し、自分のデータセットを検証する

61382 ワード

pytorch 1.0 faster R-CNNを実現
  • 概要
  • Step 1、取り付け
  • Step 2、ダウンロード特徴抽出層のプレトレーニング重み
  • Step 3、訓練前のその他の準備
  • 1)、データセット
  • を準備する
  • 2)、関連コード
  • を修正する
  • Step 4、トレーニング開始
  • Step 4、ロットTestトレーニング済みモデル
  • 1、demo.pyファイルの修正[1]
  • 2、入力指令
  • 3、問題と解決策:
  • 概要
    このプロジェクトの実戦は、Ubuntu***システム上でjwyangに基づいてgithubに発表されたfaster R-CNNポイントの私のリンクです.モデルは***pytorch 1.0.0***に基づいて開発されていますので、自分のバージョン番号に注意してください.この記事では、自分を検出するPascal_を実現します.VOCデータセット.これは基礎教育ではないので、pytorchのインストールには触れません.関連内容は他のブログを参照してください.
    私の実装環境をまとめます:Ubuntu 16.04、CUDA 10.0、pytorch 1.0.0、torchvision 0.2.1、python 3.5.
    Step 1、インストール
      まずcloneコードです.
    git clone https://github.com/jwyang/faster-rcnn.pytorch.git
    

      ここで私と同じようにpytorch 1.0以降のバージョンを使用している場合はgitブランチをtorch 1.0バージョンに切り替える必要がありますので、次のように入力します.
    git checkout pytorch-1.0
    

    この一言はかなり重要で、くれぐれも忘れないでください!!!そうでないと、後続の多くのエラーが発生します.  gitブランチの切り替えが完了したら、次のコマンド構成に依存する環境を順番に入力します.
    #  faster-rcnn.pytorch  ,        data   
    cd faster-rcnn.pytorch && mkdir data
    #     pyhon ,                       sudo
    pip install -r requirements.txt
    #  coco kit, make
    git clone https://github.com/pdollar/coco.git
    cd coco/PythonAPI
    make
    

      完了後、端末をfaster-rcnn.pytorchディレクトリに戻し、libフォルダにアクセスします.
    cd lib
    python setup.py build develop
    

    ここでffiが破棄された場合:
    ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead
      はfaster R-CNNのバージョンをpytorch 1.0に変更していないことを示しています.git clongソースコードの後、git checkout pytorch-1.0コマンドを使用してブランチを切り替える必要があります.
    ここまで成功すれば、環境依存の構成が完了し、独自のデータセットのトレーニングを開始できます.ダウンロードしたばかりのモデルをすぐにテストしたいと思っている学生もいるかもしれませんが、残念ながらこの時点ではできません.著者は特徴抽出層の重みしか提供していないので、後の分類、回帰などのパラメータがないので、直接テストすることはできません.他の人が訓練していない限り、コピーして直接テストすることができます.
    Step 2、ダウンロード特徴抽出層のプレトレーニング重み
    著者らは、2つの特徴抽出ネットワークのPretrained Modelsを提供し、ダウンロードリンクも提供している.
  • VGG 16:VT Server
  • ResNet 101 VT Serverのダウンロードが完了したらdata/pretrained_モデルディレクトリの下.

  • Step 3、トレーニング前のその他の準備
    1)、データセットの準備
    上記の手順を完了すると、私たちは手を開いて訓練に着手する準備を始めることができます.ではまず自分のデータセットを用意して、私が今回使ったのはPascal_VOCタイプのデータセット.ここではPascal_VOCデータセットの作成について詳しく述べ、いくつかのポイントだけを拾って言います.
  • 1、VOCデータセットのフォルダtree構造:Annotations内にxmlマークアップファイル、JPEGImages内にピクチャ、ImageSets/Main/内の4つのtxtファイルはそれぞれテストセット、トレーニングセット、トレーニング検証セット、検証セットである.

  • 注意訓練に用いる集合はtrainではなくtrainvalである.
    VOCdevkit
    └── VOC2007
        ├── Annotations
        ├── ImageSets
        │   └── Main
        │       ├── test.txt
        │       ├── train.txt
        │       ├── trainval.txt
        │       └── val.txt
        └── JPEGImages
    
  • 2、データセット表記フォーマット***必要なPascal_VOCデータセットの寸法フォーマットは1-Based(座標の原点は0,0ではなく(1,1)から!!***この点は、(0,0)を座標の原点として誤って基づいていると、
  • になるため、非常に重要です.
    assert (boxes[:, 2] >= boxes[:, 0]).all()
      このエラーは、ROIボックスのxminがxmaxより大きく、yminがymaxより大きく、またはbndbox属性がまったくないため、エラーの原因となるコードセグメントがlib/datasets/pascal_voc.pyのline:235~241行:
            for ix, obj in enumerate(objs):
                bbox = obj.find('bndbox')
                # Make pixel indexes 0-based
                x1 = float(bbox.find('xmin').text) - 1
                y1 = float(bbox.find('ymin').text) - 1
                x2 = float(bbox.find('xmax').text) - 1
                y2 = float(bbox.find('ymax').text) - 1
    

      マークアップフォーマットが(0,0)に基づいている場合、ROIボックスのxminまたはyminが0の位置にある場合、1を減算して65535>>xmax/ymaxになります.  当然造成该错误的因素还有可能是:bndbox的坐标超过了图片的宽高(标注错误,或未作图片的正畸校验). その解決方法はBlog:faster rcnn:assert(boxes[:,2]>=boxes[:,0]).all()解析塈VO C 2007 xml座標定義理解assert(boxes[:,2]>=boxes[:,0])エラー解決方法を参照
    2)、関連コードの修正
  • 1、lib/datasets/pascal_を修正voc.pyファイルの48~53行のカテゴリは自分のクラス:
  •         self._classes = ('__background__',  # always index 0
                             'aeroplane', 'bicycle', 'bird', 'boat',
                             'bottle', 'bus', 'car', 'cat', 'chair',
                             'cow', 'diningtable', 'dog', 'horse',
                             'motorbike', 'person', 'pottedplant',
                             'sheep', 'sofa', 'train', 'tvmonitor')
    			
    			'''            ,       background    ,   RPN  softmax    '''
    
  • 2、trainvalを修正するNet.py中60~61行中save_dirの保存アドレスは、default=「models」のmodelsを自分のパスに変更します:
  •   parser.add_argument('--save_dir', dest='save_dir',
                          help='directory to save models', default="models",
    

    Step 4、トレーニング開始
    /faster-rcnn.pytorchディレクトリで端末を開き、コマンドを入力
    	CUDA_VISIBLE_DEVICES=0 python trainval_net.py 	--dataset pascal_voc --net res101 \
    							--epochs 20 --bs 1 --nw 4 --lr 1e-2 --lr_decay_step 8 --use_tfb \
    							--mGPUs --cuda
    

    パラメータの意味:
  • CUDA_VISIBLE_DEVICES=0:GPU 0で
  • –dataset pascal_voc:pascalデータセット
  • –net res 101:res 101を特徴としてネットワークを抽出し、vgg 16
  • を選択可能
  • –epochs 20:20個のepochは、各epochがすべての訓練図を通過した.
  • –bs 1:batch_size=1
  • –nw 4:num_works=4,4スレッドで読み取りを行い、私のグラフィックスメモリは11 Gで、メモリが小さい場合は1
  • とします.
  • –lr 1 e-2:初期学習率は0.01であった.オプションパラメータ
  • –lr_decay_Step 8:いくつかのepoch学習率ごとに1回減衰する(デフォルトでは0.1回減衰し、decay_gammaで調整可能).オプションパラメータ
  • –use_tfb:tensorboardXを用いて記録と可視化を実現し、使わないと書かない.オプションパラメータ
  • –mGPUs:マルチGPUトレーニング、このコマンドを書かないでください.オプションパラメータ
  • –cuda:cudaを使用します.

  • 説明:各batchはすべての訓練図を1回通過し、反復回数iterationsはbatch_に依存する.sizeとピクチャ数の決定、例えば2000枚の図batch_size=4、iterations=2000/4=500.
    実行に成功すると、端末は次のように出力します.
    usr@usr:~/faster-rcnn.pytorch$ CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --mGPUs --net res101 --bs 1 --nw 4 --cuda
    Called with args:
    Namespace(batch_size=1, checkepoch=1, checkpoint=0, checkpoint_interval=10000, checksession=1, class_agnostic=False, cuda=True, dataset='pascal_voc', disp_interval=100, imdb_name='voc_2007_trainval', imdbval_name='voc_2007_test', large_scale=False, lr=0.001, lr_decay_gamma=0.1, lr_decay_step=5, mGPUs=True, max_epochs=20, net='res101', num_workers=4, optimizer='sgd', resume=False, save_dir='/home/usrname/faster-rcnn.pytorch/models', session=1, set_cfgs=None, start_epoch=1, use_tfboard=False)
    /home/usrname/faster-rcnn.pytorch/lib/model/utils/config.py:374: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
      yaml_cfg = edict(yaml.load(f))
    Using config:
    {'ANCHOR_RATIOS': [0.5, 1, 2],
     'ANCHOR_SCALES': [8, 16, 32],
     'CROP_RESIZE_WITH_MAX_POOL': False,
     'CUDA': False,
     'DATA_DIR': '/home/usrname/faster-rcnn.pytorch/data',
     'DEDUP_BOXES': 0.0625,
     'EPS': 1e-14,
     'EXP_DIR': 'res101',
     'FEAT_STRIDE': [16],
     'GPU_ID': 0,
     'MATLAB': 'matlab',
     'MAX_NUM_GT_BOXES': 20,
     'MOBILENET': {'DEPTH_MULTIPLIER': 1.0,
                   'FIXED_LAYERS': 5,
                   'REGU_DEPTH': False,
                   'WEIGHT_DECAY': 4e-05},
     'PIXEL_MEANS': array([[[102.9801, 115.9465, 122.7717]]]),
     'POOLING_MODE': 'align',
     'POOLING_SIZE': 7,
     'RESNET': {'FIXED_BLOCKS': 1, 'MAX_POOL': False},
     'RNG_SEED': 3,
     'ROOT_DIR': '/home/usrname/faster-rcnn.pytorch',
     'TEST': {'BBOX_REG': True,
              'HAS_RPN': True,
              'MAX_SIZE': 1000,
              'MODE': 'nms',
              'NMS': 0.3,
              'PROPOSAL_METHOD': 'gt',
              'RPN_MIN_SIZE': 16,
              'RPN_NMS_THRESH': 0.7,
              'RPN_POST_NMS_TOP_N': 300,
              'RPN_PRE_NMS_TOP_N': 6000,
              'RPN_TOP_N': 5000,
              'SCALES': [600],
              'SVM': False},
     'TRAIN': {'ASPECT_GROUPING': False,
               'BATCH_SIZE': 128,
               'BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0],
               'BBOX_NORMALIZE_MEANS': [0.0, 0.0, 0.0, 0.0],
               'BBOX_NORMALIZE_STDS': [0.1, 0.1, 0.2, 0.2],
               'BBOX_NORMALIZE_TARGETS': True,
               'BBOX_NORMALIZE_TARGETS_PRECOMPUTED': True,
               'BBOX_REG': True,
               'BBOX_THRESH': 0.5,
               'BG_THRESH_HI': 0.5,
               'BG_THRESH_LO': 0.0,
               'BIAS_DECAY': False,
               'BN_TRAIN': False,
               'DISPLAY': 20,
               'DOUBLE_BIAS': False,
               'FG_FRACTION': 0.25,
               'FG_THRESH': 0.5,
               'GAMMA': 0.1,
               'HAS_RPN': True,
               'IMS_PER_BATCH': 1,
               'LEARNING_RATE': 0.001,
               'MAX_SIZE': 1000,
               'MOMENTUM': 0.9,
               'PROPOSAL_METHOD': 'gt',
               'RPN_BATCHSIZE': 256,
               'RPN_BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0],
               'RPN_CLOBBER_POSITIVES': False,
               'RPN_FG_FRACTION': 0.5,
               'RPN_MIN_SIZE': 8,
               'RPN_NEGATIVE_OVERLAP': 0.3,
               'RPN_NMS_THRESH': 0.7,
               'RPN_POSITIVE_OVERLAP': 0.7,
               'RPN_POSITIVE_WEIGHT': -1.0,
               'RPN_POST_NMS_TOP_N': 2000,
               'RPN_PRE_NMS_TOP_N': 12000,
               'SCALES': [600],
               'SNAPSHOT_ITERS': 5000,
               'SNAPSHOT_KEPT': 3,
               'SNAPSHOT_PREFIX': 'res101_faster_rcnn',
               'STEPSIZE': [30000],
               'SUMMARY_INTERVAL': 180,
               'TRIM_HEIGHT': 600,
               'TRIM_WIDTH': 600,
               'TRUNCATED': False,
               'USE_ALL_GT': True,
               'USE_FLIPPED': True,
               'USE_GT': False,
               'WEIGHT_DECAY': 0.0001},
     'USE_GPU_NMS': True}
    Loaded dataset `voc_2007_trainval` for training
    Set proposal method: gt
    Appending horizontally-flipped training examples...
    wrote gt roidb to /home/usrname/faster-rcnn.pytorch/data/cache/voc_2007_trainval_gt_roidb.pkl
    done
    Preparing training data...
    done
    before filtering, there are 2822 images...
    after filtering, there are 2814 images...
    2814 roidb entries
    Loading pretrained weights from data/pretrained_model/resnet101_caffe.pth
    /usr/local/lib/python3.5/dist-packages/torch/nn/parallel/_functions.py:61: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.
      warnings.warn('Was asked to gather along dimension 0, but all '
    [session 1][epoch  1][iter    0/2814] loss: 4.8704, lr: 1.00e-03
    			fg/bg=(2/126), time cost: 0.592122
    			rpn_cls: 0.6998, rpn_box: 1.3103, rcnn_cls: 2.8602, rcnn_box 0.0001
    [session 1][epoch  1][iter  100/2814] loss: 2.1768, lr: 1.00e-03
    			fg/bg=(23/105), time cost: 12.911908
    			rpn_cls: 0.3399, rpn_box: 0.7910, rcnn_cls: 0.9739, rcnn_box 0.0449
    ...
    

    Step 4、ロットTestで訓練したモデル
    1、demo.pyファイルの修正[1]
      demo.pyの168~173行のコードを修正し、自分のカテゴリとして、前のpascal_voc.pyにおけるカテゴリ順対応
     pascal_classes = np.asarray(['__background__',
                           'aeroplane', 'bicycle', 'bird', 'boat',
                           'bottle', 'bus', 'car', 'cat', 'chair',
                           'cow', 'diningtable', 'dog', 'horse',
                           'motorbike', 'person', 'pottedplant',
                           'sheep', 'sofa', 'train', 'tvmonitor'])
    

    2、指令入力
    python demo.py --dataset pascal_voc --net res101  --cfg cfgs/res101.yml --load_dir models --checksession 1 --checkepoch 28  --checkpoint 2813  --image_dir images --cuda --bs 1
    

    パラメータの意味:
  • –dataset pascal_voc:pascalデータセット
  • –net res 101:res 101を特徴としてネットワークを抽出し、vgg 16
  • を選択可能
  • –cfg cfgs/res 101.yml:res 101をロードする構成
  • –load_dir models--checksession 1--checkepoch 28--checkpoint 2813:この4つのパラメータは、models/フォルダで訓練されたfasterを読み込むことを共同で決定します.rcnn_1_28_2813.pthウェイトファイル
  • –image_dir path/to/your/image:一括検出が必要な画像ファイルパス
  • –bs 1:batch_size=1
  • –cuda:cudaでテストした画像をimageと同じフォルダに出力し、元の名前+_と命名します.det.

  • 3、発生する可能性のある問題と解決策:
  • 1、
  • fasterRCNN.load_state_dict(checkpoint['model'])
      File "/usr/local/lib/python3.5/dist-packages/torch/nn/modules/module.py", line 769, in load_state_dict
        self.__class__.__name__, "
    \t"
    .join(error_msgs))) RuntimeError: Error(s) in loading state_dict for resnet: size mismatch for RCNN_cls_score.weight: copying a param with shape torch.Size([16, 2048]) from checkpoint, the shape in current model is torch.Size([21, 2048]). size mismatch for RCNN_cls_score.bias: copying a param with shape torch.Size([16]) from checkpoint, the shape in current model is torch.Size([21]). size mismatch for RCNN_bbox_pred.weight: copying a param with shape torch.Size([64, 2048]) from checkpoint, the shape in current model is torch.Size([84, 2048]). size mismatch for RCNN_bbox_pred.bias: copying a param with shape torch.Size([64]) from checkpoint, the shape in current model is torch.Size([84]).

    ***原因:***による原因は、検出時にdemo.pyのカテゴリを自分のクラスに変更しなかったことである***解決方法:***demo.pyの168~173行のコードを変更したことであり、上記[1]を参照.
  • 2、
  • FileNotFoundError: [Errno 2] No such file or directory: 'models/res101/pascal_voc/faster_rcnn_1_28_10021.pth'
    

    ***理由:***が見つかりませんでした–load_dir models--checksession 1--checkepoch 28--checkpoint 10021:この4つのパラメータに対応するmodels.***解決方法:自分で訓練したモデル名と照らし合わせて、上記の4つのパラメータを入力します.
  • 3、
  • fasterRCNN.load_state_dict(checkpoint['model'])
      File "/usr/local/lib/python3.5/dist-packages/torch/nn/modules/module.py", line 769, in load_state_dict
        self.__class__.__name__, "
    \t"
    .join(error_msgs))) RuntimeError: Error(s) in loading state_dict for resnet: size mismatch for RCNN_rpn.RPN_cls_score.weight: copying a param with shape torch.Size([18, 512, 1, 1]) from checkpoint, the shape in current model is torch.Size([24, 512, 1, 1]). size mismatch for RCNN_rpn.RPN_cls_score.bias: copying a param with shape torch.Size([18]) from checkpoint, the shape in current model is torch.Size([24]). size mismatch for RCNN_rpn.RPN_bbox_pred.weight: copying a param with shape torch.Size([36, 512, 1, 1]) from checkpoint, the shape in current model is torch.Size([48, 512, 1, 1]). size mismatch for RCNN_rpn.RPN_bbox_pred.bias: copying a param with shape torch.Size([36]) from checkpoint, the shape in current model is torch.Size([48]). size mismatch for RCNN_cls_score.weight: copying a param with shape torch.Size([16, 2048]) from checkpoint, the shape in current model is torch.Size([21, 2048]). size mismatch for RCNN_cls_score.bias: copying a param with shape torch.Size([16]) from checkpoint, the shape in current model is torch.Size([21]). size mismatch for RCNN_bbox_pred.weight: copying a param with shape torch.Size([64, 2048]) from checkpoint, the shape in current model is torch.Size([84, 2048]). size mismatch for RCNN_bbox_pred.bias: copying a param with shape torch.Size([64]) from checkpoint, the shape in current model is torch.Size([84]).

    ***原因:***このエラーは./faster-rcnn.pytorch/lib/model/utils/ディレクトリのconfig.pyの291~292行によるものです
    # Anchor scales for RPN
    __C.ANCHOR_SCALES = [8,16,32]
    

    このエラーの原因は、demoで定義されているanchor_scalesとconfig.pyのanchor_scales不一致-demoですべてのデータセットに対して定義されたanchor_scalesは[8,16,32]であり、トレーニングがCOCOデータセットをトレーニングサンプルとして使用する場合、anchor_scalesの定義は[4,8,16,32]であり、demoと一致しない.*解決方法:./faster-rcnn.pytorch/lib/model/utils/ディレクトリ内のconfig.pyの291~292動作を変更します.
    # Anchor scales for RPN
    __C.ANCHOR_SCALES = [48,16,32]
    

      最後にconfig.pyにおけるパラメータの説明に関するblogを与える:自分のデータセットに基づいてネットワークパラメータを調整する必要がある場合は、faster-rcnn(pytorch)パラメータ構成の変更を参照してください.
    ここまでfastereCNNの実戦は终わったとしても、このブログを记录としてまとめ、后で振り返ることに备えています.何か触れていない問題や文章に存在する問題があれば、コメントを歓迎します.
    -書くのは容易ではありません.転載は出典を明記してください!!!!!!!-文章を書くのは容易ではありませんて、転載して出典を明記してください!!!文章を書くのは容易ではありませんて、転載して出典を明記してください!!!