訂閱
糾錯(cuò)
加入自媒體

教你使用基于計(jì)算機(jī)視覺的PAN卡欺詐檢測(cè)

什么是計(jì)算機(jī)視覺?計(jì)算機(jī)視覺是人工智能的一個(gè)領(lǐng)域,它訓(xùn)練計(jì)算機(jī)解釋和理解視覺世界。使用來自相機(jī)和視頻的數(shù)字圖像以及深度學(xué)習(xí)模型,機(jī)器可以準(zhǔn)確地識(shí)別和分類物體——然后對(duì)它們“看到”的東西做出反應(yīng)。

計(jì)算機(jī)視覺任務(wù)包括獲取、處理、分析和理解數(shù)字圖像的方法

圖像處理中的計(jì)算機(jī)視覺主要專注于處理原始輸入圖像以增強(qiáng)它們使其做好完成其他任務(wù)的準(zhǔn)備。計(jì)算機(jī)視覺專注于從輸入圖像或視頻中提取信息,以正確理解它們,從而像人腦一樣預(yù)測(cè)視覺輸入。

目的

該項(xiàng)目的目的是使用計(jì)算機(jī)視覺檢測(cè) PAN 卡的篡改/欺詐。這個(gè)項(xiàng)目將幫助不同的組織檢測(cè)他們的員工或客戶或任何人提供給他們的 Id,即 PAN 卡是否是原件。

對(duì)于這個(gè)項(xiàng)目,我們將計(jì)算 PAN 卡原件和用戶上傳的 PAN 卡的結(jié)構(gòu)相似度——這是這個(gè)項(xiàng)目的靈魂,我們將在本博客后面深入討論。

同樣,在這個(gè)項(xiàng)目中,借助涉及計(jì)算機(jī)視覺技術(shù)的圖像處理,我們將檢測(cè) PAN 卡的給定圖像是原件還是篡改(假)PAN 卡。

本項(xiàng)目涉及的步驟如下

導(dǎo)入必要的庫(kù)

從網(wǎng)站上爬取被篡改的pan卡原件

將篡改圖像的形狀縮小為原始圖像

讀取原始圖像和篡改圖像

將圖像轉(zhuǎn)換為灰度圖像

幅圖像之間應(yīng)用結(jié)構(gòu)相似性指數(shù)(SSIM)技術(shù)

計(jì)算閾值和輪廓

體驗(yàn)圖像的實(shí)時(shí)輪廓和閾值

導(dǎo)入必要的包

from skimage.metrics import structural_similarity
import imutils
import cv2
from PIL import Image
import requests
Skimage: Scikit-image,或ski-mage,是一個(gè)開源的Python 包,在這個(gè)項(xiàng)目中,大部分圖像處理技術(shù)將通過scikit-image 來使用

imutils: Imutils 是一系列方便的函數(shù),用于使OpenCV 中的平移、旋轉(zhuǎn)、調(diào)整大小和顯示圖像等基本圖像處理功能變得更容易。

cv2: OpenCV (開源計(jì)算機(jī)視覺庫(kù))是一個(gè)編程函數(shù)庫(kù)。在這個(gè)項(xiàng)目中,圖像的讀取和寫入是通過 cv2 完成的。

PIL: PIL (Python 圖像庫(kù))是 Python 編程語(yǔ)言的免費(fèi)開源附加庫(kù),增加了對(duì)打開、操作和保存許多不同圖像文件格式的支持。

創(chuàng)建用于存儲(chǔ)圖像的文件夾和子文件夾,你可以手動(dòng)創(chuàng)建它(可選)。

!mkdir pan_card_tampering
!mkdir pan_card_tampering/image
從不同來源爬取PAN 卡原件和篡改的 PAN 卡original = Image.open(requests.get('https://www.thestatesman.com/wp-content/uploads/2019/07/pan-card.jpg', stream=True).raw)
tampered = Image.open(requests.get('https://assets1.cleartax-cdn.com/s/img/20170526124335/Pan4.png', stream=True).raw)
在上面的代碼片段中,我們使用requests庫(kù)對(duì)來自不同來源的圖像進(jìn)行網(wǎng)絡(luò)抓取。加載原始圖像和用戶提供的圖像# The file format of the source file.
print("Original image format : ",original.format)
print("Tampered image format : ",tampered.format)
# Image size, in pixels. The size is given as a 2-tuple (width, height).
print("Original image size : ",original.size)
print("Tampered image size : ",tampered.size)
輸出 :Original image format :  JPEG
Tampered image format :  PNG
Original image size :  (1200, 800)
Tampered image size :  (282, 179)
正如你在上面的輸出中所看到的,原始圖像的原始大小和篡改圖像的原始大小不同,這將導(dǎo)致在進(jìn)行圖像處理時(shí)出現(xiàn)不必要的錯(cuò)誤結(jié)果,這就是將圖像縮小到相同形狀的原因。將篡改圖像的格式轉(zhuǎn)換為與原始圖像類似的格式。

