python cnn识别图像_笨方法学习CNN图像识别(一)—— 图片预处理

— 全文阅读5分钟 —

在本文中,你将学习到以下内容:

通过数据增强增加样本量

调整图片大小便于网络训练

前言

图像识别的准备工作就是要对我们拿到手的样本图片进行预处理,具体就是数据增强和调整图片大小,这些准备工作都是为训练网络做准备。图片预处理一定要合理有效,符合机器学习的要求。

数据增强(data augmentation)

当我们拿到一套图片数据准备进行机器学习的时候,样本量往往不够多,因此需要对现有的图片进行数据增强。一方面是为了增加样本量,另一方面能够提高模型的泛化能力。

假设我们有一组商标图片,如下:

商标图片

当我们进行100类的机器学习时,显然这一类的样本量不够多,在这里我们通过keras库进行数据增强。以商标图片中的第一张图片为例:

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

pic_path = r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'

augmentation_path = r'./data_augmentation'

1

2

3

4

fromkeras.preprocessing.imageimportImageDataGenerator,img_to_array,load_img

pic_path=r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'

augmentation_path=r'./data_augmentation'

首先导入keras库,建立图片路径和数据增强保存路径,接下来定义ImageDataGenerator,告诉他通过哪些操作产生新的图片。

data_gen = ImageDataGenerator(

rotation_range=30,

width_shift_range=0.1,

height_shift_range=0.1,

zoom_range=0.2,

fill_mode='nearest')

1

2

3

4

5

6

data_gen=ImageDataGenerator(

rotation_range=30,

width_shift_range=0.1,

height_shift_range=0.1,

zoom_range=0.2,

fill_mode='nearest')

在这里根据当前的图片需求,选择了旋转、平移、缩放、边缘填充的操作,其他操作详见。有些操作的设置要符合实际情况,比如旋转操作,不能把图片完全倒立了,这样的数据增强反而不利机器学习。

img = load_img(pic_path)

x = img_to_array(img)

x = x.reshape((1,) + x.shape)

n = 1

for batch in data_gen.flow(x, batch_size=1, save_to_dir=augmentation_path, save_prefix='train', save_format='jpeg'):

n += 1

if n > 6: # 6表示生成6张新的图片

break

1

2

3

4

5

6

7

8

img=load_img(pic_path)

x=img_to_array(img)

x=x.reshape((1,)+x.shape)

n=1

forbatchindata_gen.flow(x,batch_size=1,save_to_dir=augmentation_path,save_prefix='train',save_format='jpeg'):

n+=1

ifn>6:# 6表示生成6张新的图片

break

加载图片的地址,转变成array格式给ImageDataGenerator,save_prefix表示新图片的名字前缀,save_format表示新图片保存的格式。需要注意的是,在这里根据我们定义的操作,从这些操作中随机选择几种生成6张图片。

最终在data_augmentation文件夹中生成6张新的商标图片:

新的商标图片

在实际操作中,应该多去尝试数据增强的各种操作。好的样本扩充能够增加模型的泛化能力,提高准确率。数据增强完整代码如下:

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

pic_path = r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'

augmentation_path = r'./data_augmentation'

data_gen = ImageDataGenerator(

rotation_range=30,

width_shift_range=0.1,

height_shift_range=0.1,

zoom_range=0.2,

fill_mode='nearest')

img = load_img(pic_path)

x = img_to_array(img)

x = x.reshape((1,) + x.shape)

n = 1

for batch in data_gen.flow(x, batch_size=1, save_to_dir=augmentation_path, save_prefix='train', save_format='jpeg'):

n += 1

if n > 6:

break

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

fromkeras.preprocessing.imageimportImageDataGenerator,img_to_array,load_img

pic_path=r'./3ac79f3df8dcd100755525327e8b4710b8122fdc.jpg'

augmentation_path=r'./data_augmentation'

