深度学习图片分类实战学习

article/2025/11/7 13:47:05

开始记录学习深度学习的点点滴滴

深度学习图片分类实战学习

  • 前言
  • 一、深度学习
  • 二、使用步骤
    • 1. 自建网络模型
    • 2. 进行深度学习的学习迁移
  • 注意事项


前言

随着人工智能的不断发展,这门技术也越来越重要,很多人都开启了学习人工智能,本人开始记录学习人工智能的点点滴滴。


一、深度学习

深度学习的概念在网上已经能够搜到很多内容了,这里主要介绍和记录以下相关可以实际运行的代码,对深度学习的实际操作进行深入理解,对出现的问题记录以下。我先从图像分类开始学习深度学习。

二、使用步骤

1. 自建网络模型

这里记录了第一个深度学习示例。

图片的搜索可以从深度学习的网站下载,这里我用scrapy爬虫爬取的。图片目录按照以下方式设置:在这里插入图片描述
在这里插入图片描述
这里我的图片包括战斗机、直升飞机和舰船,其中战斗机文件名都为Fighter_X.jpg,直升飞机的文件名标识为Helicopter_X.jpg,舰船的飞机名标识为Ship_X.jpg。

1. 读取文件的代码如下:

import cv2
import numpy as np
import pandas as pd
import matplotlib.image as npimg
import matplotlib.pyplot as pltimport os
import random
import gctrain_dir = 'input/train'  # 训练集数据
val_dir = 'input/test' # 验证集数据test_imgs = ['input/test/{}'.format(i) for i in os.listdir(val_dir)]
train_imgs = ['input/train/{}'.format(i) for i in os.listdir(train_dir)]random.shuffle(train_imgs)  ###图片乱序,这对学习很重要。for ima in train_imgs[0:10]:img = npimg.imread(ima)imgplot = plt.imshow(img)plt.show()nrows = 224
ncoloumns = 224
channel = 3def read_and_process_image(list_imgs):X = []y = []for image in list_imgs:X.append(cv2.resize(cv2.imread(image,cv2.IMREAD_COLOR),(nrows,ncoloumns),interpolation=cv2.INTER_CUBIC))if 'Fighter' in image:y.append(0)elif 'Helicopter' in image:y.append(1)return X,yX,y = read_and_process_image(train_imgs)plt.figure(figsize=(20,10))columns = 5for i in range(columns):plt.subplot(5/columns+1,columns,i+1)plt.imshow(X[i])```from sklearn.model_selection import train_test_splitdel train_imgs
gc.collect()X = np.array(X)
y = np.array(y)print("Shape of train set:", X.shape)
print("Shape of label set:", y.shape)X_train, X_val, y_train, y_val = train_test_split(X,y, test_size=0.2, random_state=2)print("Shape of train images is:", X_train.shape)
print("Sahpe of validation images is:", X_val.shape)
print("Shape of train label is:", y_train.shape)
print("Shape of validation label is:", y_val.shape)del X
del y
gc.collect()ntrain = len(X_train)
nval = len(X_val)

2. 构建深度学习网络的代码如下:

from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
import tensorflow as tfbatch_size = 32model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))model.summary()model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])  ####构建反向梯度

3. 进行训练和模型数据保存:

train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)val_datagen = ImageDataGenerator(rescale=1./255)#y_train = keras.utils.to_categorical(y_train,3) ####由于这里是多目标分类,因此需要进行one-hot编码。
#y_val = keras.utils.to_categorical(y_val,3)train_datagen = train_datagen.flow(X_train,y_train,batch_size=batch_size)
val_datagen = val_datagen.flow(X_val,y_val,batch_size=batch_size)history = model.fit_generator(train_datagen,steps_per_epoch=ntrain,epochs=1,validation_data=val_datagen,validation_steps=nval)#Save the modelmodel.save_weights('model_wieghts.h5')
model.save('model_keras.h5')

4. 看图验证:

from keras.models import load_modelmodelTest = load_model('model_keras.h5')
random.shuffle(test_imgs)
X_test, y_test = read_and_process_image(test_imgs[0:10])
x = np.array(X_test)
test_datagen = ImageDataGenerator(rescale=1./255)i = 0
test_label = []
plt.figure(figsize=(30,20))
for batch in test_datagen.flow(x, batch_size=1):pred = modelTest.predict(batch)if pred > 0.5:test_label.append('Fighter')else:test_label.append('Helicopter')plt.subplot(5/columns + 1, columns, i + 1)plt.title ('This is a ' + test_label[i])imgplot = plt.imshow(batch[0])i += 1if i % 10 ==0:break
plt.show()

2. 进行深度学习的学习迁移

随着学习的深入,我们也学习了学习迁移,理论知识这里不多介绍。
图片的目录设置如下图:
在这里插入图片描述
1. 读取文件和数据处理里的代码如下:

import matplotlib.pyplot as pltimport os
import random
import gctrain_dir = 'input/train'  # 训练集数据
val_dir = 'input/test' # 验证集数据
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from datetime import datetime
TIMESTAMP = "{0:%Y-%m-%dT%H-%M-%S/}".format(datetime.now())
from keras.callbacks import TensorBoard, ModelCheckpoint
batch_size = 32
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from datetime import datetime
TIMESTAMP = "{0:%Y-%m-%dT%H-%M-%S/}".format(datetime.now())
from keras.callbacks import TensorBoard, ModelCheckpoint
batch_size = 32nrows = 224
ncoloumns = 224
channel = 3train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)val_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(224, 224),batch_size=batch_size,class_mode='categorical',shuffle=True,seed = 12)validation_generator = val_datagen.flow_from_directory(val_dir ,target_size=(224, 224),batch_size=batch_size,class_mode='categorical',shuffle=False,seed=13)

2. 构建迁移网络代码如下:

import keras
from keras import Model
from keras_squeezenet import SqueezeNet
from keras.callbacks import TensorBoard, ModelCheckpoint
from keras.layers import Flatten, Dense, Dropout, GlobalAveragePooling2D
from keras.models import load_model
from keras.preprocessing import image
from PIL import ImageFile
import numpy as np
import tensorflow as tf
from keras.optimizers import SGD
from keras import optimizers
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_inputbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))classes = sorted([o for o in os.listdir(train_dir)])  # 根据文件名分类# x = base_model.output
x = base_model.output  # 自定义网络
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(3, activation='softmax')(x)
model = Model(base_model.input, predictions)  # 新网络=预训练网络+自定义网络model.summary()
model.compile(optimizer=optimizers.RMSprop(lr=0.0001),loss='categorical_crossentropy', metrics=['accuracy'])

3. 运行代码如下:

for layer in base_model.layers:layer.trainable = False
model.fit_generator(train_generator,steps_per_epoch=85,epochs=10,validation_data=validation_generator,validation_steps=10)
validation_data=(X_val, y_val))
model.save_weights('model_wieghts.h5')
model.save('model_keras.h5')

4. 查看训练结果代码如下:

img = image.load_img('./input/train/Ship_85.jpg', target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
res = model.predict(x)
plt.imshow(img)
print(np.argmax(res, axis=1)[0])

注意事项

这里对文章进行总结:

  1. 参与训练的数据需要打乱顺序,注意shuffle=true
  2. 如果是2分类,采用binary_crossentropy和 sigmoid。
  3. 如果是多目标分类(超过3个)则采用categorical_crossentropy和softmax。同时对标签进行one-hot 编码。例如 y_train = keras.utils.to_categorical(y_train,3)


http://chatgpt.dhexx.cn/article/1cDWYVth.shtml

相关文章

关于图片的多标签分类(1)

最近还在处理人脸附件(眼镜,刘海,口罩,帽子)的multi-label分类。给自己普及一下常识性问题: 1)什么是multi-label分类? multi-label分类,常见一张图片中可以存在多个目…

svm实现图片分类(python)

目录 前言 knn vs. svm svm & linear classifier bias trick loss function regularization optimization 代码主体 导入数据及预处理 svm计算loss_function和梯度 验证梯度公式是否正确 比较运行时间 svm训练及预测,结果可视化 通过corss-validat…

图片分类-python

目的:做一个简易的图片分类。 使用到的算法:hog、surfsvm 图片集:cifar-10、cifar-100、stl-10、自制图片集 分类完整代码链接 使用说明: 1.cifar-10、cifar-100和stl-10直接解压 2.自制图片集文件夹结构: ├…

CNN图片分类

最近在阅读一些AI项目,写入markdown,持续更新,算是之后也能回想起做法 项目 https://github.com/calssion/Fun_AI image classify(图片分类) CNN classify dogs and cats(猫狗二分类) Tutorial(教程):https://developers.google.com/mach…

深度学习之图像分类

第一篇CSDN文章,写的不好,还请各位大佬指正。万事开头难,千里之行始于足下! 1.什么是图像分类 图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图…

关于图像分类

https://www.zhihu.com/question/57075015/answer/194397802https://www.zhihu.com/question/57075015/answer/194397802 先定义一下图像分类,一般而言,图像分类分为通用类别分类以及细粒度图像分类 那什么是通用类别以及细粒度类别呢?这里…

(一)图像分类任务介绍 Image Classification

目录 一、什么是图像分类任务?它有哪些应用场景? 二、图像分类任务的难点? 三、基于规则的方法是否可行? 四、什么是数据驱动的图像分类范式? 数据集构建 分类器设计与学习 分类器决策 五、常用的分类任务评价指…

图像分类的数据集

图像分类的数据集 1. MNIST2. Fashion-MNIST3.CIFAR-10和CIFAR-1004. Caltech 1015. ImageNet5.1 ImageNet是什么?5.2 ILSVRC 6. 各个数据集上的最新进展其他参考资料 1. MNIST MNIST数据集的一个样例 一般机器学习框架都使用MNIST作为入门,就像"He…

机器学习——图像分类

1 图像分类的概念 1.1 什么是图像分类? 图像分类,根据图像信息中所反映出来的不同特征,把不同类别的目标区分开来的图像处理方法 1.2 图像分类的难度 ●任何拍摄情 况的改变都将提升分类的难度 1.3 CNN如何进行图像分类 ●数据驱动型方法通…

图像分类算法

图像分类 参考链接1.前言2.K近邻与KMeans算法比较KNN原理和实现过程(1) 计算已知类别数据集中的点与当前点之间的距离:(2) 按照距离递增次序排序(3) 选取与当前点距离最小的k个点(4) 确定前k个点所在类别的出现频率(5) 返回前k个点出现频率最高的类别作为当前点的预…

图像分类方法总结

1. 图像分类问题描述 图像分类问题是计算机视觉领域的基础问题,它的目的是根据图像的语义信息将不同类别图像区分开来,实现最小的分类误差。具体任务要求是从给定的分类集合中给图像分配一个标签的任务。总体来说,对于单标签的图像分类问题&…

9.图片分类数据集

1. 图像分类数据集 MNIST数据集 [LeCun et al., 1998] 是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from t…

CNN实现花卉图片分类识别

CNN实现花卉图片分 前言 本文为一个利用卷积神经网络实现花卉分类的项目,因此不会过多介绍卷积神经网络的基本知识。此项目建立在了解卷积神经网络进行图像分类的原理上进行的。 项目简介 本项目为一个图像识别项目,基于tensorflow,利用C…

常用图像分类网络

想对图像分类网络写个简要的概括,如有介绍不当之处,还望指出。 一、VGG网络 更新于2018年10月20日 参考博客:深度学习经典卷积神经网络之VGGNet 论文地址:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITIO…

干货——图像分类(上)

这是译自斯坦福CS231n课程笔记image classification notes,由课程教师Andrej Karpathy授权进行翻译。本篇教程由杜客翻译完成。非常感谢那些无偿奉献的大师,在此代表所有爱好学习者向您们致敬,谢谢! 这是斯坦福大学的课程&#xf…

图像分类

图像物体分类与检测算法综述 转自《计算机学报》 目录 图像物体分类与检测算法综述 目录图像物体分类与检测概述物体分类与检测的难点与挑战物体分类与检测数据库物体分类与检测发展历程 图像物体分类与检测是计算机视觉研究中的两个重要的基本问题,也是图像分割、…

【图像分类数据集】非常全面实用的垃圾分类图片数据集共享

【图像分类数据集】非常全面实用的垃圾分类图片数据集共享 数据集介绍: 训练集 文件夹结构如下(部分: 第0类文件夹下数据展示如下(部分: 测试集 大致如下: 数据集获取方式: 总结&#xf…

python学习(18)--图片分类

图片分类 学习动机. 在这一节中我们会引入图片分类为题。这也是从一个合适的集合中分配给图片一个标记的任务。这是计算机视觉的核心问题之一。鉴于它的简单性,有一大批实用应用。更多的是,我们可以在以后的章节中看到,一些看似分离的计算机…

【OpenMMLab】图片分类发展简史

一、发展简述 图片分类是CV领域的基础任务,也是检测、分割、追踪等任务的基石。简而言之,图片分类就是给定一张图片,判断其类别,一般而言所有的候选类别是预设的。 从数学上描述,图片分类就是寻找一个函数&#xff0…

深度学习(1) ——图像分类

图像分类概述 图像分类实质上就是从给定的类别集合中为图像分配对应标签的任务,当我们输入一张图片,返回一个该图像类别的标签。限制条件:只能输入单目标图像。常用数据集:mnist、CIFAR-10、CIFAR-100、ImageNet 图像分类算法 …