-
Notifications
You must be signed in to change notification settings - Fork 1
/
tissus.py
147 lines (132 loc) · 6.55 KB
/
tissus.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import numpy as np
import pandas as pd
from operator import itemgetter
class Tissus:
def __init__(self, csv_path, long=0, larg=0):
self.data, self.dataframe = self.parseCsv(csv_path)
self.long_tot = long
self.larg_tot = larg
if long == 0:
self.long_tot = max(self.data[:, 0])
if larg == 0:
self.larg_tot = max(self.data[:, 1])
def parseCsv(self, path): #charge le csv en mémoire
df = pd.read_csv(path, names=["roule", "id", "zero1", "termine", "long_tot", "larg_tot", "inconnu1", "zero2",
"type_defaut", "inconnu3", "metrage", "position", "long_defaut", "larg_defaut",
"inconnu2", "image", "image2", "zero3", "requal_3_cat", "requal_6_cat"])
df1 = df[['metrage', 'position', "type_defaut", "requal_6_cat", "image", "roule"]]
data=sorted(df1.values.tolist(), key=itemgetter(0)) #on range les défaut par ordre de métrage. Ca permet d'accélerer le calcul des corrélations
data=[defect for defect in data if defect[0]>0 and defect[1]>0] #on supprime les point aberrants qui ont une corrdonnée négative
return np.array(data), df
def moveData(self, long, larg): #déplace les défauts des paramètres donnés en entrée
mid_h = self.larg_tot / 2
for default in self.data:
if long != 1:
default[0] = long * np.power(default[0], 0.9995)
if larg != 1:
default[1] = default[1]
if default[1] > mid_h:
default[1] = larg * np.power(default[1] - mid_h, 0.9995) + mid_h
else:
default[1] = mid_h - larg * np.power(mid_h - default[1], 0.9995)
return self.data
def remove_duplicates(self): # remplace tous les duplicata par un défaut à leur position moyenne
kept = []
defects = self.data.tolist()
while len(defects)>0:
avgx = defects[0][0]
avgy = defects[0][1]
tot = 1
i=0
while i<len(defects):
if defects[0][3] == 6.0 or defects[0][3] == 7.0: #si on a une trame
vert_margin = 250
else:
vert_margin=25
if np.abs((defects[0][0] - defects[i][0])) < 1 and np.abs(
(defects[0][1] - defects[i][1])) < vert_margin and defects[0] != defects[i] and str(defects[0][3]) == str(defects[i][3]): #si les deux points sont proches et de meme catégorie. Le str permet de gérer le cas défaut non requalifié. La colonne 3 vaut alors nan et on ne s'interesse pas au type de défaut
avgx += defects[i][0]
avgy += defects[i][1]
tot += 1
defects.remove(defects[i])
else:
i += 1
new_defect=defects[0].copy()
new_defect[0] = avgx / tot
new_defect[1] = avgy / tot
kept.append(new_defect)
defects.pop(0)
self.data = np.array(kept)
def rotate(self, rotation): #retourne le tissus de la rotation donnée
if rotation == "no":
return
elif rotation == "invert":
self.invert_fabric()
elif rotation == "flip":
self.flip_fabric()
elif rotation == "flip+invert":
self.flip_fabric()
self.invert_fabric()
def invert_fabric(self): #retourne le tissus selon l'axe des x
for defect in self.data:
defect[0] = self.long_tot - defect[0]
def flip_fabric(self): #retourne le tissus selon l'axe des y
for defect in self.data:
defect[1] = self.larg_tot - defect[1]
def cut_all_sides(self, margin):#découpe tous les défaut compris dans la marge de tous les côtés
cuted = []
for defect in self.data:
if not (defect[1] < margin or defect[1] > self.larg_tot - margin) and not (
defect[0] < margin or defect[0] > self.long_tot - margin):
defect[1] -= margin
cuted.append(defect)
self.data = np.array(cuted)
self.larg_tot = max(self.data[:, 1])
def cut_hauteur(self, margin):#découpe tous les défauts compris dans la marge du côté haut et bas
cuted = []
for defect in self.data:
if not (defect[1] < margin or defect[1] > self.larg_tot - margin):
defect[1] -= margin
cuted.append(defect)
self.data = np.array(cuted)
self.larg_tot = max(self.data[:, 1])
def cut_longueur(self, margin):#découpe tous les défauts compris dans la marge à gauche et à droite
cuted = []
for defect in self.data:
if not(defect[0] < margin or defect[0] > self.long_tot - margin):
defect[1] -= margin
cuted.append(defect)
self.data = np.array(cuted)
self.larg_tot = max(self.data[:, 1])
def extract_center(self): #extrait tous les défaut au centre du tissus. On récupère ainsi environ 1/9 des défaut. Permet d'accélérer le calcul des corrélations
center = []
margin_long = 0.25 * self.long_tot
margin_larg = 0.25 * self.larg_tot
for defect in self.data:
if defect[1] > margin_larg and defect[1] < self.larg_tot - margin_larg and defect[0] > margin_long and \
defect[0] < self.long_tot - margin_long:
center.append(defect)
self.data = np.array(center)
def move_origin(self, origin_delta):#deplace tous les défaut verticalement
for default in self.data:
default[1] += origin_delta
def move_defects_for_broken_cam(self, start, length):#deplace tous les défaut horizontalement. Utile si les caméras TDM était en panne à un certain moment et pendant une durée connue.
for defect in self.data:
if defect[0] > start:
defect[0] += length
# def cut_when_no_cam_at_end(self, end_of_recording):
# cuted = []
# for defect in self.data:
# if defect[0] < end_of_recording:
# cuted.append(defect)
# self.data = np.array(cuted)
# self.long_tot = max(self.data[:, 0])
#
# def cut_when_no_cam_at_start(self, start_of_recording):
# cuted = []
# for defect in self.data:
# if defect[0] > start_of_recording:
# defect[0] -= start_of_recording
# cuted.append(defect)
# self.data = np.array(cuted)
# self.long_tot = max(self.data[:, 0])