forked from wiibrew/pytorch-yolo2
-
Notifications
You must be signed in to change notification settings - Fork 8
/
eval.py
122 lines (100 loc) · 3.5 KB
/
eval.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from __future__ import print_function
import sys
if len(sys.argv) < 4:
print('Usage:')
print('python eval.py datacfg cfgfile weight1 weight2 ...')
exit()
import time
import torch
from torchvision import datasets, transforms
from torch.autograd import Variable
import dataset
import random
import math
from utils import *
from cfg import parse_cfg
from darknet import Darknet
# Training settings
datacfg = sys.argv[1]
cfgfile = sys.argv[2]
data_options = read_data_cfg(datacfg)
net_options = parse_cfg(cfgfile)[0]
trainlist = data_options['train']
testlist = data_options['valid']
gpus = data_options['gpus'] # e.g. 0,1,2,3
num_workers = int(data_options['num_workers'])
batch_size = int(net_options['batch'])
#Train parameters
use_cuda = True
seed = 22222
eps = 1e-5
# Test parameters
conf_thresh = 0.25
nms_thresh = 0.4
iou_thresh = 0.5
###############
torch.manual_seed(seed)
if use_cuda:
os.environ['CUDA_VISIBLE_DEVICES'] = gpus
torch.cuda.manual_seed(seed)
model = Darknet(cfgfile)
model.print_network()
init_width = model.width
init_height = model.height
kwargs = {'num_workers': num_workers, 'pin_memory': True} if use_cuda else {}
test_loader = torch.utils.data.DataLoader(
dataset.listDataset(testlist, shape=(init_width, init_height),
shuffle=False,
transform=transforms.Compose([
transforms.ToTensor(),
]), train=False),
batch_size=batch_size, shuffle=False, **kwargs)
if use_cuda:
model = torch.nn.DataParallel(model).cuda()
def test():
def truths_length(truths):
for i in range(50):
if truths[i][1] == 0:
return i
model.eval()
num_classes = model.module.num_classes
anchors = model.module.anchors
num_anchors = model.module.num_anchors
total = 0.0
proposals = 0.0
correct = 0.0
for batch_idx, (data, target) in enumerate(test_loader):
if use_cuda:
data = data.cuda()
data = Variable(data, volatile=True)
output = model(data).data
all_boxes = get_region_boxes(output, conf_thresh, num_classes, anchors, num_anchors)
for i in range(output.size(0)):
boxes = all_boxes[i]
boxes = nms(boxes, nms_thresh)
truths = target[i].view(-1, 5)
num_gts = truths_length(truths)
total = total + num_gts
for i in range(len(boxes)):
if boxes[i][4] > conf_thresh:
proposals = proposals+1
for i in range(num_gts):
box_gt = [truths[i][1], truths[i][2], truths[i][3], truths[i][4], 1.0, 1.0, truths[i][0]]
best_iou = 0
best_j = -1
for j in range(len(boxes)):
iou = bbox_iou(box_gt, boxes[j], x1y1x2y2=False)
if iou > best_iou:
best_j = j
best_iou = iou
if best_iou > iou_thresh and boxes[best_j][6] == box_gt[6]:
correct = correct+1
precision = 1.0*correct/(proposals+eps)
recall = 1.0*correct/(total+eps)
fscore = 2.0*precision*recall/(precision+recall+eps)
logging("precision: %f, recall: %f, fscore: %f" % (precision, recall, fscore))
for i in range(3, len(sys.argv)):
weightfile = sys.argv[i]
model.module.load_weights(weightfile)
logging('evaluating ... %s' % (weightfile))
test()