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