## 问题描述
车牌的检测和识别的应用非常广泛,比如交通违章车牌追踪,小区或地下车库门禁。在对车牌识别和检测的过程中,因为车牌往往是规整的矩形,长宽比相对固定,色调纹理相对固定,常用的方法有:基于形状、基于色调、基于纹理、基于文字特征等方法,近年来随着深度学习的发展也会使用目标检测的一些深度学习方法。
## 实现思路
### 车牌定位
![1608392163939](pic/1608392163939.png)
### 车牌分割
![1608392419612](pic/1608392419612.png)
### 文字识别
![LeNet-5网络结构](pic/lenet.jpg)
## 工程和算法
### 目录结构
源码和数据位于src文件夹中,src文件夹中各个子文件功能如下:
* characterData:内含有所有简体中文车牌包含的字符图片数据集(包括省份汉字、字母、数字)
* singledigit:(请自己创建该空文件夹),用于存储提取出的单个字符图片
* Car.jpg:示例图片,可以用来测试模型识别效果
* getplate.py:车牌定位、字符分割源码
* main.py:模型训练,字符识别源码
### <span id="run">运行</span>
* clone到本地
* 在src文件夹下添加空文件夹,名为 singledigit
* 先运行getplate.py
* 再运行main.py,控制台输出结果
### 车牌定位
```python
import matplotlib.pyplot as plt
import numpy as np
import torch
import cv2
import os
def find_card(I):
# 识别出车牌区域并返回该区域的图像
[y, x, z] = I.shape
# y取值范围分析
Blue_y = np.zeros((y, 1))
for i in range(y):
for j in range(x):
# 蓝色rgb范围
temp = I[i, j, :]
if (I[i, j, 2] <= 30) and (I[i, j, 0] >= 119):
Blue_y[i][0] += 1
MaxY = np.argmax(Blue_y)
PY1 = MaxY
while (Blue_y[PY1, 0] >= 5) and (PY1 > 0):
PY1 -= 1
PY2 = MaxY
while (Blue_y[PY2, 0] >= 5) and (PY2 < y - 1):
PY2 += 1
# x取值
Blue_x = np.zeros((1, x))
for i in range(x):
for j in range(PY1, PY2):
if (I[j, i, 2] <= 30) and (I[j, i, 0] >= 119):
Blue_x[0][i] += 1
PX1 = 0
while (Blue_x[0, PX1] < 3) and (PX1 < x - 1):
PX1 += 1
PX2 = x - 1
while (Blue_x[0, PX2] < 3) and (PX2 > PX1):
PX2 -= 1
# 对车牌区域的修正
PX1 -= 2
PX2 += 2
return I[PY1:PY2, PX1 - 2: PX2, :]
def divide(I):
[y, x, z] = I.shape
White_x = np.zeros((x, 1))
for i in range(x):
for j in range(y):
if I[j, i, 1] > 176:
White_x[i][0] += 1
return White_x
```
### 车牌分割
```pytho
def divide_each_character(I):
[y, x, z] = I.shape
White_x = np.zeros((x, 1))
for i in range(x):
for j in range(y):
if I[j, i, 1] > 176:
White_x[i][0] += 1
res = []
length = 0
for i in range(White_x.shape[0]):
# 使用超参数经验分割
t = I.shape[1] / 297
num = White_x[i]
if num > 8:
length += 1
elif length > 20 * t:
res.append([i - length - 2, i + 2])
length = 0
else:
length = 0
return res
```
定位和分割主函数
```py
if __name__ == '__main__':
I = cv2.imread('Car.jpg')
Plate = find_card(I)
# White_x = divide(Plate)
plt.imshow(Plate)
plt.show()
# plt.plot(np.arange(Plate.shape[1]), White_x)
res = divide_each_character(Plate)
plate_save_path = './singledigit/'
for t in range(len(res)):
plt.subplot(1, 7, t + 1)
temp = res[t]
save_img = cv2.cvtColor(Plate[:, temp[0]:temp[1], :],cv2.COLOR_BGR2GRAY)
ma = max(save_img.shape[0], save_img.shape[1])
mi = min(save_img.shape[0], save_img.shape[1])
ans = np.zeros(shape=(ma, ma, 3),dtype=np.uint8)
start =int(ma/2-mi/2)
for i in range(mi):
for j in range(ma):
if save_img[j,i] > 125:
for k in range(3):
ans[j,start+i,k]=255
ans=cv2.merge([ans[:,:,0],ans[:,:,1],ans[:,:,2]])
ans=cv2.resize(ans,(25,25))
dir_name=plate_save_path+str(t)
os.mkdir(dir_name)
cv2.imwrite(dir_name+'/'+str(t)+'.jpg',ans)
plt.imshow(ans)
plt.show()
```
### 文字识别
```py
from torchvision.datasets import ImageFolder
from torchvision import transforms
from torch.utils.data import DataLoader,SubsetRandomSampler
from torch import nn, optim
import numpy as np
import torch
import time
import sys
import cv2
import os
#车牌字符数组
match = {0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'A', 11: 'B', 12: 'C',13: '川', 14: 'D', 15: 'E', 16: '鄂',17: 'F', 18: 'G', 19: '赣', 20: '甘', 21: '贵', 22: '桂', 23: 'H', 24: '黑', 25: '沪', 26: 'J', 27: '冀', 28: '津',29: '京', 30: '吉', 31: 'K', 32: 'L', 33: '辽',34: '鲁', 35: 'M', 36: '蒙', 37: '闽', 38: 'N', 39: '宁', 40: 'P', 41: 'Q', 42: '青', 43: '琼', 44: 'R', 45: 'S',46: '陕', 47: '苏', 48: '晋', 49: 'T', 50: 'U',51: 'V', 52: 'W ', 53: '皖', 54: 'X', 55: '湘', 56: '新', 57: 'Y', 58: '豫', 59: '渝', 60: '粤', 61: '云', 62: 'Z',63: '藏', 64: '浙'}
data_path = './characterData/data'
data_transform=transforms.Compose([
transforms.Grayscale(),
transforms.ToTensor()
])
dataset=ImageFolder(data_path,transform=data_transform)
validation_split=.1
shuffle_dataset = True
random_seed= 42
batch_size=100
dataset_size = len(dataset)
indices = list(range(dataset_size))
split = int(np.floor(validation_split * dataset_size))
if shuffle_dataset :
np.random.seed(random_seed)
np.random.shuffle(indices)
train_indices, val_indices = indices[split:], indices[:split]
train_sampler = SubsetRandomSampler(train_indices)
test_sampler = SubsetRandomSampler(val_indices)
train_iter = DataLoader(dataset, batch_size=batch_size,
sampler=train_sampler)
test_iter = DataLoader(dataset, batch_size=batch_size,
sampler=test_sampler)
#lenet训练
sys.path.append("..")
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_size
nn.Sigmoid(),
nn.MaxPool2d(2, 2), # kernel_size, stride
nn.Conv2d(6, 16, 5),
nn.Sigmoid(),
nn.MaxPool2d(2, 2)
)
self.fc = nn.Sequential(
nn.Linear(16*4, 120),
nn.Sigmoid(),
nn.Linear(120, 84),
nn.Sigmoid(),
nn.Linear(84, 65)
)
def forward(self, img):
feature = self.conv(img)
output = self.fc(feature.view(img.shape[0], -1))
return output
def evaluate_accuracy(data_iter, net, device=None):
if device is None and isinstance(net, torch.nn.Module):
# 如果没指定device就使用net的device
device = list(net.parameters())[0].device
acc_sum, n = 0.0, 0
with torch.no_grad():
for X, y in data_iter:
if isinstance(net, torch.nn.Module):
net.eval() # 评估模式, 这会关闭dropout
acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item()
net.train() # 改回训练模式
else: # 自定义的模型, 3.13节之后不会用到, 不考虑GPU
if('is_training' in net.__code__.co_varnames): # 如果有is_training这个参数
# 将is_training设置成False
acc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item()
else:
acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
n += y
没有合适的资源?快使用搜索试试~ 我知道了~
基于python和cv2、pytorch实现的车牌定位、字符分割、字符识别项目.zip
共2002个文件
jpg:1995个
py:2个
ds_store:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 130 浏览量
2023-09-30
13:13:30
上传
评论
收藏 19.91MB ZIP 举报
温馨提示
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 适用工作项目、毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,轻松复刻,欢迎下载 -------- 下载后请首先打开README.md文件(如有),仅供学习参考。
资源推荐
资源详情
资源评论
收起资源包目录
基于python和cv2、pytorch实现的车牌定位、字符分割、字符识别项目.zip (2002个子文件)
.DS_Store 6KB
._.DS_Store 120B
lenet.jpg 22KB
debug_chineseMat385.jpg 1KB
debug_chineseMat189.jpg 1KB
debug_chineseMat197.jpg 1KB
debug_chineseMat79.jpg 1KB
debug_chineseMat78.jpg 1KB
debug_chineseMat66.jpg 1KB
debug_chineseMat67.jpg 1KB
debug_chineseMat850.jpg 1KB
debug_chineseMat841.jpg 1KB
debug_chineseMat368.jpg 1KB
debug_char_auxRoi_0215.jpg 1KB
debug_chineseMat215.jpg 1KB
debug_chineseMat211.jpg 1KB
debug_chineseMat18.jpg 1KB
debug_chineseMat976.jpg 1KB
debug_chineseMat415.jpg 1024B
debug_chineseMat74.jpg 1013B
debug_chineseMat843.jpg 1006B
debug_chineseMat35.jpg 997B
debug_chineseMat52.jpg 993B
debug_chineseMat962.jpg 976B
debug_chineseMat367.jpg 960B
debug_chineseMat430.jpg 947B
debug_chineseMat384.jpg 942B
debug_chineseMat375.jpg 933B
debug_chineseMat16.jpg 928B
debug_chineseMat56.jpg 923B
debug_chineseMat182.jpg 913B
debug_chineseMat210.jpg 893B
319_sun_0_15.jpg 889B
debug_chineseMat358.jpg 883B
debug_char_auxRoi_873.jpg 877B
debug_char_auxRoi_871.jpg 872B
debug_chineseMat360.jpg 872B
gt_242_5.jpg 870B
gt_242_4.jpg 869B
gt_436_4.jpg 869B
319_sun_0_6.jpg 866B
319_sun_0_4.jpg 866B
debug_specMat396.jpg 858B
debug_chineseMat361.jpg 855B
debug_chineseMat166.jpg 852B
debug_char_auxRoi_2396.jpg 850B
debug_chineseMat416.jpg 846B
debug_chineseMat32.jpg 845B
debug_char_auxRoi_1454.jpg 838B
debug_chineseMat842.jpg 836B
debug_char_auxRoi_1203.jpg 835B
debug_chineseMat187.jpg 835B
debug_char_auxRoi_1624.jpg 833B
325_sun_jing_2.jpg 832B
debug_specMat183.jpg 832B
debug_char_auxRoi_1618.jpg 831B
debug_chineseMat846.jpg 830B
debug_char_auxRoi_2409.jpg 830B
jing_sun_318_1.jpg 829B
debug_chineseMat4.jpg 829B
debug_char_auxRoi_998.jpg 828B
debug_chineseMat848.jpg 827B
gt_451_5.jpg 826B
debug_char_auxRoi_7.jpg 825B
jing_3.jpg 823B
debug_chineseMat80.jpg 821B
debug_chineseMat5 (2).jpg 818B
debug_char_auxRoi_786.jpg 817B
debug_chineseMat372.jpg 817B
gt_534_5.jpg 816B
debug_chineseMat838.jpg 813B
debug_char_auxRoi_787.jpg 813B
debug_char_auxRoi_6547.jpg 813B
gt_1567_4.jpg 813B
debug_char_auxRoi_1702.jpg 812B
debug_char_auxRoi_1193.jpg 811B
debug_chineseMat208.jpg 810B
debug_chineseMat20.jpg 809B
9-0-1.jpg 809B
debug_chineseMat394.jpg 809B
debug_chineseMat30.jpg 808B
debug_char_auxRoi_1686.jpg 808B
debug_chineseMat397.jpg 807B
debug_chineseMat354.jpg 807B
319_sun_0_5.jpg 806B
gt_664_6.jpg 802B
gt_1037_2.jpg 798B
debug_char_auxRoi_863.jpg 798B
gt_54_5.jpg 797B
debug_char_auxRoi_950.jpg 796B
debug_chineseMat837.jpg 795B
debug_char_auxRoi_2528.jpg 794B
319_sun_0_1.jpg 794B
debug_char_auxRoi_2424.jpg 793B
160-7.jpg 791B
gt_503_1.jpg 791B
gt_288_1.jpg 791B
gt_146_1.jpg 791B
debug_char_auxRoi_865.jpg 791B
debug_chineseMat195.jpg 791B
共 2002 条
- 1
- 2
- 3
- 4
- 5
- 6
- 21
资源评论
程皮
- 粉丝: 279
- 资源: 2566
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功