我用AI回怼美女汽车销售系列[yolo车牌识别](四)
上期回顧
上一期中,我們從數據增強角度,對車牌識別進行了mixup,彷射變換,模糊處理等,最終在ccpd數據集的測試集上面將t將top1準確率從0.9683提升到了0.991(提升了2.3個點),但是在實際拍攝的視頻中,仍然出現了很多的誤檢。將一個車牌的不同角度圖片識別成很多個不同的車牌。雖然沒有達到最終目的,但是也讓我們更加清晰的認識到,深度學習項目落地的困難。并不是在公開數據集效果很好,在落地項目中效果也會很棒。還是需要針對具體項目進行具體分析。這一期將會從網絡結構的角度重新審視我們的車牌識別項目。
車牌識別網絡分析
原來的車牌識別網絡使用了shufflenet,并根據藍牌和綠牌拆分成了兩個網絡。藍牌網絡輸出7*34維的概率矩陣,綠牌網絡輸出了8*34維的概率矩陣。本質原因是由于CNN只能輸出固定維度的預測,無法輸出動態的預測。
實際上,車牌識別與OCR文字識別類似。只是車牌的格式比OCR簡單很多。因為車牌的長寬,字符位置都是固定的,因此我們可以直接使用分類網絡輸出各個字符的概率。不過這種做法也是欠妥當的,首先我們分了兩個網絡,導致藍牌和綠牌需要分開訓練和推理。另外就是車牌的字符實際上是不均勻分布的。在第一個字母后面通常有個空格,但是我們設計網絡的時候,默認字符是均勻分布的,這些都會導致CNN感受野學習的時候出現一定的偏差。因此我們需要借鑒成熟的OCR網絡以及成熟的車牌識別網絡如何解決這個問題的。很自然的,CTC技術就進入了我們的視野。
CTC技術簡介
CTC技術主要是為了語音識別而提出來的,其全稱為:Connectionist Temporal Classification(連接時序分類)。最初應用在語音上,現在OCR上面也在廣泛使用。主要應用在預測長度不固定,且標簽通常不包含位置信息的情形。例如OCR里面識別一句話,那么由于一句話的長度通常不是固定的,有長有短,但是網絡的輸出是固定的,因此假設一句話最長是9個字符(為了繪圖方便),那么網絡輸出9*N的預測。假設一句話"hello",如下圖所示(圖中的'-'表示此處無字符),第一行的預測更加符合預期,每個字符的預測對應的感受野基本是正確的。而第二行的預測更加差一些,很多預測字符對應的感受野是不匹配的。但是僅僅通過標簽“hello”,無法判斷哪個預測的更好。那么就無法很好的給網絡訓練提供監督信號進行很好的訓練了。
CTC技術主要就是為了解決這種問題的。首先引入一個空白符blank來表示此處沒有字符。且連續的字符會合并成一個字符。例如預測輸出 h,e,l,l,l,o,o會被當作helo來處理。那如果真的有兩個"l"怎么辦呢?例如"hello"中有兩個連續的"l",CTC規定兩個相同字符之間必須插入一個空白字符,用"-"表示,那么h,e,l,-,l,l,o,o就能被正確的解析為"hello"了。
CTC計算舉例
下面以一個非常簡單的例子來說明CTC具體是如何工作的。為了方便,我們假設我們的語言里面只有t,o兩個字符。我們需要識別的圖片如下圖所示,該圖片的標簽是“to”。假設我們的網絡輸出的長度為5,那么網絡最終輸出的維度是5*(2+1)。之所以需要加上1,是因為CTC規定需要一個blank的空白符。
對于該矩陣,在訓練的時候,如果識別成"ttooo",'-tooo','-t-oo','-to--','-too-','-tooo'......等都是正確的。因為在CTC里面相同字符連接在一起會被等價于一個字符,所以ttooo等價與to,而-字符為空白字符,可以刪除,因此-t-ooo等級與to。后面幾個也是同樣的道理。也就是說這些預測都是當作正確的預測。那么loss如何求取的。實際上就是把這些概率求和,作為正確的最終概率:
- ttooo概率p1 = 0.6*0.7*0.5*0.6*0.7
- -tooo概率p2 = 0.2*0.7*0.5*0.6*0.7
- -t-oo概率p3 = 0.2*0.7*0.4*0.6*0.7
- 省略后續計算......
那么最終預測正確的概率 p = p1 + p2 + p3 + ...... ,預測錯誤的概率是 1 - p, 那么實際上最終就是一個二分類的問題,可以根據交叉熵來求loss,并進行梯度回傳。總的來說,CTC是把所有預測都窮舉了一遍,然后按照規則,把所有與標簽等價的預測作為正確的預測。進而轉化成一個二分類問題。
Pytorch中的CTC loss
pytorch中已經內置了ctc loss,可以非常方便的進行使用。主要就是兩個API,一個是創建ctc loss;一個是計算ctc loss。
- 創建ctc loss的api
- 計算ctc loss
- ctc loss舉例
假設我們使用ctc loss預測車牌號,每個字符有 31(省份) + 36(字母和數字) + 1(blank空白符) = 68種可能,如下所示:
dict={0: '京', 1: '滬', 2: '津', 3: '渝',......31: '0', 32: '1', 33: '2', 34: '3',35: '4',......41: 'A', 42: 'B', 43: 'C',......67: '-'];車牌的長度有7個字符(藍牌)和8個字符(綠牌),CTC建議的輸出長度為2*max_len + 1, 為了考慮到每兩個字符之間都有一個blank的情況。即輸出長度為2*8+1 = 17個。
batch size 假設為2,那么最終網絡的輸出log_probs的shape為 T * N * C = 17 * 2 * 68;
假設batch size為2的兩張圖片的標簽分別為“京A88888”以及“滬AD12345”,轉換成字符對應的序號就是:[0,41,38,36,48,38,38] 和 [1,41,44,32,33,34,35,36]。那么最終的targets就是:[0,41,38,36,48,38,38,1,41,44,32,33,34,35,36]。
input_lengths 為[17, 17]
target_lengths為[7,8]
修改車牌識別網絡
有了CTC loss之后,我們就不需要像以前那樣對藍牌和綠牌進行分開訓練了,可以放在一個網絡里面進行訓練。如下圖所示為網絡的最終結構。網絡最終輸出的是17*68維度的預測矩陣。
預測矩陣與原車牌的對應關系如下圖所示
網絡訓練
使用CTC技術之后,訓練了6個epoch,精度就達到了驚人的0.9999.
使用CTC模型在幾張測試圖片上的推理結果如下圖所示:
效果還是挺不錯的,不過也有錯誤識別,說明CTC確實可行
視頻誤檢
雖然上述圖片測試效果比較好。但是使用真正的視頻測試,仍然會出現誤檢的情況。即一個車牌由于角度的不同被識別成不同的車牌號(但是這些車牌號都比較接近)。如下圖所示,視頻中出現了三輛車,但是卻識別出了多個車牌。
分析上面的誤檢,首先,省份比較容易預測錯誤。這是由于CCPD數據集主要從安徽的停車場中收集的,因此車牌中省份是“皖”的數據量特別大,而其他省份的就會少很多。因此如果不做一些數據增強或者訓練策略,很容易導致車牌對“皖”的預測偏好。不過這個對于我們用車牌來識別車輛實體來說,問題不大,我們可以直接忽略省份位。因為在同時一時間,同一地點,出現兩個省份不同而其他位全相同的車的概率幾乎為0。然后處理一下多個相似車牌的問題,實際上可以通過計算兩個車牌之間的相似性來排除誤檢。還是基于之前那個假設,同一地點,同一時間出現AT95S5與AT9SS5的概率是非常小的,因此當判斷出兩個車牌的相似性很高時,我們可以認為一個車牌。總結一下處理流程,如下圖所示:
成果展示
通過上面的策略,目前的統計已經比較準確。如下圖所示。
總結
這期我們通過引入CTC技術,解決了車牌識別中的不定長問題(藍牌7位,綠牌8位),并且利用了去重的后處理方案,使得在視頻中,也能夠穩定的統計藍牌車和綠牌車的數量。下一期我們就去戶外統計,看看到底有多少新能源車吧。敬請期待哦!
總結
以上是生活随笔為你收集整理的我用AI回怼美女汽车销售系列[yolo车牌识别](四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我用AI回怼美女汽车销售系列[yolo车
- 下一篇: Waymo 创造新里程碑:无人类驾驶员的