早期使用Halcon做过车牌识别的小项目。今天一时兴起,作了部分整理。既然现在大家都在玩人工智能,那么我们不妨从简单的车牌识别来练练手。本系列文章将使用CNN+Tensorflow来进行车牌训练识别。本文则先展示车牌生成。
文章链接:https://www.toutiao.com/i6490140686917042701/
卷积神经网络(下文用CNN代替,相信很多人是明白的)实现起来并不难,但要完成一个功能,并不简单地只是构建CNN模型,正如当前人工智能行业的基础三要素:算力、算法和数据。其中,没有数据就好像无米之炊,空有漂亮的模型却无法得到想要的功能。所以,第一步就是创建自己的数据。车牌图像数据,从网上爬肯定是不够的,目前好像也没有现成的数据,所以需要自己生成。
这里要说明的是,为了简化功能和降低训练难度,笔者生成的车牌图像没有考虑背景的情况,其实考虑到整体功能实现,还是有两种方案的,一种是利用OpenCV,直接把车牌从整张图中取出来,再进行识别;另一种就是对图片进行整体识别或者是扫描式的区域识别,这种方式更“人工智能”一些。万事从简入繁,先找软的捏 :)
生成图片主要就是用到pygame包。请各位童鞋自行安装。
生成的效果:
车牌内容构成分解为:汉字+6位26字母与数字的混合。如“鄂A2BP68”
汉字部分为我国三十二省简称。
生成的图片以随机生成的车牌号码命名。
车牌号码同时按行写到txt文件中用于后期生成标签。其实图片名称按车牌号码写的,也可以直接做标签。
字体采用的比较接近的微软雅黑。字体文件网上下个就行。
下面直接上代码
# 生成车牌数据
#coding=utf-8
import os
import pygame
import random
import tensorflow as tf
from pygame.locals import *
# pygame初始化
pygame.init()
number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
city = ['京', '津', '沪', '渝', '冀', '豫', '云', '辽', '黑', '湘', '皖', '鲁', '新', '苏', '浙', '赣', '鄂', '桂', '甘', '晋', '蒙', '陕',
'吉', '闽', '贵', '粤', '青', '藏', '川', '宁', '琼']
TRAINSIZE = 10000 #生成样本量
FILE_PATH = 'E:/SVN/Gavin/Learn/Python/pygame/lpr_imgs/'
def save(filename, contents):
with open(filename,'w') as f:
f.write(contents)
def random_text(char_set=number + ALPHABET, captcha_size=7):
rtext = []
rtext.append(random.choice(city))
rtext.append(random.choice(ALPHABET))
for i in range(2, captcha_size):
c = random.choice(char_set)
rtext.append(c)
str = ''.join(rtext)
return str
def write_label(instr):
label_filename = os.path.join(FILE_PATH, "chepai/labels.txt")
with open(label_filename, "a") as f:
f.writelines(instr + ' ')
font = pygame.font.Font(os.path.join(FILE_PATH, "msyh.ttf"), 32) #注意这里Windows和Mac系统使用的方法是不同的
filepath = os.path.join(FILE_PATH, "chepai/images")
fileformate = ".jpg"
if not os.path.exists(filepath):
os.makedirs(filepath)
#完全随机产生样本有可能使得某些中文字样本偏少无法得到很好的训练,
# 可以通过扩大样本生成量来解决,或者其他手段
for x in range(TRAINSIZE):
text = random_text()
# 渲染图片,设置背景颜色和字体样式,前面的颜色是字体颜色
ftext = font.render(text, True, (65, 83, 130), (255, 255, 255))
filename = filepath + text + fileformate
# 保存图片
label = text + fileformate + "," + text
# pygame.image.save(ftext, filename) # 图片保存地址
pygame.image.save(ftext, os.path.join(filepath, text + ".jpg"))
write_label(label)
print(label)
print("Done")
运行后生成图片文件和标签文件。
学习人工智能,看几篇神经网络的文章,听听在线课程,还是比较容易理解的。但只有真正使用TensorFlow来构建卷积神经网络的模型,实现一些比较贴近生活需求的功能,才算有点收获。否则,始终停留在看和听上,仍然只算是一个旁观者。