mmdetection實(shí)戰(zhàn),訓(xùn)練撲克牌數(shù)據(jù)集(VOC格式)并測試計(jì)算mAP

一、數(shù)據(jù)集準(zhǔn)備

我這次用到的數(shù)據(jù)集來自這里:撲克牌數(shù)據(jù)集,下載下整個zip文件再從中復(fù)制出來。劃重點(diǎn):但是,我不建議你直接從他那下載,慢不說,后來我遇到了一個問題,就是會出現(xiàn)下面這樣的報(bào)錯:

FileNotFoundError: img file does not exist: /home/ymz/lsm/mmdetection/data/VOCdevkit/VOC2007/JPEGImages/IMG_2608.jpg

后來我發(fā)現(xiàn)確實(shí)數(shù)據(jù)集里面有IMG_2608.JPG,唯一的區(qū)別就是文件格式大寫了,后來證實(shí)確實(shí)mmcv.imread讀不了大寫的.JPG,所以我這里把所有文件格式小寫之后的數(shù)據(jù)集鏈接放這里,提取碼:vmsy
這個數(shù)據(jù)集并沒有收集全部的撲克牌類別,里面只有6類:nine,ten,jack,queen,king,ace。一共364張,所以之后訓(xùn)練不會耗時(shí)很久,基本20個epoch半個小時(shí)就完事了。解壓之后的文件目錄是這樣的:

├── poker
│   ├── VOC2007
│   │   ├── Annotations
│   │   ├── JPEGImages
│   │   ├── ImageSets
│   │   │   ├── Main
│   │   │   │   ├── val.txt
│   │   │   │   ├── train.txt

二、mmdetection的安裝

mmdetection是一個基于pytorch的目標(biāo)檢測框架,非常好用,支持模型也比較全,Github上目前star已有8k,而且commit也非?;钴S。這次就想熟悉一下怎么使用這個框架,故用了自己找的數(shù)據(jù)集跑一遍。
安裝的話基本照著官網(wǎng)的說明文檔就行,不過似乎最近也有一些小改動,這個https://mmdetection.readthedocs.io/en/latest/上面會更新慢一點(diǎn)。我在這里放一下全部整合的命令:

# 注意官方的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
pip install -v -e .
# 官方建議創(chuàng)建軟連接,節(jié)省硬盤空間,在mmdetection目錄下運(yùn)行下面的命令
mkdir data
ln -s $COCO_ROOT data

當(dāng)然我們這里是自己VOC格式的數(shù)據(jù)集,最后一個軟鏈接就不能是上面最后一行,根據(jù)上面的數(shù)據(jù)集目錄結(jié)構(gòu)應(yīng)該是:

mkdir data
cd data
ln -s /home/你的存放路徑/poker VOCdevkit

這樣就符合官方的推薦結(jié)構(gòu)了。

三、修改相關(guān)文件

1. 修改class_names.py文件

修改mmdetection/mmdet/core/evaluation下的class_names.py中的voc_classes,將其改為要訓(xùn)練的數(shù)據(jù)集的類別名稱,否則測試的結(jié)果的名稱還會是aeroplane, bicycle, bird, boat,…這些。改完后如圖:


修改class_names.py文件

2. 修改voc.py文件

修改mmdetection/mmdet/datasets/voc.py 下的類別,如果只有一個類,因?yàn)镃LASSES是一個元組,所以要加上一個逗號,否則將會報(bào)錯,改完后如圖:
修改voc.py文件

3. 修改配置文件

配置文件就是mmdetection/configs下一堆的名稱諸如cascade_rcnn_r50_fpn_1x.py的文件,因?yàn)槲覀兪褂玫氖荲OC格式,這些默認(rèn)是COCO格式(除了mmdetection/configs/pascal_voc文件夾下的幾個),所以我就挑了cascade_rcnn_r50_fpn_1x.py,將它復(fù)制重命名為cascade_rcnn_r50_fpn_1x_poker.py,有下面幾個地方需要修改:
1、修改num_classes變量,就是背景類加上要分類的數(shù)量,所以我們這里為7:

修改num_classes變量

2、修改data settings部分,主要是了dataset_type、data_root、img_scale、ann_file、img_prefix變量的值:

修改data settings部分1

修改data settings部分2

最后的runtime settings也可以修改一下,比如total_epochs和workflow【[('train', 1)]表示只訓(xùn)練,不驗(yàn)證;[('train', 2), ('val', 1)] 表示2個epoch訓(xùn)練,1個epoch驗(yàn)證】,我將total_epochs設(shè)置成20,所以學(xué)習(xí)率設(shè)置為step=[8, 15],checkpoint_config = dict(interval=2),其他都保持默認(rèn)。

四、開始訓(xùn)練

到現(xiàn)在就可以開始訓(xùn)練了,在mmdetection目錄下:

python tools/train.py configs/cascade_rcnn_r50_fpn_1x_poker.py

這樣就能成功訓(xùn)練了,屏幕上會打印很多l(xiāng)og日志,當(dāng)然訓(xùn)練完成之后會在work_dirs目錄下出現(xiàn)如下圖的東西:有.log日志和.log.json,還有每隔一定epoch(我這里是每隔2個epoch)保存模型,為了方便后面的測試,還有最后的模型latest.pth。


訓(xùn)練過程中保存的文件

五、測試并計(jì)算mAP

1. 測試一張圖片的效果

我模仿demo/webcam_demo.py文件寫了試用于一張圖片的demo腳本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='camera device id')
    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)
    show_result(
        args.imagepath, result, model.CLASSES, score_thr=args.score_thr, wait_time=0)


if __name__ == '__main__':
    main()

然后運(yùn)行下面的命令:

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

得到下面的結(jié)果,可以看到bbox框得非常tight,分類也都正確了:


demo測試結(jié)果圖

2. 計(jì)算mAP

計(jì)算mAP之前需要修改mmdetection/tools/voc_eval.py文件中的voc_eval函數(shù),改完后的圖:


修改voc_eval.py文件

然后通過下面命令產(chǎn)生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

然后執(zhí)行如下命令,采用voc標(biāo)準(zhǔn)計(jì)算mAP:

python tools/voc_eval.py poker_results.pkl configs/cascade_rcnn_r50_fpn_1x_poker.py

便得到了下面的結(jié)果,可以看到mAP高達(dá)0.977,這當(dāng)然因?yàn)閾淇伺品椒秸苋菀讬z測的緣故啦:

mAP測試結(jié)果

好,算是玩了一下mmdetection吧。以后會常碰到它的~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容