用python将照片做成数据集_python实战项目,struct模块的使用,将MNIST数据集转换为bmp图片...
最近學習 tensroflow,用到了入門級的經典數據集 MNIST,MNIST 包含幾萬張 28x28 像素大小的手寫數字。但是它的存儲是以字節流的形式存儲的,幾萬張圖片存儲在一個文件里。一直對其很好奇,本節即用 python 的 struct 模塊處理字節流信息,結合 python 的 Image 模塊,將 MNIST 中的手寫數字圖片提取出來。
MNIST 圖片集的格式
要想從 MNIST 中提取出圖片數據,首先要了解它的格式。這點其實官網介紹的非常清楚。這里把介紹圖片格式的部分截取下來,因為測試集的數據量稍小(格式與訓練集相同),所以我們以測試集為例:
可以看出起始 32bit 是數據集的魔法數,校驗用的,可以不管。
4 字節偏移處是圖片的總數目 10000。
8 字節偏移處是圖片的行,為 28。
12 字節偏移處是圖片的列,也為 28。
從 16 字節開始,每一字節都是像素值。
像素值按行排列,從 0-255,0 表示白色,255 表示黑色,中間值是灰色。所以第一張圖片的數據,是從數據集的第 16 字節開始的,到 16+28x28 結束。
python struct 模塊
python 的 struct 模塊主要用于處理字節流信息,最重要的三個函數是pack(), unpack(), calcsize()。pack(fmt, v1, v2, ...) 把數據封裝成字符串
unpack(fmt, string) 按照 fmt 解析字節流string,返回解析出來的數據
calcsize(fmt) 返回(fmt)占用多少字節數
fmt 可為:
使用方法是放在fmt的第一個位置,就像'@5s6sif'。圖出自:嘎啦。
python 的 struct 模塊彌補了 python 處理底層字節流信息不方便的不足。什么是字節流信息呢?比如 TCP 傳來一段 C 結構體形式的數據:
用 python 程序接收,接收到的其實就是一段二進制數字,python 沒有辦法很方便的使用 c 的結構體來解析這些數據,這時 struct 模塊就派上用場了。
使用 python 的 struct 模塊,提取出 MNIST 中的圖片,并保存為 bmp 格式
這里還是以數據量較小的測試集為例。首先,我們把數據集讀入內存:
然后,讀出數據集的頭信息,
接著,就可以讀出 28x28=784 字節的圖片數據了。
得到數據后,使用 python 的 Image 模塊,就可以很輕松的把數據保存為 bmp 圖片了。
運行之,在 images 文件夾里得到了 1.bmp 文件,打開,發現是期望的手寫數字。
接下來,加個 for 循環,就可以把全部圖片提取出來了,完整代碼如下:
運行之,發現 10000 張測試集的圖片已經全部被我們提取并保存為 bmp 圖片了。
總結
以上是生活随笔為你收集整理的用python将照片做成数据集_python实战项目,struct模块的使用,将MNIST数据集转换为bmp图片...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cookie的max age
- 下一篇: kernel logo 生成方法