使用CNN破解一下自己生成的图片验证码,因为电脑性能不行,只破解四位的数字验证码,代码实现中可以对符号、字符和数字混合的验证码进行破解,原理相同,有高性能GPU的童鞋可以试试玩玩。CNN使用简单的三层卷积,人懒结构手绘如下图:

生成验证码的代码,使用了第三方库:

[python] view plaincopy
  1. #coding=utf-8
  2. import tensorflow as tf
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. #conda install Pillow
  6. from PIL import Image
  7. import random
  8. #pip install captcha 安装验证码库
  9. from captcha.image import ImageCaptcha
  10. #本代码生成验证码图片
  11. number = ['0','1','2','3','4','5','6','7','8','9']
  12. 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']
  13. 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']
  14. def random_captcha_text(char_set=number+alphabet+ALPHABET, captcha_size=4):
  15. captcha_text = []
  16. for i in range(captcha_size):
  17. c = random.choice(char_set)
  18. captcha_text.append(c)
  19. return captcha_text
  20. def gen_captcha_text_and_image():
  21. #构造captcha对象
  22. image = ImageCaptcha()
  23. captcha_text = random_captcha_text()
  24. #list->string
  25. captcha_text = ''.join(captcha_text)
  26. #生成图像验证码
  27. captcha = image.generate(captcha_text)
  28. #image.write(captcha_text, captcha_text + '.jpg')
  29. captcha_image = Image.open(captcha)
  30. #转换为numpu array格式
  31. captcha_image = np.array(captcha_image)
  32. #返回Label和验证码
  33. return captcha_text, captcha_image
  34. if __name__ == '__main__':
  35. text, image = gen_captcha_text_and_image()
  36. f = plt.figure()
  37. ax = f.add_subplot(111)
  38. ax.text(0.1, 0.9,text, ha='center', va='center', transform=ax.transAxes)
  39. plt.imshow(image)
  40. plt.show()

生成的效果如图:

验证码识别代码:

