Керас многодалека для обучения полноты данныхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Керас многодалека для обучения полноты данных

Сообщение Anonymous »

Я пытаюсь обучить многооборотную классификационную модель с керами. Приложение будет в промышленной обстановке для классификации дефектных изображений, обычно захваченных во время производства. Ожидаемым выводом будет правильно идентифицировать дефект «A» или дефект «B». Однако, возможно, и дефект «A», и «B» могут возникнуть вместе, отсюда и необходимость в многоуровневой классификации. (В действительности будет более 10 различных классификаций дефектов, и теоретически можно найти несколько дефектов, если маловероятно.) Все идет нормально. Теперь мне нужна модель, которая также может идентифицировать «A» и «B». У меня намеренно нет тренировочных изображений как с треугольниками, так и с квадратами, так как я хочу повторить обучение изображения дефекта, где у меня не будет достаточного количества изображений с несколькими дефектами. Интуитивно, кажется, это не должно иметь значения. Все, что должна сделать модель, это сказать мне, думает ли она, что есть квадрат на изображении, независимо от того, есть ли также треугольник. Я чувствую, что мне не хватает чего-то более высокого уровня, а не просто настраивать, например, параметры моей модели. Модель неправильно идентифицирует тестовые изображения как с квадратами, так и с треугольниками, хотя она хорошо работает, когда есть один или другой. I followed the various online guides to be sure the model has:
  • sigmoid final activation
  • binary_crossentropy loss
  • Adam optimizer
  • onehot multilabels produced with MultiLabelBinarizer()
Я использую следующие версии модуля в системе Linux Mint 22.1: < /p>

Python 3.12.3 < /li>
Pandas 2.2.3 < /li>
keras 3.10.0 < /li>
snumpy 2. 2.19.0 < /li>
Scikit-learn 1.7.1 < /li>
Подушка 11.1.0 < /li>
opencv-python 4.12.0.88 < /li>
< /ul>
Примечание: < /p>


. Для обучения, поскольку это будет отражать приложение к дефектным изображениям, которые также являются серого. Бонус, что он сохраняет при использовании памяти. < /Li>
< /ul>

Code с посторонними комментариями, удаленными < /p>

Код: Выделить всё

from PIL import ImageDraw, Image
import numpy as np

# SmallerVGGNet modules
import pandas as pd
from keras.models import Sequential
from keras.layers import BatchNormalization
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Activation
from keras.layers import Flatten
from keras.layers import Dropout
from keras.layers import Dense
from keras import backend as K

# training modules
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.preprocessing.image import img_to_array
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
#from pyimagesearch.smallervggnet import SmallerVGGNet
import matplotlib.pyplot as plt
from imutils import paths
import tensorflow as tf
import numpy as np
import argparse
import random
import pickle
import cv2
import os

tf.compat.v1.enable_eager_execution() # enable eager execution

class SmallerVGGNet:
@staticmethod
def build(width, height, depth, classes, finalAct="softmax"):
model = Sequential()
inputShape = (height, width, depth)
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = (depth, height, width)
chanDim = 1
model.add(Conv2D(64, (2, 2), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (2, 2), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

# first (and only) set of FC => RELU layers
model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
#model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(classes))
model.add(Activation(finalAct))
return model

# initialize the number of epochs to train for, initial learning rate, batch size, and image dimensions
EPOCHS = 50
BS = 32
IMAGE_DIMS = (200, 200, 1) # 1 channel for grayscale

# initialize the data and labels

data = []
labels = []

print("[INFO] loading images...")
for item in ['squares','triangles']:
image_path = f"Train/{item}"
imagePaths = sorted(list(paths.list_images(image_path)))
for imagePath in imagePaths:
# load the image, pre-process it, and store it in the data list
image = cv2.imread(imagePath, 0) # 0 reads as grayscale
image = img_to_array(image)
data.append(image)
labels.append([item])

# scale the raw pixel intensities to the range [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
print("[INFO] data matrix: {} images ({:.2f}MB)".format(len(data), data.nbytes / (1024 * 1000.0)))

# binarize the labels using scikit-learn's special multi-label binarizer implementation
print("[INFO] class labels:")
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
# loop over each of the possible class labels and show them
for (i, label) in enumerate(mlb.classes_):
print("{}.  {}".format(i + 1, label))

# partition the data into training and testing splits using 80% of the data for training and the remaining 20% for testing
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.2, random_state=42)
# construct the image generator for data augmentation
aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1,
height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
horizontal_flip=True, fill_mode="nearest")

print("[INFO] compiling model...")
model = SmallerVGGNet.build(width=IMAGE_DIMS[1], height=IMAGE_DIMS[0],
depth=IMAGE_DIMS[2], classes=len(mlb.classes_), finalAct="sigmoid")
model.compile(loss="binary_crossentropy", optimizer=Adam(), metrics=["accuracy"])

# train the network
print("[INFO] training network...")
H = model.fit(
x=aug.flow(trainX, trainY, batch_size=BS),
validation_data=(testX, testY),
steps_per_epoch=len(trainX) // BS,
epochs=EPOCHS, verbose=1)

model.save("model_multilabel_gray.keras")
with open('history_gray.pkl', 'wb') as file:
pickle.dump(H.history, file)
with open('classes.pkl', 'wb') as file:
pickle.dump(mlb.classes_, file)
Я попытался изменить различные параметры в модели, но полученная модель находит только одну из форм в изображении (только треугольник, но не квадрат, когда обе формы присутствуют.)

Подробнее здесь: https://stackoverflow.com/questions/797 ... mpleteness
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»