基于卷积神经网络的品牌LOGO识别原理与代码

简介: 人工智能之父John McCarthy将AI视为科学和工程的结合,而机器学习是AI已经实现的部分,利用机器学习技术,计算机能够通过体验(数据)来像人类一样学习,而不需要被显式地编程。这篇文章将详细介绍我们在大作业项目如何使用Python的Keras深度学习框架,实现一个卷积神经网络(Convolutional Neural Network)来识别图像中的店铺LOGO/招牌。

人工智能之父John McCarthy将AI视为科学和工程的结合,而机器学习是AI已经实现的部分,利用机器学习技术,计算机能够通过体验(数据)来像人类一样学习,而不需要被显式地编程。这篇文章将详细介绍我们在大作业项目如何使用Python的Keras深度学习框架,实现一个卷积神经网络(Convolutional Neural Network)来识别图像中的店铺LOGO/招牌。

在这里插入图片描述
随着越来越多的数据可用,机器学习现在已经广泛地应用于各个领域,例如个性化的视频推荐、医疗搜索中的图像和语音识别、欺诈识别、股票市场分析、自动驾驶车辆等等。我们对于识别图像中的店铺招牌有兴趣的原因之一,在于后续我们将基于这一技术实现对twitter微博的情感分析。

要快速掌握机器学习应用的开发,推荐汇智网的机器学习系列教程

1、数据集选择与预处理

任何机器学习项目的第一步,都是找到有趣的数据集。鉴于我们稍后希望将这一技术应用到twitter微博中的任意图像以分类标牌,因此我们使用了Wild数据集,其中包含11052个包含大标牌的图像。不过我们没有直接从官网下载这个数据集,而是从QMUL-OpenLogo数据集中提取了9428个图像。首先我们载入图像,然后使用文件夹名称标记图像中LOGO的目标分类:

from sklearn.datasets import load_files       
from keras.utils import np_utils
import numpy 

#load files from LogosInTheWild directory with logo categories given by their subfolder name
data = load_files('LogosInTheWild-v2/data/voc_format')
logo_files = numpy.array(data['filenames'])
jpg_indices = [index for index, name in enumerate(logo_files) if 'jpg'==name.split('.')[-1]]
logo_targets = np_utils.to_categorical(numpy.array(data['target']), max(data['target']+1))
all_files, all_targets = logo_files[jpg_indices], logo_targets[jpg_indices]

在训练的每一步,使用单独的验证数据集对结果参数进行验证是很有意义的。我们定义了一个检查点来将验证集上获得的最优权重参数保存下来。最终,在完成训练之后我们将使用另一个单独的数据集来测试我们的机器学习算法:测试数据集。因此我们将图像数据集拆分为三部分:训练集、验证集和测试集,然后定义如下的检查点:

from sklearn.model_selection import train_test_split

#split into 80% training+validation files+labels, and 20 % test files+labels
train_and_val_files, test_files, train_and_val_targets, test_targets 
            = train_test_split(all_files, all_targets, test_size=0.2)
#further split into 80% training files+labels, and 20 % validation files+labels
train_files, val_files, train_targets, val_targets 
            = train_test_split(train_and_val_files, train_and_val_targets, test_size=0.2)
        
#create a checkpointer to save the CNN model with the best weight parameters
from keras.callbacks import ModelCheckpoint  
checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.from_scratch.hdf5', 
                               save_best_only=True)

作为预处理的最后一步,我们将每个图像转换为224 X 224 像素和RGB三个通道,以便将数据转换为Keras的卷积神经网络需要的格式:6033个训练样本、1509个验证样本、1886个测试样本,三个数据集的形状均为:(样本数,224,224,3):

from keras.preprocessing import image                  
from PIL import ImageFile                            
ImageFile.LOAD_TRUNCATED_IMAGES = True   

def path_to_tensor(img_path):
    # loads RGB image as PIL format with 224x224 pixels
    img = image.load_img(img_path, target_size=(224, 224))
    # convert to 3D tensor with shape (224, 224, 3) with 3 RGB channels
    x = image.img_to_array(img)
    # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return it
    return numpy.expand_dims(x, axis=0)

def paths_to_tensor(img_paths):
    list_of_tensors = [path_to_tensor(img_path) for img_path in img_paths]
    #stack the (1,224,224,3) 4D tensor arrays to a (# images,224,224,3) 4D tensor
    return numpy.vstack(list_of_tensors)

#create 4D tensors and rescale each pixel by dividing by RGB max value 255
train_tensors = paths_to_tensor(train_files).astype('float32')/255
val_tensors = paths_to_tensor(val_files).astype('float32')/255
test_tensors = paths_to_tensor(test_files).astype('float32')/255

2、CNN识别店铺LOG的原理

