? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? by SA16225335,吳倩? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
一 簡(jiǎn)介
? ? ? 2016年科大網(wǎng)絡(luò)程序設(shè)計(jì)課程即將結(jié)束,筆者在這里寫下人生的第一篇博客,來(lái)總結(jié)一下這門課程給我?guī)?lái)的啟發(fā)和提升,并且作為人生的又一個(gè)起點(diǎn)開始生命的下一次征程。首先在這里要感謝孟寧老師的教導(dǎo),孟寧老師在課程中一反常態(tài),并沒(méi)有使用傳統(tǒng)的上課授課的方式,而是采用項(xiàng)目驅(qū)動(dòng)的方法,由學(xué)生在老師的帶動(dòng)下主動(dòng)開發(fā),在這門課程中,班里70多個(gè)學(xué)生共同完成了這個(gè)項(xiàng)目。作為一個(gè)菜鳥,我必須慚愧的承認(rèn)我對(duì)這個(gè)項(xiàng)目并沒(méi)有什么直接的貢獻(xiàn),只在PPT知識(shí)共享時(shí),對(duì)Theano框架的知識(shí)進(jìn)行了共享?!傲只ㄖx了春紅,太匆匆,無(wú)奈朝來(lái)寒雨晚來(lái)風(fēng)”,時(shí)光總是匆匆,在這門課中,我完整的學(xué)習(xí)了python語(yǔ)法,理解了關(guān)于神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的原理,并且對(duì)CNN,RNN,深度學(xué)習(xí)框架及圖像處理有了一定的了解。在這個(gè)寒假,我將繼續(xù)學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的相關(guān)知識(shí)。堅(jiān)持總會(huì)有結(jié)果,明年我會(huì)繼續(xù)選修孟寧老師的高軟課程,定跟上老師步伐??傊兄x老師讓我踏入新世界的大門。
二 什么是深度學(xué)習(xí)
? ? ? ?Andrew Ng曾經(jīng)說(shuō)過(guò)“我們相信(神經(jīng)網(wǎng)絡(luò)代表的深度學(xué)習(xí))是讓我們獲得最接近于人工智能的捷徑”。這就是我們要學(xué)習(xí)深度學(xué)習(xí)的重要的原因。相對(duì)于網(wǎng)絡(luò)上一提到神經(jīng)網(wǎng)絡(luò)就會(huì)提到的反向傳播,激活函數(shù),特征基向量,卷積神經(jīng)網(wǎng)絡(luò),筆者在這里想用自己淺薄的知識(shí)來(lái)談?wù)勛约簩?duì)神經(jīng)網(wǎng)絡(luò)的理解。
? ? ? 我在接觸神經(jīng)網(wǎng)絡(luò)之前,曾看過(guò)一個(gè)關(guān)于對(duì)生物體大腦形象化的描述,人的大腦中有成千上億的神經(jīng)元細(xì)胞(甚至更多),它們都長(zhǎng)著像電線一樣的軸突,神經(jīng)元在我們的大腦中構(gòu)成一個(gè)網(wǎng)狀結(jié)構(gòu),當(dāng)人們對(duì)外部事件進(jìn)響應(yīng)時(shí),神經(jīng)元細(xì)胞會(huì)產(chǎn)生興奮也就是化學(xué)信號(hào)順著神經(jīng)元的網(wǎng)狀結(jié)構(gòu)進(jìn)行傳播,最終產(chǎn)生人的各種反應(yīng)。以上相應(yīng)凡有高中學(xué)歷的大家都了解整個(gè)過(guò)程,故而不進(jìn)行詳述。而進(jìn)行深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò),就是根據(jù)大腦的反饋機(jī)構(gòu)進(jìn)行設(shè)計(jì)的。最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)一般有三層,第一層是輸入層,第二層是隱藏層,第三層是輸出層,第一層輸入數(shù)據(jù)后,隱藏層根據(jù)自己神經(jīng)上的比重對(duì)輸入層數(shù)據(jù)進(jìn)行自己的處理,最后在第三層輸出層進(jìn)行輸出。我們把神經(jīng)網(wǎng)絡(luò)假設(shè)為一個(gè)小孩,在他的成長(zhǎng)過(guò)程中,他將不斷的接收到各種各樣的信息,而神經(jīng)網(wǎng)絡(luò)也是如此,我們不斷的用各種數(shù)據(jù)訓(xùn)練它,是他在隱藏層的每個(gè)分支都有不同的權(quán)重,在訓(xùn)練過(guò)程中,權(quán)重不斷的變化,當(dāng)訓(xùn)練集達(dá)到一個(gè)數(shù)量時(shí),會(huì)得到一個(gè)相對(duì)穩(wěn)定的權(quán)重,這就如同大腦中的電信號(hào)傳播一樣,每個(gè)神經(jīng)元都帶著不同大小的神經(jīng)信號(hào),最后形成人的各種反應(yīng),而神經(jīng)網(wǎng)絡(luò)也是如此。我們不斷的訓(xùn)練它,使它不斷的糾正自己,最后實(shí)現(xiàn)預(yù)測(cè)功能。
三 關(guān)于Theano的學(xué)習(xí)
3.1 Theano定義
Theano是一個(gè)Python庫(kù),專門用于定義、優(yōu)化、求值數(shù)學(xué)表達(dá)式,效率高,適用于多維數(shù)組。Theano是一個(gè)Python庫(kù),用于定義、優(yōu)化、求值數(shù)學(xué)表達(dá)式,即簡(jiǎn)單來(lái)說(shuō),它就是一個(gè)代數(shù)符號(hào)系統(tǒng)。在數(shù)學(xué)表達(dá)式中的一個(gè)符號(hào)就是一個(gè)variable對(duì)象,對(duì)象之間用加減乘除等操作符連接起來(lái),就變成一個(gè)圖,成為graph.在將theano運(yùn)用于神經(jīng)網(wǎng)絡(luò)時(shí),就是將網(wǎng)絡(luò)表示成一個(gè)巨大的公式。比如z=x+y這樣的表達(dá)式,就會(huì)組成成下面的圖。