# Resize Image
original = original.resize((250, 160))
print(original.size)
original.save('pan_card_tampering/image/original.png')#Save image
tampered = tampered.resize((250,160))
print(tampered.size)
tampered.save('pan_card_tampering/image/tampered.png')#Saves image
輸出 :(250, 160)
(250, 160)
現(xiàn)在,如果你將看到輸出圖像(原始圖像和篡改圖像)的形狀被縮小到相同的形狀,即(250,160)。現(xiàn)在的圖像處理將比以前更加平滑和準(zhǔn)確。如果需要,我們可以更改圖像的格式(png 或 jpg)。# Change image type if required from png to jpg
tampered = Image.open('pan_card_tampering/image/tampered.png')
tampered.save('pan_card_tampering/image/tampered.png')#can do png to jpg
顯示將用于比較的原始 PAN 卡圖像。# Display original image
original
輸出 :

顯示用戶提供的圖像,將與 PAN 卡進(jìn)行比較。# Display user given image
tampered
輸出 :

使用 OpenCV 讀取圖像。# load the two input images
original = cv2.imread('pan_card_tampering/image/original.png')
tampered = cv2.imread('pan_card_tampering/image/tampered.png')
現(xiàn)在在上面的代碼中,我們使用 cv2 的**imread()**函數(shù)讀取圖像(原件和篡改)。

將圖像轉(zhuǎn)換為灰度

# Convert the images to grayscale
original_gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
tampered_gray = cv2.cvtColor(tampered, cv2.COLOR_BGR2GRAY)
在上面的代碼中,我們使用參數(shù)為cv2.COLOR_BGR2GRAY 的 cv2函數(shù)cvtColor()將原始圖像(原始PAN卡和用戶給定的PAN卡)轉(zhuǎn)換為灰度圖像。但是為什么我們需要將它們轉(zhuǎn)換為灰度?原因如下:將圖像轉(zhuǎn)換為灰度對(duì)于圖像處理的不準(zhǔn)確性非常有益,因?yàn)樵趫D像處理中,許多應(yīng)用程序并不能幫助我們識(shí)別重要性,彩色圖像的邊緣以及彩色圖像對(duì)于機(jī)器理解有點(diǎn)復(fù)雜,因?yàn)樗鼈冇? 個(gè)通道,而灰度只有1 個(gè)通道。

在兩幅圖像之間應(yīng)用結(jié)構(gòu)相似性指數(shù) (SSIM) 技術(shù)

首先我們需要了解什么是SSIM。

什么是 SSIM?

**結(jié)構(gòu)相似性指數(shù) (SSIM)**是一種感知度量,用于量化由數(shù)據(jù)壓縮等處理或數(shù)據(jù)傳輸丟失引起的圖像質(zhì)量下降。

SSIM 如何發(fā)揮其功能?

這個(gè)指標(biāo)基本上是一個(gè)完整的參考,需要來自同一個(gè)鏡頭的2 個(gè)圖像,這意味著對(duì)于人眼來說,2 個(gè)圖像是相同的。第二張圖片一般是經(jīng)過壓縮的或者有不同的質(zhì)量,這就是這個(gè)指標(biāo)的目標(biāo)。

SSIM 的實(shí)際用途是什么?

SSIM 通常用于視頻行業(yè),但在攝影方面也有很強(qiáng)的應(yīng)用。

SSIM 如何幫助檢測(cè)?

SSIM 實(shí)際上衡量的是兩個(gè)相似圖像之間的感知差異。它無法判斷兩者中的哪一個(gè)更好:必須從知道哪個(gè)是原始的以及哪個(gè)已經(jīng)暴露于諸如壓縮或過濾器之類的附加處理來推斷。# Compute the Structural Similarity Index (SSIM) between the two images,
# ensuring that the difference image is returned
(score, diff) = structural_similarity(original_gray, tampered_gray, full=True)
diff = (diff * 255).a(chǎn)stype("uint8")
print("SSIM Score is : {}".format(score*100))
if score >= 80:
   print ("The given pan card is original")
else:
   print("The given pan card is tampered")
