如何通过Tensorflow和GCP在电商网站中自动标记服装
为什么选择电商和服装标记?
从创业公司到小型企业,再到大型品牌,大量公司在他们电商网站上销售产品或服务,获益颇多。在当今竞争激烈且以便利为中心的社会中,消费者不想再冒险在大街购买物品,相反,他们倾向于在家中购物,这使得电商成为企业和买家的灵活解决方案。
随着电商日益普及,可供购物的产品数量也在增加,我们很难对服装之类的产品进行手动标记。因此,以下是使用机器学习来缓解这项任务的一个小尝试。
图像分类vs对象检测
人们很容易混淆图像分类和对象检测。通常,如果要将图像分类为特定类别,则属于图像分类。然而,如果您的目标是识别图像中对象的位置,例如,计算对象的实例数,则属于对象检测。
机器学习模型
我们使用的模型是用于对象检测的内置TensorFlow模型,以便对数据进行分类。需要分类的类别有:衬衫,T恤,夹克,牛仔裤,裤子,太阳镜,鞋子,上衣和裙子。TensorFlow中有多种模型可供选择,您可在此链接中找到详细信息。
出于本实验的目的,我使用了一类被称为MobileNets的特殊卷积神经网络(CNN)。 MobileNets虽然不能提供与发展成熟的深度神经网络一样精确的模型,但对于许多应用来说,其精确度已经非常高并且足够好。MobileNet架构和“传统的”CNN之间的主要区别在于,MobileNets将卷积分解为3x3深度卷积和1x1逐点卷积,而不是在简单的3x3卷积层后再接一个ReLU非线性**。
网上有大量关于如何使用MobileNets或其他内置模型构建自定义分类器的教程。
数据集
本实验中的图像是从知名电商网站上下载的。这些数据已经经过清理(删除重复的图像,删除不需要的图像)并上传到dataturks平台。使用平台上提供的注释工具,用矩形边界框对这些图像注释(查看注释工具)。注释后的数据下载到包含图像和JSON文档的文件夹,并按照80-20的拆分比例将数据拆分为训练集和测试集。然后给出训练和测试文件夹作为python脚本的输入,以便将数据转换为Pascal VOC(此处为演示)。从json到PascalVOC脚本转换过程中获得的xml文档和图像随后转换为一组csv文档和图像。最后,将这些数据转换为TensorFlow 要求的.record 文件进行训练和测试。
(确保数据拆分后数据集中每个类别至少包含100-150个图像用于训练。)
数据准备的代码:
训练:
模型的训练是在Ubuntu 16.04 LTS GPU系统上完成的,安装有NVIDIATESLA K80,7GB内存,12GB显卡以及30GB硬盘。训练进行了10,000次迭代,大约需要3个小时。
整个训练过程,从创建数据集,将其设置为正确的格式,利用谷歌云平台创建实例(GCP实例),训练模型到最终对其进行测试,需要付出巨大的努力,进行大量工作。下面概述了创建数据集后需采取的具体步骤。
创建GPC实例:谷歌云平台(Google Cloud Platform)是一种云计算基础架构,可提供安全,强大,高性能且经济高效的框架。它不仅仅适用于数据分析和机器学习,但其他方面我们在这里并不会探讨。谷歌将赠送300美元的信用额度和并提供12个月的免费试用。
有关如何设置实例的分步指南,请参阅谷歌云平台文档和博客。
创建实例后,设置如下所示:
在Ubuntu 16.04 LTS上安装TensorFlow GPU版本:
第一步
#确保系统更新并具有基本构建工具
sudo apt-get update
sudo apt-get — assume-yes upgrade
sudo apt-get — assume-yes install tmux build-essentialgcc g++ make binutils
sudo apt-get — assume-yes installsoftware-properties-common
第二步
#安装您的nvidia显卡驱动。
在菜单中搜索其他驱动程序并将其打开。等待几分钟,选择nvidia驱动程序,点击应用并重新启动。
第三步
#谷歌cuda工具包
下载cuda-8.0 .deb并安装
sudo dpkg -icuda-repo-ubuntu1604–8–0-local-ga2_8.0.61–1_amd64.deb (this is the deb fileyou’ve downloaded)
sudo apt-get update
sudo apt-get install cuda exportPATH=/usr/local/cuda-8.0/bin ${PATH:+:${PATH}}
exportLD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
第四步
#下载cudnn v5.1并运行以下命令
tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 sudochmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
第五步
#安装TensorFlow依赖包
sudo apt-get install libcupti-dev
第六步
#下载Python以及tensorflow gpu版本
bash Anaconda3–4.4.0-Linux-x86_64.sh
pip install tensorflow-gpu==1.2
第七步
#检查gpu是否能够正常运行
#下载git repo https://github.com/tensorflow/models,并解压
pythonmodels-master/tutorials/image/imagenet/classify_image.py
or
pythonmodels-master/tutorials/image/cifar10/cifar10_train.py
修改自定义模型的文件:
由于我曾用过MobileNet模型,我对配置文件进行了更改。训练好的模型可以在这里下载
配置文件中的更改:
后面的部分:
clothes-detection.pbtxt文件:
开始训练模型
可以使用以下命令在本地进行训练:
其中${PATH_TO_YOUR_PIPELINE_CONFIG}指向管道配置,${PATH_TO_TRAIN_DIR}指向训练检查点和事件写入的目录。 默认情况下,训练将无限期运行,直到用户将其终止或完成迭代。
我的总损失图表如下:
进行评估
评估需单独进行,并在测试数据集上对其进行评估。可以使用以下命令进行评估:
其中 ${PATH_TO_YOUR_PIPELINE_CONFIG}指向管道配置, ${PATH_TO_TRAIN_DIR}指向保存训练检查点的目录(与训练时的目录相同),${PATH_TO_EVAL_DIR}指向将保存评估事件的目录。与训练一样,评估工作一直运行,直到默认终止。
运行TensorBoard
可以使用Tensorboard检查训练和评估工作的进度。如果要使用推荐的目录结构,可以使用以下命令运行Tensorboard:
其中${PATH_TO_MODEL_DIRECTORY}
指向包含训练和评估文件的目录。请注意,Tensorboard可能需要几分钟才能填充数据。
成功加载后,TensorBoard应该是这样的:
下面给出了学习率,批次规模,模型中tensorboard的损失等一些图表。所有这些图表以及其他图表都可以在浏览器中打开的tensorboard上找到,在图表上移动光标会提供平滑、步长、值等信息。
测试:
为了在本地测试模型,我将文件导出到谷歌驱动器,使用对象检测的object_detection_tutorial.ipynb文件来测试也会更容易些。下面给出了执行相同操作并简化任务的步骤。这样做可以让您多次运行已保存的模型进行测试,而无需为实例付费,并可在任何时间对它本地访问。
首先压缩保存模型检查点和图像的整个文件夹。
1. 通过SSH连接到Linux服务器,并从GitHub下载Linux版本的谷歌驱动器。
cd ~
wget https://docs.google.com/uc?id=0B3X9GlR6EmbnWksyTEtCM0VfaFE&export=download
2.您应该在主目录中看到一个文件名为uc= 0B3X9GlR6EmbnWksyTEtCM0VfaFE的文件。将此文件重命名为gdrive。
mv uc\?id\=0B3X9GlR6EmbnWksyTEtCM0VfaFEgdrive
3. 分配此文件的可执行权限。
chmod +x gdrive
4. 将文件安装到usr文件夹。
sudo install gdrive/usr/local/bin/gdrive
5. 您需要让谷歌驱动器允许此程序连接到您的帐户。为此,可以使用任意参数运行gdrive程序,并将其提供给您的文本复制到浏览器中。然后将Google提供的响应代码粘贴到您的SSH窗口中。运行以下内容。
gdrive list
6. 完成了! 现在您可以根据需要上传文件。
gdrive upload trained.tar.gz
现在,可以从驱动器下载压缩文件并在本地进行测试。
下面将对object_detection_tutorial.ipynb文件进行一些更改:
在模型准备的存储变量的单元格中:
# 要下载的模型.
MODEL_NAME = ‘ssd_mobilenet_v1_coco_2017_11_17’
MODEL_FILE = MODEL_NAME + ‘.tar.gz’
DOWNLOAD_BASE = ‘http://download.tensorflow.org/models/object_detection/'
# 确定检测图表的路径。这是用于对象检测的实际模型。
PATH_TO_CKPT = MODEL_NAME + ‘/frozen_inference_graph.pb’ #name of yourinference graph
只需更改PATH_TO_CKPT,使其指向新的 .pb文件,就可以在此处加载使用export_inference_graph.py工具导出的任何模型。
# 为每个矩形框添加正确标签的字符串列表。
PATH_TO_LABELS = os.path.join(‘data’, ‘mscoco_label_map.pbtxt’) #name ofyour pbtxt file.
NUM_CLASSES = 90 #to the numberof classes you want
在第一个被检测的单元格中:
(确保测试图像命名为image1.jpg或image1.jpeg,image2.jpg或image2.jpeg等)
到这里模型就测试完成了。
以下是我测试模型后的一些结果:
结论:
实验结果令人印象深刻,对50个测试图像中的大约48个进行了正确的分类。分类的置信度范围为88%至98%。
对于MobileNets模型而言,结果似乎令人信服,因为该模型的准确性不是很高。我们也可以对GitHub上提供的其他模型,如Faster RCNN或InceptionNets等,进行类似实验。这些用于图像分类的定制模型可以部署在Android应用程序中,也可以在电商网站中使用。
注:本文由「图普科技」编译,您可以关注微信公众号tuputech,体验基于深度学习的「图像识别」应用。