在第二步,我们来决定要用的机器学习算法。CNN是通常用于图像分析的一种特殊设计的神经网络,让我们先看一个简单的神经网络:

在这里插入图片描述
简单地说,神经网络是一个包含输入层、隐层和输出层的图,节点彼此相连。在这里我们的输入是数据的特征,例如图像中每个像素的RGB值。输出节点对应数据集中的可能的LOGO分类。不同节点之间的连接有不同的权重,这对应不同的重要性。任何节点的输出都要使用一个激活函数来处理加权的输入和,就像下面这样:

在这里插入图片描述

在隐层我们将使用ReLU激活函数,在输出层将使用Softmax激活函数以便将每个输出节点的值转换到[0,1]区间来获取其概率。当训练神经网络的时候,计算机将不断地优化神经网络中各连接的权重,以推动网络的输出尽可能接近其真实分类。

当分析图像的时候,经典的神经网络中的参数数量巨大:如果图像大小为224X224像素,并且我们使用3个RGB值来记录每个像素时,那么我们将需要224X224X3=150528个输入节点,由于整个网络是全连接的,我们不得不优化数量巨大的连接权重。并且,由于输入节点被排列为一维向量,神经网络也无法获知图像的任何局部模式。这些问题促成了卷积神经网络的诞生:

在我们的示例中,输入节点排列为4X4矩阵,然后我们为4个输入区域定义3个2X2的滤波器,每个区域只连接到隐层对应的3色节点。注意现在3个滤波器定义了3个特征图,每个图用来检测四个区域中的垂直、水平或对角线之类的特征。在我们的案例中,就是检测出星巴克、汉堡王或者Telekom的LOGO。

对于3个滤波器而言,由于输入层到卷积层的连接权重参数,因此我们只有2X2X3=12个权重参数需要优化。当然,在全连接的输出层还有12X9=108个权重参数需要优化。

考虑到我们要识别图像中的小LOGO,CNN的另一个优势就是其具有位移不变性,也就是说,CNN可以识别出图像中任何区域的LOGO。

3、训练Keras卷积神经网络LOGO识别器

我们已经可以开始从零定义我们的卷积神经网络架构了。为此,在上面的卷积层之后,我们也利用了池化层。池化层有两种常见的类型,都可以缩减特征图的维度:最大值池化和全局平均池化。

在这里插入图片描述
最大值池化层将特征图中的池化窗口映射为最大值。例如,两个特征图的绿色的2X2池化窗口(左侧)分别映射到最大值0.6和0.7(右侧),容易理解,现在特征图的维度减少到2了。

类似的,一个全局平均池化层将每个特征图映射为其节点的平均值。例如,蓝色特征图的平均值是
-0.1–0.2–0.4–0.1 = - 0.2,可以看到结果特征图中只包含一个节点,因此全局平均池化层可以显著降低特征图的维度。

在这里插入图片描述
现在我们可以定义CNN的架构:

from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dropout, Dense
from keras.models import Sequential

cnn_model = Sequential()

#after the input layer, add the first convolutional layer with 32 2x2-filters 
cnn_model.add(Conv2D (kernel_size = (2,2), filters = 32, 
                      input_shape=train_tensors.shape[1:], activation='relu'))
#add a max pooling layer with a 2x2 pooling window
cnn_model.add(MaxPooling2D(pool_size=2))
#add the second convolutional layer with 64 2x2-filters 
cnn_model.add(Conv2D(kernel_size = 2, filters = 64, activation='relu'))
cnn_model.add(MaxPooling2D(pool_size=2))
#add the third convolutional layer with 128 2x2-filters 
cnn_model.add(Conv2D(kernel_size = 2, filters = 128, activation='relu'))
#add a dropout layer so that each node has a chance of 20% to be dropped when training
cnn_model.add(Dropout(0.2))
cnn_model.add(MaxPooling2D(pool_size = 2))
#add a global average pooling layer
cnn_model.add(GlobalAveragePooling2D())
#add the final fully connected output layer with 109 node for all 109 logo classes
cnn_model.add(Dense(109, activation = 'softmax'))

cnn_model.summary()

最终,我们可以训练CNN模型了。我们选择Adam优化算法,采用交叉熵作为损失函数,使用标准的
衡量指标 准确度 = 正确预测数量 / 所有预测数量

#Compile the model 
cnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

#Train the model
H = cnn_model.fit(train_tensors, train_targets, epochs=100, verbose=1  
                  validation_data=(val_tensors, val_targets), callbacks=[checkpointer])

#After training, load the model with the best validation loss
cnn_model.load_weights('saved_keras_models/weights.best.CNN.hdf5')

4、模型评估

完成训练之后,我们使用Python的Matplotlib库来绘制训练过程中记录的衡量指标。容易注意到在训练集上得到的模型准确度在每个epoch之后保持提升,但是在验证集上得到的模型准确度则徘徊在30%附近:

