-
Notifications
You must be signed in to change notification settings - Fork 0
/
CarsColor.py
228 lines (166 loc) · 6.5 KB
/
CarsColor.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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# -*- coding: utf-8 -*-
"""
Created on augost 2023
@author: Alfonso Blanco
"""
#######################################################################
# PARAMETERS
######################################################################
dir=""
dirname= "Test1"
import time
import cv2
import joblib
Ini=time.time()
dirnameYolo="best.pt"
# https://docs.ultralytics.com/python/
from ultralytics import YOLO
model = YOLO(dirnameYolo)
class_list = model.model.names
#print(class_list)
import numpy as np
from CarColor import CarColorImg
import os
import re
########################################################################
def loadimagesRoboflow (dirname):
#########################################################################
# adapted from:
# https://www.aprendemachinelearning.com/clasificacion-de-imagenes-en-python/
# by Alfonso Blanco García
########################################################################
imgpath = dirname + "\\"
images = []
Licenses=[]
print("Reading imagenes from ",imgpath)
NumImage=-2
Cont=0
for root, dirnames, filenames in os.walk(imgpath):
NumImage=NumImage+1
for filename in filenames:
if re.search("\.(jpg|jpeg|png|bmp|tiff)$", filename):
filepath = os.path.join(root, filename)
License=filename[:len(filename)-4]
#if License != "PGMN112": continue
image = cv2.imread(filepath)
# Roboflow images are (416,416)
#image=cv2.resize(image,(416,416))
# kaggle images
#image=cv2.resize(image, (640,640))
images.append(image)
Licenses.append(License)
Cont+=1
return images, Licenses
# ttps://medium.chom/@chanon.krittapholchai/build-object-detection-gui-with-yolov8-and-pysimplegui-76d5f5464d6c
def DetectCarWithYolov8 (img):
TabcropLicense=[]
y=[]
yMax=[]
x=[]
xMax=[]
results = model.predict(img)
for i in range(len(results)):
# may be several plates in a frame
result=results[i]
xyxy= result.boxes.xyxy.numpy()
confidence= result.boxes.conf.numpy()
class_id= result.boxes.cls.numpy().astype(int)
# Get Class name
class_name = [class_list[z] for z in class_id]
# Pack together for easy use
sum_output = list(zip(class_name, confidence,xyxy))
# Copy image, in case that we need original image for something
out_image = img.copy()
for run_output in sum_output :
# Unpack
#print(class_name)
label, con, box = run_output
if label != "vehicle":continue
# crop image to center it
xoff=50
#if int(box[0]) < xoff or int(box[1]) < xoff or int(box[2]) < xoff or int(box[3]) < xoff:
# continue
box[0]=int(box[0])+xoff
box[1]=int(box[1])+xoff
box[2]=int(box[2])-xoff
box[3]=int(box[3])-xoff
cropLicense=out_image[int(box[1]):int(box[3]),int(box[0]):int(box[2])]
#cv2.imshow("Crop", cropLicense)
#cv2.waitKey(0)
TabcropLicense.append(cropLicense)
y.append(int(box[1]))
yMax.append(int(box[3]))
x.append(int(box[0]))
xMax.append(int(box[2]))
return TabcropLicense, y,yMax,x,xMax
###########################################################
# MAIN
##########################################################
#from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
#from sklearn.naive_bayes import GaussianNB
#from sklearn.ensemble import GradientBoostingClassifier
#arr=[]
#arry=[]
arrname=[]
f=open("colors.csv","r")
Conta=0;
for linea in f:
Conta=Conta+1
lineadelTrain =linea.split(",")
#linea_x =[]
#z=2
#for x in lineadelTrain:
# z=z+1
# if z==6: break
# linea_x.append(int(lineadelTrain[z]))
#arr.append(linea_x)
#arry.append(int(Conta))
arrname.append(lineadelTrain[1])
#X_train=np.array(arr)
# print(x)
#Y_train=np.array(arry)
Name=np.array(arrname)
#rf= RandomForestClassifier()
#modelRf= rf.fit(X_train,Y_train)
#joblib.dump(modelRf, "colors_random_forest.joblib")
modelRf=joblib.load("colors_random_forest.joblib")
imagesComplete, Licenses=loadimagesRoboflow(dirname)
print("Number of imagenes : " + str(len(imagesComplete)))
#print("Number of licenses : " + str(len(Licenses)))
ContDetected=0
ContNoDetected=0
TotHits=0
TotFailures=0
with open( "CarColorResults.txt" ,"w") as w:
for i in range (len(imagesComplete)):
# solo imagenes .jpg pueden ser referenciadas en formato [:, :, 0]
cv2.imwrite('pp.jpg',imagesComplete[i])
img=cv2.imread("pp.jpg")
#cv2.imshow("img", img)
#cv2.waitKey()
TabImgSelect, y, yMax, x, xMax =DetectCarWithYolov8(img)
#gray=imagesComplete[i]
License=Licenses[i]
if TabImgSelect==[] :
print(License + " NON DETECTED")
continue
for j in range( len(TabImgSelect)):
#dimensions = TabImgSelect[j].shape
# height, width, number of channels in image
height = TabImgSelect[j].shape[0]
width = TabImgSelect[j].shape[1]
if height < 1 or width < 1:
#print( License + " image too small")
continue
R, G, B, NameColor=CarColorImg(TabImgSelect[j], modelRf, Name, License)
print ("")
lineaw=[]
lineaw.append(License)
lineaw.append(str(R))
lineaw.append(str(G))
lineaw.append(str(B))
lineaw.append(NameColor)
lineaWrite =','.join(lineaw)
lineaWrite=lineaWrite + "\n"
w.write(lineaWrite)
print ("seconds "+ str(time.time()-Ini))