国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

【深度學習系列】用PaddlePaddle進行車牌識別(一)

企業動態
小伙伴們,終于到了實戰部分了!今天給大家帶來的項目是用PaddlePaddle進行車牌識別。車牌識別其實屬于比較常見的圖像識別的項目了,目前也屬于比較成熟的應用,大多數老牌廠家能做到準確率99%+。

小伙伴們,終于到了實戰部分了!今天給大家帶來的項目是用PaddlePaddle進行車牌識別。車牌識別其實屬于比較常見的圖像識別的項目了,目前也屬于比較成熟的應用,大多數老牌廠家能做到準確率99%+。傳統的方法需要對圖像進行多次預處理再用機器學習的分類算法進行分類識別,然而深度學習發展起來以后,我們可以通過用CNN來進行端對端的車牌識別。任何模型的訓練都離不開數據,在車牌識別中,除了晚上能下載到的一些包含車牌的數據是不夠的,本篇文章的主要目的是教大家如何批量生成車牌。


生成車牌數據

  1.定義車牌數據所需字符

  車牌中包括省份簡稱、大寫英文字母和數字,我們首先定義需要的字符和字典,方便后面使用

 
 1 index = {"京": 0, "滬": 1, "津": 2, "渝": 3, "冀": 4, "晉": 5, "蒙": 6, "遼": 7, "吉": 8, "黑": 9, "蘇": 10, "浙": 11, "皖": 12,
 2          "閩": 13, "贛": 14, "魯": 15, "豫": 16, "鄂": 17, "湘": 18, "粵": 19, "桂": 20, "瓊": 21, "川": 22, "貴": 23, "云": 24,
 3          "藏": 25, "陜": 26, "甘": 27, "青": 28, "寧": 29, "新": 30, "0": 31, "1": 32, "2": 33, "3": 34, "4": 35, "5": 36,
 4          "6": 37, "7": 38, "8": 39, "9": 40, "A": 41, "B": 42, "C": 43, "D": 44, "E": 45, "F": 46, "G": 47, "H": 48,
 5          "J": 49, "K": 50, "L": 51, "M": 52, "N": 53, "P": 54, "Q": 55, "R": 56, "S": 57, "T": 58, "U": 59, "V": 60,
 6          "W": 61, "X": 62, "Y": 63, "Z": 64};
 7 
 8 chars = ["京", "滬", "津", "渝", "冀", "晉", "蒙", "遼", "吉", "黑", "蘇", "浙", "皖", "閩", "贛", "魯", "豫", "鄂", "湘", "粵", "桂",
 9              "瓊", "川", "貴", "云", "藏", "陜", "甘", "青", "寧", "新", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
10              "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
11              "Y", "Z"
12              ];

 

  2.生成中英文字符

 
 1 def GenCh(f,val):
 2     """
 3     生成中文字符
 4     """
 5     img=Image.new("RGB", (45,70),(255,255,255))
 6     draw = ImageDraw.Draw(img)
 7     draw.text((0, 3),val,(0,0,0),font=f)
 8     img =  img.resize((23,70))
 9     A = np.array(img)
10     return A
11 
12 def GenCh1(f,val):
13     """
14     生成英文字符
15     """
16     img=Image.new("RGB", (23,70),(255,255,255))
17     draw = ImageDraw.Draw(img)
18     draw.text((0, 2),val.decode('utf-8'),(0,0,0),font=f)
19     A = np.array(img)
20     return A
 

  3.對數據添加各種噪音和畸變,模糊處理

 
 1 def AddSmudginess(img, Smu):
 2     rows = r(Smu.shape[0] - 50)
 3     cols = r(Smu.shape[1] - 50)
 4     adder = Smu[rows:rows + 50, cols:cols + 50];
 5     adder = cv2.resize(adder, (50, 50));
 6     #adder = cv2.bitwise_not(adder)
 7     img = cv2.resize(img,(50,50))
 8     img = cv2.bitwise_not(img)
 9     img = cv2.bitwise_and(adder, img)