data_gen=ImageDataGenerator(

rotation_range=30,

width_shift_range=0.1,

height_shift_range=0.1,

zoom_range=0.2,

fill_mode='nearest')

img=load_img(pic_path)

x=img_to_array(img)

x=x.reshape((1,)+x.shape)

n=1

forbatchindata_gen.flow(x,batch_size=1,save_to_dir=augmentation_path,save_prefix='train',save_format='jpeg'):

n+=1

ifn>6:

break

图片大小调整(resize)

统一调整图片的大小,便于后面进行机器学习。我们以调整data_augmentation文件夹生成的新图片为例:

from PIL import Image

import os

img_path = r'./data_augmentation'

resize_path = r'./resize_image'

for i in os.listdir(img_path):

im = Image.open(os.path.join(img_path,i))

out = im.resize((224, 224))

if not os.path.exists(resize_path):

os.makedirs(resize_path)

out.save(os.path.join(resize_path, i))

1

2

3

4

5

6

7

8

9

10

11

12

fromPILimportImage

importos

img_path=r'./data_augmentation'

resize_path=r'./resize_image'

foriinos.listdir(img_path):

im=Image.open(os.path.join(img_path,i))

out=im.resize((224,224))

ifnotos.path.exists(resize_path):

os.makedirs(resize_path)

out.save(os.path.join(resize_path,i))

使用PIL库改变图片大小,使用os库读取文件路径,将resize后的图片放到resize_image文件夹中。resize后的大小为224*224(这个大小是为了后面ResNet使用)。resize后的图片效果如下:

resize后的图片

当你完成这一步的时候,图像识别的准备工作就完成一半了,剩下的就是将这些图片制成tfrecord格式,方便训练网络读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机数发生器

很多人喜欢用 rand()%n产生区间 [0,n]内的一个随机整数。姑且不论这样产生的整数是否仍然均匀分布,当 n大于 RAND_MAX 时,此法并不能得到期望的结果。由于RAND_MAX 很可能只是32767这么小,在使用此法时应当小心。 #include "stdio.h&quo…

Request和Response详解

转自:http://zhidao.baidu.com/link?url8BI0cjlcFdBSJKHTZlpo874eqtbTJoZfrh3miQgM_05RvSER8skPiBc1wSPZtXT8OGGCHfVXFAzAosa6E5HBl_ 内置对象request:请求对象request.getParameter("名字") 获得客户端输入的信息***************request.get…

将Maven与Ivy集成

问题是:您在Ivy存储库中(只有那里)有一些资源,您想在基于Maven的项目中使用这些资源。 可能的解决方案: 由于Ivy可以轻松使用Maven风格的存储库(因此,您的Ivy客户端可以继续使用Ivy并进行一些微…

用python下载辞典

用python下载词源词典Etymoline Online Etymology Dictionary是最好的 English 词源词典,现在来说没有之一。但是,一直在PC上查单词有时不是很方便,遂就想怎么才能在手机上使用。现在的手机上的词典,除了BlueDict、MDict之外&…

程序员都用什么来记录知识_1年前的小五都用 Python 来做什么?

↑ 点击上方 “凹凸数据” 关注 星标 ~ 每天更新,干货不断 (多图预警)注:这是小五一年前在知乎的回答,当时还只有凹凸数读一个公众号,所以很多图片都会带有数读或者知乎的水印。作为一个菜鸟数据分析师,只会sqlpytho…

CSDN编程挑战——《高斯公式》

高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:12..1005050。现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算)。 输入格式: 多组数据,每组数据一行&#xff0c…

SQL-行转列(PIVOT)实例1

--未旋转之前的查询结果 select s.Name ShiftName,h.BusinessEntityID,d.Name as DpartmentName from HumanResources.EmployeeDepartmentHistory h inner join HumanResources.Department d on h.DepartmentIDd.DepartmentIDinner join HumanResources.Shift s on s.ShiftIDh…

