时尚达人的深度学习:非洲服装检测

介绍

时尚在医疗、教育和农业等不同领域的人工智能领域并没有受到太多关注,包括机器学习、深度学习。这是因为时尚不被认为是一个关键领域.

时尚和文化在 AI 中并没有得到公正的对待。这是一个令人兴奋的项目,我们将在 8 种当地非洲服装之间建立一个分类器模型!

这不是一个常规项目,因为数据集是新的,并与此项目一起启动。请将此视为一个原创项目,为你的数据科学简历增添更多美感。

9bd3e4c725fc7d7bbb3c9a8fd15dcd76.png

检测非洲服装可以被认为是一个有趣的项目,同时可以提高深度学习和 TensorFlow 技能。根据部落识别这些非洲服装可以作为附加功能用于时尚应用程序。

另一个应用是当你在网上找到一件当地服装并想知道它是什么时。别担心。该模型可以帮助你了解它是什么,帮助解决这种不确定性。

在技术取代文化遗产的时代,最安全的方法是向 AI 传授我们的文化,这将帮助我们保护它。

Inuwa Mobarak Abraham

我们将开发一个能够检测 8 种文化服饰的机器学习非洲服饰检测模型。

在这个项目和文章中,我们将介绍时尚达人如何使用深度学习技术的真实世界原型的实际开发。我们将应用各种评估指标来确保深度学习模型的性能。

目录

  1. 问题陈述

  2. 数据集描述

  3. 项目管道

  4. 第 1 步:设置环境

  5. 第 2 步:导入依赖

  6. 第 3 步:加载数据集

  7. 第 4 步:数据清洗

  8. 第 5 步:图像数据预处理

  9. 第 6 步:数据可视化

  10. 第 7 步:模型训练

  11. 第 8 步:训练和评估

  12. 第 9 步:部署

  13. 结论

问题陈述

大多数文化正在消失于文明和技术之中。在非洲,文化遗产正在丢失和被遗忘。这就是这个项目的想法来源——试图保护这些文化,我们还可以开发智能系统,包括聊天机器人、图像标识符和文本转语音,以帮助对抗文化流失并帮助保护我们的遗产。

如前所述,我们将构建一个模型来帮助对尼日利亚和南非等国家/地区的八种当地非洲服饰进行分类。这是由于这些部落的在线数据可用。保存此模型将有助于外国人和下一代快速识别他们的文化产物。

94070902e908bf8dad3dd0e8e697070c.png

这一挑战将涵盖深度学习、TensorFlow 和数据来源。该项目的先决条件是了解机器学习模型管道和使用 jupyter notebooks 的经验。

数据集描述

非洲服装图像数据集是使用 Google Chrome 扩展程序从互联网上收集的。数据集是原始的和新的。

数据集地址:https://drive.google.com/drive/folders/1jhMG6vnsKqDm5uILBMLezU2Ll5ljWOZy?usp=sharing

数据集包含属于 8 个类别的图像。该目录包含属于 8 个训练类的 9784 个图像和属于 8 个模型验证类的 2579 个文件。

数据集:

  • 该数据集总共包含 12,363 张包含八个类别的图像。这些类别是非洲的部落。

  • 这些类别是:

  1. Adire(来自尼日利亚)

  2. Idgo(来自尼日利亚)

  3. Idoma(来自尼日利亚)

  4. Igala(来自尼日利亚)

  5. Tiv(来自尼日利亚)

  6. Tswana-Shweshwe(来自南非)

  7. Xhosa-South Africa(来自南非)

  8. Zulu(来自南非)

  • 数据集包含组织在 1 个文件夹中的图像的不同视图,其中 2 个子文件夹代表训练集和验证集。然后子文件夹相应地包含图像。

  • 有些类在图像数量上略有不平衡。

9d7a1f0c518df53de9d4ff5ca45632db.jpeg

项目管道

项目管道指导项目将如何进行。不要盲目构建,通过管道概览,任何人都可以了解项目是如何完成或将如何完成的。

以下是构建模型所涉及的步骤:

  • 设置环境

  • 导入依赖项

  • 加载数据集

  • 数据清洗

  • 图像数据预处理

  • 数据可视化

  • 模型训练

  • 训练与评估

  • 保存训练好的模型工件

Google colab 提供了一个实践环境来执行这样的深度学习任务。如果你没有在本地安装 GPU 进行深度学习,你可以在线使用 Google colab。它具有可访问的 GPU,这使得在大型数据集上的训练时间很短。

