-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSide.py
More file actions
161 lines (125 loc) · 6.03 KB
/
Copy pathSide.py
File metadata and controls
161 lines (125 loc) · 6.03 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
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
148
149
150
import pandas as pd
import re
import utils
import cv2
import matplotlib.pyplot as plt
from pathlib import Path
class Side:
DATAFOLDERNAME = r"data"
AREASCOLUMNSNAMES = [f"a{i}" for i in range(1, 11)]
# SCRATCHTYPEAREAEDGES = [100, 1100, 2500, 5000, 7000, 9000] # Allowed defect of area
SCRATCHTYPEAREAEDGES = [10, 700, 6000, 11000, 33000] # Allowed defect of area
def __init__(self,sidename=None,rootpath=r"evo_images_CSV",sideimei=None,sidecsvfile= r"Front.csv",sideimagename = r"Display.jpg",sideregiongroup=None,manualgrade="B"):
self.sidename = sidename
self.sideregiongroup = sideregiongroup
self.sidecsvfilename =sidecsvfile
self.sideimagename = sideimagename
self.manualgrade = manualgrade
self.siderootpath = Path(".").cwd() / rootpath
self.sideimei = sideimei
self.sidecsvfilenew = f"{self.sidecsvfilename[:-4]}_new{self.sidecsvfilename[-4:]}"
self.sideannotatedimagename = f"{self.sideimagename[:-4]}_annotated{self.sideimagename[-4:]}"
self.sidecurrentimeifolder = self.siderootpath / Side.DATAFOLDERNAME / self.sideimei
self.readfilteredcsvdata()
self.sidelightscratchescount = 0
self.sidedeepscratchescount = 0
self.setscratchescount()
def readfilteredcsvdata(self):
self.correctcsv()
self.dfsidecsvdata = pd.read_csv(self.sidecurrentimeifolder / self.sidecsvfilenew, on_bad_lines='warn')
self.dfsidecsvdata.insert(0, column="imei", value=self.sideimei)
# # add grade B column
self.dfsidecsvdata.insert(1, column="grade", value=self.manualgrade)
#filtering for Ls Rs, Ts and Bs regions depending on sidename
if self.sidename == 'left':
filt = (self.dfsidecsvdata['region'].str.startswith('L'))
self.dfsidecsvdata = self.dfsidecsvdata[filt]
elif self.sidename == 'right':
filt = (self.dfsidecsvdata['region'].str.startswith('R'))
self.dfsidecsvdata = self.dfsidecsvdata[filt]
elif self.sidename == 'top':
filt = (self.dfsidecsvdata['region'].str.startswith('T'))
self.dfsidecsvdata = self.dfsidecsvdata[filt]
elif self.sidename == 'bottom':
filt = (self.dfsidecsvdata['region'].str.startswith('B'))
self.dfsidecsvdata = self.dfsidecsvdata[filt]
def correctcsv(self):
# Open the file in read mode
with open(self.sidecurrentimeifolder / self.sidecsvfilename, 'r') as file:
# Read the entire content of the file
content = file.read()
cells_raw = re.split(r'[,\n]', content)
#remove first and last cell
cells = cells_raw[1:-3]
#remove empty cells
cleaned_cells = [c for c in cells if (c!="")]
#creating rows
rows_delimiters =["Scratch","Shape","Crack"]
rows=[]
row = ""
for i,c in enumerate(cleaned_cells):
if c in rows_delimiters:
if i > 2:
# remove beyond 32. a1...a10,X1...10,y1..10
aux = row.split(',')[:32]
cleanedrow = ",".join(aux)
rows.append(cleanedrow)
row = ""
row = c.strip() +','
else:
row += c.strip() +','
#remove beyond 32. a1...a10,X1...10,y1..10
aux = row.split(',')[:32]
cleanedrow= ",".join(aux)
#append last row of the loop
rows.append(cleanedrow)
# add header for csv file
header = ["type,","region,",] + ['a' + str(i)+',' for i in range(1, 11)]
for i in range(1,11):
header.append(f"x{i},")
header.append(f"y{i},")
rows.insert(0,"".join(header))
#replace , by \n at the end of each row for csv format
for i in range(len(rows)):
if len(rows[i]) > 0:
rows[i] = rows[i][:-1] + '\n'
#save as corrected csv
correctedcsvpath = self.sidecurrentimeifolder / self.sidecsvfilenew
text = "".join(rows)
with open(str(correctedcsvpath), mode='w') as file:
file.write(text)
def setscratchescount(self):
df = self.dfsidecsvdata
self.sidelightscratchescount = ((df[Side.AREASCOLUMNSNAMES] >= Side.SCRATCHTYPEAREAEDGES[1]) &
(df[Side.AREASCOLUMNSNAMES] < Side.SCRATCHTYPEAREAEDGES[2])).sum().sum()#first sum for df second for series
self.sidedeepscratchescount = ((df[Side.AREASCOLUMNSNAMES] >= Side.SCRATCHTYPEAREAEDGES[2])).sum().sum()
def annotateside(self,scale=4):
imagepath = self.sidecurrentimeifolder / self.sideimagename
annotatedimagename = self.sidecurrentimeifolder / self.sideannotatedimagename
#read image
image = cv2.imread(imagepath)
image_copy = image.copy()
#might need to flip vertically if back
if self.sidename == 'back':
image_copy = cv2.flip(image_copy, 1)
#filter data by its side's region
dfsideregions = self.dfsidecsvdata[ (self.dfsidecsvdata['region'].isin(self.sideregiongroup))]
for index, row in dfsideregions.iterrows():
if row[f"type"] != 'Shape' and row[f"type"] != 'Crack':
boxes = [(row[f"a{i}"],row[f"x{i}"],row[f"y{i}"]) for i in range(1,11) if row[f"a{i}"] > 0 ]
for bx in boxes:
a,x,y = bx
x=float(x)
y = float(y)
a = float(a)
utils.AnnotateOnImage(image_copy,top_left=(x/scale,y/scale),area=a)
if self.sidename != 'front':
image_copy = cv2.flip(image_copy, 1)
cv2.imwrite(self.sidecurrentimeifolder / self.sideannotatedimagename, image_copy)
def showannotatedside(self):
self.annotateside()
imageannotated = cv2.imread(self.sidecurrentimeifolder / self.sideannotatedimagename)
image_rgb = cv2.cvtColor(imageannotated, cv2.COLOR_BGR2RGB)
# Plot the image using Matplotlib
plt.imshow(image_rgb)
plt.show()