手机版

深度学习中使用Node.js对图片进行预处理

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

背景

最近在做一个和物体识别相关的项目。由于团队中的技术栈偏向于JavaScript,在用Python和Tensorflow搭建了对象识别服务器之后,为了不增加团队成员的维护成本,除了训练和识别之外的任务都会尽可能交给Node.js,今天要讨论的图像预处理就是其中之一。

这里为那些还不知道深度学习的人简单解释几个概念

物体识别:物体识别可以理解为计算机在一张图片中找到一个或一些指定的物体,比如找到其中所有的狗。训练:计算机学习物体识别就像人类学习说话一样,需要不断的练习。在深度学习中,这个过程叫做“训练”。训练集:人类学习说话时,需要看别人说什么,听别人的声音等。能够让他们学会说话的信息在深度学习中被称为训练集,而物体识别中需要的训练集只是图片。图像预处理的目的是解决目标识别中训练集不足的问题。当对象识别应用到一个特殊的领域时,就会遇到这个问题。如果你在识别一只狗,这样的图片有很多,有些人已经训练过了,可以提供服务给大家使用。如果是鉴定队里的t恤,图片那么少,拍100张需要很长时间,但是数据量还是少得可怜。要知道互联网上成熟的AI服务,从字面上看有数千个训练集,甚至数十亿个。当然,特殊领域的一般要求比较简单,需要识别的东西种类不多,特点也很明显。不过,我们还是希望训练集越大越好。此时,我们可以对拥有的图片进行一些处理,生成新的图片,从而扩展当前的训练集。这个过程叫做图片预处理。

常见的图像预处理方法如下:

旋转。由于旋转角度可以是任意值,所以需要随机生成一些角度进行旋转,这也称为随机旋转。翻过来。相当于在图片旁边放一面镜子,新图片就是镜子里的图片,一般有水平翻转和垂直翻转两种类型。调节亮度。你可以通过调节手机亮度来理解这个意思。调整饱和度。这个意义可以通过调整传统电视来实现。饱和度越高,色彩显示越亮,相反,给人一种色彩酷炫的感觉。调整色调。这相当于改变了整个画面的颜色。想象一下之前关掉的绿色电视。调整对比度。这将使明亮的地方更亮,黑暗的地方更暗。也可以想象一下电视上的对比度调整。不得不说,电视启蒙了这些专业术语。以上每个操作都需要根据场景进行选择,目前适用于我们团队的处理方式主要有以上几种。还有一些操作如白化、Gamma处理等。它们不是那么直观,可以被感兴趣的人自己理解。

安装gm

Gm是一个用于图像处理的npm库,其性能应该算是Node.js库中最好的。它的底层使用GraphicsMagick默认,所以你需要先安装graphicsmackfirst,在Mac系统中直接用Homebrew安装:

brew install graphicsmagick其他系统的安装方法可以直接在官网查看。

如果需要给图片添加文字,还需要安装ghostscript,可以在Mac上用brew install ghostscript安装。由于本文不涉及此功能,因此没有必要安装它。同时,您需要在您的项目下安装gm:

Npm i gm -S预处理

为了直观,我选择了一张图片作为预处理对象:

此外,在本文的示例代码中,每个预处理方法的函数名都是通过参考Tensorflow中Image模块同名的方法来确定的。更多图片的处理方法,可以去Tensorflow文档官网自行查看,同时在gm官方文档中寻找具有相同效果的方法。

翻转

沿y轴的翻转使用gm。翻转方法:

从' gm '进口GM;/* * *沿Y轴翻转,即上下颠倒* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param回调函数*/Function Flip(输入路径、输出路径、回调){ gm(inputPath)。翻转()。write(outputPath,回调);}翻转后的效果如下图所示:

沿x轴翻转使用通用汽车公司的。翻牌法:

从' gm '进口GM;/* * *沿X轴翻转,即上下颠倒* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param回调处理的回调函数*/Function flop(输入路径、输出路径、回调){ gm(inputPath)。扑通()。write(outputPath,回调);}翻转后的效果如下图所示:

也可以组合。翻转和。翻牌圈创造对角线翻转效果:

如果把原图看作一个前端组件,即一个购物按钮组,其中每个按钮的背景都可以自定义,按钮由文字、分隔线、文字三个元素组成,那么上面翻转过来的图片就可以看作同一个组件,即可以作为训练集。

有时候,翻转带来的效果并不是你想要的。翻转后,可能就不算是和原图一样的东西了。此时,这种方法有局限性。

调节亮度

之后,调节亮度就更通用了。无论什么画面,调整亮度后,内容还是一样的。