Google colab:https://www.analyticsvidhya.com/blog/2020/03/google-colab-machine-learning-deep-learning/

第 1 步:设置环境

本项目推荐环境为Google colab。但是,只要你对自己的行为有信心,就可以使用任何环境。Colab 友好而高效。

要查找环境,你可以谷歌搜索“Google Colaboratory”或访问:https://colab.research.google.com/

它是一个在线平台,因此你无需安装任何东西。它类似于 jupyter。因此,了解 Jupiter 就足以在这个项目中使用 Colab。

主页如下所示:

53fa734a748c1d5286e21c625c8cba21.jpeg

如上所示选择“文件”和“新建笔记本”。这应该会为你提供一个新的无标题笔记本,如下所示。

2931d2659912559cd2a3e70b5ea553ae.png

使用 Colab GPU

使用 Colab 的好处是可以使用免费的 GPU。我们必须将它添加到当前运行时才能使用它。你可以单击屏幕顶部选项卡中的“运行时”菜单,然后选择“更改运行时类型”,如下面的快照所示:

51a8f26d81ad623c72686aaa617ac61e.png

单击“更改运行时类型”将提供一个菜单,你可以在其中找到“硬件加速器”,单击下拉按钮并选择“GPU”作为硬件加速器。如下所示:

81535a994532086f29249f40598d82a3.png

这会使用该笔记本电脑的 GPU。完成后,会话开始。由于 GPU 是一种昂贵的资源,因此你不仅要使用这个 GPU,还要使用这个会话。这就是为什么如果你让这个会话闲置太久,会话就会结束,你将不得不通过启动会话来重新开始。你应该通过不使用同一用户帐户同时打开太多会话来管理此问题。

你可以选择 Google Colab Pro 来消除所有限制。

环境设置后的下一步是导入依赖项。

第 2 步:导入依赖

在编码开始时导入所有库是一个很好的做法。这将帮助人们轻松阅读和理解代码,而无需担心所使用的库。

有时一些库在项目开始时可能并不为人所知,直到需要时才知道。在这种情况下,我们总是可以回来将它们添加到这里。

#Importing Required Libraries
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf #major backend

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

在上面的代码中,我们导入了 TensorFlow,它将成为我们项目的重要后端。一个替代方案是 PyTorch 或 OpenCV,但我们选择 TensorFlow 是因为它的性能和可扩展性。它有一个非常干净、可读的代码库。

第 3 步:加载数据集

如前所述,我已经提供了数据集供使用。下面将创建并提供 GitHub 存储库。

你可以将数据集下载到你的设备,然后直接将其上传到你的个人谷歌驱动器,然后再实际执行后续步骤。

#Mounting Google Drive for dataset
from google.colab import drive
drive.mount('/content/drive')
#Dataset directory loading
import pathlib
data_dir = "/content/drive/MyDrive/MLProjects/dataset/african_attires"
data_dir_train = "/content/drive/MyDrive/MLProjects/dataset/african_attires/Train"
data_dir_validation = "/content/drive/MyDrive/MLProjects/dataset/african_attires/Validation"

注意:必须修改上面的代码片段以适合你的 Google Drive 中的位置。

第 4 步:数据清洗

使用的数据集被废弃了,一些图像在这个过程中被破坏了。虽然有些图像是可见的,但它们的二进制文件很糟糕。如果使用这些图像,将引发未知类型错误。

TensorFlow 对不一致的图像类型有一定的容忍度。像PyTorch这样的框架可能会接受这样的图像,但由于图像是在内部处理的,因此它仍然会影响其性能。

TensorFlow 接受的图像类型有位图、gif、jpeg 和 png。

import cv2 #major backend for data cleaning

