圖片識別
Caffe,全稱Convolutional Architecture for Fast Feature Embedding,是一個計算CNN相關算法的框架总寒。
Docker
Docker 是一個開源的應用容器引擎灭必,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的linux機器上掸刊,也可實現(xiàn)虛擬化免糕。容器是完全使用沙箱機制,相互之間不會有任何接口忧侧。
AWS
AWS BPM業(yè)務流程管理開發(fā)平臺是一個易于部署和使用的業(yè)務流程管理基礎平臺軟件石窑,AWS平臺提供了從業(yè)務流程梳理、建模到運行蚓炬、監(jiān)控松逊、優(yōu)化的全周期管理和面向角色的BPM Total Solution。
OpenCV
它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成肯夏,同時提供了Python经宏、Ruby、MATLAB等語言的接口驯击,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法烁兰。 OpenCV用C++語言編寫,它的主要接口也是C++語言余耽,但是依然保留了大量的C語言接口缚柏。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。
OpenCV自帶例子中碟贾,提供了boost币喧,mlp轨域,knearest,nbayes杀餐,svm干发,rtrees這些機器學習方法,進行訓練和識別史翘。
處理的步驟和方式都類似枉长。這些例子的識別率不是很高,OCR識別率在90%以上才有較好的使用意義琼讽,所以必峰,OCR還需要更多特征和分析方法,來提高識別率钻蹬,tesseract是一個不錯的開源OCR引擎吼蚁。
數(shù)字識別的步驟
ROI抽取、訓練问欠、識別
1.ROI抽取即將感興趣的區(qū)域從原始圖像中分離肝匆,該步驟包括二值化,噪點的消除等顺献。直接將整個圖像作為特征數(shù)據(jù)維度太高旗国,計算量太大,可進行降維處理注整,拿到字符的ROI圖像能曾,二值化。將圖像分塊设捐,然后統(tǒng)計每個小塊中非0像素的個數(shù)借浊,這樣形成了一個較小的矩陣,這矩陣就是新的特征萝招。
灰度圖
2.訓練
3.識別即通過一些分類器將第一步中的結(jié)果進行分類,事實上屬于機器學習的一個典型應用
訓練和識別一般采用同一種方法存捺,目前普遍使用KNN、SVM捌治。
數(shù)據(jù)之美:在自然語言與機器翻譯領域,簡單模型加上大量有效樣本數(shù)據(jù)兼吓,比復雜模型加小樣本數(shù)據(jù),有效的多森枪。收集有效的视搏、大量的樣本庫很重要。
CNN
CNN的分類模型與傳統(tǒng)模型的不同點在于其可以直接將一幅二維圖像輸入模型中佑力,接著在輸出端即給出分類結(jié)果。其優(yōu)勢在于不需復雜的預處理筋遭,將特征抽取打颤,模式分類完全放入一個黑匣子中,通過不斷的優(yōu)化來獲得網(wǎng)絡所需參數(shù)漓滔,在輸出層給出所需分類,網(wǎng)絡核心就是網(wǎng)絡的結(jié)構(gòu)設計與網(wǎng)絡的求解反肋。這種求解結(jié)構(gòu)比以往多種算法性能更高踏施。
tesseract
google支持的開源的OCR圖文識別開源項目
1.tesseract 圖片名 輸出文件名 -l 字庫文件 -psm pagesegmode 配置文件
2.tesseract code.jpg result -l chi_sim -psm 7 nobatch
3.-l chi_sim 表示用簡體中文字庫(需要下載中文字庫文件,解壓后养距,存放到tessdata目錄下去,字庫文件擴展名為 .raineddata 簡體中文字庫文件名為: chi_sim.traineddata)
4.-psm 7 表示告訴tesseract code.jpg圖片是一行文本 這個參數(shù)可以減少識別錯誤率. 默認為 3
5.configfile 參數(shù)值為tessdata\configs 和 tessdata\tessconfigs 目錄下的文件名
cv2.imshow()
使用函數(shù)cv2.imshow() 顯示圖像。窗口會自動調(diào)整為圖像大小日熬。第一個參數(shù)是窗口的名字,其次才是我們的圖像耘纱。你可以創(chuàng)建多個窗口毕荐,只要你喜歡,但是必須給他們不同的名字憎亚。
cv2.waitKey()
一個鍵盤綁定函數(shù)。需要指出的是它的時間尺度是毫
秒級蝶锋。函數(shù)等待特定的幾毫秒什往,看是否有鍵盤輸入。特定的幾毫秒之內(nèi)躯舔,如果按下任意鍵驴剔,這個函數(shù)會返回按鍵的ASCII 碼值,程序?qū)^續(xù)運行庸毫。如果沒有鍵盤輸入罐呼,返回值為-1,如果我們設置這個函數(shù)的參數(shù)為0廊勃,那它將會無限期的等待鍵盤輸入橄务。
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
功能:對輸入的圖像src進行高斯濾波后用dst輸出
參數(shù):src和dst當然分別是輸入圖像和輸出圖像。Ksize為高斯濾波器模板大小挠乳,sigmaX和sigmaY分別為高斯濾波在橫線和豎向的濾波系數(shù)姑躲。borderType為邊緣擴展點插值類型。
.shape讀取矩陣的長度
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
獲得原圖像的副本卖怜,轉(zhuǎn)換成灰度圖
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
Sobel算子是一種帶方向的過濾器
前四個是必須的參數(shù):
第一個參數(shù)是需要處理的圖像阐枣;
第二個參數(shù)是圖像的深度,-1表示采用的是與原圖像相同的深度甩鳄。目標圖像的深度必須大于等于原圖像的深度额划;
dx和dy表示的是求導的階數(shù),0表示這個方向上沒有求導彬祖,一般為0品抽、1甜熔、2。
其后是可選的參數(shù):
dst不用解釋了盆昙;
ksize是Sobel算子的大小,必須為1淡喜、3炼团、5、7瘟芝。
scale是縮放導數(shù)的比例常數(shù)锌俱,默認情況下沒有伸縮系數(shù);
delta是一個可選的增量贸宏,將會加到最終的dst中,同樣诫龙,默認情況下沒有額外的值加到dst中线脚;
borderType是判斷圖像邊界的模式。這個參數(shù)默認值為cv2.BORDER_DEFAULT姊舵。
cv2.CV_16S
16位有符號的數(shù)據(jù)類型
Sobel函數(shù)求完導數(shù)后會有負值寓落,還有會大于255的值。而原圖像是uint8史飞,即8位無符號數(shù)仰税,所以Sobel建立的圖像位數(shù)不夠,會有截斷吐绵。因此要使用16位有符號的數(shù)據(jù)類型,即cv2.CV_16S唉窃。
cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
經(jīng)過處理后纹笼,別忘了用convertScaleAbs()函數(shù)將其轉(zhuǎn)回原來的uint8形式。否則將無法顯示圖像蔓涧,而只是一副灰色的窗口
其中可選參數(shù)alpha是伸縮系數(shù)牍疏,beta是加到結(jié)果上的一個值。結(jié)果返回uint8類型的圖片鳞陨。
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
由于Sobel算子是在兩個方向計算的厦滤,最后還需要用cv2.addWeighted(...)函數(shù)將其組合起來
其中alpha是第一幅圖片中元素的權(quán)重,beta是第二個的權(quán)重掏导,gamma是加到最后結(jié)果上的一個值趟咆。
np.absolute
x = np.array([-1.2, 1.2])
np.absolute(x)
array([ 1.2, 1.2])
np.absolute(1.2 + 1j)
1.5620499351813308
np.unit8
無符號整數(shù),0 至 255
np.sum(axis = 1)
每一行的元素相加
cv2.threshold
將得到的結(jié)果二值化
cv2.getStructuringElement(cv2.MORPH_RECT,(13,7))
定義結(jié)構(gòu)元素
用OpenCV-Python內(nèi)置的常量定義橢圓(MORPH_ELLIPSE)和十字形結(jié)構(gòu)(MORPH_CROSS)元素要簡單一些鳞贷,如果定義矩形(MORPH_RECT)和自定義結(jié)構(gòu)元素虐唠,則兩者差不多。
腐蝕和膨脹
<pre>
import cv2
import numpy as np
img = cv2.imread('D:/binary.bmp',0)
OpenCV定義的結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
腐蝕圖像
eroded = cv2.erode(img,kernel)
顯示腐蝕后的圖像
cv2.imshow("Eroded Image",eroded);
膨脹圖像
dilated = cv2.dilate(img,kernel)
顯示膨脹后的圖像
cv2.imshow("Dilated Image",dilated);
原圖像
cv2.imshow("Origin", img)
NumPy定義的結(jié)構(gòu)元素
NpKernel = np.uint8(np.ones((3,3)))
Nperoded = cv2.erode(img,NpKernel)
顯示腐蝕后的圖像
cv2.imshow("Eroded by NumPy kernel",Nperoded);
cv2.waitKey(0)
cv2.destroyAllWindows()
</pre>
腐蝕和膨脹的處理很簡單咱筛,只需設置好結(jié)構(gòu)元素杆故,然后分別調(diào)用cv2.erode(...)和cv2.dilate(...)函數(shù)即可,其中第一個參數(shù)是需要處理的圖像沙热,第二個是結(jié)構(gòu)元素罢缸。返回處理好的圖像。
開運算和閉運算 cv2.morphologyEx
形態(tài)學基本處理:開運算和閉運算就是將腐蝕和膨脹按照一定的次序進行處理爵川。但這兩者并不是可逆的息楔,即先開后閉并不能得到原先的圖像。
<pre>
coding=utf-8
import cv2
import numpy as np
img = cv2.imread('D:/binary.bmp',0)
定義結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
閉運算
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
顯示腐蝕后的圖像
cv2.imshow("Close",closed);
開運算
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
顯示腐蝕后的圖像
cv2.imshow("Open", opened);
cv2.waitKey(0)
cv2.destroyAllWindows()
</pre>
<font color=blue >閉運算用來連接被誤分為許多小塊的對象圃泡,開運算用于移除由圖像噪音形成的斑點愿险,</font>因此辆亏,某些情況下可以連續(xù)運用這兩種運算。如對一副二值圖連續(xù)使用閉運算和開運算扮叨,將獲得圖像中的主要對象彻磁。同樣,如果想消除圖像中的噪聲(即圖像中的“小點”)衷蜓,也可以對圖像先用開運算后用閉運算,不過這樣也會消除一些破碎的對象刻恭。
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
<font color=blue>尋找檢測物體的輪廓 </font>
注:cv2.findContours()函數(shù)接受的參數(shù)為二值圖扯夭,即黑白的(不是灰度圖),所以讀取的圖像要先轉(zhuǎn)成灰度的骑科,再轉(zhuǎn)成二值圖
<font color=#00ffff>參數(shù):</font>
第一個參數(shù)是尋找輪廓的圖像构拳;
第二個參數(shù)表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):
cv2.RETR_EXTERNAL表示只檢測外輪廓
cv2.RETR_LIST檢測的輪廓不建立等級關系
cv2.RETR_CCOMP建立兩個等級的輪廓斗埂,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息男娄。如果內(nèi)孔內(nèi)還有一個連通物體漾稀,這個物體的邊界也在頂層。
cv2.RETR_TREE建立一個等級樹結(jié)構(gòu)的輪廓尸折。
第三個參數(shù)method為輪廓的近似辦法
cv2.CHAIN_APPROX_NONE存儲所有的輪廓點殷蛇,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2)收擦,abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE壓縮水平方向谍倦,垂直方向,對角線方向的元素宴猾,只保留該方向的終點坐標叼旋,例如一個矩形輪廓只需4個點來保存輪廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
<font color=#00ffff>返回值:</font>
返回兩個值:contours讹剔,hierarchy详民。一個是輪廓本身(list),還有一個是每條輪廓對應的屬性由捎。
list中每個元素都是圖像中的一個輪廓饿凛,用numpy中的ndarray表示软驰。這個概念非常重要锭亏。
該函數(shù)還可返回一個可選的hiararchy結(jié)果蒙畴,這是一個ndarray,其中的元素個數(shù)和輪廓個數(shù)相同膳凝,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓蹬音、前一個輪廓休玩、父輪廓、內(nèi)嵌輪廓的索引編號永部,如果沒有對應項呐矾,則該值為負數(shù)。
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
第一個參數(shù)是指明在哪幅圖像上繪制輪廓组橄;
第二個參數(shù)是輪廓本身罚随,在Python中是一個list。
第三個參數(shù)指定繪制輪廓list中的哪條輪廓遵班,如果是-1潮改,則繪制其中的所有輪廓。后面的參數(shù)很簡單愿阐。其中thickness表明輪廓線的寬度趾疚,如果是-1(cv2.FILLED)以蕴,則為填充模式辛孵。繪制參數(shù)將在以后獨立詳細介紹魄缚。
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);
InputArray curve:輸入的點集
OutputArray approxCurve:輸出的點集冶匹,當前點集是能最小包容指定點集的嚼隘。draw出來即是一個多邊形;
double epsilon:指定的精度谤狡,也即是原始曲線與近似曲線之間的最大距離卧檐。
bool closed:若為true,則說明近似曲線是閉合的,它的首位都是相連捕仔,反之佛嬉,若為false,則斷開斜做。
IplImage *image = cvLoadImage("I:\OpenCV Learning\picture\sumpalace.jpg");
cvShowImage("image1",image);
//將ROI區(qū)域圖像保存在image中:左上角x湾揽、左上角y、矩形長霸旗、寬
cvSetImageROI(image,cvRect(200,200,600,200));
cvShowImage("imageROI",image);
//執(zhí)行cvSetImageROI()之后顯示image圖像是只顯示ROI標識的一部分戚揭,即改變了指針image,
//但是它仍舊保留有原來圖像的信息精居,在執(zhí)行這一句cvResetImageROI(image),之后,image指示原來的圖像信息沃但。
cvResetImageROI(image);
cvShowImage("image2",image);
cvWaitKey(0);
return 0;
}
jTessBoxEditor
import cv2
img = cv2.imread("lenna.png")
crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400
NOTE: its img[y: y + h, x: x + w] and not img[x: x + w, y: y + h]
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
jTessBoxEditor訓練步驟
- 工具jTessBoxEditor佛吓,下載地址為 http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
- tif文面命名格式[lang].[fontname].exp[num].tif
tesseract chi.fontname.exp0.tif chi.fontname.exp0 batch.nochop makebox
運行以上命令也會產(chǎn)生一個box文件维雇。產(chǎn)生box文件的過程是必須的,也是最重要的钝凶,沒有box文件以下的內(nèi)容都無法進行唁影。
需要記住的是生成的.box要和這個.tif文件同在一個目錄下掂名。
- 文字校正。運行jTessBoxEditor工具锌介,打開chi.黑體.exp0.tif文件(必須將上一步生成的.box和.tif樣本文件放在同一目錄)猾警,如上圖所示发皿。可以看出有些字符識別的不正確穴墅,可以通過該工具手動對每張圖片中識別錯誤的字符進行校正玄货。校正完成后保存即可。
- 產(chǎn)生字符特征文件
tesseract chi.fontname.exp0.tif chi.fontname.exp0 nobatch box.train
- 計算字符集
unicharset_extractor chi.fontname.exp0.box
- 定義字體特征文件夹界,---Tesseract-OCR3.01以上的版本在訓練之前需要創(chuàng)建一個名稱為font_properties.txt的字體特征文件
手工建立一個文件font_properties.txt
內(nèi)容如:fontname 0 0 0 0 0
注意:fontname為字體名稱,italic為斜體,bold為黑體字,fixed為默認字體,serif為襯線字體,fraktur德文黑字體,1和0代表有和無. - 聚集字符特征
shapeclustering -F font_properties.txt -U unicharset chi.fontname.exp0.tr
使用上一步產(chǎn)生的字符集文件unicharset隘世,來生成當前新語言的字符集文件chi.unicharset。同時還會產(chǎn)生圖形原型文件inttemp和每個字符所對應的字符mftraining -F font_properties.txt -U unicharset -O chi.unicharset chi.fontname.exp0.tr
特征數(shù)文件pffmtable趾痘。最重要的就是這個inttemp文件了永票,他包含了所有需要產(chǎn)生的字的圖形原型。
這一步產(chǎn)生字符形狀正陈录化特征文件normproto世分。cntraining chi.fontname.exp0.tr
- 把目錄下的unicharset、inttemp臭埋、pffmtable瓢阴、shapetable、normproto這五個文件前面都加上chi.
combine_tessdata chi.
11. 然后把chi.traineddata放到tessdata目錄