參考:
深度實踐ocr author:劉樹春
先說一下ctc有什麼用,先從應用場景下說:ctc最早被設計來解決編譯碼對不齊的問題。
在傳統的語音識別的模型中,我們對語音模型進行訓練之前,往往都要將文字與語音進行嚴格的對齊操作。
比方說上圖這週情況**得到乙個(t,c)的矩陣,但是結果卻可能是乙個長度為(t1)的序列,t1和t不一定等,這個時候如何對其就很麻煩,全部人工標註就太費事了,而且標的還不一定對,比如下圖,要把影象分割開,太費事了,這個時候ctc就上場了
先說一下crnn模型輸出是什麼樣的呢;
一般的全連線層輸出為1*c的向量,而crnn輸出的是乙個(t*c)的矩陣
該1*c的tensor輸出為d,即模型**結果為d
該模型輸出為daeb
def
decode
(self, encode_texts, encode_probs=
none
, raw=
false):
texts =
scores =
for n in
range
(len
(encode_texts)):
encode_text = encode_texts[n]
if raw:
''.join(
[self.alphabet[i -1]
for i in encode_text]))
else
: char_list =
min_score =
1for i in
range
(len
(encode_text)):
if encode_text[i]!=0
and(
not(i >
0and encode_text[i -1]
== encode_text[i]))
:-1]
)if encode_probs is
notnone
: char_prob = encode_probs[n, i, encode_text[i]
]if min_score > char_prob:
min_score = char_prob
''.join(char_list)
)return texts, scores
乙個標準的解碼過程如上所示
邏輯為如果遇到對於t[i]∈t,如果首先在該維度取max,得到當前t**的char,如果當前char為空格,則跳過,如果t[i]==t[i-1],那麼忽略當前值,其它的加入當前list的back
最終可以得到**的序列
ioctl初步理解
ioctl系統呼叫是為使用者空間建立的一種控制硬體裝置的通道。比如控制串列埠的波特率,馬達的轉速等等。是使用者空間和核心空間進行通訊的方式之一。要實現乙個ioctl,需要使用者空間和核心空間兩方面的配合。如果想要乙個硬體支援ioctl,則要在其驅動函式中加入ioctl的實現,應用程式想要通過ioct...
初步理解socket
在學習socket之前,先回顧下tcp ip協議。tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,但實...
SVN初步理解
問題二 衝突 問題描述 為了解決超時問題,只能更新.而在更新過程中,如果幾個人修改了同一檔案的同一行 此時就會產生衝突。產生原因 版本控制器不會那麼智慧型,去決定應該使用誰的 作為最終 只能將選擇權拋給使用者,讓使用者解決。系統提供三種解決方案 p postpone,延遲處理 待會我自己處理 如果選...