# Helper function for data cleaning
def check_images(s_dir, ext_list):
    bad_images=[] # empty array for storing bad images
    bad_ext=[]  # empty array for storing bad image extensions
    s_list= os.listdir(s_dir) # read the location where the images are stored
    for klass in s_list: # go through the image locations in the folders/classes
        klass_path=os.path.join (s_dir, klass)  
        print ('processing class directory ', klass)
        if os.path.isdir(klass_path):
            file_list=os.listdir(klass_path)
            for f in file_list:               
                f_path=os.path.join (klass_path,f)
                index=f.rfind('.')
                ext=f[index+1:].lower()
                if ext not in ext_list:  # looping for bad images
                    print('file ', f_path, ' has an invalid extension ', ext)
                    bad_ext.append(f_path)
                if os.path.isfile(f_path):
                    try:
                        img = cv2.imread(f_path)
                        shape = img.shape
                        image_contents = tf.io.read_file(f_path)
                        image = tf.image.decode_jpeg(image_contents, channels=3) # Checking the image internal structures to detect bad images
                    except Exception as e:
                        print('file ', f_path, ' is not a valid image file')
                        print(e)
                        bad_images.append(f_path)
                else:
                    print('*** fatal error, you a sub directory ', f, ' in class directory ', klass)
        else:
            print ('*** WARNING*** you have files in ', s_dir, ' it should only contain sub directories')
    return bad_images, bad_ext
#Calling the helper function
source_dir = data_dir_train
good_exts=["bmp", "gif", "jpeg", "png","jpg"] # list of acceptable extensions
bad_file_list, bad_ext_list=check_images(source_dir, good_exts)
if len(bad_file_list) !=0:
    print('improper image files are listed below')

print(bad_file_list)
print(bad_ext_list)

上面的代码循环遍历数据集并打印出不一致的数据类型。此处使用 OpenCV 来批判性地查看图像二进制文件。

第 5 步:图像数据预处理

我们可以将预处理保留到可视化之后。但是由于我们的图像是在线获取的并且可能不规则,因此最好在可视化之前尝试按照我们想要的方式对其进行预处理。

如果有模糊之类的问题,我们可以在可视化过程中看到它。

img_height,img_width=180,180 #setting image dimention
batch_size=32
#for train datset
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir_train,
  #validation_split=0.2,
  #subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

输出应打印在训练集中找到的文件数:找到属于 8 个类的 9784 个文件。

#for validation datset
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir_validation,
  #validation_split=0.2,
  #subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)

输出应打印在训练集中找到的文件数:找到属于 8 个类的 2579 个文件。

第 6 步:数据可视化

我们可以在训练前看到我们的图像是什么样子的。此外,在没有首先看到数据集的情况下查看笔记本的人可以知道这些图像是什么样子的。它是数据的图形表示。在不经过整个数据集的情况下进行通信特别有效。

class_names = train_ds.class_names
print(class_names)

上面的代码片段首先按照模型使用它的顺序打印数据集的类的数组。这给出:

[‘Adire’, ‘Idgo’, ‘Idoma’, ‘Igala’, ‘Tiv’, ‘Tswana-Shweshwe’, ‘Xhosa-South Africa’, ‘Zulu’]
import matplotlib.pyplot as plt

# Lopping through the trainset for sample images 
plt.figure(figsize=(14, 14))
for images, labels in train_ds.take(1):
  for i in range(9):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(images[i].numpy().astype("uint8"))
    plt.title(class_names[labels[i]])
    plt.axis("off")
06bd1862dfa50ca454ba0e67d1b73ebd.png

第 7 步:模型训练

此时,数据集已准备好用于训练。我们需要设置一些关键参数进行训练。

num_classes = 8 # number of classes is number of image directory

# Define Sequential model with 3 layers
model = Sequential([
  layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes,activation='softmax')
])

下面简要解释其中一些参数和术语:

ReLU: 是“rectified linear unit”的缩写(写作ReLU)。它是一种激活函数,用于将非线性引入深度学习模型。这解决了模型可能面临所谓的“梯度消失问题”的问题。

padding: 模型内核处理图像时添加到图像边缘的像素数。

activation: 它是决定神经元是否应该被激发的参数。这有助于在预测时重视参数。

layers:这用于设置模型将训练的层的性质。

Conv2D: 此参数有助于过滤和确定通过形成卷积来组合的内核数。

#Setting the training parameters
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
epochs=10 #setting the number of passes in the model
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

上面的代码在 10 个时期训练模型,这意味着它遍历数据集 10 次,并且每次都在学习时做出预测。如下所示:

