圖片識別

圖片識別

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訓練步驟
  1. 工具jTessBoxEditor佛吓,下載地址為 http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
  2. tif文面命名格式[lang].[fontname].exp[num].tif
  3.   tesseract chi.fontname.exp0.tif chi.fontname.exp0 batch.nochop makebox
    

運行以上命令也會產(chǎn)生一個box文件维雇。產(chǎn)生box文件的過程是必須的,也是最重要的钝凶,沒有box文件以下的內(nèi)容都無法進行唁影。
需要記住的是生成的.box要和這個.tif文件同在一個目錄下掂名。

  1. 文字校正。運行jTessBoxEditor工具锌介,打開chi.黑體.exp0.tif文件(必須將上一步生成的.box和.tif樣本文件放在同一目錄)猾警,如上圖所示发皿。可以看出有些字符識別的不正確穴墅,可以通過該工具手動對每張圖片中識別錯誤的字符進行校正玄货。校正完成后保存即可。
  2. 產(chǎn)生字符特征文件
      tesseract chi.fontname.exp0.tif chi.fontname.exp0 nobatch box.train
    
  3. 計算字符集
      unicharset_extractor chi.fontname.exp0.box
    
  4. 定義字體特征文件夹界,---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代表有和無.
  5. 聚集字符特征
      shapeclustering -F font_properties.txt -U unicharset chi.fontname.exp0.tr
    
      mftraining -F font_properties.txt -U unicharset -O chi.unicharset chi.fontname.exp0.tr
    
    使用上一步產(chǎn)生的字符集文件unicharset隘世,來生成當前新語言的字符集文件chi.unicharset。同時還會產(chǎn)生圖形原型文件inttemp和每個字符所對應的字符
    特征數(shù)文件pffmtable趾痘。最重要的就是這個inttemp文件了永票,他包含了所有需要產(chǎn)生的字的圖形原型。
      cntraining chi.fontname.exp0.tr
    
    這一步產(chǎn)生字符形狀正陈录化特征文件normproto世分。
  6. 把目錄下的unicharset、inttemp臭埋、pffmtable瓢阴、shapetable、normproto這五個文件前面都加上chi.
  7.  combine_tessdata chi.
    
11. 然后把chi.traineddata放到tessdata目錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末液斜,一起剝皮案震驚了整個濱河市叠穆,隨后出現(xiàn)的幾起案子硼被,更是在濱河造成了極大的恐慌,老刑警劉巖祷嘶,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件论巍,死亡現(xiàn)場離奇詭異,居然都是意外死亡丹禀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙矛,“玉大人村斟,你說我怎么就攤上這事◇№铮” “怎么了逾滥?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讥巡。 經(jīng)常有香客問我舔哪,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任外里,我火速辦了婚禮特石,結(jié)果婚禮上姆蘸,老公的妹妹穿的比我還像新娘。我一直安慰自己逞敷,他們只是感情好推捐,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堪簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哪审。 梳的紋絲不亂的頭發(fā)上虑瀑,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天缴川,我揣著相機與錄音,去河邊找鬼而线。 笑死恋日,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的誓竿。 我是一名探鬼主播谈截,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼簸喂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扼倘?” 一聲冷哼從身側(cè)響起除呵,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纠拔,沒想到半個月后泛啸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秃症,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡种柑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年聚请,在試婚紗的時候發(fā)現(xiàn)自己被綠了稳其。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡煤傍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘱蛋,到底是詐尸還是另有隱情蚯姆,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布洒敏,位于F島的核電站龄恋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凶伙。R本人自食惡果不足惜郭毕,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望函荣。 院中可真熱鬧显押,春花似錦傻挂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沉迹,卻和暖如春睦疫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞭呕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓦糕。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像咕娄,于是被迫代替她去往敵國和親亥揖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容