gpt4 book ai didi

python-3.x - Keras/Tensorflow 模型适用于验证图像,但不适用于真实世界数据

转载 作者:行者123 更新时间:2023-11-30 08:58:50 25 4
gpt4 key购买 nike

我有一个验证精度非常高(> 99%)的模型,当针对原始训练或验证集中不存在的图像(即用我的智能手机拍摄的照片)运行时,该模型会失败。

我一直觉得学习任何新技术都必须经历磨难。为此(在阅读和观看大量机器学习教程之后),我创建并标记了大约 25,000 张图像,并将它们输入到我的 CNN 中(大部分抄袭自 CIFAR-10 示例)。

这些图像(我纽约街区的建筑物)是从 GoPro 和我的 Android 手机拍摄的视频中获取的。每个帧都被转换为全尺寸(原始分辨率)jpeg 文件。

图像被标记并组织成目录结构,其中每个子目录对应于图像的地址(标签)(100MainSt、102MainSt 等)。这是为了允许与 Keras 的“flow_from_directory”功能无缝集成。请注意,给定的目录/标签包含 Android 和 GoPro 图像。

然后使用 sklearn train_test_split 函数将数据划分 (80/20) 为训练数据和验证数据。

我使用 Adam 优化器运行模型,损失函数为 categorical_crossentropy,学习率为 1e-6,每个图像缩小到 300x300(由于我的 GPU 内存限制)。经过 70 多个 epoch 后,我的验证准确率为 99.2%,损失为 0.0383。还不错(至少我是这么认为的)。

现在是我的问题:当我用手机拍照(静态照片,而不是上面视频中的帧)并通过我的模型输入它们时,性能很糟糕,12 张图像中有 7 张不正确分类。当我通过模型运行(由我自己)随机选择的训练或验证图像(从上面)时,它效果很好,这正是我所期望的。这向我表明,我对输入图像所做的转换(缩小、转置、转换为 numpy 数组等)在所有情况下都是相同且正确的。

我可以看到用于训练和验证的视频采集图像与静态图像(又称快照)之间唯一显着的区别是分辨率。快照的分辨率明显更高,但我认为这并不重要,因为所有图像都缩小到 300x300。

任何见解或想法将不胜感激(并且可能对 future 的旅行者有帮助),因为我完全困惑为什么这不起作用。

我的代码的核心:

model = Sequential()

filters = 32
model.add(Conv2D(filters, (3, 3), padding='same', input_shape=(image_width, image_height, 3)))

model.add(Activation('relu'))
model.add(Conv2D(filters, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(filters*2, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(filters*2, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(filters*16))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(len(classes)))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
optimizer=opts[opt],
metrics=['accuracy'])

拟合、标准化和预测:

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
training_dir,
target_size=(image_width, image_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True
)

validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(image_width, image_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True
)

hist = model.fit_generator(
train_generator,
steps_per_epoch=train_generator.samples//batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_generator.samples//batch_size,
use_multiprocessing=True,
workers=8,
callbacks=[early_stopping, time_callback]
)

pred = model.predict_generator(validation_generator, workers=8, use_multiprocessing=True, verbose=1)

以及我用来测试单个(快照)图像的代码:

#... Use with snapshots (may need to be rotated)
# image = Image.open(image_file).convert("RGB").rotate(-90).resize((width, height))

#... Use with images scraped from video (either GoPro or Android)
image = Image.open(image_file).convert("RGB").resize((width, height))

img = np.array(image)

r = img[:,:,0]
g = img[:,:,1]
b = img[:,:,2]

npimages = np.array([[r] + [g] + [b]], np.uint8)
npimages = npimages.transpose(0,2,3,1)

classes = model.predict_classes(npimages)
prediction = model.predict(npimages, verbose=2)

print(prediction)
print(classes)
print(label_map[classes[0]])

plt.imshow(img)

最佳答案

恐怕视频数据往往具有很强的相关性。也就是说,虽然 1 分钟的视频转换为 60 秒的 30 fps (1800) 图像,但它们大多数都非常相似。这是相同的场景,“相同”的照明条件,相同的汽车或路过的人。

如果您的验证图像数据与测试数据来自相同的视频序列,您将获得很高的准确性(接近 100%!),但这与训练数据的测试类似。它是过度拟合的,并且验证集与测试集足够相似,因此准确性很高。退出可能会有所帮助,但如果您的数据集强相关,则没有帮助。

从好的方面来说,您的编码可能是有效的!

修复?更多数据可能是您的最佳途径。即使它是在不同日期(不同的汽车、人物、天气等)拍摄的更多视频数据。抱歉 - 我知道给事物贴上标签需要做很多工作。或者,也许可以尝试根据您的数据微调预先训练的网络。

关于python-3.x - Keras/Tensorflow 模型适用于验证图像,但不适用于真实世界数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48652113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com