由于自己手动标注车牌号工作量很大,想偷懒省个事,所以写了个简单的程序实现自动标注,利用了百度开放的API,需要先去官网获取API Key和Secret Key,获取的方式请参考:https://ai.baidu.com/forum/topic/show/943028
代码如下:
#encoding:utf-8
import requests
import cv2
import numpy as np
import json
import base64
import os
def get_token(client_id,client_secret):
host='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
res=requests.get(host,headers=headers).text
res=json.loads(res)
return res['access_token']
def get_license_plate(access_token,i):
url= "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token="+access_token
#img=cv2.imread(img_path)
img= cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)#从中文路径读取时用
with open(img_path,'rb') as f: image_binary=f.read()
image_encode=base64.b64encode(image_binary)#image需要进行base64加密
# print(image_encode)
postdata={'image':image_encode,
'multi_detect': 'false'}
respond=requests.post(url,data=postdata,headers=headers).text#发送post请求获取车牌信息
words_result=json.loads(respond,encoding='utf-8')
print(words_result)
if 'words_result' in words_result.keys():
number=words_result['words_result']['number']
print(number)
# cv2.imwrite(save_path+number+'.png',img)
cv2.imencode('.png',img)[1].tofile(save_dir+number+'.png')
else:
print('%s未识别'%name)
cv2.imencode('.png',img)[1].tofile(save_dir+name)
if __name__ == '__main__':
client_id='xxxxxxxx'#API Key 获取方式参考链接 https://ai.baidu.com/forum/topic/show/943028
client_secret='xxxxxxxxx'#Secret Key 获取方式参考链接 https://ai.baidu.com/forum/topic/show/943028
headers={'user-agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
access_token=get_token(client_id,client_secret)
img_dir="D:/Desktop/car/"#你需要标注的图片的路径
img_name=os.listdir(img_dir)
save_dir='D:/desktop/car_name/'#保存的路径
for name in img_name:
img_path=img_dir+name
get_license_plate(access_token,name)
运行的效果图如下:
但是有几点需要注意:
- 貌似一天只有200次的识别机会(官网创建项目前可以看到),实际运行后确实后面达到了上限,要是没有限制那标注起来会很快
- 百度AI车牌识别的准确率还是很高的,但是也存在某些图片不能识别的情况(见上图中118.png和124.png未能识别),原因可能是角度过于倾斜了
- 有的小伙伴可能会说,自己需要的并不是包含了车牌的整个车辆的标注信息,而是需要一张完整的车牌的标注图片,这里可以关注一下我接下来会发的一篇博客,基于u-net的车牌定位与矫正系统,在那里我会介绍如何进行车牌的自动定位和矫正,这里先放几张截图吧。之所以不先使用u-net将车牌图片矫正后,再利用百度的API进行识别,是因为百度的API对整个车牌(包括其他外景)进行识别的准确率是很高的,相反直接识别一张车牌图片很有可能识别不了
下图是我使用自己标注并训练好的u-net网络进行的图像语义分割效果图,通过u-net将原图进行图像分割后,再利用cv2库进行边缘检测,从而实现车牌的精准定位。其中第1张和第2张都是上面利用百度AI识别时未能识别的图片,同时第3和第4张图即使车辆本身是蓝色也成功的定位,而且2张车牌都有检测到,我自己本地随机找了一些未训练过的图片还有自己随机拍摄的图片进行测试,测试结果也是十分准确,这说明模型的定位准确率是很高的。关于车牌的矫正部分也是利用cv2库,矫正效果也很不错。
通过以上操作,实现车牌标注还是蛮方便的,主要是对后续车牌识别可以有很大帮助,后续有时间还会写一下关于u-net图像分割的文章以及定位后进行端到端车牌识别的文章,暂时先到这吧。。。
最后大家如果有什么意见建议也可以提出了,欢迎交流,谢谢支持!