车牌号识别源码
‘壹’ 车牌识别系统原理与代码“YOLO+MLP”
车牌识别系统可以自动检测并识别图像中的车辆牌照,其算法主要包括牌照定位、牌照分割、字符识别等步骤。本文将给出一种基于深度学习的车牌识别系统方案。
由于可以自动地从视频图像中提取车辆牌照信息,因此车牌识别系统可以应用于以下行业:
我们的项目包含以下三个步骤:车辆牌照检测、牌照字符分割、牌照字符识别。
我们使用Yolo(You Only Look One)算法来检测车辆牌照。Yolo是一个基于卷积神经网络的深度学习目标检测架构。该架构由 Joseph Redmon , Ali Farhadi, Ross Girshick和Santosh Divvala引入,2015年推出第一个版本,然后逐渐升级至版本3:
Yolo是一个端到端训练的单一网络,可以用来预测目标的类别与边界框。Yolo网络速度极快,可以每秒45帧的速度实时处理图像。其中一个较小规模的网络,被称为Fast YOLO,甚至达到了令人咂舌的155帧/秒的处理速度。
下面我们来实现YOLO V3网络。首先,我们准备一个有700张包含土耳其车辆牌照的图片的数据集,对每一张图片,我们都使用一个桌面应用LabelImg标注出车牌位置并存入一个xml文件。数据下载及网络训练脚本如下:
在网络训练完之蔽培后,为了识别图像中的车辆牌照,我们从darknet/custom/weights中选择最新的模型并在文件object_detection_yolo.py中写入其路径名称,我们也将使用yolov3.cfg文件,注释掉训练部分,然后执行:
这就是我们的结果:
现在我们要分割出我们的车牌号码。这个步骤的输入是车牌图像,我们必须能够提取出轿桐单个字符的图像。由于这一步骤的输出将用于识别步骤,因此对于一个车牌识别系统而言,车牌分割步骤非常重要。为了尽可能的正确分割车牌字符,我们需要进行必要的预处理。
像素投影直方图用来找出字符区域的上限和下限、左边及右边。我们使用水平投影来找出字符的顶部 和底部位置,使用垂直投影来找出字符的左边和右边位置:
从车辆牌照中提取数字的另一个方法时使用形态学的开/闭操作来生成一些连通区域,然后再使用连通跟踪算法提取这些连通区域。
识别阶段是我们的车牌自动检测与识别系统的最后一个环节,识别是宏帆唯基于前面环节得到的单个字符图像。我们的模型将对这些图像进行预测,从而得到最终的车牌号码。
为了尽可能利用训练数据,我们将每个字符单独切割,得到一个车牌字符数据集,该数据集中包含11个类(数字0-9以及阿拉伯单词),每个类包含30~40张字符图像,图像为28X28的PNG格式。
然后,我们就多层感知器MLP和K近邻分类器KNN的比较进行了一些调研,研究结果标明,对于多层感知器而言,如果隐层的神经元增多,那么分类器的性能就会提高;同样,对于KNN而言,性能也是随着近邻数量的增多而提高。不过由于KNN的可调整潜力要远远小于MLP,因此我们最终选择在这个阶段使用多层感知器MLP网络来识别分割后的车牌字符:
你可以在这里找到代码及数据集:github
原文链接:车辆牌照自动检测与识别 —— 汇智网
‘贰’ 有没有微信小程序调用百度ai车辆识别接口的程序源码,很简单的就可以
class BaiDuAiBaseController extends BaseController
{
private $appid;
private $appKey;
private $secretKey;
public function __construct(){
$this->appid= config('api..appid');
$this->appKey = config('api..apikey');
$this->secretKey = config('api..secretkey');
}
//网络ai接口--文字识别--车牌号识别
public function getCarNumber($_imgurl,$_img=''){
$_token = $this->getToken();
$_url = 'https://aip.bce.com/rest/2.0/ocr/v1/license_plate?access_token='.$_token;
if($_img){
$_data = [
'image'=>$_img//图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
];
}else{
$_data = [
'url'=>request()->domain().'/'.$_imgurl
];
}
$_res = json_decode(httpGet($_url,$_data),true);
//TODO 此处只返回false没有终止,是因为程序执行流程需要,后期可能要改
if(isset($_res['error_msg'])) return false;
return $_res['words_result']['number'];
}
//获取token
private function getToken(){
if(cache('_token')){
$_access_token = cache('_token');
}else{
$_url = 'https://aip.bce.com/oauth/2.0/token?grant_type=client_credentials&client_id='.$this->appKey.'&client_secret='.$this->secretKey;
$res = json_decode(httpGet($_url),true);
if(isset($res['error']))TApiException($res['error_description']);//终止程序并抛出异常
$_access_token = $res['access_token'];
$_expires_in = $res['expires_in'];
cache('_token',$_access_token,($_expires_in-1000));//我喜欢少存1000秒,没有为什么,问就是癖好
}
return $_access_token;
}
}
这是ThinkPhp5.1后端封装的网络AI接口类,getToken()获取凭证,getCarNumber()请求$_url 返回识别结果,这个是车牌号码识别,车型识别等其他接口大部分都一样,就换个请求地址$_url就行
//接口:
public function getImgCarNum(){
$_number = (new BaiDuAiBaseController())->getCarNumber(false,request()->param('img'));
return self::myShow('申请成功',['carNum'=>$_number]);
}
小程序端正常request请求上面的接口就行,下面是微信小程序拍照识别功能
//拍照
goImgSearch(){
uni.chooseImage({
count:1,
sizeType: ['compressed'],//original 原图,compressed 压缩图
sourceType: ['album','camera'],//camera 相机 album相册
success:(r)=>{
console.log(r)
//执行识别车牌号码
this.img = r.tempFilePaths[0]
this.urlTobase64(r.tempFilePaths[0])
}
})
},
//识别车牌号码
urlTobase64(url){
uni.showLoading({
title:'拼命识别车牌中..'
})
//#ifdef MP-WEIXIN
uni.getFileSystemManager().readFile({
filePath: url, //选择图片时返回的路径
encoding: "base64",//这个是很重要的
success: res => { //成功的回调
//返回base64格式
let base64= 'data:image/jpeg;base64,' + res.data
//发送请求,识别车牌号码
this.$H.post('/getImgCarNum',{
img:base64 //图片数据
},{
token:true //必须登录
}).then((res)=>{
console.log(res.carNum)
if(!res.carNum){
uni.hideLoading()
return uni.showModal({
title:'识别失败',
content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',
showCancel:false
})
}
uni.showToast({
title:'识别车牌成功',
icon:'none'
})
this.searchUser = res.carNum
this.userCarNum = res.carNum
uni.hideLoading()
}).catch((e)=>{
uni.hideLoading()
return uni.showModal({
title:'识别失败',
content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',
showCancel:false
})
})
},
fail:(e)=>{
console.log(e)
}
})
//#endif
},