+ [0 |" B7 m S5 h 前言
% z! m: C/ L& j3 p {, V
前段时间忙工作的事情,所以没有给大家及时更文,近期小瑞根据各版块的知识重新划分了一下结构,新加的版块有“专题强化”和“可视原理”,专题强化这块日后会经常写一些单一性知识的文章,和其他版块的内容相关性不大但是也是必须要知道的一些内容。可视原理这块小瑞想把各个算法用视频或者其他方式来展现其实现原理。让大家更容易理解算法的本质。好了,先说这么多,今天的内容是小瑞在工作中遇到的一些问题,周末抽空给大家整理总结一下。今天的主要知识就是在 Tensorflow 中的数据处理及读取数据的方式.
2 H2 n* n1 p5 {" K" z, P/ b
1. 图像处理
: T5 E7 L" f3 D) T2 O1 m 常见的图像处理有图像去燥、图像超分辨、图像增强等等。要对图像进行处理,首先要构建所需要的数据库,处理的数据的方式也是多种多样,常见的有:
3 y2 U4 F7 O* I. x- I
7 V' |4 z# W: e! P$ k9 F0 Z 图像颜色域的变化(例如RGB转Gray)
3 o" R; b: h+ ]; Q
数据增强 (Data augmentation)将图像翻转,缩放,裁剪,旋转等
% U0 U( C2 p1 o, k4 T* w 图像块(Image patch) 就是从整张图像中, 扣下小块的小图像,这么做主要是因为可以增加训练数据的量, 另外小块的图像训练起来速度更快, image patch的合理性是基于卷积神经网络的感受野(Receptive field)通常不会太大.
, [" ]- i8 H' t2 u 做完这些,然后就需要为深度网络喂数据,还需要写Batch Generator, 就是用来生成一个batch的东西.
( g1 k2 Y; Q% U, G
训练方案
$ c' K/ [: A; d P! R5 t' ~
构建数据库的部分是独立, 也就是说我们对找到的图像做预处理, 将预处理的结果保存起来, 这就算构建好训练的数据库了, 训练时从数据库里直接拿数据进行训练
) i' r( h/ \4 N: \# C! l
训练时实时地预处理一个batch的图像, 将处理的结果作为训练的输入
- q/ O2 Q `, E8 _0 b2 L 第一种方法将训练集的构建和网络的训练分开,并且将预处理结果存在电脑中,这样做训练的代码会比较简单,且直接读入处理好的数据能让训练速度更快,当然,不足的地方就是不够灵活,如果预处理的方式改变了(例如, 原本是RGB转HSV, 现在我要RGB转Gray), 那么需要重新构建一个数据库,造成硬盘空间的浪费. 第二种方法虽然训练速度不如第一种,但是足够灵活, 一般来讲主要关注第二种方法. 在TensorFlow中,图像处理主要由tf.image模块支持, batch generator主要用tf.data.Dataset实现,下面来看下整个流程的具体实现. 事先准备了一个文件夹, 存放了19张图片, 作为我们本章代码的示例图片
& ^$ U0 w: t4 t+ f. s

. A3 [6 E+ T' S2 @( S
对于训练来讲, TensorFlow提供了一整套图像预处理以及数据生成的机制,这里实现了一个简单的常用的数据处理框架, 总结为三步:
8 P. p2 m2 `+ o9 }2 j2 ~5 u
4 E% U8 `9 u: t: D$ y1 G 获取所有图片的路径
2 y2 T( d* ~. ^ X8 l# N
图片预处理的代码
1 p; c* \5 D; p; @ 定义数据生成器
8 c+ K: \& Z' z# l! g- h0 F/ Z1 C, D 2. 图像处理相关代码
7 a' y4 D9 t0 _2 ]8 }
+ x0 ]* w* C0 o8 v" @6 t7 ] 1. 获取图片路径
/ y; F( S, f* I

" L9 J _$ c) Y3 @4 i$ s8 k2 @ 
; O# |9 L; _" m# {! m6 o4 s

# R; }4 k' V9 ?5 l

. U( J4 h2 ^0 p2 m' N2 n1 I
2. Batch Generator
, G9 ~% x: H8 Q1 [5 `

+ }+ C7 \ \# U g+ ? 
: U1 V1 T1 a8 s

* f: _% H7 s' n7 \ 
9 \8 G' C8 A: L* |( A5 k 3. 处理效果
# }4 c0 s5 c7 K8 u! {, Y 
* l/ X0 B& ^: G; d2 p
2 {3 Y* ?+ G/ Y& ~' B