Skip to content

Commit 5e605ec

Browse files
committed
merge multi-gpu and single gpu mining mode
1 parent 6559078 commit 5e605ec

8 files changed

Lines changed: 40 additions & 287 deletions

File tree

det-yolov5-tmi/mining/mining_cald.py

Lines changed: 0 additions & 162 deletions
This file was deleted.

det-yolov5-tmi/mining/mining_entropy.py

Lines changed: 0 additions & 82 deletions
This file was deleted.

det-yolov5-tmi/mining/util.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,35 @@
1919
import cv2
2020
import numpy as np
2121
import torch.utils.data as td
22+
from mining.data_augment import cutout, horizontal_flip, intersect, resize, rotate
23+
from nptyping import NDArray
2224
from scipy.stats import entropy
2325
from torch.utils.data._utils.collate import default_collate
24-
25-
from mining.data_augment import cutout, horizontal_flip, resize, rotate
26-
from mining.mining_cald import get_ious
2726
from utils.augmentations import letterbox
27+
from utils.ymir_yolov5 import BBOX
2828

2929
LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1)) # https://pytorch.org/docs/stable/elastic/run.html
3030
RANK = int(os.getenv('RANK', -1))
3131
WORLD_SIZE = int(os.getenv('WORLD_SIZE', 1))
3232

3333

34+
def get_ious(boxes1: BBOX, boxes2: BBOX) -> NDArray:
35+
"""
36+
args:
37+
boxes1: np.array, (N, 4), xyxy
38+
boxes2: np.array, (M, 4), xyxy
39+
return:
40+
iou: np.array, (N, M)
41+
"""
42+
area1 = (boxes1[:, 2] - boxes1[:, 0]) * (boxes1[:, 3] - boxes1[:, 1])
43+
area2 = (boxes2[:, 2] - boxes2[:, 0]) * (boxes2[:, 3] - boxes2[:, 1])
44+
iner_area = intersect(boxes1, boxes2)
45+
area1 = area1.reshape(-1, 1).repeat(area2.shape[0], axis=1)
46+
area2 = area2.reshape(1, -1).repeat(area1.shape[0], axis=0)
47+
iou = iner_area / (area1 + area2 - iner_area + 1e-14)
48+
return iou
49+
50+
3451
def preprocess(img, img_size, stride):
3552
img1 = letterbox(img, img_size, stride=stride, auto=False)[0]
3653

det-yolov5-tmi/mining/ymir_mining_aldd.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
174174
if RANK in [-1, 0]:
175175
ymir_yolov5.write_monitor_logger(stage=YmirStage.TASK, p=idx * batch_size_per_gpu / dataset_size)
176176

177-
torch.save(mining_results, f'/out/mining_results_{RANK}.pt')
177+
torch.save(mining_results, f'/out/mining_results_{max(0,RANK)}.pt')
178178

179179

180180
def main() -> int:
@@ -191,9 +191,7 @@ def main() -> int:
191191

192192
# wait all process to save the mining result
193193
if LOCAL_RANK != -1:
194-
print(f'rank: {RANK}, sync start before merge')
195194
dist.barrier()
196-
print(f'rank: {RANK}, sync finished before merge')
197195

198196
if RANK in [0, -1]:
199197
results = []

det-yolov5-tmi/mining/ymir_mining_cald.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
155155
image_file = batch['image_file'][inner_idx]
156156
mining_results[image_file] = batch_consistency[inner_idx]
157157

158-
torch.save(mining_results, f'/out/mining_results_{RANK}.pt')
158+
torch.save(mining_results, f'/out/mining_results_{max(0,RANK)}.pt')
159159

160160

161161
def main() -> int:

det-yolov5-tmi/mining/ymir_mining_entropy.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,12 @@
1414
import torch.distributed as dist
1515
import torch.utils.data as td
1616
from easydict import EasyDict as edict
17+
from mining.util import YmirDataset, load_image_file
1718
from tqdm import tqdm
19+
from utils.ymir_yolov5 import YmirYolov5
1820
from ymir_exc import result_writer as rw
1921
from ymir_exc.util import YmirStage, get_merged_config
2022

21-
from mining.util import (YmirDataset, collate_fn_with_fake_ann, load_image_file, load_image_file_with_ann,
22-
update_consistency)
23-
from utils.general import scale_coords
24-
from utils.ymir_yolov5 import YmirYolov5
25-
2623
LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1)) # https://pytorch.org/docs/stable/elastic/run.html
2724
RANK = int(os.getenv('RANK', -1))
2825
WORLD_SIZE = int(os.getenv('WORLD_SIZE', 1))
@@ -58,9 +55,7 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
5855
pin_memory=ymir_yolov5.pin_memory,
5956
drop_last=False)
6057

61-
results = []
6258
mining_results = dict()
63-
beta = 1.3
6459
dataset_size = len(images_rank)
6560
pbar = tqdm(origin_dataset_loader) if RANK == 0 else origin_dataset_loader
6661
for idx, batch in enumerate(pbar):
@@ -73,18 +68,16 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
7368

7469
if RANK in [-1, 0]:
7570
ymir_yolov5.write_monitor_logger(stage=YmirStage.TASK, p=idx * batch_size_per_gpu / dataset_size)
76-
preprocess_image_shape = batch['image'].shape[2:]
7771
for inner_idx, det in enumerate(pred): # per image
78-
result_per_image = []
7972
image_file = batch['image_file'][inner_idx]
8073
if len(det):
8174
conf = det[:, 4].data.cpu().numpy()
82-
mining_results[image_file] = -np.sum(conf*np.log2(conf))
75+
mining_results[image_file] = -np.sum(conf * np.log2(conf))
8376
else:
8477
mining_results[image_file] = -10
8578
continue
8679

87-
torch.save(mining_results, f'/out/mining_results_{RANK}.pt')
80+
torch.save(mining_results, f'/out/mining_results_{max(0,RANK)}.pt')
8881

8982

9083
def main() -> int:
@@ -99,7 +92,7 @@ def main() -> int:
9992
run(ymir_cfg, ymir_yolov5)
10093

10194
# wait all process to save the mining result
102-
if LOCAL_RANK != -1:
95+
if WORLD_SIZE > 1:
10396
dist.barrier()
10497

10598
if RANK in [0, -1]:
@@ -112,10 +105,6 @@ def main() -> int:
112105
for img_file, score in result.items():
113106
ymir_mining_result.append((img_file, score))
114107
rw.write_mining_result(mining_result=ymir_mining_result)
115-
116-
if LOCAL_RANK != -1:
117-
print(f'rank: {RANK}, start destroy process group')
118-
# dist.destroy_process_group()
119108
return 0
120109

121110

0 commit comments

Comments
 (0)