-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdel_duplicates.py
More file actions
104 lines (78 loc) · 3.31 KB
/
del_duplicates.py
File metadata and controls
104 lines (78 loc) · 3.31 KB
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
import numpy as np
def find_exact_duplicates(images):
"""
Находит индексы дублирующихся изображений.
images: np.array, shape=(N, H, W) или (N, H, W, 1)
return: список списков индексов дубликатов
"""
N = images.shape[0]
# Уберем лишнюю размерность, если есть
if images.ndim == 4 and images.shape[-1] == 1:
images = images.reshape(N, images.shape[1], images.shape[2])
seen = {}
duplicates = []
for idx, img in enumerate(images):
# Превращаем изображение в bytes для быстрого сравнения
img_bytes = img.tobytes()
if img_bytes in seen:
seen[img_bytes].append(idx)
else:
seen[img_bytes] = [idx]
# Оставляем только группы с повторениями
for group in seen.values():
if len(group) > 1:
duplicates.append(group)
return duplicates
def remove_duplicates(X, y, y_reg, duplicates):
"""
Удаляет дубликаты из X и усредняет y по группам.
X: np.ndarray (N, H, W, C)
y: np.ndarray (N, ...) — метки
duplicates: list[list[int]] — группы индексов-дубликатов
return: (X_new, y_new)
"""
keep_indices = []
y_new = []
y_new_reg = []
used = set()
for group in duplicates:
group = list(set(group)) # на всякий случай убираем повтор индексов
# выбираем первый индекс для сохранения картинки
keep_idx = group[0]
keep_indices.append(keep_idx)
used.update(group)
# усредняем метки по группе
y_avg = np.mean(y[group], axis=0)
y_avg_reg = np.mean(y_reg[group], axis=0)
y_new.append(y_avg)
y_new_reg.append(y_avg_reg)
# добавляем те картинки, которые не попали ни в одну группу
all_indices = set(range(len(X)))
leftovers = list(all_indices - used)
keep_indices.extend(leftovers)
y_new.extend(list(y[leftovers]))
y_new_reg.extend(list(y_reg[leftovers]))
# формируем новые массивы
keep_indices = np.array(keep_indices)
y_new = np.array(y_new)
y_new_reg = np.array(y_new_reg)
# переставляем, чтобы сохранить порядок
order = np.argsort(keep_indices)
keep_indices = keep_indices[order]
y_new = y_new[order]
y_new_reg = y_new_reg[order]
return X[keep_indices], y_new, y_new_reg
images = np.load(r"Data\Online\X.npy")
y = np.load(r"Data\Online\y.npy")
y_reg = np.load(r"Data\Online\y_reg.npy")
duplicates = find_exact_duplicates(
np.where(images > 160, 160, images)) # Чтобы убрать случайнче шумы по типу звезд на заднем плане
print(f"Найдено {len(duplicates)} групп дубликатов")
s = 0
for group in duplicates:
s += len(group)
print(f"Найдено {s} дубликатов")
X, y, y_reg = remove_duplicates(images, y, y_reg, duplicates)
np.save(r"Data\X_nodup.npy", X)
np.save(r"Data\y_nodup.npy", y)
np.save(r"Data\y_reg_nodup.npy", y_reg)