0% encontró este documento útil (0 votos)
137 vistas14 páginas

Clasificación Binaria de Tomates

Este documento describe un proyecto para clasificar tomates de forma binaria (rojos vs verdes) utilizando aprendizaje profundo. Se presenta el conjunto de datos de imágenes de tomates y se realiza un preprocesamiento que incluye la conversión a HSV y la aplicación de umbrales para filtrar colores. Luego, se define un modelo convolucional con dos capas convolucionales seguidas de pooling y densas para la clasificación, el cual es entrenado con las imágenes preprocesadas.

Cargado por

David Rodríguez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
137 vistas14 páginas

Clasificación Binaria de Tomates

Este documento describe un proyecto para clasificar tomates de forma binaria (rojos vs verdes) utilizando aprendizaje profundo. Se presenta el conjunto de datos de imágenes de tomates y se realiza un preprocesamiento que incluye la conversión a HSV y la aplicación de umbrales para filtrar colores. Luego, se define un modelo convolucional con dos capas convolucionales seguidas de pooling y densas para la clasificación, el cual es entrenado con las imágenes preprocesadas.

Cargado por

David Rodríguez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 14

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

También podría gustarte