欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)識別手寫數(shù)字 簡易圖片存儲管理系統(tǒng)

 更新時間:2018年01月29日 11:53:03   作者:Hanpu_Liang  
這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)識別手寫數(shù)字,簡易圖片存儲管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下

寫在前面

上一篇文章Python實現(xiàn)識別手寫數(shù)字—圖像的處理中我們講了圖片的處理,將圖片經(jīng)過剪裁,拉伸等操作以后將每一個圖片變成了1x10000大小的向量。但是如果只是這樣的話,我們每一次運(yùn)行的時候都需要將他們計算一遍,當(dāng)圖片特別多的時候會消耗大量的時間。

所以我們需要將這些向量存入一個文件當(dāng)中,每次先看看圖庫中有沒有新增的圖片,如果有新增的圖片,那么就將新增的圖片變成1x10000向量再存入文件之中,然后從文件中讀取全部圖片向量即可。當(dāng)圖庫中沒有新增圖片的時候,那么就直接調(diào)用文件中的圖片向量進(jìn)行計算就好。這樣子算是節(jié)省了大量的時間。

所以本文就是從零開始建立一個這樣的圖片存儲管理系統(tǒng)。

實現(xiàn)邏輯

第一次讀入圖片

我們的圖庫中擁有一大堆圖片,每一張圖片上面都是一個手寫的數(shù)字,圖片的名稱為[數(shù)字內(nèi)容]_[序號]。比如說一個圖片的名稱為2_3,代表這一張圖片里面的數(shù)字是2,并且是“數(shù)字是2的第3張圖片”。

存在一個csv文件作為我們的建議的圖片數(shù)據(jù)庫,名稱為Data.csv。

首先我們讀取圖庫中所有圖片的名稱,保存在fileNames中。然后讀取Data.csv中所有數(shù)據(jù)。

提取出Data.csv的最后一列(一共10002列,第10001列說明該數(shù)字是什么數(shù)字,第10002列是圖片的名稱),也就是數(shù)據(jù)庫中存儲的所有圖片的名稱,存儲在item中。

將新加入圖庫的圖片名稱保存在newFileNames中。如果Data.csv為空,那么就直接令newFileNames = fileNames。也就是說如果數(shù)據(jù)庫中什么也沒有,那么圖庫中所有圖片都是新加入的。

如果Data.csv不為空,那么就將item里面的內(nèi)容與fileNames的內(nèi)容比較,如果出現(xiàn)了fileNames里面有的名稱item中沒有,那么就將這些名稱放進(jìn)newFileNames中。如果item里有的名稱fileNames中沒有,那就不管。

也就是說,我令我們的數(shù)據(jù)庫只進(jìn)不出。

現(xiàn)在我們得到了新加入圖庫的圖片的名稱newFileNames。

將newFileNames中的名稱的圖片帶入上一文中函數(shù)GetTrainPicture進(jìn)行處理,得到了一個nx10001的矩陣,每一行代表一個新加入的圖片,前10000列是圖片向量,第10001列是該圖片的數(shù)字,保存在pic中。

將這些圖片壓入到數(shù)據(jù)庫的后面。

讀取之前數(shù)據(jù)庫原有的圖片向量,并與pic合并,得到目前擁有的所有的訓(xùn)練圖片向量pic。

以上就是本章寫的所有內(nèi)容,下面放出代碼來詳細(xì)解釋一下。

代碼解析

主文件

import os
import numpy as np
import OperatePicture as OP
import OperateDataBase as OD
import csv

##Essential vavriable 基礎(chǔ)變量
#Standard size 標(biāo)準(zhǔn)大小
N = 100
#Gray threshold 灰度閾值
color = 100/255

#讀取原CSV文件
reader = list(csv.reader(open('DataBase.csv', encoding = 'utf-8')))
#清除讀取后的第一個空行
del reader[0]
#讀取num目錄下的所有文件名
fileNames = os.listdir(r"./num/")
#對比fileNames與reader,得到新增的圖片newFileNames
newFileNames = OD.NewFiles(fileNames, reader)
print('New pictures are: 'newFileNames)
#得到newFilesNames對應(yīng)的矩陣
pic = OP.GetTrainPicture(newFileNames)
#將新增圖片矩陣存入CSV中
OD.SaveToCSV(pic, newFileNames)
#將原數(shù)據(jù)庫矩陣與新數(shù)據(jù)庫矩陣合并
pic = OD.Combination(reader, pic)

