Python制作并读取二分类数据集(猫狗示例)

Python制作并读取二分类数据集(猫狗示例)

一、新建文件目录

1.新建文件目录datasets保存两个子目录(两个类别):

  • datasets
    • cats

      • cat01.jpg
    • dogs

      • dog01.jpg

二、导入所需的第三方库

import  os
import cv2
import numpy as np
import random
from sklearn.model_selection import train_test_split
from keras.utils import np_utils

三、读取并生成对应的标签

1.输入图片文件夹的路径,保存文件夹下所有的图片的路径进一个列表里面:

def get_files(input_dir):
	file_list = []
	for (path, dir_name, file_names) in os.walk(input_dir):
		# path: 顶层文件夹
		# dir_name:(如果有)当前文件夹下的文件夹
		# file_names: 包含当前文件夹下所有文件名的列表
		for file_name in file_names:
			if file_name.endswith('.jpg') or file_name.endswith('.png') or file_name.endswith('.bmp'):
				# 完成的图片路径
				full_img_path = os.path.join(path, file_name)
				# 将图片路径添加进列表里面
				file_list.append(full_img_path)
	return file_list

2.读取图片并调整图片的大小,生成对应的label列表:

def read_img_label(file_list, label, size):
	imges = []
	labels = []
	for img_path in file_list:
		img = cv2.imread(img_path)
		# 调整图像大小
		img = cv2.resize(img, (size, size))
		imges.append(img)
		labels.append(label)
	return imges, labels

3.读取含有两个类别的数据集文件夹,设置标签值, 合并图片列表和标签列表:

def read_datasets(data_dir, class_1, class_2, size):
	# data_dir: 数据集目录名
	# class_1: 类别1目录名
	# class-2:类别2目录名
	
	label_1 = 0
	label_2 = 1
	
	class_dir_1 = os.path.join(data_dir, class_1)
	class_dir_2 = os.path.join(data_dir, class_2)
	
	file_path_1 = get_files(class_dir_1)
	file_path_2 = get_files(class_dir_2)
	
	imges_1, labels_1 = read_img_label(file_path_1, label_1, size)
	imges_2, labels_2 = read_img_label(file_path_2, label_2, size)

	img_array = np.array(imges_1 + imges_2)
	label_array = np.array(labels_1 + labels_2)
	
	return img_array, label_array

四、划分成训练集和测试集

def load_data(data_dir, class_1, class_2, size):

	imges, labels = read_datasets(data_dir, class_1, class_2, size)
	
	imges = imges.reshape(imges.shape[0], size, size, 3)
	
	x_train, x_test, y_train, y_test = train_test_split(imges, labels, test_size=0.3, random_state=random.randint(0, 100))
	return (x_train, y_train), (x_test, y_test)

读取数据集并进行归一、独热转化

(x_train, y_train), (x_test, y_test) = load_data('./datasets', 'cats', 'dogs', 416)

x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

y_train = np_utils.to_categorical(y_train, 2)
y_test = np_utils.to_categorical(y_test, 2)
  • 4
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,这是一个常见的机器学习问题。下面是一个基本的步骤: 1. 准备数据集,包括猫和狗的图片。 2. 将数据集分成训练集和测试集。 3. 使用Python中的深度学习框架,如Tensorflow或PyTorch,构建卷积神经网络模型。 4. 训练模型,使用训练集进行训练,并使用测试集评估模型的性能。 5. 对新的猫或狗的图片进行预测,检查模型的准确性。 这是一个简单的代码示例,使用Keras库实现猫狗图片分类: ``` python import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 设置训练和测试数据路径 train_dir = 'path/to/training/dataset' test_dir = 'path/to/test/dataset' # 设置输入图像的大小和批量大小 IMG_SIZE = 160 BATCH_SIZE = 32 # 数据增强 train_datagen = ImageDataGenerator( rescale = 1./255, rotation_range = 20, width_shift_range = 0.2, height_shift_range = 0.2, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True, fill_mode = 'nearest') # 从目录中读取训练和测试数据 train_generator = train_datagen.flow_from_directory( train_dir, target_size = (IMG_SIZE, IMG_SIZE), batch_size = BATCH_SIZE, class_mode = 'binary') test_datagen = ImageDataGenerator(rescale = 1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size = (IMG_SIZE, IMG_SIZE), batch_size = BATCH_SIZE, class_mode = 'binary') # 构建卷积神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit( train_generator, steps_per_epoch = train_generator.n // BATCH_SIZE, epochs = 40, validation_data = test_generator, validation_steps = test_generator.n // BATCH_SIZE) # 对新的猫或狗的图片进行预测 import numpy as np from tensorflow.keras.preprocessing import image img_path = 'path/to/image' img = image.load_img(img_path, target_size=(IMG_SIZE, IMG_SIZE)) img_array = image.img_to_array(img) img_array = tf.expand_dims(img_array, 0) prediction = model.predict(img_array) if prediction < 0.5: print('猫') else: print('狗') ``` 希望这可以帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值