10     img = cv2.bitwise_not(img)
11     return img
12 
13 
14 def rot(img,angel,shape,max_angel):
15     """
16         添加放射畸變
17         img 輸入圖像
18         factor 畸變的參數
19         size 為圖片的目標尺寸
20     """
21     size_o = [shape[1],shape[0]]
22     size = (shape[1]+ int(shape[0]*cos((float(max_angel )/180) * 3.14)),shape[0])
23     interval = abs( int( sin((float(angel) /180) * 3.14)* shape[0]));
24     pts1 = np.float32([[0,0],[0,size_o[1]],[size_o[0],0],[size_o[0],size_o[1]]])
25     if(angel>0):
26         pts2 = np.float32([[interval,0],[0,size[1]  ],[size[0],0  ],[size[0]-interval,size_o[1]]])
27     else:
28         pts2 = np.float32([[0,0],[interval,size[1]  ],[size[0]-interval,0  ],[size[0],size_o[1]]])
29     M  = cv2.getPerspectiveTransform(pts1,pts2);
30     dst = cv2.warpPerspective(img,M,size);
31     return dst
32 
33 
34 def rotRandrom(img, factor, size):
35     """
36     添加透視畸變
37     """
38     shape = size;
39     pts1 = np.float32([[0, 0], [0, shape[0]], [shape[1], 0], [shape[1], shape[0]]])
40     pts2 = np.float32([[r(factor), r(factor)], [ r(factor), shape[0] - r(factor)], [shape[1] - r(factor),  r(factor)],
41                        [shape[1] - r(factor), shape[0] - r(factor)]])
42     M = cv2.getPerspectiveTransform(pts1, pts2);
43     dst = cv2.warpPerspective(img, M, size);
44     return dst
45 
46 def tfactor(img):
47     """
48     添加飽和度光照的噪聲
49     """
50     hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV);
51     hsv[:,:,0] = hsv[:,:,0]*(0.8+ np.random.random()*0.2);
52     hsv[:,:,1] = hsv[:,:,1]*(0.3+ np.random.random()*0.7);
53     hsv[:,:,2] = hsv[:,:,2]*(0.2+ np.random.random()*0.8);
54 
55     img = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR);
56     return img
57 
58 def random_envirment(img,data_set):
59     """
60     添加自然環境的噪聲
61     """
62     index=r(len(data_set))
63     env = cv2.imread(data_set[index])
64     env = cv2.resize(env,(img.shape[1],img.shape[0]))
65     bak = (img==0);
66     bak = bak.astype(np.uint8)*255;
67     inv = cv2.bitwise_and(bak,env)
68     img = cv2.bitwise_or(inv,img)
69     return img
70 
71 def AddGauss(img, level):
72     """
73     添加高斯模糊
74     """
75     return cv2.blur(img, (level * 2 + 1, level * 2 + 1));
76 
77 def r(val):
78     return int(np.random.random() * val)
79 
80 def AddNoiseSingleChannel(single):
81     """
82     添加高斯噪聲
83     """
84     diff = 255-single.max();
85     noise = np.random.normal(0,1+r(6),single.shape);
86     noise = (noise - noise.min())/(noise.max()-noise.min())
87     noise= diff*noise;
88     noise= noise.astype(np.uint8)
89     dst = single + noise
90     return dst
91 
92 def addNoise(img,sdev = 0.5,avg=10):
93     img[:,:,0] =  AddNoiseSingleChannel(img[:,:,0]);
94     img[:,:,1] =  AddNoiseSingleChannel(img[:,:,1]);
95     img[:,:,2] =  AddNoiseSingleChannel(img[:,:,2]);
96     return img

 

  4.加入背景圖片,生成車牌字符串list和label,并存為圖片格式,批量生成。

 
 1 class GenPlate:
 2 
 3     def __init__(self,fontCh,fontEng,NoPlates):
 4         self.fontC =  ImageFont.truetype(fontCh,43,0);
 5         self.fontE =  ImageFont.truetype(fontEng,60,0);
 6         self.img=np.array(Image.new("RGB", (226,70),(255,255,255)))
 7         self.bg  = cv2.resize(cv2.imread("./images/template.bmp"),(226,70));
 8         self.smu = cv2.imread("./images/smu2.jpg");
 9         self.noplates_path = [];
