今天要來跟大家分享驗證碼辨識,因為公司也有用到,我就搭配一個網站,讓大家來嘗試看看,這個網站是"身分證國民身分證領補換資料查詢作業",銀行作業很常會用到,今天就以他的驗證碼來做練習吧!!
網站連結
要做圖像辨識,我們第一件事情一定是先蒐集資料,爬取夠多的圖片,才能練出更準確的模型。小弟爬取圖片的部分,是跟我們公司老大學的,主要先擷取網站頁面,再定位驗證碼圖片位置,把驗證碼再截圖下來,再做人工標記。
這邊我們主要用selenium去做操作,要用selenium開啟chrome要先去這邊下載chromedriver.exe。另外我們需要儲存圖片,我這邊使用PIL的Image去做圖片的開啟和儲存。我們這個圖片爬取的執行都是在背景下執行,不開視窗。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
chrome_options = Options()
chrome_options.add_argument("--headless")#不開視窗,在背景下處理
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.ris.gov.tw/apply-idCard/app/idcard/IDCardReissue/main")
先進去網頁整頁截圖。
scroll_width = driver.execute_script('return document.body.parentNode.scrollWidth')
scroll_height = driver.execute_script('return document.body.parentNode.scrollHeight')
driver.set_window_size(scroll_width, scroll_height)
driver.save_screenshot('./cap_pic/fullpage.jpg')
這是我們全屏截圖的圖片。
現在我們要把他圖形驗證的圖片給切下來。
先找到圖形驗證碼的位置,然後抓取他的位置,指定好寬高,之後打開剛剛的全屏截圖,在將我們設定的位置給取出來,轉換成RGB去做儲存。
element = driver.find_element_by_xpath('//*[@id="captchaImage_captcha-refresh"]')
left = element.location['x']
right = element.location['x'] + element.size['width']
top = element.location['y']
bottom = element.location['y'] + element.size['height']
img = Image.open('./cap_pic/fullpage.jpg')
img = img.crop((left, top, right, bottom))
img = img.convert("RGB")
img.save(f'C:/Users/Frank/PycharmProjects/practice/captcha_recognition/pic/{i}.jpg')
我們要抓很多張,這邊假設我們抓100張圖片,下面是完整程式碼:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
for i in range(0,100):
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.ris.gov.tw/apply-idCard/app/idcard/IDCardReissue/main")
######
scroll_width = driver.execute_script('return document.body.parentNode.scrollWidth')
scroll_height = driver.execute_script('return document.body.parentNode.scrollHeight')
driver.set_window_size(scroll_width, scroll_height)
driver.save_screenshot('./cap_pic/fullpage.jpg')
# 網頁中圖片驗證碼的位置
element = driver.find_element_by_xpath('//*[@id="captchaImage_captcha-refresh"]')
left = element.location['x']
right = element.location['x'] + element.size['width']
top = element.location['y']
bottom = element.location['y'] + element.size['height']
img = Image.open('./cap_pic/fullpage.jpg')
img = img.crop((left, top, right, bottom))
img = img.convert("RGB")
img.save(f'./pic/{i}.jpg')
print(f"已儲存:{i}.jpg")
這樣我們就把圖片抓取下來啦,再來就是手動標籤每張圖片的label了。
因為如果在圖片名稱直接標籤會有個問題,就是萬一label是一樣的,檔名就會重複,那等於一種組合的字只能有一張圖片,所以我會把它標記在CSV裡面。
今天就先分享爬取圖片的方法,因為這幾天較忙,沒有太多時間,所以建模部分,我就放在明天的部分再跟各位分享囉!!
我主要用pytorch的框架,會分享一個自己架CNN和使用預訓練模型去訓練的差別。
謝謝各位~明天見囉!!