輸出 :SSIM Score is : 31.678790332739425
The given pan card is tampered
讓我們分解一下上面代碼中剛剛發(fā)生的事情結(jié)構(gòu)相似性指數(shù)幫助我們準(zhǔn)確地確定在x,y 坐標(biāo)位置方面,圖像差異在哪里。在這里,我們?cè)噲D找到原始圖像和篡改圖像之間的相似之處。SSIM分?jǐn)?shù)越低相似度越低,即SSIM分?jǐn)?shù)與兩幅圖像的相似度成正比我們給出了一個(gè)閾值“45”,即如果分?jǐn)?shù)>= 80,它將被視為原卡,否則被篡改。通常,對(duì)于良好質(zhì)量的重建技術(shù),SSIM 值為 0.97、0.98、0.99。體驗(yàn)圖像上的實(shí)時(shí)閾值和輪廓輪廓檢測(cè)是一個(gè)過程,可以簡(jiǎn)單地解釋為連接所有連續(xù)點(diǎn)(連同邊界)的曲線,具有相同的顏色或強(qiáng)度。該算法確實(shí)找到了圖像的邊緣,但也將它們置于層次結(jié)構(gòu)中。# Calculating threshold and contours
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
在這里,我們使用計(jì)算機(jī)視覺的閾值函數(shù),該函數(shù)將自適應(yīng)閾值應(yīng)用于存儲(chǔ)在表單數(shù)組中的圖像。此函數(shù)使用數(shù)學(xué)公式將灰度圖像轉(zhuǎn)換為二值圖像。查找輪廓適用于二值圖像并檢索輪廓。這些輪廓是形狀分析和識(shí)別的有用工具。抓取輪廓,抓取合適的輪廓值。創(chuàng)建邊界框(輪廓)# loop over the contours
for c in cnts:
   # applying contours on image
   (x, y, w, h) = cv2.boundingRect(c)
   cv2.rectangle(original, (x, y), (x + w, y + h), (0, 0, 255), 2)
   cv2.rectangle(tampered, (x, y), (x + w, y + h), (0, 0, 255), 2)
邊界矩形幫助找到對(duì)象的邊界矩形的寬高比。我們計(jì)算輪廓的邊界框,然后在兩個(gè)輸入圖像上繪制邊界框以表示兩個(gè)圖像的不同之處**。**#Display original image with contour
print('Original Format Image')
original_contour = Image.fromarray(original)
original_contour.save("pan_card_tampering/image/original_contour_image.png")
original_contour
輸出 :Original format Image

推斷:在上面的輸出中,你可以看到使用**fromarray()**函數(shù)顯示原始圖像及其輪廓(邊界框)。此外,你可以使用**save()**函數(shù)(可選)簡(jiǎn)單地保存圖像。#Diplay tampered image with contour
print('Tampered Image')
tampered_contour = Image.fromarray(tampered)
tampered_contour.save("pan_card_tampering/image/tampered_contours_image.png")
tampered_contour
輸出 :Tampered Image

推斷:這與篡改圖像類似,但可以注意到篡改圖像中缺少某些輪廓。這是上述結(jié)果的說明

# Display difference image with black
print('Different Image')
difference_image = Image.fromarray(diff)
difference_image.save("pan_card_tampering/image/difference_image.png")
difference_image
輸出 :Different Image

推斷:這是根據(jù)加熱閾值顯示輪廓的另一種交互式的方式,即通過查找加熱區(qū)域(文本/圖像區(qū)域)和正常區(qū)域(沒有文本/圖像)。加熱區(qū),即具有文本/圖像的區(qū)域?qū)@示在深色區(qū)域中,而另一種區(qū)域顯示為淺色區(qū)域。#Display threshold image with white
print('Threshold Image')
threshold_image = Image.fromarray(thresh)
threshold_image.save("pan_card_tampering/image/threshold_image.png")
threshold_image
輸出 :Threshold Image

推論:這里的一切都是一樣的,我們只能看到顏色作用的變化,這里白色表示加熱區(qū),黑色表示正常區(qū)?偨Y(jié)找出圖像的結(jié)構(gòu)相似性有助于我們找到圖像形狀的差異或相似性。同樣,根據(jù)該閾值為轉(zhuǎn)換為灰度二值的圖像找出閾值輪廓也有助于我們進(jìn)行形狀分析和識(shí)別。由于我們的 SSIM 約為 31.2%,我們可以說用戶提供的圖像是偽造的或被篡改的。最后,我們通過顯示具有輪廓、差異和閾值的圖像來可視化圖像之間的差異和相似之處。范圍該項(xiàng)目可用于不同的組織,客戶或用戶需要提供任何類型的 id 才能進(jìn)行驗(yàn)證。該組織可以使用該項(xiàng)目來查明該 ID 是原始的還是偽造的。同樣,這可用于任何類型的ID,如 Aadhar、選民 ID 等。

image.png


聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)