我將兩節(jié)內(nèi)容分別封裝在兩個py文件里面,上一篇文章中的圖片的切割與處理等所有內(nèi)容我放在文件OperatePicture里面了,這一節(jié)的數(shù)據(jù)庫處理放在了文件OperateDatabase里面。

因為整個代碼的邏輯我在上面已經(jīng)捋過一遍了,所以我不再解釋其中的內(nèi)容,接下來針對每個函數(shù)開始講解。

OperateDatabase代碼

從上面的主文件中,我們首先用到了函數(shù)NewFiles,主要是對比fileNames和reader這兩個文件中圖片的名稱有什么不同,返回值是新增的圖片的名稱的列表。下面是代碼

def NewFiles(fileNames, reader):
 '''判斷是否有不同于數(shù)據(jù)庫中的新文件加入'''
 #如果數(shù)據(jù)庫中沒有數(shù)據(jù),則返回filenames
 if len(reader) == 0:
  return fileNames
 else:
  #從數(shù)據(jù)庫中提取所有名稱
  files = [item[10001] for item in reader]
  #需要加入的圖片名稱
  newFileNames = []
  for item in fileNames:
   #判斷當(dāng)前名稱是否存在數(shù)據(jù)庫中
   #如果不存在,則加入newFileNames
   if item not in files:
    newFileNames.append(item)
  return newFileNames

首先判斷reader是否有內(nèi)容,如果沒有內(nèi)容,說明是第一次執(zhí)行,那么會直接把fileNames返回。否則才會進(jìn)入下面進(jìn)行比較。

返回了newFileNames之后,就會把這個列表中的所有名稱的圖片通過GetTrainPicture函數(shù)得到一個1x10001大小的矩陣,具體過程請看我上一篇文章講的內(nèi)容。

之后為了把新的數(shù)據(jù)存入CSV文件中,我們利用函數(shù)SaveToCSV將pic存入文件中,具體代碼如下。

def SaveToCSV(pic, fileNames):
 '''將pic與對應(yīng)的dileNames存入CSV文件'''
 writer = csv.writer(open('Database.csv', 'a', newline = ''), dialect = 'excel')
 #將fileNames變?yōu)榱斜?
 f = [item for item in fileNames]
 #每一行依次寫入文件中
 for i in range(len(pic)):
  #將改行圖片向量轉(zhuǎn)為list
  item = pic[i].tolist()
  #將這個圖片向量對應(yīng)的名稱f放入列表最后一個
  item.append(f[i])
  writer.writerow(item)

當(dāng)函數(shù)運(yùn)行過后,會把pic矩陣對應(yīng)的內(nèi)容直接給續(xù)寫入CSV文件中,相當(dāng)于數(shù)據(jù)庫操縱的寫入,并不會覆蓋之前原有的數(shù)據(jù)。

之后我們需要將數(shù)據(jù)庫原有的一大堆數(shù)據(jù)reader和新加進(jìn)來的數(shù)據(jù)pic合并到pic里面,所以利用Combination函數(shù)將兩個矩陣合并,代碼如下

def Combination(reader, pic):
 '''將兩個矩陣reader與pic合并'''
 #兩個矩陣的總行數(shù)
 l = len(reader) + len(pic)
 #初始化新的矩陣
 newPic = np.zeros(l*10001).reshape(l, 10001)
 #將reader最后的那個字符串名稱去掉
 for item in reader:
  item.pop()
 #將reader轉(zhuǎn)化為numpy的矩陣形式
 reader = np.array(reader)
 #新矩陣前半部分放reader,后半部分放pic
 if len(reader) != 0:
  newPic[0:len(reader), :] = reader
 newPic[len(reader):len(pic), :] = pic
 return newPic

因為reader最后一行還包括了一個圖片的名稱,所以先利用pop將其去掉,之后轉(zhuǎn)化為矩陣形式,然后再直接放入矩陣中。這個矩陣操作可能沒有見過,下面我詳細(xì)解釋一下。