将MongoDB与Morphia结合使用

在过去的几年中, NoSQL数据库(例如CouchDB,Cassandra和MongoDB)在不需要运行传统RDBMS的语义和开销的应用程序中得到了普及。 我不会进入选择NoSQL数据库的设计决策,因为其他人已经做得很好,但是我将结合我…

webservice接口_webservice服务器端发票识别接口

关键词:发票识别 私有云发票识别 发票识别API接口 webservice发票识别平台发票,一个再也熟悉不过的财务往来凭证,录入发票,一项让多少财会人员头疼的工作。过去录入一张发票需要一个财会人员5分钟的时间,那么这个人在工…

二叉树学习——简单入门题

入门题一: 输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到它的移动序列给出 (L表示左,R表示右)。在输入中,每个节点的左括号和右括号之间没有空格&#…

java8-4 多态的练习以及题目

1、/* 多态练习:猫狗案例*/ 1 class Animal {2 public void eat(){3 System.out.println("吃饭");4 }5 }6 7 class Dog extends Animal {8 public void eat() {9 System.out.println("狗吃肉"); 10 } 11 12 public void lookDoor() { 13 Syste…

一个简单的socket通信小demo

写了一个socket的程序,可以和本地的服务器进行通信,要先和服务器建立链接,然后发送登录信息,验证成功,就可以和服务器通信了 1 页面截图 2 点击链接服务器,可以链接服务器,服务器的ip地址为&…

Java并发教程– CountDownLatch

Java中的某些并发实用程序自然会比其他并发实用程序受到更多关注,因为它们可以解决通用问题而不是更具体的问题。 我们大多数人经常遇到执行程序服务和并发集合之类的事情。 其他实用程序不太常见,因此有时它们可​​能会使我们逃脱,但是请记…

汉仪尚巍手书可以商用吗_【商用车维修】夏天修空调可以撑起全年修车收入的一半,你会了吗?...

更多精彩,请点击上方蓝字关注我们!车载空调是炎热的季节必不可少的利器,但用得多,毛病也多了起来,今天和大家分享一些空调系统的相关知识,助力修车师傅们来应对空调系统的相关故障问题。如何判断制冷系统的…

CSDN编程挑战——《-3+1》

-31 题目详情: 有一个数列,所有的数都是非负整数,你可以进行如下方式进行一次操作(注意一次完整的操作必须先后完成如下两个步骤): (1) 任选一个不小于3的数,把它减少3。 &#xff…

游戏感悟

1.所谓游戏平衡,就是指玩家没有最优解。 2.所谓公司的文化,就是指员工被公司洗脑的那些观点(认知)。 3.人是能动的,摆脱平庸。转载于:https://www.cnblogs.com/yangzhou33/p/5074509.html

Git 简单使用

1.Git是什么 简介:Git是 Linux 之父 Linus Trovalds,为管理 Linux 内核代码而建立的,被认为是分布式版本控制工具中的顶级水准。智能、友好、强健、高效。 作用:新建一个分支,把服务器上最新版的代码fetch下来&#x…

Vaadin附加组件和Maven

介绍 我喜欢Vaadin的 (众多)一件事是它对Vaadin框架的“附加组件”社区-他们称之为Vaadin目录 。 “附加组件”是框架中社区贡献的附加组件,可以是任何东西,例如从新的客户端小部件到数据表的延迟加载容器。 我肯定会为Activiti看…

八皇后时间复杂度_【算法打卡】N皇后

难度:困难题目:n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回 n 皇后不同的解决方案的数量。提示:皇后,是国际…

Android-Binder 简析

前言 对于Android来说,Binder的重要性怎么说都不为过。不管是我们的四大组件Activity、Service、BroadcastReceiver、ContentProvider,还是经常在应用中使用到的各种ServiceManager,其背后都是Binder在支撑。然而Binder机制又不是三言两语能够…