深度學習之數據增強方案和TensorFlow操作

?一、數據增強的方法介紹

增加訓練數據, 則能夠提升算法的準確率, 因為這樣可以避免過擬合, 而避免了過擬合你就可以增大你的網絡結構了。 當訓練數據有限的時候, 可以通過一些變換來從已有的訓練數據集中生成一些新的數據, 來擴大訓練數據。?數據增強的方法有:

1) 圖片的水平翻轉(主要包括對稱處理, 度數旋轉等)

2) 隨機裁剪(可以裁剪成不同大小的數據)

如原始圖像大小為256*256,隨機裁剪出一些圖像224*224的圖像。如下圖,紅色方框內為隨機裁剪出的224*224的圖片。 AlexNet 訓練時,對左上、右上、左下、右下、中間做了5次裁剪,然后翻轉,得到一些剪切圖片。防止大網絡過擬合(under ubstantial overfitting)。

3)?fancy PCA?(就是從像素的角度變化, 形成新的圖片)

在訓練集像素值的RGB顏色空間進行PCA, 得到RGB空間的3個主方向向量,3個特征值, p1,p2, p3, λ1, λ2, λ3. 對每幅圖像的每個像素加上如下的變化:

其中:α i 是滿足均值為0,方差為0.1的隨機變量.

4)?樣本不均衡( 解決方案: 增加小眾類別的圖像數據)

樣本數據的不均衡的問題是日常中較多遇到的問題, 在機器學習中我們對于數據不平衡有上采樣和下采樣等處理方法, 在這里我們一般使用的是小眾類別增強的方法處理.

一般根據數據集中的圖像最多的種類的數量進行隨機采樣, 使得每個樣本的數量均相等.然后將這些樣本圖片混合打亂形成新的數據集.

5)其它方法

  • 如平移變換;
  • 旋轉/仿射變換;
  • 高斯噪聲、 模糊處理、?
  • 對顏色的數據增強: 圖像亮度、 飽和度、 對比度變化.

6)訓練和測試要協調

在訓練的時候,我們通常都需要做數據增強,在測試的時候,我們通常很少去做數據增強。這其中似乎有些不協調,因為你訓練和測試之間有些不一致。實驗發現,訓練的最后幾個迭代,移除數據增強,和傳統一樣測試,可以提升一點性能。

如果訓練的時候一直使用尺度和長寬比增強數據增強,在測試的時候也同樣做這個變化,隨機取32個裁剪圖片來測試,也可以在最后的模型上提升一點性能。就是多尺度的訓練,多尺度的測試。

二、數據增強的TensorFlow實現

