报错:cv2.error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
图片读取转RGB,有些图片运行后会报错,但是由于图片有1800多张,没法细找事哪张图片的问题,图片路径没有中文
import numpy as np
import glob
import cv2
from random import shuffle
import streamlit as st
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.models import load_model
import os
def load_data(path):
"""
获取数据并对应标签
Args:
path: 所有图片所在的大文件夹路径
Returns: 训练集和验证集数据和对应标签
"""
img_path = glob.glob(path + '/*/*')
classes = os.listdir(path)
f_class = {k: v for k, v in zip(classes, range(len(classes)))}
images = []
labels = []
shuffle(img_path)
for im in img_path:
img = cv2.imread(im)
img = cv2.cvtColor(img, code=cv2.COLOR_BGR2RGB)
h, w = img.shape[0], img.shape[1]
img = img[int(h * 0.1):int(h * 0.9), int(w * 0.1):int(w * 0.9), :]
img = cv2.resize(img, (256, 256))
lab = im.split('\\')[1]
images.append(img)
labels.append(f_class[lab])
Length = len(images)
tarin_img = np.array(images[: int(Length * 0.8)])
val_img = np.array(images[int(Length * 0.8):])
train_lab = np.array(labels[: int(Length * 0.8)])
val_lab = np.array(labels[int(Length * 0.8):])
train_genretor = ImageDataGenerator(rotation_range=90,
zoom_range=0.2,
rescale=1. / 255,
)
val_genretor = ImageDataGenerator(rescale=1. / 255, )
train = train_genretor.flow(x=tarin_img, y=train_lab, batch_size=32, )
val = val_genretor.flow(x=val_img, y=val_lab, batch_size=32, )
return train, val
def model_train(train, val, epochs):
tf.keras.backend.clear_session()
model = Sequential([
Conv2D(64, kernel_size=3, input_shape=(256, 256, 3), activation='relu'),
MaxPooling2D(),
Conv2D(128, kernel_size=3, activation='relu'),
MaxPooling2D(),
Conv2D(128, kernel_size=3, activation='relu'),
MaxPooling2D(),
Conv2D(256, kernel_size=3, activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(128, activation='relu'),
Dense(7, activation='softmax')
])
lr = 0.0001
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr),
loss='sparse_categorical_crossentropy',
metrics=['acc'])
checkpoint = ModelCheckpoint('./models/model.h5',
monitor='val_acc',
verbose=1,
save_weights_only=False,
save_best_only=True,
mode='max',
perio=1)
history = model.fit(train,
epochs=epochs,
callbacks=[checkpoint],
validation_data=val,
shuffle=True,
)
print('训练完毕!')
model.save('./models/model.h5')
print('模型保存成功!')
print(history.history['val_acc'])
accuracy = max(history.history['val_acc'])
print('模型准确率:', accuracy)
return accuracy
@st.cache
def model_pred(predimg_path='./', model_path='./'):
"""
模型预测
Args:
predimg_path: 预测数据所在路径
model_path: 模型所在路径
Returns: 预测类别
"""
img = image.load_img(predimg_path, target_size=(256, 256))
data = image.img_to_array(img) / 255.0
data = np.expand_dims(data, axis=0)
classes = os.listdir('./flowers/')
f_class = {v: k for k, v in zip(classes, range(len(classes)))}
model = load_model(model_path)
result = model.predict(data).argmax()
prediction = f_class[result]
return prediction
train,val = load_data('./flowers')
accuracy = model_train(train, val, epochs=20)
model_pred('./test_images/rose.jpg','./models/model.h5')
