mmdetection実際の戦闘、トランプデータセット(VOC形式)のトレーニング、mAPのテストと計算
1.データセットの準備
今回使用したデータセットはここから来ています:ポーカーデータセット、zipファイル全体をダウンロードしてそこからコピーします。キーポイント:ただし、彼から直接ダウンロードすることはお勧めしません。後で問題が発生した、つまり次のエラーメッセージが表示されるので、教えてはいけません。
FileNotFoundError:imgファイルが存在しません:/home/ymz/lsm/mmdetection/data/VOCdevkit/VOC2007/JPEGImages/IMG_2608.jpg
後で、IMG_2608.JPGが実際にデータセットに含まれていることを知りました。唯一の違いは、ファイル形式が大文字であるということです。後で、mmcv.imread
大文字の.JPGを読み取れないことを確認したので、データセットへのリンクを配置しました。ここではすべてのファイル形式を小文字にしています。コードを抽出します。vmsy
データセットはすべての種類のプレイカードを収集するわけではなく、9、10 、ジャック、クイーン、キング、エースの6種類しかありません。全部で364あるので、その後のトレーニングはそれほど長くはかからず、基本的に30分で20エポックが終わります。解凍後のファイルディレクトリは次のようになります。
├── poker
│ ├── VOC2007
│ │ ├── Annotations
│ │ ├── JPEGImages
│ │ ├── ImageSets
│ │ │ ├── Main
│ │ │ │ ├── val.txt
│ │ │ │ ├── train.txt
第二に、mmdetectionのインストール
mmdetectionは、pytorchに基づくターゲット検出フレームワークです。非常に使いやすく、すべてのモデルをサポートしています。現在、Githubには8kの星があり、コミットも非常に活発です。今回はこのフレームワークの使い方を知りたかったので、見つけたデータセットで実行しました。
基本的には公式ウェブサイトの指示に従ってインストールしてくださいが、最近は小さな変更が加えられていることが多いようです。上記のhttps://mmdetection.readthedocs.io/en/latest/もご覧ください。ここにすべての統合コマンドを配置します(これは、公式Webサイトにアクセスして、時間内に更新を確認するのが最善です):
最新のコードバージョンが一部の評価ファイルを更新するため、使用するコードバージョン
# 注意官方的Requirements
conda create -n open-mmlab python=3.7 -y
conda activate open-mmlab
# 安装pytorch和torchvision自己来也行
conda install -c pytorch pytorch torchvision -y
# cython一定要安装,编译需要
conda install cython -y
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
# 若自己离线安装pytorch和torchvision,可注释requirements.txt对应行
# 还有也可以把pycocotools那行注释了,官方建议通过下面那句安装
pip install -r requirements.txt
pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI"
pip install -v -e .
# 官方建议创建软连接,节省硬盘空间,在mmdetection目录下运行下面的命令
mkdir data
ln -s $COCO_ROOT data
もちろん、これがVOC形式の独自のデータセットです。最後のソフトリンクを上の最後の行にすることはできません。上記のデータセットのディレクトリ構造によると、次のようになります。
mkdir data
cd data
ln -s /home/你的存放路径/poker VOCdevkit
これは、公式の推奨構造に沿ったものです。
3、関連ドキュメントを変更します
1.class_names.pyファイルを変更します
mmdetection / mmdet / core / Evaluationの下のclass_names.pyのvoc_classesを変更し、トレーニングするデータセットのカテゴリ名に変更します。変更しない場合、テスト結果の名前は飛行機、自転車、鳥、ボートなどになります。これら。図に示すように、変更後:
2.voc.pyファイルを変更します
mmdetection / mmdet / datasets / voc.pyの下のカテゴリを変更します。CLASSESはタプルであるため、カテゴリが1つしかない場合は、カンマを追加します。そうしないと、エラーが報告されます。
3.構成ファイルを変更します
構成ファイルは、cascade_rcnn_r50_fpn_1x.pyなどのmmdetection / configsファイルの次の束の名前です。VOC形式を使用しているため、これらはデフォルトでCOCO形式です(mmdetection / configs / pascal_vocフォルダーの下のいくつかを除く)私が選んだので、cascade_rcnn_r50_fpn_1x.pyを、それが名前の変更、コピーcascade_rcnn_r50_fpn_1x_poker.pyを、あなたは次のように変更する必要があるいくつかの場所があります:
1.変更num_classes変数は、我々が7にここにいるので、クラス分類番号に追加する背景であります:
2、データ設定の変更パート、主にdataset_type、data_root、img_scale、ann_file、およびimg_prefix変数の値:total_epochsやworkflow [[( 'train'、1)]などの
最終的なランタイム設定も変更できますはトレーニングのみ、検証なしを意味します; [( 'train'、2)、( 'val'、1)]は2エポックトレーニング、1エポック検証を意味します]、total_epochsを20に設定したので、学習率はstep = [に設定されます8、15]、checkpoint_config = dict(interval = 2)、それ以外はすべてデフォルトのままにします。
第四に、トレーニングを開始します
これで、mmdetectionディレクトリの下でトレーニングを開始できます。
python tools/train.py configs/cascade_rcnn_r50_fpn_1x_poker.py
このようにして、正常にトレーニングでき、多くのログログが画面に出力されます。もちろん、トレーニングが完了すると、work_dirsディレクトリに次のような画像が表示されます。.logログと。 log.json、および特定のエポックごと(ここでは2エポックごと)モデルを保存します。後のテストの便宜のために、最終モデルlatest.pthがあります。
5、mAPをテストして計算します
1.画像の効果をテストします
demo / webcam_demo.pyファイルを模倣し、画像のデモスクリプトimage_demo.pyを作成しました。
import argparse
import torch
from mmdet.apis import inference_detector, init_detector, show_result
def parse_args():
parser = argparse.ArgumentParser(description='MMDetection image demo')
parser.add_argument('config', help='test config file path')
parser.add_argument('checkpoint', help='checkpoint file')
parser.add_argument('imagepath', help='the path of image to test')
parser.add_argument('--device', type=int, default=0, help='CUDA device id')
parser.add_argument(
'--score-thr', type=float, default=0.5, help='bbox score threshold')
args = parser.parse_args()
return args
def main():
args = parse_args()
model = init_detector(
args.config, args.checkpoint, device=torch.device('cuda', args.device))
result = inference_detector(model, args.imagepath)
# 这里的result是一个列表,长度为类别数,例如我这里就是6
# 其中每个元素就是对一类的预测出来的bbox,是一个np.ndarray
# shape为(N,5),N可能大于测试图中实际的该类的数量
# 5是4个坐标值,加1个置信度
show_result(
args.imagepath, result, model.CLASSES, score_thr=args.score_thr, wait_time=0)
if __name__ == '__main__':
main()
次に、次のコマンドを実行します。
python demo/image_demo.py configs/cascade_rcnn_r50_fpn_1x_poker.py work_dirs/cascade_rcnn_r50_fpn_1x_poker/latest.pth demo/poker_test.jpg
次の結果が得られます。bboxボックスが非常にタイトで、分類が正しいことがわかります。
2.mAPを計算します
mAPを計算する前に、mmdetection / tools / voc_eval.pyファイルのvoc_eval関数を変更する必要があります。変更後の図:
次に、次のコマンドを使用してpoker_results.pklファイルを生成します。
python tools/test.py configs/cascade_rcnn_r50_fpn_1x_poker.py work_dirs/cascade_rcnn_r50_fpn_1x_poker/latest.pth --out poker_results.pkl
次に、次のコマンドを実行して、voc標準を使用してmAPを計算します。
python tools/voc_eval.py poker_results.pkl configs/cascade_rcnn_r50_fpn_1x_poker.py
次のような結果が得られ、そして、あなたはマップがと高いようであることがわかります0.977もちろん、ポーカーの正方形の検出が容易であることから、これは次のとおりです。
さて、レッツ・プレイmmdetection。将来よく出くわします~~
チップ
2020年3月1日に更新
- これは、work_dirs /.../latest.pthのlatest.pthが実際の.pthモデルファイルではなく、epoch_20.pthを指すシンボリックリンク(シンボリックリンク)であることを思い出させてくれます(最大エポックが20であると仮定)したがって、冗長に生成されたモデルファイルを削除する場合は、最後のepoch_20.pth(latest.pthを除く)を保持する必要があります。そうしないと、次のエラーが表示される場合があります。
OSError: work_dirs/.../latest.pth is not a checkpoint file
- mmdetectionはバグなどを修正するために頻繁に更新されるため、彼のドキュメントも頻繁に更新されます。たとえば、ツールの下にvoc_eval.pyはなく、統合されたrobustness_eval.py #2074に置き換えられます。もちろん、再現したい場合は私の結果では、以前のリリースに移動して、tools /voc_eval.pyをダウンロードして使用できます。