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.pswp.cn/news/373931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373931.shtml
英文地址,請注明出處:http://en.pswp.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機制又不是三言兩語能夠…