[python] view plaincopy
  1. #coding=utf-8
  2. import numpy as np
  3. import tensorflow as tf
  4. from captcha.image import ImageCaptcha
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. from PIL import Image
  8. import random
  9. number = ['0','1','2','3','4','5','6','7','8','9']
  10. #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']
  11. #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']
  12. #def random_captcha_text(char_set=number+alphabet+ALPHABET, captcha_size=4):
  13. #生成验证码文本
  14. def random_captcha_text(char_set=number, captcha_size=4):
  15. captcha_text = []
  16. for i in range(captcha_size):
  17. c = random.choice(char_set)
  18. captcha_text.append(c)
  19. return captcha_text
  20. #生成验证码图片(H*W*Chanel)和标签
  21. def gen_captcha_text_and_image():
  22. image = ImageCaptcha()
  23. captcha_text = random_captcha_text()
  24. captcha_text = ''.join(captcha_text)
  25. captcha = image.generate(captcha_text)
  26. #image.write(captcha_text, captcha_text + '.jpg')
  27. captcha_image = Image.open(captcha)
  28. captcha_image = np.array(captcha_image)
  29. return captcha_text, captcha_image
  30. def convert2gray(img):
  31. if len(img.shape) > 2:
  32. gray = np.mean(img, -1)
  33. # 上面的转法较快,正规转法如下
  34. # r, g, b = img[:,:,0], img[:,:,1], img[:,:,2]
  35. # gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
  36. return gray
  37. else:
  38. return img
  39. def text2vec(text):
  40. text_len = len(text)
  41. if text_len > MAX_CAPTCHA:
  42. raise ValueError('验证码最长4个字符')
  43. vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)
  44. """
  45. def char2pos(c):
  46. if c =='_':
  47. k = 62
  48. return k
  49. k = ord(c)-48
  50. if k > 9:
  51. k = ord(c) - 55
  52. if k > 35:
  53. k = ord(c) - 61
  54. if k > 61:
  55. raise ValueError('No Map')
  56. return k
  57. """
  58. for i, c in enumerate(text):
  59. idx = i * CHAR_SET_LEN + int(c)
  60. vector[idx] = 1
  61. return vector
  62. # 向量转回文本
  63. def vec2text(vec):
  64. """
  65. char_pos = vec.nonzero()[0]
  66. text=[]
  67. for i, c in enumerate(char_pos):
  68. char_at_pos = i #c/63
  69. char_idx = c % CHAR_SET_LEN
  70. if char_idx < 10:
  71. char_code = char_idx + ord('0')
  72. elif char_idx <36:
  73. char_code = char_idx www.thd178.com/- 10 + ord('A')
  74. elif char_idx < 62:
  75. char_code = char_idx-  36 + ord('a')
  76. elif char_idx == 62:
  77. char_code = ord('_')
  78. else:
  79. raise ValueError('error')
  80. text.append(chr(char_code))
  81. """
  82. text=[]
  83. char_pos = vec.nonzero()[0]
  84. for i, c in enumerate(char_pos):
  85. number = i % 10
  86. text.append(str(number))
  87. return "".join(text)
  88. """
  89. #向量(大小MAX_CAPTCHA*CHAR_SET_LEN)用0,1编码 每63个编码一个字符,这样顺利有,字符也有
  90. vec = text2vec("F5Sd")
  91. text = vec2text(vec)
  92. print(text)  # F5Sd
  93. vec = text2vec("SFd5")
  94. text = vec2text(vec)
  95. print(text)  # SFd5
  96. """
  97. # 生成一个训练batch
  98. def get_next_batch(batch_size=128):
  99. batch_x = np.zeros([batch_size, IMAGE_HEIGHT*IMAGE_WIDTH])
  100. batch_y = np.zeros([batch_size, MAX_CAPTCHA*CHAR_SET_LEN])
  101. # 有时生成图像大小不是(60, 160, 3)
  102. def wrap_gen_captcha_text_and_image():
  103. while True:
  104. text, image = gen_captcha_text_and_image()
  105. if image.shape == (60, 160, 3):
  106. return text, image
  107. for i in range(batch_size):
  108. text, image = wrap_gen_captcha_text_and_image()
  109. image = convert2gray(image)
  110. batch_x[i,:] = image.flatten() / 255 # (image.flatten()-128)/128  mean为0
  111. batch_y[i,:] = text2vec(text)
  112. return batch_x, batch_y
  113. # 定义CNN
  114. # w_alpha, b_alpha传入一个很小的值作为初始化值
  115. def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1):
  116. #传入的X为[batch_size,H,W],需要转换为Tensorflow格式[batch_size,H,W,Chanel]
  117. x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1])
  118. #w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHT*IMAGE_WIDTH)) #
  119. #w_c2_alpha = np.sqrt(2.0/(3*3*32))
  120. #w_c3_alpha = np.sqrt(2.0/(3*3*64))
  121. #w_d1_alpha = np.sqrt(2.0/(8*32*64))
  122. #out_alpha = np.sqrt(2.0/1024)
  123. # 3 conv layer
  124. #filter:3*3,输入通道1(灰度图),输出(特征图):32
  125. w_c1 = tf.Variable(w_alpha*tf.random_normal([3, 3, 1, 32]))
  126. b_c1 = tf.Variable(b_alpha*tf.random_normal([32]))
  127. conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_www.tkcyl1.com c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1))
  128. conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  129. conv1 = tf.nn.dropout(conv1, keep_prob)
  130. w_c2 = tf.Variable(w_alpha*tf.random_normal([3, 3, 32, 64]))
  131. b_c2 = tf.Variable(b_alpha*tf.random_normal([64]))
  132. conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2))
  133. conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  134. conv2 = tf.nn.dropout(conv2, keep_prob)
  135. w_c3 = tf.Variable(w_alpha*tf.random_normal([3, 3, 64, 64]))
  136. b_c3 = tf.Variable(b_alpha*tf.random_normal([64]))
  137. conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3))
  138. conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, www.huachengj1980.com/1], strides=[1, 2, 2, 1], padding='SAME')
  139. conv3 = tf.nn.dropout(conv3, keep_prob)
  140. # Fully connected layer
  141. w_d = tf.Variable(w_alpha*tf.random_normal([8*20*64, 1024]))
  142. b_d = tf.Variable(b_alpha*tf.random_normal([1024]))
  143. #卷积结果扁平化
  144. dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]])
  145. dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d))
  146. dense = tf.nn.dropout(dense, keep_prob)
  147. w_out = tf.Variable(w_alpha*tf.random_normal([1024, MAX_CAPTCHA*CHAR_SET_LEN]))
  148. b_out = tf.Variable(b_alpha*tf.random_normal([MAX_www.chaoyueyule.com CAPTCHA*CHAR_SET_LEN]))
  149. out = tf.add(tf.matmul(dense, w_out), b_out)
  150. return out
  151. # 训练
  152. def train_crack_captcha_cnn():
  153. #三层CNN预测输出
  154. output = crack_captcha_cnn()
  155. loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output, labels=Y))
  156. optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
  157. predict = tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN])
  158. max_idx_p = tf.argmax(predict, 2)
  159. max_idx_l = tf.argmax(tf.reshape(Y, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
  160. correct_pred = tf.equal(max_idx_p, max_idx_www.536611.cn  l)
  161. accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
  162. saver = tf.train.Saver()
  163. with tf.Session() as sess:
  164. sess.run(tf.global_variables_initializer(www.wanmeiyuele.cn ))
  165. step = 0
  166. while True:
  167. batch_x, batch_y = get_next_batch(64)
  168. _, loss_ = sess.run([optimizer, loss], www.636591.cn feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.75})
  169. print(step, loss_)
  170. # 每100 step计算一次准确率
  171. if step % 10 == 0:
  172. batch_x_test, batch_y_test = get_next_batch(100)
  173. acc = sess.run(accuracy, feed_dict={X: batch_x_test, Y: batch_y_test, keep_prob: 1.})
  174. print(step, acc)
  175. # 如果准确率大于50%,保存模型,完成训练
  176. if acc > 0.50:
  177. saver.save(sess, "./model/crack_www.douniu157.com capcha.model", global_step=step)
  178. break
  179. step += 1
  180. def crack_captcha(captcha_image):
  181. output = crack_captcha_cnn()
  182. saver = tf.train.Saver()
  183. with tf.Session() as sess:
  184. saver.restore(sess, "./model/crack_capcha.model-810")
  185. predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
  186. text_list = sess.run(predict, feed_dict={X: [captcha_image], keep_prob: 1})
  187. text = text_list[0].tolist(www.cnzhaotai.com)
  188. return text
  189. if __name__ == '__main__':
  190. #定义train变量,train=0:网络测试,train=1:网络训练
  191. train = 0
  192. if train == 0:
  193. number = ['0','1','2','3','4','5','6','7','8','9']
  194. #没有GPU,为加快训练速度,暂时只训练仅含数字的验证码
  195. #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']
  196. #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']
  197. text, image = gen_captcha_text_and_image()
  198. print("验证码图像channel:", image.shape)  # (60, 160, 3)
  199. # 图像大小
  200. IMAGE_HEIGHT = 60
  201. IMAGE_WIDTH = 160
  202. MAX_CAPTCHA = len(text)
  203. print("验证码文本最长字符数", MAX_CAPTCHA)
  204. # 文本转向量
  205. #char_set = number + alphabet + ALPHABET + ['_']  # 如果验证码长度小于4, '_'用来补齐
  206. char_set = number
  207. CHAR_SET_LEN = len(char_set)
  208. #验证码识别中,颜色用处不大,因此将彩色图转换为灰度图,加快训练速度
  209. X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT*IMAGE_WIDTH])  #60*160
  210. #四位验证码:采用四组10位的one-hot
  211. Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHA*CHAR_SET_LEN])  #4*10
  212. # dropout
  213. keep_prob = tf.placeholder(tf.float32)
  214. train_crack_captcha_cnn()
  215. if train == 1:
  216. number = ['0','1','2','3','4','5','6','7','8','9']
  217. IMAGE_HEIGHT = 60
  218. IMAGE_WIDTH = 160
  219. char_set = number
  220. CHAR_SET_LEN = len(char_set)
  221. text, image = gen_captcha_text_and_image()
  222. f = plt.figure()
  223. ax = f.add_subplot(111)
  224. ax.text(0.1, 0.9,text, ha='center', va='center', transform=ax.transAxes)
  225. plt.imshow(image)
  226. plt.show()
  227. MAX_CAPTCHA = len(text)
  228. image = convert2gray(image)
  229. image = image.flatten() / 255
  230. X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT*IMAGE_WIDTH])
  231. Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHA*CHAR_SET_LEN])
  232. keep_prob = tf.placeholder(tf.float32) # dropout
  233. predict_text = crack_captcha(image)
  234. print("正确: {}  预测: {}".format(text, predict_text))