用gm调节亮度。调制方法:

/* * *调整亮度* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param brightness图像亮度值,参考值为100,且高于100会增加亮度。低于100是亮度降低后的回调函数* @param回调处理*/函数调整亮度(输入路径、输出路径、亮度、回调){GM(输入路径)。模块化(亮度,100,100)。write(输出路径,回调);}.调制法是一种多功能的方法,可以同时调节图片的亮度、饱和度和色调。这三个特征对应于该方法的三个参数。这里只调整亮度,所以只改变第一个参数(高于100会增加亮度,低于100会降低亮度),其余不变。

我生成了亮度从0-200的所有图片,并进行比较,选择了一个合适的间隔进行亮度处理。可以看看亮度相差10的相邻图片在0到200之间的差别(提示:每张图片的亮度标注在左上角):

可以看到亮度60以下的图片都太暗细节不够明显,亮度150以上的图片都太亮细节不够明显。综合多张图片对比后,我觉得[60,140]的画质更好,和原图相比不会损失太多细节。

再来看看亮度为50和60的两张图,其实看起来像一张图,不符合训练集多样性的原则,更别说相邻亮度差为1的两张图了。因此,最终决定作为训练集的两个相邻图片之间的亮度差为20,这样差别就很明显了,例如亮度为80、亮度为100的两张图片。

最后,通过调整亮度将产生四张新图片。从亮度为60的图片开始,每增加20个亮度,就选择加入训练集,直到亮度为140的图片,其中亮度为100的图片不计算在内。

调整饱和度

饱和度也由。调制方法,只调整第二个参数:

/* * *调整饱和度* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param饱和度图像饱和度值,参考值为100,高于100则增加饱和度。低于100是饱和度降低后的回调函数* @param回调处理*/函数调整饱和度(输入路径、输出路径、饱和度、回调){GM(输入路径)。模块化(100,饱和,100)。write(输出路径,回调);}还可以通过调整亮度来确定训练集中两个相邻图片的饱和度范围和饱和度差。可以看看饱和度差为10的相邻图片之间的差异(提示:每个图片的饱和度标在左上角):

调整饱和度产生的图片细节不会丢失,大部分可以作为训练集中的图片。和亮度一样,饱和度相差20的两张图片明显不同。另外,饱和度大于140时,画面变化不明显。因此,通过调整饱和度将产生6张新图片。从饱和度为0的图片开始,每20度的饱和度加入训练集,直到饱和度为140的图片,其中饱和度为100的图片不计算在内。

调整色调

调节色调的方法是这个场景中最有用的方法,它产生最多的训练集。让我们来看看相邻色调为10的图片之间的差距(提示:每张图片的左上角标记图片的色调):

几乎每张图片都可以作为新的训练集。由于色调调整范围只能在0到200之间,从色调为0的图片开始,每添加10个色调加入训练集,直到色调为190的图片,其中色调为100的图片不计算在内。这样,可以生成20张图片作为训练集。

至于调节色相的代码,和亮度、饱和度是一样的,只是改变了第三个参数:

/* * *调整色相* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param色相图像色相值,参考值为100,且高于100会增加色相。低于100的是回调函数*/函数调整色相(输入路径、输出路径、色相、回调){GM(输入路径)。模块化(100,100,色相)。write(输出路径,回调);}调整色调不是万能药,只适用于这种场景。当然,我们团队的需求都和这个场景差不多。但是,如果要训练人工智能识别梨,告诉它有一个蓝色的梨显然是不合适的。

调整对比度

调整与通用汽车的对比。对比方法:

/* * *调整对比度* @param inputPath输入图像文件路径* @param outputPath输出图像文件路径* @param乘数调整对比度因子,默认值为0,可以是负数,n表示增加对比度n次。-n表示降低对比度n次后的回调函数* @param回调*/函数调整对比度(输入路径、输出路径、乘数、回调){GM(输入路径)。对比度(乘数)。write(输出路径,回调);}以下是对比度因子在-10到10之间的图像。可以看到画质比较好的区间是[-5,2],其他的会丢失一些细节。此外,具有相邻对比度因子的图片之间有明显的差异,因此每个图片都可以用作训练集,因此还有7个图片。

摘要

通过以上五种方法,可以在一张图片的基础上多获得40张图片,即训练集是原集的40倍。这还是在没有各种混合方法的情况下,如果混合的话,恐怕要多几百倍。

Gm还支持图片的其他处理方式,可以自己探索。每种方法在特定场景中都有其局限性,您需要选择它们。希望大家都有一套满意的训练集。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:深度学习中使用Node.js对图片进行预处理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。