代碼編寫如下:
import theano
from theano import tensor
# declare two symbolic floating-point scalars
a = tensor.dscalar()
b = tensor.dscalar()
# create a simple expression
c = a + b
# convert the expression into a callable object that takes (a,b)
# values as input and computes a value for c
f = theano.function([a,b], c)
# bind 1.5 to 'a', 2.5 to 'b', and evaluate 'c'
assert 4.0 == f(1.5, 2.5)
3.2 使用Theano的優(yōu)勢(shì)
1.使研究深度學(xué)習(xí)的各位們減少花在推導(dǎo)數(shù)和實(shí)現(xiàn)算法上的精力。
2.? 緊密集成Numpy,在Theano的編譯函數(shù)中使用numpy.ndarray
3.透明的使用Gpu,使得執(zhí)行數(shù)據(jù)密集型的計(jì)算速度高達(dá)CPU的140倍
4.高效的符號(hào)分解---替你計(jì)算一個(gè)或多個(gè)輸入函數(shù)的推導(dǎo)
5.速度和穩(wěn)定性優(yōu)化
6.動(dòng)態(tài)生成C語(yǔ)言代碼,計(jì)算表達(dá)式更快速
7.廣泛的單元測(cè)試和自我驗(yàn)證,能檢測(cè)和診斷許多類型的錯(cuò)誤
8.讓你輕松的編寫Deep Learning模型,并提供運(yùn)行在GPU上的選擇,他使得構(gòu)建學(xué)習(xí)模型更加容易
3.3 為什么使用Theano
1.深度學(xué)習(xí)最好使用一些庫(kù),比如Theano。主要是因?yàn)榉聪騻鞑フ{(diào)整參數(shù)時(shí),需要求導(dǎo)。鏈?zhǔn)角髮?dǎo)本身沒(méi)有難處。
但是深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)的比較復(fù)雜,層數(shù)又多(15層不是夢(mèng))。
在隱藏層多的神經(jīng)網(wǎng)絡(luò)中,推導(dǎo)公式不忍直視,人工求導(dǎo)顯然不是明智的。
Theano提供了grad梯度函數(shù),自動(dòng)根據(jù)表達(dá)式求一階導(dǎo)數(shù),grad(cost,param),其中cost函數(shù)可以是一個(gè)超長(zhǎng)超長(zhǎng)的表達(dá)式。
param則可以是一個(gè)超大超大的數(shù)組或是矩陣。
顯然,有了grad函數(shù),我們可以專心設(shè)計(jì)正向傳播的I/O,反向傳播只要一個(gè)grad函數(shù)即可。省去了復(fù)雜的公式推導(dǎo)
2.使用Python組織邏輯,C編譯執(zhí)行,CUDA并行加速計(jì)算,是非常好的實(shí)驗(yàn)平臺(tái)。
它的庫(kù)源碼中包含大量注釋,并且提供深度學(xué)習(xí)的幾個(gè)基本模型的代碼實(shí)現(xiàn)文檔。
每篇文檔都采用paper的形式,集中了許多大牛的論文的精華、各種小trick,也給出了論文的具體引用,方便按圖索驥。
CUDA(Compute Unified Device Architecture),顯卡廠商N(yùn)Vidia推出的運(yùn)算平臺(tái)。 CUDA?是一種由NVIDIA推出的通用并行計(jì)算架構(gòu),該架構(gòu)使GPU能夠解決復(fù)雜的計(jì)算問(wèn)題。 它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計(jì)算引擎。
3.4 原理介紹
在Theano中,每個(gè)可導(dǎo)運(yùn)算都帶有一個(gè)grad函數(shù),對(duì)應(yīng)于圖中每一步單獨(dú)的求導(dǎo)(邊)。比如 theano.tensor.nnet.sigmoid :
def grad(self, inp, grads):
x, = inp
gz, = grads
y = scalar_sigmoid(x)
rval = gz * y * (1.0 - y)
assert rval.type.dtype.find('float') != -1
return [rval]
對(duì)所有可導(dǎo)運(yùn)算使用鏈?zhǔn)椒▌t,即在圖中沿著邊和節(jié)點(diǎn)傳播,就求出了最后我們想要的導(dǎo)數(shù)。整個(gè)過(guò)程大抵如此,細(xì)節(jié)部分可以翻看一下這篇博客。http://colah.github.io/posts/2015-08-Backprop/
3.5 原理介紹
Theano基于Python的面向?qū)ο?,所以它的神?jīng)網(wǎng)絡(luò)也是基于面向?qū)ο蟮乃悸啡懙摹?br>
【對(duì)象】
它認(rèn)為,淺層網(wǎng)絡(luò)的中分類器,深度網(wǎng)絡(luò)中的每個(gè)層,都是一個(gè)對(duì)象。
在這個(gè)對(duì)象里,你被指定了輸入格式,你只需要做兩件事:
根據(jù)格式,定義參數(shù)、定義輸出。
【數(shù)據(jù)讀入/處理】
從文件讀入數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行全局分享處理(shared)
theano.tensor中封裝的著大量的惰性函數(shù)。這些惰性函數(shù),在Python里是不會(huì)執(zhí)行的。需要在theano.function()里執(zhí)行。
【主過(guò)程:前向傳播構(gòu)建&反向傳播迭代】
創(chuàng)建各個(gè)神經(jīng)網(wǎng)絡(luò)層、分類器的實(shí)例對(duì)象,由I/O首尾相連,最后利用分類器構(gòu)建cost函數(shù),完成前向傳播。
利用各個(gè)層對(duì)象的參數(shù)、cost函數(shù),構(gòu)建梯度表達(dá)式,以及updates列表。
為訓(xùn)練集、驗(yàn)證集、測(cè)試集創(chuàng)建以theano.function()為殼的模型。
使用mini-batch梯度法分批訓(xùn)練訓(xùn)練集,測(cè)試驗(yàn)
3.6 編程基礎(chǔ)
theano.tensor常用數(shù)據(jù)類型
學(xué)習(xí)theano,首先要學(xué)的就是theano.tensor使用,其是基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),功能類似于Python.numpy,教程網(wǎng)站為:http://deeplearning.Net/software/theano/library/tensor/basic.html
在theano.tensor數(shù)據(jù)類型中,有double、int、uchar、float等各種類型,不過(guò)我們最常用到的是int和float類型,float是因?yàn)镚PU一般是float32類型,所以在編寫程序的時(shí)候,我們很少用到double,常用的數(shù)據(jù)類型如下:
數(shù)值:iscalar(int類型的變量)、fscalar(float類型的變量)
一維向量:ivector(int 類型的向量)、fvector(float類型的向量)、
二維矩陣:fmatrix(float類型矩陣)、imatrix(int類型的矩陣)
三維float類型矩陣:ftensor3
四維float類型矩陣:ftensor4
其它類型只要把首字母變一下就可以了,更多類型請(qǐng)參考:http://deeplearning.net/software/theano/library/tensor/basic.html#theano.tensor.TensorV
3.7 編程實(shí)例
實(shí)例1:
import theano
x=theano.tensor.iscalar('x')#聲明一個(gè)int類型的變量x
y=theano.tensor.pow(x,3)#定義y=x^3
f=theano.function([x],y)#定義函數(shù)的自變量為x(輸入),因變量為y(輸出)
print f(2)#計(jì)算當(dāng)x=2的時(shí)候,函數(shù)f(x)的值
print f(4)#計(jì)算當(dāng)x=4時(shí),函數(shù)f(x)=x^3的值
實(shí)例2:
import theano
x =theano.tensor.fscalar('x')#定義一個(gè)float類型的變量x
y= 1 / (1 + theano.tensor.exp(-x))#定義變量y
f= theano.function([x],y)#定義函數(shù)f,輸入為x,輸出為y
print f(3)#計(jì)算當(dāng)x=3的時(shí)候,y的值
例3:function使用示例
我們?cè)倏匆粋€(gè)多個(gè)自變量、同時(shí)又有多個(gè)因變量的函數(shù)定義例子:
import theano
x, y =theano.tensor.fscalars('x', 'y')
z1= x + y
z2=x*y
f =theano.function([x,y],[z1,z2])#定義x、y為自變量,z1、z2為函數(shù)返回值(因變量)
print f(2,3)#返回當(dāng)x=2,y=3的時(shí)候,函數(shù)f的因變量z1,z2的值 為x,輸出為y
print f(3)#計(jì)算當(dāng)x=3的時(shí)候,y的值
3.8 學(xué)習(xí)深度學(xué)習(xí)必須要學(xué)習(xí)的幾個(gè)函數(shù)
例1、求偏導(dǎo)數(shù)
theano有個(gè)很好用的函數(shù),就是求函數(shù)的偏導(dǎo)數(shù)theano.grad(),比如上面的S函數(shù),我們要求當(dāng)x=3的時(shí)候,s函數(shù)的導(dǎo)數(shù),代碼如下:
import theano
x =theano.tensor.fscalar('x')#定義一個(gè)float類型的變量x
y= 1 / (1 + theano.tensor.exp(-x))#定義變量y
dx=theano.grad(y,x)#偏導(dǎo)數(shù)函數(shù)
f= theano.function([x],dx)#定義函數(shù)f,輸入為x,輸出為s函數(shù)的偏導(dǎo)數(shù)
print f(3)#計(jì)算當(dāng)x=3的時(shí)候,函數(shù)y的偏導(dǎo)數(shù)
例2、共享變量
共享變量是多線程編程中的一個(gè)名詞,故名思議就是各線程,公共擁有的變量,這個(gè)是為了多線程高效計(jì)算、訪問(wèn)而使用的變量。因?yàn)樯疃葘W(xué)習(xí)中,我們整個(gè)計(jì)算過(guò)程基本上是多線程計(jì)算的,于是就需要用到共享變量。在程序中,我們一般把神經(jīng)網(wǎng)絡(luò)的參數(shù)W、b等定義為共享變量,因?yàn)榫W(wǎng)絡(luò)的參數(shù),基本上是每個(gè)線程都需要訪問(wèn)的。
import theano
import numpy
A=numpy.random.randn(3,4);#隨機(jī)生成一個(gè)矩陣
x = theano.shared(A)#從A,創(chuàng)建共享變量x
print x.get_value()
通過(guò)get_value()、set_value()可以查看、設(shè)置共享變量的數(shù)值
例3、共享變量參數(shù)更新
前面我們提到theano.function函數(shù),有個(gè)非常重要的參數(shù)updates,updates是一個(gè)包含兩個(gè)元素的列表或tuple,updates=[old_w,new_w],當(dāng)函數(shù)被調(diào)用的時(shí)候,這個(gè)會(huì)用new_w替換old_w,具體看一下下面例子:
import theano
w= theano.shared(1)#定義一個(gè)共享變量w,其初始值為1
x=theano.tensor.iscalar('x')
f=theano.function([x], w, updates=[[w, w+x]])#定義函數(shù)自變量為x,因變量為w,當(dāng)函數(shù)執(zhí)行完畢后,更新參數(shù)w=w+x
print f(3)#函數(shù)輸出為w
print w.get_value()#這個(gè)時(shí)候可以看到w=w+x為4
這個(gè)主要用于梯度下降的時(shí)候,要用到。比如updates=[w,w-α*(dT/dw)],其中dT/dw就是我們梯度下降的時(shí)候,損失函數(shù)對(duì)參數(shù)w的偏導(dǎo)數(shù),α是學(xué)習(xí)率。
3.9 應(yīng)用方向
邏輯回歸,三層神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)等
四 ?項(xiàng)目簡(jiǎn)介
4.1 項(xiàng)目地址
coding.net:https://coding.net/u/sharon12/p/np2016-1765866307/git/tree/master
4.2 項(xiàng)目概述
?4.2.1 項(xiàng)目功能
輸入血常規(guī)圖片,程序通過(guò)處理圖片上的數(shù)據(jù),進(jìn)行性別和年齡的預(yù)測(cè)。(暫只能處理獨(dú)墅湖高教區(qū)的體檢單)
?4.2.2 具體流程
輸入圖片->圖片OCR識(shí)別->將識(shí)別出來(lái)的數(shù)值存入MongoDB->根據(jù)機(jī)器學(xué)習(xí)方法生成模型并進(jìn)行預(yù)測(cè)
?4.2.3 項(xiàng)目概要
該項(xiàng)目主要分為三個(gè)部分。第一部分是web端圖片的導(dǎo)入和結(jié)果的顯示;第二部分是OCR識(shí)別模塊,用來(lái)進(jìn)行圖片的處理并將處理數(shù)據(jù)存儲(chǔ)進(jìn)mongodb;第三部分是學(xué)習(xí)預(yù)測(cè)模塊,用來(lái)進(jìn)行性別和年齡的預(yù)測(cè)。
4.3 運(yùn)行環(huán)境
?安裝前置依賴
# 安裝 Python 發(fā)布版本,dev包必須安裝,很多用pip安裝包都需要編譯
sudo apt-get install python2.7 python2.7-dev python3.2 python3.2-dev
# 很多pip安裝的包都需要libssl和libevent編譯環(huán)境
sudo apt-get install build-essential libssl-dev libevent-dev libjpeg-dev libxml2-dev libxslt-dev
安裝python模塊
PS: 裝python模塊時(shí)最好每一步進(jìn)入python命令行嘗試import是否成功
# 安裝pip
sudo apt-get install python-pip
# 安裝numpy,
sudo apt-get install python-numpy # http://www.numpy.org/
# 安裝opencv
sudo apt-get install python-opencv # http://opencv.org/
#裝完后需要更新環(huán)境變量
vim /etc/bash.bashrc
#在文件末尾添加兩行代碼
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/dist-packages
export PYTHONPATH="${PYTHONPATH+${PYTHONPATH}:}/usr/local/lib/python2.7/site-packages"
##安裝OCR和預(yù)處理相關(guān)依賴
sudo apt-get install tesseract-ocr
sudo pip install pytesseract
sudo apt-get install python-tk
sudo pip install pillow
# 安裝Flask框架、mongo
sudo pip install Flask
sudo apt-get install mongodb # 如果找不到可以先sudo apt-get update
sudo service mongodb started
sudo pip install pymongo
如果import cv2報(bào)no module name cv2。需要從源碼編譯opencv安裝,教程地址如下:OPENCV2.4.9源碼安裝
安裝tensorflow
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc0-cp27-none-linux_x86_64.whl
運(yùn)行demo
cd? BloodTestReportOCR
python view.py # upload圖像,在瀏覽器打開http://yourip:8080
4.4 部分文件功能簡(jiǎn)介
view.py
Web 端上傳圖片到服務(wù)器,存入mongodb并獲取oid
imageFilter.py
對(duì)圖像透視裁剪和OCR進(jìn)行了簡(jiǎn)單的封裝,以便于模塊間的交互,規(guī)定適當(dāng)?shù)慕涌?/p>
imageFilter = ImageFilter() # 可以傳入一個(gè)opencv格式打開的圖片
num = 22
print imageFilter.ocr(num)
ocr函數(shù) - 模塊主函數(shù)返回識(shí)別數(shù)據(jù)
用于對(duì)img進(jìn)行ocr識(shí)別,他會(huì)先進(jìn)行剪切,之后進(jìn)一步做ocr識(shí)別,返回一個(gè)json對(duì)象 如果剪切失敗,則返回None @num 規(guī)定剪切項(xiàng)目數(shù)
perspect函數(shù)做 - 初步的矯正圖片
用于透視image,他會(huì)緩存一個(gè)透視后的opencv numpy矩陣,并返回該矩陣 透視失敗,則會(huì)返回None,并打印不是報(bào)告 @param 透視參數(shù)
關(guān)于param
參數(shù)的形式為[p1, p2, p3 ,p4 ,p5]。 p1,p2,p3,p4,p5都是整型,其中p1必須是奇數(shù)。
p1是高斯模糊的參數(shù),p2和p3是canny邊緣檢測(cè)的高低閾值,p4和p5是和篩選有關(guān)的乘數(shù)。
如果化驗(yàn)報(bào)告單放在桌子上時(shí),有的邊緣會(huì)稍微翹起,產(chǎn)生比較明顯的陰影,這種陰影有可能被識(shí)別出來(lái),導(dǎo)致定位失敗。 解決的方法是調(diào)整p2和p3,來(lái)將陰影線篩選掉。但是如果將p2和p3調(diào)的比較高,就會(huì)導(dǎo)致其他圖里的黑線也被篩選掉了。 參數(shù)的選擇是一個(gè)問(wèn)題。 前列們?cè)趃etinfo.default中設(shè)置的是一個(gè)較低的閾值,p2=70,p3=30,這個(gè)閾值不會(huì)屏蔽陰影線。 如果改為p2=70,p3=50則可以屏蔽,但是會(huì)導(dǎo)致其他圖片識(shí)別困難。
就現(xiàn)在來(lái)看,得到較好結(jié)果的前提主要有三個(gè)
化驗(yàn)單盡量平整
圖片中應(yīng)該包含全部的三條黑線
圖片盡量不要包含化驗(yàn)單的邊緣,如果有的話,請(qǐng)盡量避開有陰影的邊緣。
filter函數(shù) - 過(guò)濾掉不合格的或非報(bào)告圖片
返回img經(jīng)過(guò)透視過(guò)后的PIL格式的Image對(duì)象,如果緩存中有PerspectivImg則直接使用,沒(méi)有先進(jìn)行透視 過(guò)濾失敗則返回None @param filter參數(shù)
autocut函數(shù) - 將圖片中性別、年齡、日期和各項(xiàng)目名稱數(shù)據(jù)分別剪切出來(lái)
用于剪切ImageFilter中的img成員,剪切之后臨時(shí)圖片保存在out_path, 如果剪切失敗,返回-1,成功返回0 @num 剪切項(xiàng)目數(shù) @param 剪切參數(shù)
剪切出來(lái)的圖片在BloodTestReportOCR/temp_pics/ 文件夾下
函數(shù)輸出為data0.jpg,data1.jpg……等一系列圖片,分別是白細(xì)胞計(jì)數(shù),中性粒細(xì)胞記數(shù)等的數(shù)值的圖片。
classifier.py
用于判定裁剪矯正后的報(bào)告和裁剪出檢測(cè)項(xiàng)目的編號(hào)
imgproc.py
將識(shí)別的圖像進(jìn)行處理二值化等操作,提高識(shí)別率 包括對(duì)中文和數(shù)字的處理
digits
將該文件替換Tesseract-OCR\tessdata\configs中的digits
4.5 實(shí)驗(yàn)結(jié)果
首先在終端輸入view.py,在后臺(tái)會(huì)展示index.html頁(yè)面,在頁(yè)面選擇文件上傳并點(diǎn)擊提交,后臺(tái)會(huì)調(diào)用imageFilter.py中的ocr,對(duì)圖像進(jìn)行灰度化,裁剪和OCR識(shí)別,并將圖片和識(shí)別出來(lái)的數(shù)據(jù)存入數(shù)據(jù)庫(kù)并在頁(yè)面進(jìn)行展示

