新浦京81707con > 注册购买 > 这是一个有颜色的卷积神经网络验证码识别,P

原标题:这是一个有颜色的卷积神经网络验证码识别,P

浏览次数:71 时间:2020-01-23

图片 1率性生成红郎窑红三种颜色中的风度翩翩种图片 2轻巧生成0-9数字中的一个图片 3接下去利用text方法,在刚刚成立好的draw画布中,画上大家随意变化的有颜色数字

3.总结

  自个儿出手男耕女织,风乐趣能够团结做手写体数字数据集,字母和汉字的数目集稍加修正也可以做;

# GitHub:

0.引言 平日上网干啥的大概都会接触验证码,可能在机械学习深造过程中,大家莫不会接触...

此地根本运用了叁个有力的图像管理库PIL,关键代码如下

Python3生成手写体数字艺术,python3生成手写体

图片 4神经互连网模型

0.引言

  日常上网干啥的大都都会接触验证码,或然在机械学习深造进程中,大家可能会接触过手写体识别/验证码识别之类难题,会用到手写体的数据集;

  自个儿尝尝写了二个生成手写体图片的python程序,在那分享下生成单张 30*30像素的手写体数字1-9图像 的后生可畏种完成格局;

  我是采纳random生成随机数1-9,然后PIL写到图像上,然后经过旋转、扭曲管理,获得“手写体”,这里未有加忧愁线和苦恼点;

  得到的手写体数字图像如图1所示;

  完成比较简单,用了PIL库,无需分外安装opencv啥的,有意思味能够团结探究。

图片 5

图1 生成的手写体数字1-9

图片 6

  图2 利用generate_pngs.py写入到文件夹3的数字3图像

  要是你想生成手写体的假名/汉字也得以:

图片 7图片 8

  图3 利用generate_single_png.py生成汉字的手写体

源码上传到了自身的GitHub:

from PILimport Image,ImageFont,ImageDraw

2.py源码介绍

2.1 generate_folders_1to9.py

  因为我们要将内定的图像分类放入钦定文件夹,所以我们需求先在品种目录上面新建9个文本夹:

 (当然你也能够和睦新建,新建9个文本夹专门的职业量还相当的小,不过要是要转移的验证码包含日语字母那就超多了,大写A-Z共贰15个 小写a-z共贰14个 数字1-9共9个=伍拾几个子文件夹)

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_folders_1to9.py
# 在目录下生成用来存放数字1-9的9个文件夹,分别用1-9命名


import os

path_folders = "F:/***/P_generate_handwritten_number/data_pngs/"

# 1-9
for i in range(49,58):
  if (os.path.isdir(path_folders   chr(i))):
    pass
  else:
    # print(i,": ",path_1 chr(i))
    # 生成目录
    os.mkdir(path_folders chr(i))

图片 9

图7 自动生成的用来寄存钦赐图像的文书夹

2.2 generate_pngs.py

  依据给定随机次数samples, 生成samples个手写体数字1-9,然后寄存到地面文件夹1-9生成数据集;

  在49行能够改进生成图像的尺寸,小编这里取的是30*30像素;

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_pngs.py
# 生成手写体数字


import random
from PIL import Image, ImageDraw, ImageFilter, ImageFont

random.seed(3)

# 生成单张扭曲的数字图像
def generate_single():

  # 先绘制一个50*50的空图像
  img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

  # 创建画笔
  draw = ImageDraw.Draw(img_50_blank)

  # 生成随机数1-9
  num = str(random.randint(1, 9))

  # 设置字体,这里选取字体大小25
  font = ImageFont.truetype('simsun.ttc', 20)

  # xy是左上角开始的位置坐标
  draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

  # 随机旋转-10-10角度
  random_angle = random.randint(-10, 10)
  img_50_rotated = img_50_blank.rotate(random_angle)

  # 图形扭曲参数
  params = [1 - float(random.randint(1, 2)) / 100,
       0,
       0,
       0,
       1 - float(random.randint(1, 10)) / 100,
       float(random.randint(1, 2)) / 500,
       0.001,
       float(random.randint(1, 2)) / 500]

  # 创建扭曲
  img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

  # 生成新的30*30空白图像,(在此处可以更改生成的图像大小)
  img_30 = img_50_transformed.crop([10, 10, 40, 40])

  return img_30, num