10         for parent,parent_folder,filenames in os.walk(NoPlates):
11             for filename in filenames:
12                 path = parent+"/"+filename;
13                 self.noplates_path.append(path);
14 
15 
16     def draw(self,val):
17         offset= 2 ;
18         self.img[0:70,offset+8:offset+8+23]= GenCh(self.fontC,val[0]);
19         self.img[0:70,offset+8+23+6:offset+8+23+6+23]= GenCh1(self.fontE,val[1]);
20         for i in range(5):
21             base = offset+8+23+6+23+17 +i*23 + i*6 ;
22             self.img[0:70, base  : base+23]= GenCh1(self.fontE,val[i+2]);
23         return self.img
24     
25     def generate(self,text):
26         if len(text) == 9:
27             fg = self.draw(text.decode(encoding="utf-8"));
28             fg = cv2.bitwise_not(fg);
29             com = cv2.bitwise_or(fg,self.bg);
30             com = rot(com,r(60)-30,com.shape,30);
31             com = rotRandrom(com,10,(com.shape[1],com.shape[0]));
32             com = tfactor(com)
33             com = random_envirment(com,self.noplates_path);
34             com = AddGauss(com, 1+r(4));
35             com = addNoise(com);
36             return com
37 
38     def genPlateString(self,pos,val):
39         '''
40     生成車牌String,存為圖片
41         生成車牌list,存為label
42         '''
43         plateStr = "";
44         plateList=[]
45         box = [0,0,0,0,0,0,0];
46         if(pos!=-1):
47             box[pos]=1;
48         for unit,cpos in zip(box,range(len(box))):
49             if unit == 1:
50                 plateStr += val
51                 #print plateStr
52                 plateList.append(val)
53             else:
54                 if cpos == 0:
55                     plateStr += chars[r(31)]
56                     plateList.append(plateStr)
57                 elif cpos == 1:
58                     plateStr += chars[41+r(24)]
59                     plateList.append(plateStr)
60                 else:
61                     plateStr += chars[31 + r(34)]
62                     plateList.append(plateStr)
63         plate = [plateList[0]]
64         b = [plateList[i][-1] for i in range(len(plateList))]
65         plate.extend(b[1:7])
66         return plateStr,plate
67 
68     # 將生成的車牌圖片寫入文件夾,對應的label寫入label.txt
69     def genBatch(self, batchSize,pos,charRange, outputPath,size):
70         if (not os.path.exists(outputPath)):
71             os.mkdir(outputPath)
72     outfile = open('label.txt','w')
73         for i in xrange(batchSize):
74                 plateStr,plate = G.genPlateString(-1,-1)
75                 print plateStr,plate
76         img =  G.generate(plateStr);
77                 img = cv2.resize(img,size);
78                 cv2.imwrite(outputPath + "/" + str(i).zfill(2) + ".jpg", img);
79         outfile.write(str(plate)+"\n")
80 G = GenPlate("./font/platech.ttf",'./font/platechar.ttf',"./NoPlates")
 

  完整代碼:

[[223827]] View Code

  運行時加生成數量和保存路徑即可,如:

 1 python genPlate.py 100 ./plate_100 

  顯示結果:

 

  上圖即為生成的車牌數據,有清晰的有模糊的,有比較方正的,也有一些比較傾斜,生成完大量的車牌樣張后就可以進行車牌識別了。下一小節將會講如何用端對端的CNN進行車牌識別,不需要通過傳統的ocr先對字符進行分割處理后再識別。

 

參考資料:

1.原來做的車牌識別項目:https://github.com/huxiaoman7/mxnet-cnn-plate-recognition 

責任編輯:張燕妮 來源: www.cnblogs.com
相關推薦

2018-04-09 10:20:32

深度學習

2018-04-02 10:45:11

深度學習PaddlePaddl手寫數字識別

2018-04-04 10:19:32

深度學習

2018-04-16 11:30:32

深度學習

2018-04-11 09:30:41

深度學習

2018-04-17 09:40:22

深度學習

2018-03-26 20:07:25

深度學習

2018-03-26 20:00:32

深度學習

2018-03-26 21:31:30

深度學習

2018-03-26 21:26:50

深度學習

2018-03-26 19:56:13

深度學習

2021-02-03 13:56:09

KerasAPI深度學習

2018-04-18 09:39:07

深度學習

2017-10-17 15:44:53

一體機

2017-08-10 15:31:57

Apache Spar TensorFlow

2018-03-09 22:56:52

PaddlePaddl

2018-02-07 16:13:00

深度學習

2017-09-15 18:13:57

機器學習深度學習語音識別

2017-02-09 16:39:54

百度

2018-03-26 20:12:42

深度學習
點贊
收藏

51CTO技術棧公眾號