然后點(diǎn)擊生成報(bào)告,這次程序中根據(jù)fid將數(shù)據(jù)從mongodb數(shù)據(jù)庫(kù)中讀出數(shù)據(jù),并在頁(yè)面上進(jìn)行展示,讀取不準(zhǔn)確的地方可以修改。

最后,我們調(diào)用已經(jīng)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),將數(shù)據(jù)輸入進(jìn)去進(jìn)行預(yù)測(cè),以下是預(yù)測(cè)結(jié)果。

由于筆者并沒(méi)有直接參與實(shí)驗(yàn)代碼的編寫,故這里只敘述了關(guān)于整個(gè)實(shí)驗(yàn)的主要文件的用途和運(yùn)行的詳細(xì)過(guò)程,并對(duì)自己分享的Theano框架進(jìn)行了詳細(xì)的介紹。若想要了解更多關(guān)于本次實(shí)驗(yàn)更細(xì)致的事情,請(qǐng)參考以下鏈接:
1.http://blog.csdn.net/u014659656/article/details/53887507#課程心得體會(huì)
2.http://rp38.cn/2016/12/25/np2016/
在那里,你會(huì)得到關(guān)于更多實(shí)驗(yàn)詳盡的描述。
五 個(gè)人心得
? ? ? 自從來(lái)到科大后,才感覺(jué)到大神林立,然而自己對(duì)時(shí)間的利用卻并不充分。這門課中,也是僅僅能夠跟上項(xiàng)目更新的步伐。在接下來(lái)的日子里,會(huì)繼續(xù)對(duì)不足的知識(shí)點(diǎn)進(jìn)行學(xué)習(xí),更加深入的理解神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的知識(shí),做更多關(guān)于這一方面的研究。
六 學(xué)習(xí)鏈接
2.theano文檔