# -- encoding:utf-8 --
"""
圖像處理的Python庫:OpenCV、PIL、matplotlib、tensorflow等
"""import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf# 打印numpy的數組對象的時候,中間不省略
np.set_printoptions(threshold=np.inf)def show_image_tensor(image_tensor):# 要求:使用交互式會話# 獲取圖像tensor對象對應的image對象,image對象時一個[h,w,c]# print(image_tensor)image = image_tensor.eval()# print(image)print("圖像大小為:{}".format(image.shape))if len(image.shape) == 3 and image.shape[2] == 1:# 黑白圖像plt.imshow(image[:, :, 0], cmap='Greys_r')plt.show()elif len(image.shape) == 3:# 彩色圖像plt.imshow(image)plt.show()# 1. 交互式會話啟動
sess = tf.InteractiveSession()image_path = 'data/xiaoren.png'
# image_path = 'data/gray.png'
# image_path = 'data/black_white.jpg'# 一、圖像格式的轉換
# 讀取數據
file_contents = tf.read_file(image_path)
# 將圖像數據轉換為像素點的數據格式,返回對象為: [height, width, num_channels], 如果是gif的圖像返回[num_frames, height, width, num_channels]
# height: 圖片的高度的像素大小
# width: 圖片的水平寬度的像素大小
# num_channels: 圖像的通道數,也就是API中的channels的值
# num_frames: 因為gif的圖像是一個動態圖像,可以將每一個動的畫面看成一個靜態圖像,num_frames相當于在這個gif圖像中有多少個靜態圖像
# 參數channels:可選值:0 1 3 4,默認為0, 一般使用0 1 3,不建議使用4
# 0:使用圖像的默認通道,也就是圖像是幾通道的就使用幾通道
# 1:使用灰度級別的圖像數據作為返回值(只有一個通道:黑白)
# 3:使用RGB三通道讀取數據
# 4:使用RGBA四通道讀取數據(R:紅色,G:綠色,B:藍色,A:透明度)
image_tensor = tf.image.decode_png(contents=file_contents, channels=3)
# show_image_tensor(image_tensor)# 二、圖像大小重置
"""
BILINEAR = 0 線性插值,默認
NEAREST_NEIGHBOR = 1 最近鄰插值,失真最小
BICUBIC = 2 三次插值
AREA = 3 面積插值
"""
# images: 給定需要進行大小轉換的圖像對應的tensor對象,格式為:[height, width, num_channels]或者[batch, height, width, num_channels]
# API返回值和images格式一樣,唯一區別是height和width變化為給定的值
resize_image_tensor = tf.image.resize_images(images=image_tensor, size=(200, 200),method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# show_image_tensor(resize_image_tensor)# 三、圖片的剪切&填充
# 圖片重置大小,通過圖片的剪切或者填充(從中間開始計算新圖片的大小)
crop_or_pad_image_tensor = tf.image.resize_image_with_crop_or_pad(image_tensor, 200, 200)
# show_image_tensor(crop_or_pad_image_tensor)# 中間等比例剪切
central_crop_image_tensor = tf.image.central_crop(image_tensor, central_fraction=0.2)
# show_image_tensor(central_crop_image_tensor)# 填充數據(給定位置開始填充)
pad_to_bounding_box_image_tensor = tf.image.pad_to_bounding_box(image_tensor, offset_height=400, offset_width=490,target_height=1000,target_width=1000)
# show_image_tensor(pad_to_bounding_box_image_tensor)# 剪切數據(給定位置開始剪切)
crop_to_bounding_box_image_tensor = tf.image.crop_to_bounding_box(image_tensor, offset_height=10, offset_width=40,target_height=200, target_width=300)
# show_image_tensor(crop_to_bounding_box_image_tensor)# 四、旋轉
# 上下交換
flip_up_down_image_tensor = tf.image.flip_up_down(image_tensor)
# show_image_tensor(flip_up_down_image_tensor)# 左右交換
flip_left_right_image_tensor = tf.image.flip_left_right(image_tensor)
# show_image_tensor(flip_left_right_image_tensor)# 轉置
transpose_image_tensor = tf.image.transpose_image(image_tensor)
# show_image_tensor(transpose_image_tensor)# 旋轉(90度、180度、270度....)
# k*90度旋轉,逆時針旋轉
k_rot90_image_tensor = tf.image.rot90(image_tensor, k=4)
# show_image_tensor(k_rot90_image_tensor)#  五、顏色空間的轉換(rgb、hsv、gray)
# 顏色空間的轉換必須講image的值轉換為float32類型,不能使用unit8類型
float32_image_tensor = tf.image.convert_image_dtype(image_tensor, dtype=tf.float32)
# show_image_tensor(float32_image_tensor)# rgb -> hsv(h: 圖像的色彩/色度,s:圖像的飽和度,v:圖像的亮度)
hsv_image_tensor = tf.image.rgb_to_hsv(float32_image_tensor)
# show_image_tensor(hsv_image_tensor)# hsv -> rgb
rgb_image_tensor = tf.image.hsv_to_rgb(hsv_image_tensor)
# show_image_tensor(rgb_image_tensor)# rgb -> gray
gray_image_tensor = tf.image.rgb_to_grayscale(rgb_image_tensor)
# show_image_tensor(gray_image_tensor)# 可以從顏色空間中提取圖像的輪廓信息(圖像的二值化)
a = gray_image_tensor
b = tf.less_equal(a, 0.9)
# 0是黑,1是白
# condition?true:false
# condition、x、y格式必須一模一樣,當condition中的值為true的之后,返回x對應位置的值,否則返回y對應位置的值
# 對于a中所有大于0.9的像素值,設置為0
c = tf.where(condition=b, x=a, y=a - a)
# 對于a中所有小于等于0.9的像素值,設置為1
d = tf.where(condition=b, x=c - c + 1, y=c)
# show_image_tensor(d)# 六、圖像的調整
# 亮度調整
# image: RGB圖像信息,設置為float類型和unit8類型的效果不一樣,一般建議設置為float類型
# delta: 取值范圍(-1,1)之間的float類型的值,表示對于亮度的減弱或者增強的系數值
# 底層執行:rgb -> hsv -> h,s,v*delta -> rgb
adjust_brightness_image_tensor = tf.image.adjust_brightness(image=image_tensor, delta=0.8)
# show_image_tensor(adjust_brightness_image_tensor)# 色調調整
# image: RGB圖像信息,設置為float類型和unit8類型的效果不一樣,一般建議設置為float類型
# delta: 取值范圍(-1,1)之間的float類型的值,表示對于色調的減弱或者增強的系數值
# 底層執行:rgb -> hsv -> h*delta,s,v -> rgb
adjust_hue_image_tensor = tf.image.adjust_hue(image_tensor, delta=-0.8)
# show_image_tensor(adjust_hue_image_tensor)# 飽和度調整
# image: RGB圖像信息,設置為float類型和unit8類型的效果不一樣,一般建議設置為float類型
# saturation_factor: 一個float類型的值,表示對于飽和度的減弱或者增強的系數值,飽和因子
# 底層執行:rgb -> hsv -> h,s*saturation_factor,v -> rgb
adjust_saturation_image_tensor = tf.image.adjust_saturation(image_tensor, saturation_factor=20)
# show_image_tensor(adjust_saturation_image_tensor)# 對比度調整,公式:(x-mean) * contrast_factor + mean
adjust_contrast_image_tensor = tf.image.adjust_contrast(image_tensor, contrast_factor=10)
# show_image_tensor(adjust_contrast_image_tensor)# 圖像的gamma校正
# images: 要求必須是float類型的數據
# gamma:任意值,Oup = In * Gamma
adjust_gamma_image_tensor = tf.image.adjust_gamma(float32_image_tensor, gamma=100)
# show_image_tensor(adjust_gamma_image_tensor)# 圖像的歸一化(x-mean)/adjusted_sttdev, adjusted_sttdev=max(stddev, 1.0/sqrt(image.NumElements()))
per_image_standardization_image_tensor = tf.image.per_image_standardization(image_tensor)
# show_image_tensor(per_image_standardization_image_tensor)# 七、噪音數據的加入
noisy_image_tensor = image_tensor + tf.cast(5 * tf.random_normal(shape=[600, 510, 3], mean=0, stddev=0.1), tf.uint8)
show_image_tensor(noisy_image_tensor)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動前端頭部標簽(HTML5 head meta)

<!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不區分大小寫 --> <html lang"zh-cmn-Hans"> <!-- 更加標準的 lang 屬性寫法 http://zhi.hu/XyIa --> <head><!-- 聲明文檔使用的字符編碼 --><meta charsetutf-8>&l…

python新建文件夾口令_python編程快速上手—口令保管箱

之前小編為大家整理了如何成為一個優秀的程序員應該具備的品質&#xff0c;接下來為大家展示一個簡單有趣的python小項目&#xff0c;從中體會編程的樂趣。小編了解這個小項目之后&#xff0c;很是驚奇&#xff0c;覺得python竟然還可以做這樣的事情。為什么要建立口令保管箱&a…

django+nginx+uwsgi部署web站點

環境&#xff1a; django&#xff1a;1.8.16 python&#xff1a;2.7.13 pip&#xff1a;2.7 uwsgi&#xff1a;2.0.15 project路徑&#xff1a; /opt/cmdb/ Uwsgi的安裝配置 1、安裝python2.7 &#xff08;省略安裝過程&#xff09; 2、安裝pip2.7 &#xff08;省略安裝過程&…

GCC源代碼閱讀

獲取GCC源代碼 閱讀源代碼的第一步是獲取源代碼&#xff0c;巧婦難為無米之炊嘛&#xff01; 使用以下任意方法均可獲得gcc源代碼&#xff1a; svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir &#xff08;摘自http://gcc.gnu.org/svn.html&#xff09;git clone …

Nginx 動靜分離

頁面動靜分離 后端 調用tomcat 集群 示例&#xff1a; server { listen 80; server_name www.www2.com ; root /web/www2/htmlloation /img/ {alias /web/www2/html/img/;}location ~ (\.jsp)|(\.do)$ {proxy_pass http:## //serverip:port;proxy_redirect off;// 重定向 指…

Linux 狀態命令之內存狀態 vmstat

語法 vmstat 常見命令格式如下&#xff1a; vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]命…

使用OpenSSL實現CA證書的搭建過程

個人博客地址&#xff1a;http://www.pojun.tech/ 歡迎訪問 什么是CA CA,Catificate Authority,通俗的理解就是一種認證機制。它的作用就是提供證書&#xff08;也就是服務端證書&#xff0c;由域名&#xff0c;公司信息&#xff0c;序列號&#xff0c;簽名信息等等組成&#…

最近公共祖先 python_求二叉搜索樹的最近公共祖先

給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個結點 p、q&#xff0c;最近公共祖先表示為一個結點 x&#xff0c;滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”…

gdb使用實例

第一篇 概論我們將學習使用gdb來調試通過一個通過串行線同PC相連的嵌入式系統。Gdb可以調試各種程序&#xff0c;包括C、C、JAVA、PASCAL、FORAN和一些其它的語言。包括GNU所支持的所有微處理器的匯編語言。在gdb的所有可圈可點的特性中&#xff0c;有一點值得注意&#xff0c;…

Linux 監控命令之 netstat

netstat命令用于顯示與IP、TCP、UDP和ICMP協議相關的統計數據&#xff0c;一般用于檢驗本機各端口的網絡連接情況。netstat是在內核中訪問網絡及相關信息的程序&#xff0c;它能提供TCP連接&#xff0c;TCP和UDP監聽&#xff0c;進程內存管理的相關報告。 語法 netstat [-acC…

C#遞歸搜索指定目錄下的文件或目錄

來源&#xff1a;https://www.cnblogs.com/huhangfei/p/5012978.html誠然可以使用現成的Directory類下的GetFiles、GetDirectories、GetFileSystemEntries這幾個方法實現同樣的功能&#xff0c;但請相信我不是蛋疼&#xff0c;原因是這幾個方法在遇上【System Volume Informati…

solr 配置

創建 SolrHome(solrCore) 1.解壓 solr-4.10.4.tgz 到 /usr/local/solr 2.將 solr-4.10.4/example/solr 下所有文件拷貝到 /usr/local/solrhome (此 solrhome 為自己創建的) solrhome 是 solr 運行主目錄&#xff0c;可包含多個 SolrCore 目錄SolrCore 目錄中包含運行 Solr 實例…

mfc程序轉化為qt_10年程序員:我都學過這些語言,2019年開始我再也不是程序員......

為什么學編程2008年&#xff0c;高中畢業的我問一個已經工作兩年的親戚&#xff1a;什么專業工資高&#xff1f;他告訴我&#xff1a;程序員。2008年成都最低工資好像是800元&#xff0c;我的生活費也是800元&#xff0c;據他所說程序員出來的工資是2000&#xff0c;于是開始了…

day 7 引用

1.ba在c語言和python中的區別 c語言&#xff1a;a100 a變量里面放的100 b a b變量里面也放的100 python &#xff1a; a100 內存中有個100 a放的100的內存地址 b a b也放的100的內存地址 相當于給100那一塊內存&#xff0c;貼個便利簽 2.type查看數據類型&…

Dapper逆天入門~強類型,動態類型,多映射,多返回值,增刪改查+存儲過程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答應群友做個入門Demo的&#xff0c;現有園友需要&#xff0c;那么公開分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 項&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平臺之大勢何人…

Linux 狀態命令之磁盤狀態 iostat

Linux系統中的iostat是I/O statistics&#xff08;輸入/輸出統計&#xff09;的縮寫&#xff0c;iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況&#xff0c;同時也會匯報出CPU使用情況。同vmstat一樣&#xff0c;iostat也有一個弱點&#xff0c;就…

GDB十分鐘教程

GDB十分鐘教程 作者: liigo 原文鏈接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文寫給主要工作在Windows操作系統下而又需要開發一些跨平臺軟件的程序員朋友&#xff0c;以及程序愛好者。 GDB是一個由GNU開源組織發布的、UNIX/LI…

課后作業-閱讀任務-閱讀提問-3

1.如果兩個人合作的始終達不到規范階段該怎如何處理&#xff1f; 2. 邏輯和界面設計要注意哪些因素&#xff1f;轉載于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上點擊用例不能顯示edit信息_接口測試平臺代碼實現61: 多接口用例1

終于又序更上了&#xff0c;原諒最近作者幾天事情不斷。按照我們之前的計劃&#xff0c;需要迅速開啟很重要的核心多用例接口。首先&#xff0c;我們要確定&#xff0c;這個功能的大體設計。就放在在我們的頁面 用例庫 中&#xff1a;所以也就是我們很久之前就創建好的P_cases.…

黑客攻防專題八:21種RING的提權方法

好多都沒有成功&#xff0c;還是發來看看&#xff0c;看看思路&#xff0c;呵呵 以下全部是本人提權時候的總結 很多方法至今沒有機會試驗也沒有成功&#xff0c;但是我是的確看見別人成功過的。本人不才&#xff0c;除了第一種方法自己研究的&#xff0c;其他的都是別人的經驗…