国产综合在线观看视频| 欧美手机在线视频| 最新亚洲国产精品| 成人黄色电影网址| 人人网欧美视频| 欧美又粗又大又爽| 蜜桃久久影院| 日韩av手机在线观看| 国产福利在线播放麻豆| 中文字幕一区二区三区不卡在线| 99re在线视频观看| 高清精品视频| 亚洲国产天堂久久综合| 在线国产1区| 日本一区二区三区在线不卡 | 黄色福利视频网站| 国产成人免费视频一区| 欧美不卡福利| 国产一区激情| 成人a在线视频| 亚洲福利网站| 欧美激情视频在线观看| 欧美一区久久久| 亚洲国内精品在线| 成人午夜在线影视| 欧美日韩一区二区三区在线| 日本在线三级| 亚洲男人都懂的| 爆操妹子视频在线观看| 国产精品久久777777| 可以在线看的黄色网址| 国产高清亚洲一区| 久久久天堂国产精品| 日韩国产精品久久久| 欧美人xxxxx| 久久久天天操| 精品久久久久久综合日本| 一区二区亚洲精品| 欧美精品久久| 麻豆成人免费电影| 99热这里只有精品7| 国产资源在线一区| 精品少妇人欧美激情在线观看| 国产成人免费高清| 免费黄色福利视频| 国产精品久久夜| 国产一级粉嫩xxxx| 欧美午夜视频一区二区| 九九热视频在线观看| 欧美影院精品一区| 综合久久五月天| 久久久久亚洲综合| 嫩草在线播放| 免费在线亚洲| 欧美人xxxxx| 日韩av不卡一区二区| 视频二区一区| 国产成人av一区二区三区在线观看| 老司机激情视频| 99re6这里只有精品视频在线观看| 日日碰狠狠丁香久燥| 亚洲欧美日韩成人高清在线一区| 性疯狂做受xxxx高清视频| 高潮白浆女日韩av免费看| 黄色av网址在线免费观看| 欧美一区欧美二区| 老司机2019福利精品视频导航| 久久精品成人一区二区三区| 亚洲国产精品嫩草影院久久av| 91老司机精品视频| 手机精品视频在线观看| 国产又粗又猛又爽又黄的网站| 91网站黄www| 色中文字幕在线观看| 欧美激情国内偷拍| 校园春色综合网| 黄色三级高清在线播放| 四虎884aa成人精品最新| 亚洲精选中文字幕| 在线亚洲自拍| 日本h片在线看| 色狠狠色狠狠综合| 51漫画成人app入口| 蜜臀久久99精品久久久无需会员 | 欧美久久久影院| 成人性生交大片免费看网站| 视频在线观看一区二区| 精品日韩毛片| 亚洲欧美精品在线观看| 国产精品视频你懂的| 国产福利免费在线观看| 国产亚洲精品久久久久久| 色婷婷精品视频| 欧美一区二区三区四区五区六区| 91蜜桃在线观看| 国产香蕉视频在线看| 国产亚洲欧洲高清一区| 精品精品久久| 中文字幕av日韩精品| 中文字幕在线免费不卡| 国产精品实拍| 国内外成人免费激情在线视频| 亚洲日本欧美| 一级在线免费视频| 日韩美女天天操| 欧美sss在线视频| 日韩精品成人一区二区在线观看| 国产精品成人一区二区三区夜夜夜| 三区四区在线视频| 欧美精品video| 日韩国产欧美在线播放| 91天堂在线| 国产一区二区三区视频免费| 一本一道久久综合狠狠老| 91猫先生在线| 制服丝袜中文字幕一区| 欧美亚洲大陆| 18视频在线观看娇喘| 精品美女永久免费视频| 欧美天堂一区二区| 久久综合毛片| 亚洲成人精品在线观看| 亚洲三级在线| 亚洲日本无吗高清不卡| 日韩欧美亚洲成人| 老司机在线精品视频| 超碰超碰超碰超碰超碰| 欧美日韩美女一区二区| 国产传媒欧美日韩成人精品大片| 精品无码一区二区三区爱欲| 日韩欧美国产精品一区| 一区二区日韩欧美| 久久精品影视大全| 亚洲色图综合久久| 美女黄网久久| 成人在线免费电影| 国产精品丝袜久久久久久不卡| 久久综合资源网| 欧美日韩国产色站一区二区三区| 欧美综合社区国产| 一本一道久久久a久久久精品91 | 欧美三区视频| 色老板在线观看| 欧美精品九九久久| 97久久精品人人澡人人爽| 亚洲黄色中文字幕| 欧美精品欧美精品系列c| 欧美日韩一区不卡| 欧美激情一级片一区二区| 能在线观看av网站| 久久一区二区三区四区五区| 美女网站色91| 最新国产乱人伦偷精品免费网站| 四虎8848精品成人免费网站| av免费不卡国产观看| 国产精品人人爽人人爽| 中文字幕成人一区| 欧美一区二区在线免费播放| 中国色在线日|韩| 91久久精品国产91久久性色tv| 成人xxxxx色| 成人精品一区二区三区| 香港日本韩国三级网站| 久久精品国产久精国产一老狼 | 亚洲欧美国产日韩中文字幕| 日韩国产一区二区| 九色综合婷婷综合| 亚洲综合自拍| 国产一区二区高清| 围产精品久久久久久久| 99蜜桃在线观看免费视频网站| 亚洲国产综合91精品麻豆| 国产麻豆一区二区三区精品视频| 网上成人av| 国产欧美va欧美va香蕉在| 国产三级视频| 成a人v在线播放| 97超碰资源站在线观看| 午夜精品一区| 欧美xxxx黑人又粗又长| 狠狠色丁香婷综合久久| 九九九久久久精品| 波波电影院一区二区三区| 国产精品免费播放| 久久久999精品免费| 国产欧美日韩在线视频| 一本色道久久综合狠狠躁的番外| 日本按摩中出| 国产欧美日韩一区| 精品久久久久久久久久久久包黑料 | 日韩久久99| siro系绝美精品系列| 国产原创欧美精品| 欧美老女人在线| 国产伦理精品不卡| 91在线一区| 国产午夜在线观看| 毛片av在线播放| 欧美一区二区三区艳史| 欧美日韩国产首页|