提问人:jeongwon bahk 提问时间:11/17/2023 更新时间:11/19/2023 访问量:26
使用英特尔映像分类进行验证提取
validation extraction using intel image classification
问:
我正在尝试制作一个机器学习模型,该模型可以操作验证提取以区分它是亮的还是暗的。
我使用了 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:使用序列设置数组元素。
我真的很感谢你的帮助。
希望你有美好的一天。
答:
0赞
SKPS
11/19/2023
#1
您在分析解决问题本身时所采用的方法存在几个问题。我浏览了您的代码和英特尔数据。
对于您的第一个问题,该变量是一个 2D 列表,因此需要 或者 如果您正在执行条件检查。您可以执行以下操作来实现您想要的:
brightness_data
any
all
np.mean(brightness_data[i]) < 127.5
第二个问题是由于所有图片的大小都不一样。虽然大多数图像都是 150x150 大小,但有些图像不遵循此形状,例如 150x124,这会导致您出现第二个错误,因为列表形状一旦您附加此图像。为了避免这种情况,你可以从训练中跳过这些图像。
5358.jpg
评论
0赞
jeongwon bahk
11/20/2023
你成就了我的一天。非常感谢!
评论