转载于:https://www.cnblogs.com/qwangxiao/p/9119447.html

CNN破解简单验证码(Tensorflow实现)相关推荐

  1. 破解验证码相关:用imagemagick和tesseract-ocr破解简单验证码

    本文源自:http://hooopo.iteye.com/blog/993538 工具:imagemagick + tesseract-ocr Tesseract-ocr据说辨识程度是世界排名第三,可 ...

  2. Python视觉深度学习系列教程 第一卷 第21章 案例:使用CNN破解验证码

            第一卷 第二十一章 案例:使用CNN破解验证码 Breaking captchas with deep learning, Keras, and TensorFlow - PyImag ...

  3. python tensorflow验证码识别_Tensorflow简单验证码识别应用

    简单的Tensorflow验证码识别应用,供大家参考,具体内容如下 1.Tensorflow的安装方式简单,在此就不赘述了. 2.训练集训练集以及测试及如下(纯手工打造,所以数量不多): 3.实现代码 ...

  4. 利用keras破解captcha验证码

    本文参考了知乎上的一篇文章,只做了少许改动,感觉挺好玩的,自己实现了一下,准确率比原作者的要高一些.如果想要了解原创文章的话,请移步知乎:使用深度学习来破解captcha验证码 本文通过keras深度 ...

  5. 国外大神一张图学会python-12306看了会沉默,国外大神利用机器学习15分钟破解网站验证码!...

    原标题:12306看了会沉默,国外大神利用机器学习15分钟破解网站验证码! 相信很多同学,都曾被12306的神级验证码虐到过怀疑人生,但是看了下面这一位国外一位大神的分享,小蓝我算是知道为什么1230 ...

  6. 使用tesseract-ocr破解网站验证码

    首先我得承认,关注tesseract-ocr, 是冲着下面这篇文章的噱头去的,26行groovy代码破解网站验证码  http://www.kellyrob99.com/blog/2010/03/14 ...

  7. Python Selenium破解滑块验证码最新版!

    通过率高达百分之95!真的强! 一.滑块验证码简述 有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展.而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号, ...

  8. 暴力破解和验证码安全

    暴力破解和验证码安全 暴力破解注意事项 1.破解前一定要有一个有效的字典(Top100 Top2000 csdn QQ 163邮箱等密码) 2.判断用户是否设置了复杂密码 前端正常注册,看密码设置是否 ...

  9. python手工打码_使用Python + Selenium破解滑块验证码

    在前面一篇博客,介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全没有问题了.看了前一篇博客,可能有人会有疑惑,浏览器爬虫的优势感觉并不比传统 ...