假如我現(xiàn)在有一個2x3的矩陣和一個2x2的矩陣

m = [[1 2 3]
  [4 5 6]]
n = [[7 8]
  [9 1]]

我可以進(jìn)行如下操作

#操作一
m[:, 0:2] = n
print(m)
#操作二
m[:, 1:3] = n
print(m)

#以下為輸出結(jié)果
#操作一
[[7 8 3]
 [9 1 6]]
#操作二
[[7 7 8]
 [9 9 1]]

可以看出操作一直接把m的第一二列給替換成n,操作二把m的第二三列替換成了n。具體過程可以百度查一下numpy的矩陣的操作,也可以自己總結(jié)規(guī)律,不細(xì)講了。

以上就是這一篇的全部代碼。

小結(jié)

這一篇我相當(dāng)于用CSV文件制作了一個非常簡陋的數(shù)據(jù)庫,能夠執(zhí)行的操作只有識別已有內(nèi)容NewFiles與添加內(nèi)容SaveToCSV,并沒有插入、刪改等操作。主要是我覺得這兩個函數(shù)目前已經(jīng)夠用,因此只寫了這兩個操作,所以再需求已經(jīng)被滿足的情況下就不再拓展了。

所有的源代碼已經(jīng)上傳到了我的GitHub上,可以前去下載,謝謝閱讀。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用graphviz畫流程圖過程解析

    Python使用graphviz畫流程圖過程解析

    這篇文章主要介紹了Python使用graphviz畫流程圖過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用PyInstaller庫把Python程序打包成exe

    使用PyInstaller庫把Python程序打包成exe

    這篇文章介紹了使用PyInstaller庫把Python程序打包成exe的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Python文件遍歷os.walk()與os.listdir()使用及說明

    Python文件遍歷os.walk()與os.listdir()使用及說明

    這篇文章主要介紹了Python文件遍歷os.walk()與os.listdir()使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • pytorch張量和numpy數(shù)組相互轉(zhuǎn)換

    pytorch張量和numpy數(shù)組相互轉(zhuǎn)換

    在使用pytorch作為深度學(xué)習(xí)的框架時,經(jīng)常會遇到張量tensor和矩陣numpy的類型的相互轉(zhuǎn)化的問題,本文主要介紹了pytorch張量和numpy數(shù)組相互轉(zhuǎn)換,感興趣的可以了解一下
    2024-02-02
  • Python利用matplotlib模塊數(shù)據(jù)可視化繪制3D圖

    Python利用matplotlib模塊數(shù)據(jù)可視化繪制3D圖

    matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地行制圖,下面這篇文章主要給大家介紹了關(guān)于Python利用matplotlib模塊數(shù)據(jù)可視化實現(xiàn)3D圖的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 完美解決pyinstaller打包報錯找不到依賴pypiwin32或pywin32-ctypes的錯誤

    完美解決pyinstaller打包報錯找不到依賴pypiwin32或pywin32-ctypes的錯誤

    這篇文章主要介紹了完美解決pyinstaller打包報錯找不到依賴pypiwin32或pywin32-ctypes的錯誤,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • tensorflow實現(xiàn)邏輯回歸模型

    tensorflow實現(xiàn)邏輯回歸模型

    這篇文章主要為大家詳細(xì)介紹了tensorflow實現(xiàn)邏輯回歸模型的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python定時檢查某個進(jìn)程是否已經(jīng)關(guān)閉的方法

    python定時檢查某個進(jìn)程是否已經(jīng)關(guān)閉的方法

    這篇文章主要介紹了python定時檢查某個進(jìn)程是否已經(jīng)關(guān)閉的方法,涉及Python進(jìn)程與時間的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • Python爬蟲抓取指定網(wǎng)頁圖片代碼實例

    Python爬蟲抓取指定網(wǎng)頁圖片代碼實例

    這篇文章主要介紹了Python爬蟲抓取指定網(wǎng)頁圖片代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 基于Python的OCR實現(xiàn)示例

    基于Python的OCR實現(xiàn)示例

    這篇文章主要介紹了基于Python的OCR實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論