path_pic = "F:/***/P_generate_handwritten_number/data_pngs/"


# 生成手写体数字1-9存入指定文件夹1-9

# 用cnt_num[1]-cnt_num[9]来计数数字1-9生成的个数,方便之后进行命名
cnt_num = []
for i in range(10):
  cnt_num.append(0)

# 生成次数
samples = 200

for m in range(1, samples 1):

  # 调用生成图像文件函数
  img, generate_num = generate_single()

  # 取灰度
  imgray = img.convert('1')

  # 计数生成的数字1-9的个数,用来命名图像文件
  for j in range(1, 10):
    if(generate_num == str(j)):
      cnt_num[j] = cnt_num[j] 1

      # 路径如 "F:/code/***/P_generate_handwritten_number/data_pngs/1/1_231.png"
      # 输出显示路径
      print(path_pic   str(j)   "/"   str(j)   "_"   str(cnt_num[j])   ".png")
      # 将图像保存在指定文件夹中
      imgray.save(path_pic   str(j)   "/"   str(j)   "_"   str(cnt_num[j])   ".png")

# 输出显示1-9的分布
print("n", "生成的1-9的分布:")
for k in range(9):
  print(k 1, ":", cnt_num[k 1], "张")

output

D:***anacondapython.exe F:/***/P_generate_handwritten_number/generate_pngs.py
F:/***/P_generate_handwritten_number/data_pngs/4/4_1.png
F:/***/P_generate_handwritten_number/data_pngs/1/1_1.png
F:/***/P_generate_handwritten_number/data_pngs/8/8_1.png
F:/***/P_generate_handwritten_number/data_pngs/3/3_1.png
F:/***/P_generate_handwritten_number/data_pngs/1/1_2.png
...

生成的1-9的分布:
: 25 张
: 17 张
: 21 张
: 19 张
: 20 张
: 22 张
: 25 张
: 24 张
: 27 张

修改 generate_pngs.py中的samples, 你就足以扭转钦定大小的数据集;

2.3 generate_single_png.py

  修正27行的char=" "(能够是数字/字母/汉字),生成单张手写体扭曲图像:

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# generate_single_png.py
# 生成手写体数字/字母/汉字


import random
from PIL import Image, ImageDraw, ImageFilter, ImageFont

random.seed(3)

# 生成单张扭曲的数字图像
def generate_single():

  # 先绘制一个50*50的空图像
  img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

  # 创建画笔
  draw = ImageDraw.Draw(img_50_blank)

  # 设置字体,这里选取字体大小25
  font = ImageFont.truetype('simsun.ttc', 20)

  # xy是左上角开始的位置坐标
  # text是你想要显示的内容,数字/字母/汉字
  char ="呵"
  draw.text(xy=(12, 11), font=font, text=char, fill=(0, 0, 0))

  # 随机旋转-10-10角度
  random_angle = random.randint(-10, 10)
  img_50_rotated = img_50_blank.rotate(random_angle)

  # 图形扭曲参数
  params = [1 - float(random.randint(1, 2)) / 100,
       0,
       0,
       0,
       1 - float(random.randint(1, 10)) / 100,
       float(random.randint(1, 2)) / 500,
       0.001,
       float(random.randint(1, 2)) / 500]

  # 创建扭曲
  img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

  # 生成新的30*30空白图像
  img_30 = img_50_transformed.crop([10, 10, 40, 40])

  return img_30, char

path_pic = "F:/code/python/P_generate_handwritten_number/"


# 调用生成图像文件函数
img, generated_char = generate_single()
imgray = img.convert('1')

print(path_pic   "test.png")
# 将图像保存在指定文件夹中
imgray.save(path_pic   "test.png")

2.4 del_pngs.py

  删除内定目录下子文件夹1-9中的全体图片:

# 2018-01-9
# By TimeStamp
# cnblogs: http://www.cnblogs.com/AdaminXie/
# del_pngs.py
# 删除路径下生成的图像文件

import os

path_pic = "F:/***/P_generate_handwritten_number/data_pngs/"