Epoch 1/10
/usr/local/lib/python3.9/dist-packages/keras/backend.py:5585: UserWarning: "`sparse_categorical_crossentropy` received `from_logits=True`, but the `output` argument was produced by a Softmax activation and thus does not represent logits. Was this intended?
  output, from_logits = _get_logits(
306/306 [==============================] - 498s 2s/step - loss: 1.2685 - accuracy: 0.5346 - val_loss: 3.3806 - val_accuracy: 0.2602
Epoch 2/10
306/306 [==============================] - 56s 179ms/step - loss: 0.7726 - accuracy: 0.7296 - val_loss: 3.9734 - val_accuracy: 0.3695
Epoch 3/10
306/306 [==============================] - 56s 181ms/step - loss: 0.4911 - accuracy: 0.8325 - val_loss: 4.3418 - val_accuracy: 0.3808
Epoch 4/10
306/306 [==============================] - 56s 180ms/step - loss: 0.2632 - accuracy: 0.9153 - val_loss: 5.4616 - val_accuracy: 0.4102
Epoch 5/10
306/306 [==============================] - 57s 183ms/step - loss: 0.1420 - accuracy: 0.9586 - val_loss: 6.2114 - val_accuracy: 0.4188
Epoch 6/10
306/306 [==============================] - 57s 183ms/step - loss: 0.0970 - accuracy: 0.9747 - val_loss: 7.2962 - val_accuracy: 0.4234
Epoch 7/10
306/306 [==============================] - 56s 181ms/step - loss: 0.0831 - accuracy: 0.9787 - val_loss: 6.9264 - val_accuracy: 0.4122
Epoch 8/10
306/306 [==============================] - 57s 182ms/step - loss: 0.0637 - accuracy: 0.9859 - val_loss: 7.9563 - val_accuracy: 0.4331
Epoch 9/10
306/306 [==============================] - 57s 180ms/step - loss: 0.0523 - accuracy: 0.9879 - val_loss: 7.9776 - val_accuracy: 0.4234
Epoch 10/10
306/306 [==============================] - 56s 178ms/step - loss: 0.0655 - accuracy: 0.9828 - val_loss: 8.0845 - val_accuracy: 0.4149

第 8 步:训练和评估

为了评估我们的模型性能,我们查看训练损失、准确性以及验证损失和准确性。

训练损失:训练损失提供了一个指标,用于评估我们的深度学习模型如何适合训练集。它估计模型在训练集上的误差值。

训练准确度:训练准确度表示模型识别其训练图像的能力。我们的模型在这里显示出很高的训练准确性,这意味着它训练得很好。但我们必须通过引入验证集来证明这一点,看看它是否真的学得很好。

验证损失:我们合并了训练损失和验证损失,这是一种常见的做法。验证损失显示了我们的模型与验证集的拟合程度。与训练损失相比,这里的错误很高。

验证准确性:此处的验证集访问训练结果的真实性。我们的项目显示平均准确率为 43%。这意味着我们的模型需要更多的训练。要做的事情可能是增加数据集大小或相应地调整一些参数。

第 9 步:部署

最后,要退出我们的模型训练以进行部署,需要保存模型以供进一步使用。这是使用keras 中的 save_model 函数在此处完成的。该模型可以用作 Web 或本地应用程序中的工件。

#saving the model
tf.keras.models.save_model(model,'my_model.hdf5')

结论

在本文中,我们训练了一个深度学习模型来对非洲当地服饰的图像进行预测和分类。我们从网上收集了 12,000 多张图片,并将它们分为 8 类服装,包括 Adire、Idgo、Idoma、Igala、Tiv、Tswana-Shweshwe、Africa 和 Zulu。

虽然准确率表现一般,但我们可以通过添加更多图像或调整参数来进一步改进这个个人项目。

该模型可以使用 streamlit、Heroku 或任何 Web 服务进行部署。甚至在你的机器上进行本地部署。

要点:

  • 该项目涵盖了时尚达人使用的深度学习技术的真实世界原型的实际开发。应用了各种合适的评估指标。

  • 非洲着装检测的数据集是从互联网上收集的。数据集是原始的和新的,链接在文章末尾可用。

  • 该数据集包含属于 8 个类别的图像。该目录包含属于 8 个训练类的 9784 个图像和属于 8 个模型验证类的 2579 个文件。

  • 推荐的环境是Google colab,模型的开发平均准确率为43%。

链接:

  • GitHub 存储库:https://github.com/inuwamobarak/african_attire_detector

  • 数据集地址:https://drive.google.com/drive/folders/1jhMG6vnsKqDm5uILBMLezU2Ll5ljWOZy?usp=sharing

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

23f434f1bdc237aba83c0fca20ef988f.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值