最新文章

  1. APUE学习笔记——第十章信号中10.15节例程的运行结果与书本里的不一样
  2. python 文件格式转换_Python的处理数据,如何进行数据转换,学会三种方式
  3. pytorch的梯度计算以及backward方法
  4. 使用SqlCommandBuilder
  5. 解决:Truncated incorrect DOUBLE value: xxxX-1‘
  6. 如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...
  7. oracle的序列为什么会出错,Oracle系列:(24)序列
  8. 社区发现(二)--GN
  9. 教你如何创建unity3d多个定时器,以及定时器的其他操作
  10. 编辑距离及编辑距离算法 1
  11. pythonwhileelse,关于Python while语句的Else子句
  12. 各类程序开发下载地址备注:
  13. 用Java实现学生管理系统【简化版】基础
  14. C语言:字符数字转int
  15. 如何在POWER BI中翻转90度显示标题?
  16. 如何把证件照裁剪到需要的尺寸?小一寸证件照的尺寸是多少?
  17. linux uefi iso,支持UEFI启动的GRUB2 ISO光盘镜像的制作
  18. 光滑曲线_微分几何笔记(4) —— 二维三维空间中曲线的曲率以及环绕数
  19. 新来的妹纸 rm -rf 把公司整个数据库删没了,整个项目组慌了~
  20. 基础知识 | node js基础知识

热门文章

  1. C语言基础之--sizeof()运算符的使用以及注意
  2. SQL Server 重命名数据库
  3. php json_encode options,json_encode($json,$option) 对变量进行 JSON 编码说明
  4. Python中列表的增、删、改、查、排序
  5. 17R-无重复数字的三位数和去重后最大数
  6. windows2008开机占用多少内存_如何提升电脑开机速度?
  7. 祝心想事成无Bug,1024快乐!
  8. Cover V2将启用两条产品线 本周开始进行V2 UI开发
  9. 去中心化存储项目Sia计划于2月初启动Sia基金会
  10. SAP ERP与国内ERP系统的对比,为什么建议选SAP