#删除路径下的图片
def del_pic():
  for i in range(1, 10):
   #  print(path_png chr(i))
    namedir = os.listdir(path_pic str(i))

    for tmppng in namedir:
      if( tmppng in namedir):
       # print(tmppng)
        os.remove(path_pic str(i) "/" tmppng)

del_pic()

图片 10变化的验证码

1.设计流程

图片 11

图4 全体设计流程

图片 12

图5 生成的图像经过的拍卖

1.1 新建三个空白图像img_50,尺寸大小为50*50 

img_50_blank = Image.new('RGB', (50, 50), (255, 255, 255))

何以笔者那边要先生成50*50的空域图像?

    因为图像背景(50*50像素的画布)开始化的时候设置为卡其色(颜色数组(255, 255, 255卡塔尔(قطر‎),而背景象之外的实乃樱草黄;

  之后须求开展旋转管理,倘使一贯新建30*30像素的画布,旋转早先面上会并发黑边,如图6所示;

  所以笔者新建了叁个50*50,然后旋转之后从当中间裁出来三个30*30的图像出来;

图片 13

图6 直接用30*30像素的画布写字旋转(会冷俊不禁黑边)

1.2 利用PIL在图像上写文字

  利用PIL的ImageDraw,创立画笔,然后使用draw.text在钦点地点写字;

  xy=(18,11)是从图像左上角带头的坐标,取值自个儿依照供给调解;

# 创建画笔
 draw = ImageDraw.Draw(img_50_blank)

# 生成随机数1-9
num = str(random.randint(1, 9))

# 设置字体,这里选取字体大小25
font = ImageFont.truetype('simsun.ttc', 20)

# xy是左上角开始的位置坐标
draw.text(xy=(18, 11), font=font, text=num, fill=(0, 0, 0))

1.3 将图像随机旋转一定角度

  利用 rotate(angel卡塔尔国举办旋转图像,angel取的是度数,这里让它轻易旋转-10到 10度:

# 随机旋转-10-10角度
 random_angle = random.randint(-10, 10)
 img_50_rotated = img_50_blank.rotate(random_angle)

1.4 图像扭曲

  这里是生成“手写体”数字的为主步骤,三个正规的图像经过回转之后就能够拿到想要的验证码了:

# 图形扭曲参数
params = [1 - float(random.randint(1, 2)) / 100,
      0,
      0,
      0,
      1 - float(random.randint(1, 10)) / 100,
      float(random.randint(1, 2)) / 500,
      0.001,
      float(random.randint(1, 2)) / 500]

# 创建扭曲
img_50_transformed = img_50_rotated.transform((50, 50), Image.PERSPECTIVE, params)

与此同一时间,要封存对应颜色和数字,这里将她们两转变one-hot变量

emmmmmmmmm那样的验证码是未曾灵魂的.......应该未有何人家的验证码长那一个样吧,所以接下去要选取PIL和Augmentor工具对图像进行'改换'.首要目标是让验证码变得更丑更难辨认.

要害代码如下:

#始建的验证码长度宽度

那边一齐有10000张图纸,每张图片单独切分成6个数字,所以最终的练习集是6*10000=6w条数据

图片 14对每张图纸张开截取,然后到场jpg_list列表中

图片 15Augmentor图片扭曲代码图片 16Augmentor效果

图片 17创立画布

好呢,隔了四个月才履新小说,早前一贯在做各类大额竞技.近些日子休赛期,所以把后面部分好的idea完成一下.

图片 18图片 19

width =200

图片 20画点,每张图片画1000个点图片 21画线,每张图随机画1-10条线图片 22效果图

图片 23练习进程图片 24终极注解结果

这一片段神经互联网模型借鉴了杨培文大神的验证码识别github开源,在他的幼功上依据我们团结的必要进行了弹指间改进.大家选用的模子是

初阶化叁个画布之后,必要大家往画布上写东西,根据必要,红威尼斯红0-9的数字

本文由新浦京81707con发布于注册购买,转载请注明出处:这是一个有颜色的卷积神经网络验证码识别,P

关键词: 新浦京81707con 卷积 神经网络 这是一个

上一篇:CNN检测空闲车位,对象检测

下一篇:没有了