-
Notifications
You must be signed in to change notification settings - Fork 2
/
ensemble_all.py
78 lines (68 loc) · 2.09 KB
/
ensemble_all.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
from zipfile import ZipFile
import pandas as pd
import cv2
import os
import numpy as np
from matplotlib import pyplot as plt # noqa
from tqdm import tqdm; tqdm.monitor_interval = 0 # noqa
from data import DicomDataset
ensemble_id = 3
p_clf = 0.4995
reduction_fn = lambda x: (x.mean() + x.max()) / 2 # np.mean # np.mean # noqa
p_seg = 0.2
os.makedirs('x_ensemble', exist_ok=True)
fns = [
'Model_000_f00/f00-PREDS.zip',
'Model_000_f01/f01-PREDS.zip',
'Model_000_f02/f02-PREDS.zip',
'Model_000_f03/f03-PREDS.zip',
'Model_000_f04/f04-PREDS.zip',
'Model_001_f00/f00-PREDS.zip',
'Model_001_f01/f01-PREDS.zip',
'Model_001_f02/f02-PREDS.zip',
'Model_001_f03/f03-PREDS.zip',
'Model_001_f04/f04-PREDS.zip',
'Model_002_f00/f00-PREDS.zip',
'Model_002_f01/f01-PREDS.zip',
'Model_002_f02/f02-PREDS.zip',
'Model_002_f03/f03-PREDS.zip',
'Model_002_f04/f04-PREDS.zip',
'Model_002_f05/f05-PREDS.zip',
'Model_002_f06/f06-PREDS.zip',
]
val = '_VAL' in fns[0]
prefix = fns[0].split('_')[0]
out_fn = os.path.join('x_ensemble', '%s_ENS_V5_%04d%s.csv' % (
prefix, ensemble_id, '_VAL' if val else ''))
handels = [ZipFile(fn) for fn in fns]
image_ids, rles = [], []
pngs = ZipFile(fns[0]).namelist()
num_clf_empty = 0
for png in tqdm(pngs):
image_id = os.path.splitext(png)[0]
p_ensemble = 0.0
for handle in handels:
with handle.open(png) as f:
img = cv2.imdecode(np.frombuffer(f.read(), 'uint8'), 0)
p = np.float32(img) / 255
# plt.imshow(p); plt.show()
p_ensemble += p / len(fns)
# classify
p_reduced = reduction_fn(p_ensemble)
if p_reduced < p_clf:
image_ids.append(image_id)
rles.append('-1')
num_clf_empty += 1
continue
# segment
mask = (p_ensemble > p_seg).astype('uint8')
if mask.sum() == 0:
image_ids.append(image_id)
rles.append('-1')
continue
image_ids.append(image_id)
rles.append(DicomDataset.mask_to_rle(mask * 255))
sub = pd.DataFrame({'ImageId': image_ids, 'EncodedPixels': rles})
sub.to_csv(out_fn, columns=['ImageId', 'EncodedPixels'], index=False)
print("Wrote to: %s" % out_fn)
print("Empty (clf): ", num_clf_empty)