使用英特尔映像分类进行验证提取

validation extraction using intel image classification

提问人:jeongwon bahk 提问时间:11/17/2023 更新时间:11/19/2023 访问量:26

问:

我正在尝试制作一个机器学习模型,该模型可以操作验证提取以区分它是亮的还是暗的。

我使用了 kaggle 的数据集“intel image classification”。

import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# read image and change to HSV colorspace to extract validation
def extract_brightness(image_path):
    image = cv2.imread(image_path)
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    brightness = hsv_image[:,:,2]  # extract validation
    return brightness.flatten()

# image file directory
directory = 'D:\intel_image_classification\seg_train\seg_train/buildings' 

image_files = []
# repeat every file in directory
for filename in os.listdir(directory):
    if filename.endswith('.jpg') or filename.endswith('.png') or filename.endswith('.jpeg'):
        # jpg, png, jpeg only added in list
        file_path = os.path.join(directory, filename)
        image_files.append(file_path)



# extract validation from each file image
brightness_data = []
for file in image_files:
    brightness = extract_brightness(file)
    brightness_data.append(brightness)
binarybright_data = brightness_data.copy()
# change brightness to bright=1 dark=0 for model training
for i in range(len(binarybright_data)):
    if binarybright_data[i].all() < 127.5: #<------ First problem
        binarybright_data[i] = 0
    else:
        binarybright_data[i] = 1


# data
X = np.array(brightness_data, dtype=object)
y = np.array(binarybright_data)  # label of images (0: dark, 1: bright)

# divide data to train and test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# choose machine learning model
model = LogisticRegression()
model.fit(X_train, y_train)

# prediction using test data
y_pred = model.predict(X_test)

# accuracy evaluation
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

第一个问题

我用 127.5(是 255 的一半)来训练它是亮的还是暗的。

我知道这可能会导致不准确,但有 14k 图像仅用于训练,所以我无法标记所有这些图像。

如果您建议我任何其他标记图像的方法,我将不胜感激。

for i in range(len(binarybright_data)):
    if binarybright_data[i].all() < 127.5: #<------ First problem
        binarybright_data[i] = 0
    else:
        binarybright_data[i] = 1

如果我不把'.all()'方法放在最后,我会得到错误,这是

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我不明白为什么会出现这个错误,即使数据是由数字而不是布尔值组成的。

第二个问题

如果我使用'.all()'方法,那么会出现这两个错误。

TypeError:只有 size-1 数组才能转换为 Python 标量

ValueError:使用序列设置数组元素。

我真的很感谢你的帮助。

希望你有美好的一天。

python numpy tensorflow 机器学习 scikit-learn

评论


答:

0赞 SKPS 11/19/2023 #1

您在分析解决问题本身时所采用的方法存在几个问题。我浏览了您的代码和英特尔数据。

  1. 对于您的第一个问题,该变量是一个 2D 列表,因此需要 或者 如果您正在执行条件检查。您可以执行以下操作来实现您想要的:brightness_dataanyall

    np.mean(brightness_data[i]) < 127.5

  2. 第二个问题是由于所有图片的大小都不一样。虽然大多数图像都是 150x150 大小,但有些图像不遵循此形状,例如 150x124,这会导致您出现第二个错误,因为列表形状一旦您附加此图像。为了避免这种情况,你可以从训练中跳过这些图像。5358.jpg

评论

0赞 jeongwon bahk 11/20/2023
你成就了我的一天。非常感谢!