在这里插入图片描述

虽然我们在卷积层之后已经增加Dropout层,但模型看起来还是过拟合了,也就是说我们的模型
记住了训练数据,以至于对验证集上没有看到过的数据,效果并不好。

收集更多的训练数据,或者进一步调整学习率、激活函数、节点数量、滤波器数量等架构参数应该
会有一定的作用。但是我们这个项目始终没有获得更好的结果,因此考虑到篇幅问题,我们略去
参数细调部分的说明。

最终,使用cnn_model.evaluate(test_tensors, test_targets, verbose=0),我们的CNN模型在测试集上达到了31.60%的准确率。

5、使用训练好的模型预测LOGO分类

成功训练好我们的CNN模型后,就可以使用Keras的predict_classes函数预测店铺LOGO的分类了:

在这里插入图片描述


原文链接:店铺LOGO识别 — 汇智网

目录
相关文章
|
6天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
2天前
|
存储 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系现代社会正常运转的关键支柱。本文旨在深入探讨网络安全漏洞的成因与影响,剖析加密技术的原理与应用,并强调提升公众安全意识的重要性。通过这些综合性的知识分享,我们期望为读者提供一个全面而深刻的网络安全视角,助力个人与企业在数字时代中稳健前行。
本文聚焦网络安全与信息安全领域,详细阐述了网络安全漏洞的潜在威胁、加密技术的强大防护作用以及安全意识培养的紧迫性。通过对真实案例的分析,文章揭示了网络攻击的多样性和复杂性,强调了构建全方位、多层次防御体系的必要性。同时,结合当前技术发展趋势,展望了未来网络安全领域的新挑战与新机遇,呼吁社会各界共同努力,共筑数字世界的安全防线。
|
2天前
|
存储 安全 自动驾驶
探索未来网络:量子互联网的原理与应用
【10月更文挑战第2天】 本文旨在探讨量子互联网的基本原理、技术实现及其在通讯领域的革命性应用前景。量子互联网利用量子力学原理,如量子叠加和量子纠缠,来传输信息,有望大幅提升通信的安全性和速度。通过详细阐述量子密钥分发(QKD)、量子纠缠交换和量子中继等关键技术,本文揭示了量子互联网对未来信息社会的潜在影响。
|
6天前
|
人工智能 安全 网络协议
探索未来网络:量子互联网的原理与应用
本文深入探讨了量子互联网的基础原理、关键技术及其在未来通信领域的应用前景。通过分析量子纠缠、量子叠加等核心概念,揭示了量子互联网相较于传统互联网的优势所在。同时,文章还讨论了当前量子互联网领域面临的技术挑战和解决方案,为读者呈现了一个关于量子互联网的全面且深入的视角。
|
12天前
|
机器学习/深度学习 人工智能 算法
深入理解卷积神经网络:从理论到实践
【9月更文挑战第31天】在深度学习的众多模型之中,卷积神经网络(CNN)以其在图像处理领域的出色表现而闻名。本文将通过浅显易懂的语言和直观的比喻,带领读者了解CNN的核心原理和结构,并通过一个简化的代码示例,展示如何实现一个简单的CNN模型。我们将从CNN的基本组成出发,逐步深入到其在现实世界中的应用,最后探讨其未来的可能性。文章旨在为初学者提供一个清晰的CNN入门指南,同时为有经验的开发者提供一些深入思考的视角。
|
12天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【9月更文挑战第31天】本文旨在通过浅显易懂的语言和直观的比喻,为初学者揭开深度学习中卷积神经网络(CNN)的神秘面纱。我们将从CNN的基本原理出发,逐步深入到其在图像识别领域的实际应用,并通过一个简单的代码示例,展示如何利用CNN进行图像分类。无论你是编程新手还是深度学习的初学者,这篇文章都将为你打开一扇通往人工智能世界的大门。
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门与实践
【8月更文挑战第62天】本文以浅显易懂的方式介绍了深度学习领域中的核心技术之一——卷积神经网络(CNN)。文章通过生动的比喻和直观的图示,逐步揭示了CNN的工作原理和应用场景。同时,结合具体的代码示例,引导读者从零开始构建一个简单的CNN模型,实现对图像数据的分类任务。无论你是深度学习的初学者还是希望巩固理解的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的奥秘:探索神经网络背后的原理与实践
【9月更文挑战第29天】本文将带你深入理解深度学习的核心概念,从基础理论到实际应用,逐步揭示其神秘面纱。我们将探讨神经网络的工作原理,并通过实际代码示例,展示如何构建和训练一个简单的深度学习模型。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。
28 2
|
4天前
|
XML 网络协议 算法
【TCP】网络原理
【TCP】网络原理
19 0
|
4天前
|
机器学习/深度学习 PyTorch API
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)

热门文章

最新文章