被推荐尝试一下mmdetection,之后我就开始进行安装了
需求环境如下:
- Linux (tested on Ubuntu 16.04 and CentOS 7.2)
- Python 3.4+
- PyTorch 0.4.1
- Cython
- mmcv
一个都不能错,特别是PyTorch 0.4.1是硬性规定。。。。😂
我的推荐是先下载,再安装。。。
1. 安装PyTorch 0.4.1:
pip install torch-0.4.1-cp36-cp36m-manylinux1_x86_64.whl
conda install pytorch-0.4.1-py36_cuda9.0.176_cudnn7.1.2_1.tar.bz2
2. 下载mmdetection
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
./compile.sh
python setup.py install
3. 下载预训练模型
Detection model zoo
Baseline model zoo
我使用resnet50,我是单卡的小傻瓜
4.设置config参数
就在config文件夹加下,
我只有一个类--face
faster_rcnn_r50_fpn_1x_voc0712.py
改了四处:
- num_classes(类别数目)=2(类别数+ 1)
- work_dir(模型保存目录) = './work_dirs/faster_rcnn_r50_fpn_1x_voc0712_V2'
- load_from(检测模预训练参数数据) = './ckpt/resnext101_64x4d-ee2c6f71.pth'
- pretrained(backbone预训练参数)='./ckpt/resnext101_64x4d-ee2c6f71.pth'
# model settings
model = dict(
type='FasterRCNN',
pretrained='/home/model/resnet50-19c8e357.pth',,
backbone=dict(
type='ResNet',
depth=50,
num_stages=4,
out_indices=(0, 1, 2, 3),
frozen_stages=1,
style='pytorch'),
neck=dict(
type='FPN',
in_channels=[256, 512, 1024, 2048],
out_channels=256,
num_outs=5),
rpn_head=dict(
type='RPNHead',
in_channels=256,
feat_channels=256,
anchor_scales=[2],
anchor_ratios=[0.9, 1.0, 1.1],
anchor_strides=[4, 8, 16, 32, 64],
target_means=[.0, .0, .0, .0],
target_stds=[1.0, 1.0, 1.0, 1.0],
use_sigmoid_cls=True),
bbox_roi_extractor=dict(
type='SingleRoIExtractor',
roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),
out_channels=256,
featmap_strides=[4, 8, 16, 32]),
bbox_head=dict(
type='SharedFCBBoxHead',
num_fcs=2,
in_channels=256,
fc_out_channels=1024,
roi_feat_size=7,
num_classes=2,
target_means=[0., 0., 0., 0.],
target_stds=[0.1, 0.1, 0.2, 0.2],
reg_class_agnostic=False))
# model training and testing settings
train_cfg = dict(
rpn=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.7,
neg_iou_thr=0.3,
min_pos_iou=0.3,
ignore_iof_thr=-1),
sampler=dict(
type='RandomSampler',
num=256,
pos_fraction=0.5,
neg_pos_ub=-1,
add_gt_as_proposals=False),
allowed_border=0,
pos_weight=-1,
smoothl1_beta=1 / 9.0,
debug=False),
rcnn=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.5,
neg_iou_thr=0.5,
min_pos_iou=0.5,
ignore_iof_thr=-1),
sampler=dict(
type='RandomSampler',
num=256,
pos_fraction=0.25,
neg_pos_ub=-1,
add_gt_as_proposals=True),
pos_weight=-1,
debug=False))
test_cfg = dict(
rpn=dict(
nms_across_levels=False,
nms_pre=2000,
nms_post=2000,
max_num=2000,
nms_thr=0.2,
min_bbox_size=0),
rcnn=dict(
score_thr=0.0, nms=dict(type='nms', iou_thr=0.2),
max_per_img=2000)
# soft-nms is also supported for rcnn testing
# e.g., nms=dict(type='soft_nms', iou_thr=0.5, min_score=0.05)
)
# dataset settings
dataset_type = 'VOCDataset'
data_root = 'data/VOCdevkit/'
img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
data = dict(
imgs_per_gpu=2,
workers_per_gpu=2,
train=dict(
type='RepeatDataset', # to avoid reloading datasets frequently
times=3,
dataset=dict(
type=dataset_type,
ann_file=[
data_root + 'VOC2007/ImageSets/Main/trainval.txt',#trainval.txt
],
img_prefix=[data_root + 'VOC2007/'],
img_scale=(600, 600),
img_norm_cfg=img_norm_cfg,
size_divisor=32,
flip_ratio=0.5,
with_mask=False,
with_crowd=True,
with_label=True)),
val=dict(
type=dataset_type,
ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt',
img_prefix=data_root + 'VOC2007/',
img_scale=(600, 600),
img_norm_cfg=img_norm_cfg,
size_divisor=32,
flip_ratio=0,
with_mask=False,
with_crowd=True,
with_label=True),
test=dict(
type=dataset_type,
ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt',
img_prefix=data_root + 'VOC2007/',
img_scale=(600, 600),
img_norm_cfg=img_norm_cfg,
size_divisor=32,
flip_ratio=0,
with_mask=False,
with_label=False,
test_mode=True))
# optimizer
optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
# learning policy
lr_config = dict(policy='step', step=[3]) # actual epoch = 3 * 3 = 9
checkpoint_config = dict(interval=1)
# yapf:disable
log_config = dict(
interval=100,
hooks=[
dict(type='TextLoggerHook'),
# dict(type='TensorboardLoggerHook')
])
# yapf:enable
# runtime settings
total_epochs = 40 # actual epoch = 4 * 3 = 12
dist_params = dict(backend='nccl')
log_level = 'INFO'
work_dir = './work_dirs/faster_rcnn_r50_fpn_1x_voc0712_V2' # [2]
load_from = None
resume_from = None
workflow = [('train', 1)]
6. 修改voc.py
/mmdet/dataset/voc.py
由于其他地方我不会改,所以这能从这里下手。
from .xml_style import XMLDataset
class VOCDataset(XMLDataset):
#
# CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',
# 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
# 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train',
# 'tvmonitor')
CLASSES = ('face',)
def __init__(self, **kwargs):
super(VOCDataset, self).__init__(**kwargs)
if 'VOC2007' in self.img_prefix:
self.year = 2007
elif 'VOC2012' in self.img_prefix:
self.year = 2012
else:
raise ValueError('Cannot infer dataset year from img_prefix')
7.训练
python train.py configs/faster_rcnn_r50_fpn_1x_voc0712.py --gpus 1 --validate
8.计算map
1 . 首先产生pkl
python test.py configs/faster_rcnn_r50_fpn_1x_voc0712.py work_dirs/faster_rcnn_r50_fpn_1x_voc0712/latest.pth --gpus=1 --out=eval/result.pkl
- 计算map
python voc_eval.py eval/result.pkl configs/faster_rcnn_r50_fpn_1x_voc0712.py
9.测试
import mmcv
from mmcv.runner import load_checkpoint
from mmdet.models import build_detector
from mmdet.apis import inference_detector, show_result
import cv2
import numpy as np
import os
cfg = mmcv.Config.fromfile('configs/faster_rcnn_r50_fpn_1x_voc0712.py')
cfg.model.pretrained = None
# YangHE/mmdetection-master/work_dirs/faster_rcnn_r50_fpn_1x_voc0712/epoch_1.pth
# construct the model and load checkpoint
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
# _ = load_checkpoint(model, 'https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/faster_rcnn_r50_fpn_1x_20181010-3d1b3351.pth')
_ = load_checkpoint(model, 'work_dirs/faster_rcnn_r50_fpn_1x_voc0712/latest.pth')
# test a single image
img = mmcv.imread('test.jpg')
result = inference_detector(model, img, cfg)
# show_result(img, result)
# print(result[0].shape)
#
img = cv2.imread('test.jpg')
sores = result[0][:,-1]
ind = sores > 0.01
bboxes = result[0][ind,:-1]
for bbox in bboxes:
bbox_int = bbox.astype(np.int32)
left_top = (bbox_int[0], bbox_int[1])
right_bottom = (bbox_int[2], bbox_int[3])
cv2.rectangle(
img, left_top, right_bottom,color=(0, 255, 0))
cv2.imshow("s", img)
cv2.waitKey(0)
总的来说由于这里框架不是特别熟,out of memory把我给惹毛了,用来50层的resnext效果不是特别好。。。就没再进行深入探究。。。。。
算是一次失败的尝试。。。。。。。。