22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
Clasificación binaria de tomates
Reconocimiento del problema
¿Será posible clasificar tomates a partir de un algoritmo de aprendizaje de máquina?
Librerías básicas
In [1]:
import cv2
import tensorflow as tf
import os
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.keras.models import load_model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dropout, Flatten, Dense
from tensorflow.keras.layers import Convolution2D, MaxPooling2D
from tensorflow.keras import backend as K
import pathlib
import random, os
from PIL import Image, ImageOps
Set de datos
Se omiten imágenes con valores atípicos con el fin de no incurrir en pre-procesamiento.
Se insertan las
direcciones con las respectivas imágenes y caracteristicas de los mismos, para luego enlistarlos como se ve a
continuacion:
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 1/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [2]:
dataEntrenamiento = 'C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\entrenamiento'
dataValidacion = 'C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\validacion'
lista_data_entrenamiento = os.listdir(dataEntrenamiento)
lista_data_validacion = os.listdir(dataValidacion)
print(lista_data_entrenamiento, lista_data_validacion)
['Tomates Rojos', 'Tomates Verdes'] ['00000000004807L1.webp', '1237943.jpg',
'depositphotos_25296371-stock-photo-red-tomato.jpg', 'depositphotos_5610509-
stock-photo-red-tomato.jpg', 'green-tomato-1383239.jpg', 'green-tomato-260nw
-230674579.webp', 'green-tomato-on-white-260nw-305885363.webp', 'imagen-toma
te-dl28304.webp', 'solo-tomate-verde-aislado-en-fondo-gris-116383269.jpg',
'Tomate Rojo', 'Tomate Verde', 'tomaterojo150.jpg', 'tomaterojo151.jpg', 'to
materojo152.jpg', 'tomaterojo153.jpg', 'tomaterojo154.jpg', 'tomaterojo155.j
pg', 'tomaterojo156.jpg', 'tomaterojo157.jpg', 'tomaterojo158.jpg', 'tomater
ojo159.jpg', 'tomaterojo160.jpg', 'tomaterojo161.jpg', 'tomaterojo162.jpg',
'tomaterojo163.jpg', 'tomaterojo164.jpg', 'tomaterojo165.jpg', 'tomaterojo16
6.jpg', 'tomaterojo167.jpg', 'tomaterojo168.jpg', 'tomaterojo169.jpg', 'toma
terojo170.jpg', 'tomaterojo171.jpg', 'tomaterojo172.jpg', 'tomaterojo173.jp
g', 'tomaterojo174.jpg', 'tomaterojo175.jpg', 'tomaterojo176.jpg', 'tomatero
jo177.jpg', 'tomaterojo178.jpg', 'tomaterojo179.jpg', 'tomaterojo180.jpg',
'tomaterojo181.jpg', 'tomaterojo183.jpg', 'tomaterojo184.jpg', 'tomaterojo18
5.jpg', 'tomaterojo186.jpg', 'tomaterojo187.jpg', 'tomaterojo188.jpg', 'toma
terojo189.jpg', 'tomaterojo190.jpg', 'tomaterojo191.jpg', 'tomateverde117.jp
eg', 'tomateverde118.jpeg', 'tomateverde119.jpeg', 'tomateverde120.jpeg', 't
omateverde121.jpeg', 'tomateverde122.jpeg', 'tomateverde123.jpeg', 'tomateve
rde124.jpeg', 'tomateverde125.jpeg', 'tomateverde126.jpeg', 'tomateverde127.
jpeg', 'tomateverde128.jpeg', 'tomateverde129.jpeg', 'tomateverde130.jpeg',
'tomateverde131.jpeg', 'tomateverde132.jpeg', 'tomateverde133.jpeg', 'tomate
verde134.jpeg', 'tomateverde135.jpeg', 'tomateverde136.jpeg', 'tomateverde13
7.jpeg', 'tomateverde138.jpg', 'tomateverde139.jpg', 'tomateverde140.jpg',
'tomateverde141.jpg', 'tomateverde142.jpg', 'tomateverde143.jpeg', 'tomateve
rde144.jpeg', 'tomateverde145.jpeg', 'tomateverde146.jpeg']
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 2/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [3]:
categorias = []
labels = []
imagenes = []
categorias = os.listdir('C:\\Users\\juans\\Desktop\Proyecto anaconda\\Datos\\entrenamiento'
print(categorias)
x=0
for directorio in categorias:
for imagen in os.listdir('C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\entrenam
img = Image.open('C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\entrenamient
img = np.asarray(img)
imagenes.append(img)
labels.append(x)
x += 1
print(labels)
['Tomates Rojos', 'Tomates Verdes']
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Mosaico con un segmento del DataSet
Y aqui se presenta una porcion de las imagenes tomadas para el proyecto
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 3/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [4]:
img_mosaico = cv2.imread('TomatesRecopilados.jpg')
img_mosaico = cv2.cvtColor(img_mosaico, cv2.COLOR_BGR2RGB)
plt.imshow(img_mosaico)
Out[4]:
<matplotlib.image.AxesImage at 0x21a005dcac0>
Abstraccion de características de imagen
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 4/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [5]:
im = Image.open('C:/Users/juans/Desktop/Proyecto anaconda/Datos/entrenamiento/Tomates Rojos
print(im.format)
print(im.size)
print(im.mode)
im
JPEG
(1040, 780)
RGB
Out[5]:
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 5/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [6]:
img = cv2.imread("C:/Users/juans/Desktop/Proyecto anaconda/Tomatesvarios.png")
plt.imshow(img)
Out[6]:
<matplotlib.image.AxesImage at 0x21a00617820>
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 6/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [7]:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
Out[7]:
<matplotlib.image.AxesImage at 0x21a00687970>
In [8]:
img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 7/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [9]:
# Elegimos el umbral de rojo en HSV
umbral_bajo1 = (170,100,100)
umbral_alto1 = (179,255,255)
# Elegimos el segundo umbral de rojo en HSV
umbral_bajo2 = (0,100,100)
umbral_alto2 = (10,255,255)
# hacemos la mask y filtramos en la original
mask1 = cv2.inRange(img_hsv, umbral_bajo1, umbral_alto1)
mask2 = cv2.inRange(img_hsv, umbral_bajo2, umbral_alto2)
mask = mask1 + mask2
res = cv2.bitwise_and(img, img, mask=mask)
# imprimimos los resultados
plt.subplot(1, 2, 1)
plt.imshow(mask, cmap="gray")
plt.subplot(1, 2, 2)
plt.imshow(res)
plt.show()
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 8/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [10]:
# Elegimos el umbral de verde en HSV
umbral_bajo1 = (28,100,100)
umbral_alto1 = (85,255,255)
# Elegimos el segundo umbral de verde en HSV
umbral_bajo2 = (86,100,100)
umbral_alto2 = (90,255,255)
# hacemos la mask y filtramos en la original
mask1 = cv2.inRange(img_hsv, umbral_bajo1, umbral_alto1)
mask2 = cv2.inRange(img_hsv, umbral_bajo2, umbral_alto2)
mask = mask1 + mask2
res = cv2.bitwise_and(img, img, mask=mask)
# imprimimos los resultados
plt.subplot(1, 2, 1)
plt.imshow(mask, cmap="gray")
plt.subplot(1, 2, 2)
plt.imshow(res)
plt.show()
In [12]:
##Parametros
epocas=5
ancho, alto = 350, 350
batch_size = 3
filtrosConv1 = 32
filtrosConv2 = 64
tamano_filtro1 = (3, 3)
tamano_filtro2 = (2, 2)
tamano_pool = (2, 2)
clases = 2
lr = 0.00008
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 9/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [13]:
entrenamiento_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen= ImageDataGenerator(
rescale=1./255)
imagen_entrenamiento=entrenamiento_datagen.flow_from_directory(
dataEntrenamiento,
target_size=(alto,ancho),
batch_size=batch_size,
class_mode='categorical'
)
imagen_validacion=test_datagen.flow_from_directory(
dataValidacion,
target_size=(alto,ancho),
batch_size=batch_size,
class_mode='categorical'
)
Found 264 images belonging to 2 classes.
Found 76 images belonging to 2 classes.
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 10/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [14]:
## crear la red convolucional
cnn=Sequential()
cnn.add(Convolution2D(filtrosConv1,tamano_filtro1, padding='same', input_shape=(ancho,alto,
cnn.add(MaxPooling2D(pool_size=tamano_pool))
cnn.add(Convolution2D(filtrosConv2,tamano_filtro2,padding='same'))
cnn.add(MaxPooling2D(pool_size=tamano_pool))
cnn.add(Flatten())
cnn.add(Dense(256,activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(clases,activation='softmax'))
cnn.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=lr), metrics=['ac
print(cnn.summary())
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 350, 350, 32) 896
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 175, 175, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 175, 175, 64) 8256
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 87, 87, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 484416) 0
_________________________________________________________________
dense (Dense) (None, 256) 124010752
_________________________________________________________________
dropout (Dropout) (None, 256) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 514
=================================================================
Total params: 124,020,418
Trainable params: 124,020,418
Non-trainable params: 0
_________________________________________________________________
None
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 11/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [15]:
## Iniciar entrenamiento
historial = cnn.fit(
imagen_entrenamiento,
epochs=epocas,
validation_data=imagen_validacion,
verbose=1)
Epoch 1/5
88/88 [==============================] - 242s 3s/step - loss: 1.0408 - accur
acy: 0.8258 - val_loss: 0.1917 - val_accuracy: 0.9342
Epoch 2/5
88/88 [==============================] - 288s 3s/step - loss: 0.0393 - accur
acy: 0.9848 - val_loss: 0.0081 - val_accuracy: 1.0000
Epoch 3/5
88/88 [==============================] - 246s 3s/step - loss: 0.0616 - accur
acy: 0.9773 - val_loss: 9.1189e-04 - val_accuracy: 1.0000
Epoch 4/5
88/88 [==============================] - 255s 3s/step - loss: 0.0165 - accur
acy: 0.9924 - val_loss: 0.0026 - val_accuracy: 1.0000
Epoch 5/5
88/88 [==============================] - 247s 3s/step - loss: 0.0023 - accur
acy: 1.0000 - val_loss: 3.4855e-04 - val_accuracy: 1.0000
In [16]:
dir='./modelo/'
cnn.save('./modelo/modelo.h5')
In [17]:
modelo='./modelo/modelo.h5'
cnn=load_model(modelo)
In [18]:
def predict(file):
x=load_img(file, target_size=(ancho,alto))
x=img_to_array(x)
x=np.expand_dims(x,axis=0)
array = cnn.predict(x)
result = array[0]
respuesta = np.argmax(result)
print(result)
if respuesta==0:
print("pred: tomate rojo")
elif respuesta==1:
print("pred: tomate verde")
return respuesta
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 12/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
In [21]:
path = "C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\validacion\\"
random_imageName = random.choice([
x for x in os.listdir(path)
if os.path.isfile(os.path.join(path, x))
])
prueba = Image.open("C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\validacion\\"+str
resultado = "C:\\Users\\juans\\Desktop\\Proyecto anaconda\\Datos\\validacion\\"+str(random_
predict(resultado)
plt.imshow(prueba)
[1. 0.]
pred: tomate rojo
Out[21]:
<matplotlib.image.AxesImage at 0x21a540bf730>
In [ ]:
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 13/14
22/11/22, 13:15 Clasificacion binaria Tomates Final - Jupyter Notebook
localhost:8888/notebooks/Desktop/Proyecto anaconda/Clasificacion binaria Tomates Final.ipynb#Abstraccion-de-características-de-imagen 14/14