Tensorflow.keras筆記-識別Sci-hub驗證碼

2021-02-14 阿皮的筆記

Tensorflow.keras筆記

卷積神經網絡識別Sci-hub驗證碼

使用requests庫和selenium批量下載sci_hub驗證碼數據集。問題考慮:1. 並不是每次輸入doi都能出現需要驗證碼的情況。2. 批量下載會出現檢測出網頁爬蟲檢測情況,需要隨機休息一段時間後下載。3. 下載失敗如何繼續運行,循環運行下載。
from selenium import webdriver from selenium.webdriver.common.keys import Keys  import reimport requestsimport timeimport numpy as npdef path(sci,doi,start,end,path):    browser = webdriver.Chrome(executable_path = "D:/chromedriver.exe")    for i in range(start,end):        browser.get(sci)        jpg = browser.find_element_by_name('request')        jpg.send_keys(doi)        jpg.send_keys(Keys.ENTER)        try:            a = sci + re.search(r'(src=")(.*)(.jpg)',browser.page_source ).group(2) + '.jpg'            b = requests.get(a, timeout = 30)            b.encoding = b.apparent_encoding            load = path + 'test' + str(i+1) + '.jpg'          #開始下載test數據            with open(load, 'wb') as f:                f.write(b.content)            print('下載成功 test{}.jpg'.format(str(i+1)))  #開始下載test數據        except:            print('下載失敗')            break        time.sleep(np.random.randint(1))    browser.quit()    i = i     return i  a = ['10.2174/1381612820666140825143610'    ,'10.1037/ccp0000440',       '10.1176/appi.psychotherapy.20190009'  ,'10.1037/pas0000715',       '10.4149/neo_2019_190131N92'           ,'10.1016/j.oftal.2019.04.003',       '10.1136/rmdopen-2019-000914'          ,'10.1136/rmdopen-2019-001017',       '10.1016/j.eimc.2019.01.014'           ,'10.1136/bmjopen-2019-030598']k = 1for i in range (len(a)):     k = path(sci = r'https://sci-hub.se',                           doi = a[i],             start = k,             end = 500,             path = r'D:/sci_hub_raw/test/')    if k == 500:        break

處理sci-hub驗證集圖片存在噪聲,並對齊做二值化處理。首先,利用photoshop查詢噪聲與字母的RGB灰度值差異,並按差異條件做二值化處理。其次,批量載入圖片,並保存為npz數組格式。

from PIL import Imageimport numpy as npimport pandas as pddef jpg_load(load,width,length,lower,upwer):    img = Image.open(load)    img = img.convert('L')    img = np.array(img)    for i in range(width):        for j in range(length):            if img[i,j] <= upwer and img[i,j] >= lower:                img[i,j] = 1            else:                img[i,j] = 0                      return imgload = 'D:/1_數據/Python/Tensorflow學習/數據/sci_hub_1/sci_hub_raw'train_path0 = ['1_500'   ,'501_1000' ,'1001_1500','1501_2000','2001_2500',              '2501_3000','3001_3500','3501_4000','4001_4500','4501_5000',              '5001_5500','5501_6000','6001_6500','6501_7000','7001_7500',              '7501_8000','8001_8500','8501_9000','9001_9500','9501_10000']train_path1 = np.arange(10000).reshape(20,500) + 1train = np.empty((10000,200,800))for i in range(20):    for j in range(500):        a = train_path0[i]        b = train_path1[i,j]        c = b -1         path = load + '/' + str(a) + '/' + str(b) + '.jpg'        img = jpg_load(path,200,800,115,125)        img = img.reshape(1,200,800)        train[c] = img        if b%10 == 0:            print('載入第{0}張圖片'.format(b))np.savez('D:/sci_hub_op/train.npz',train_x = train)

CNN建模:sci-hub圖片驗證碼共有6個字母,屬於單輸入多輸出情況。
PS:該模型為學習後測試模型,重點在於我可以完整跑完正個流程,雖然後面結果也不錯(圖片特徵比較簡單吧)。0.01. 載入圖片數據和結局數據,並修改成可輸入模型格式。2. 建模:五層卷積,卷積層分別為32/64/128/256/512,卷積核3*3,relu激活函數,最大池化2*2,全連接層直接輸出六次結果。3. 預測:圖片六個字母全預測正確才算完整預測出一張驗證碼。
import pandas as pdimport numpy as npimport tensorflow as tffrom tensorflow import kerasimport osfrom matplotlib import pyplot as pltfrom tensorflow.keras.layers import Conv2D,BatchNormalization,Activation,MaxPool2D,Dropout,Flatten,Densefrom tensorflow.keras import Modelfrom tensorflow.keras.layers import Input,MaxPooling2Dnp.set_printoptions(threshold=np.inf)train = np.load('D:/sci_hub_op/train.npz')train_x = train['train_x']train_y = train['train_y']train_x = train_x.astype('float32')train_x = train_x.reshape(10000,200,800,1)b = [train_y[0],train_y[1],train_y[2],train_y[3],train_y[4],train_y[5]]input_x = Input(shape=(200,800,1))x = input_x    x = Conv2D(filters=32,kernel_size=(3,3),activation='relu',padding = 'same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D((2,2),padding='same')(x)    x = Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding = 'same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D((2,2),padding='same')(x)    x = Conv2D(filters=128,kernel_size=(3,3),activation='relu',padding = 'same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D((2,2),padding='same')(x)    x = Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding = 'same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D((2,2),padding='same')(x)    x = Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding = 'same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D((2,2),padding='same')(x)x = Dropout(0.2)(x)    x = Flatten()(x)x = [Dense(26,activation='softmax',name='c%d' % (i+1))(x) for i in range(6)]    model = Model(inputs=input_x, outputs=x)model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])model.fit(train_x,b,batch_size=1,epochs=2,validation_split=0.1)
word = ['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']letter = {}for i, v in enumerate(word): letter[v] = iletter_T = dict(zip(letter.values(),letter.keys()))result = []for i in range(10000): x_predict = train_x[i].reshape(1,200,800,1) c = model.predict(x_predict) c = np.array(c).reshape(6,26) c = c.argmax(axis=1) if i % 100 == 0: print(i) result.append(c)result = np.array(result)
y_result = train_y.transpose(1,0,2)y_result = y_result.argmax(axis = 2)y_result = y_result[0:10000,:]d = []for i in range(10000): if list(result[i]) == list(y_result[i]): e = 1 d.append(e) else: e = 0 d.append(e)d = np.array(d)sum(d)f = []for j in range(10000): c = '' for i in range(6): a = result[j,i] b = letter_T[a] c = c + b f.append(c)    print('第{0}個字母是:{1}'.format(j+1,c))f = pd.DataFrame(f)

相關焦點

  • 使用Python+Tensorflow的CNN技術快速識別驗證碼
    目前,在圖像識別和視覺分析研究中,卷積神經網絡(CNN)技術的使用越來越多。Tensorflow 是由 Google 團隊開發的神經網絡模塊,短短幾年間, 就已經有很多次版本的更新。最近我也在自學Tensorflow,想通過卷積神經網絡快速識別整塊驗證碼(不分割字符)。期間也碰到許多問題,諸如軟體安裝,Tensorflow版本差異等。
  • Tensorflow.keras筆記-卷積神經網絡
    Tensorflow.keras筆記-卷積神經網絡cifar10數據集    1.
  • 100天搞定機器學習|day39 Tensorflow Keras手寫數字識別
    1、安裝庫tensorflow有些教程會推薦安裝nightly,它適用於在一個全新的環境下進行TensorFlow的安裝,默認會把需要依賴的庫也一起裝上。我使用的是anaconda,本文我們安裝的是純淨版的tensorflow,非常簡單,只需打開Prompt:
  • Keras,TensorFlow 的高級 API
    您可以構建新層、指標和損失函數,還可以開發頂尖模型Keras:快速概覽 指南會幫助您入門(https://www.tensorflow.org/alpha/guide/keras/overview)。如需適合初學者的 tf.keras 機器學習簡介,請參閱此 入門教程集(https://www.tensorflow.org/tutorials/keras)。
  • 教程 | Tensorflow keras 極簡神經網絡構建與使用
    發布於2015年,是一套高級API框架,其默認的backend是tensorflow,但是可以支持CNTK、Theano、MXNet作為backend運行。其特點是語法簡單,容易上手,提供了大量的實驗數據接口與預訓練網絡接口,最初是谷歌的一位工程師開發的,非常適合快速開發。
  • TensorFlow自動識別驗證碼(一)
    作者再使用插件需要一個額外的第三方的驗證碼網站。對於驗證碼識別,其實現在用深度學習已經對普通的驗證碼有了效率碼有了非常高的識別率 。這篇文章主要來編寫如何使用tensorflow來編寫自己的驗證碼識別器。0x001 深度學習基礎由於本文只是簡單做一下驗證碼的介紹 並不會過多深入講述深度學習。只是簡單概括一下 深度學習需要做的事情。
  • 100天搞定機器學習|day40-42 Tensorflow Keras識別貓狗
    import tensorflow as tffrom tensorflow.keras.datasets import cifar10from tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.models import Sequential
  • Python貓狗識別tensorflow2.0
    最近的工作太繁雜了,不知道要從何寫起,想起之前寫過用tensorflow1.x實現的「貓狗識別」的案例,這次就寫一個用tensorflow2.0實現的案例吧。貓狗識別的數據集依舊可以從Kaggle上下載,或者直接百度,應該有很多可以下載的地方,或者直接在本公眾號後臺回復「貓狗」也可以獲取下載連結。
  • 圖像分類任務中,Tensorflow 與 Keras 到底哪個更厲害?
    他們提出了一個名為TPU的獨立實例,它具有最強大的功率驅動計算能力來處理tensorflow的深度學習模型。是時候做一個了!我現在將幫助你使用tensorflow創建一個功能強大的圖像分類器。等等!什麼是分類器?這只是一個簡單的問題,你向你的tensorflow代碼詢問,給定的圖像是玫瑰還是鬱金香。所以,首先的首先,讓我們在機器上安裝tensorflow。
  • 深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • Keras vs tf.keras: 在TensorFlow 2.0中有什麼區別?
    TensorFlow v1.10.0中引入了tf.keras子模塊,這是將Keras直接集成在TensorFlow包本身中的第一步。tf.keras軟體包與您將要通過pip安裝的keras軟體包分開(即pip install keras)。原始的keras軟體包不包含在tensorflow中以確保兼容性,因此它們都可以有機地發展。
  • 深度學習筆記7:Tensorflow入門
    作者:魯偉 一個數據科學踐行者的學習日記。
  • TensorFlow 2.0 中的 tf.keras 和 Keras 有何區別?為什麼以後一定要用 tf.keras?
    tf.keras 是在 TensorFlow v1.10.0 中引入的,這是將 keras 直接集成到 TensorFlow 包中的第一步。tf.keras 軟體包與你通過 pip 安裝的 keras 軟體包(即 pip install keras)是分開的,過去是這樣,現在也是。為了確保兼容性,原始的 keras 包沒有被包含在 tensorflow 中,因此它們的開發都很有序。
  • TensorFlow 1.9 新增 tf.keras 官方入門教程(Keras與TF的深度集成)
    好消息是Keras的許多核心功能已經融入了原生的TensorFlow(tf.keras),TensorFlow 1.9新增tf.keras官方入門文檔,介紹了tf.keras的使用。這幾天打開TensorFlow的官方教程頁(https://www.tensorflow.org/tutorials/),會發現教程頁中給出的DEMO變成了基於tf.keras的教程。
  • TensorFlow (2) CIFAR-10 簡單圖像識別
    和之前一樣,使用 http_proxy 代理:import matplotlib.pyplot as pltimport tensorflow as tffrom tensorflow.kerasimport layers, modelsimport tensorflow_datasets as tfdsimport osimport ssl
  • 使用Tensorflow及Keras對Mnist手寫數字數據集進行預測識別
    圖一下面進入代碼部分(筆者系統為win10):import tensorflow as tf print(tf.__version__)     1.將Mnist數據集導入:from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('.
  • RTX 3090 的深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • RTX 3090的深度學習環境配置指南:Pytorch、TensorFlow、Keras
    還不支持cudatoolkit=11中下載cudnn)從https://developer.nvidia.com/rdp/cudnn-download下載cudnn,解壓後進入cuda/lib64路徑下,把裡面所有文件拷入對應虛擬環境(exp38)的lib中(6)裝tf2.5(不要裝tensorflow-gpu
  • TensorFlow 2.0正式版官宣!深度集成Keras
    查看分布式訓練指南了解更多:https://www.tensorflow.org/guide/distributed_trainingTensorFlow 2.0在GPU上提供了許多性能改進。如果你使用過TensorFlow 1.x,這裡有一個遷移到2.0的官方指南:https://www.tensorflow.org/guide/migrateTensorFlow 2.0也包括一個自動轉換腳本。
  • 深度學習框架(TensorFlow、keras、PyTorch)
    一、TensorFlow(參見中文文檔)TensorFlow其命名基於工作原理,tensor 意為張量(即多維數組),flow 意為流動。