教你使用基于計(jì)算機(jī)視覺的PAN卡欺詐檢測
什么是計(jì)算機(jī)視覺?計(jì)算機(jī)視覺是人工智能的一個領(lǐng)域,它訓(xùn)練計(jì)算機(jī)解釋和理解視覺世界。使用來自相機(jī)和視頻的數(shù)字圖像以及深度學(xué)習(xí)模型,機(jī)器可以準(zhǔn)確地識別和分類物體——然后對它們“看到”的東西做出反應(yīng)。
計(jì)算機(jī)視覺任務(wù)包括獲取、處理、分析和理解數(shù)字圖像的方法
圖像處理中的計(jì)算機(jī)視覺主要專注于處理原始輸入圖像以增強(qiáng)它們使其做好完成其他任務(wù)的準(zhǔn)備。計(jì)算機(jī)視覺專注于從輸入圖像或視頻中提取信息,以正確理解它們,從而像人腦一樣預(yù)測視覺輸入。
目的
該項(xiàng)目的目的是使用計(jì)算機(jī)視覺檢測 PAN 卡的篡改/欺詐。這個項(xiàng)目將幫助不同的組織檢測他們的員工或客戶或任何人提供給他們的 Id,即 PAN 卡是否是原件。
對于這個項(xiàng)目,我們將計(jì)算 PAN 卡原件和用戶上傳的 PAN 卡的結(jié)構(gòu)相似度——這是這個項(xiàng)目的靈魂,我們將在本博客后面深入討論。
同樣,在這個項(xiàng)目中,借助涉及計(jì)算機(jī)視覺技術(shù)的圖像處理,我們將檢測 PAN 卡的給定圖像是原件還是篡改(假)PAN 卡。
本項(xiàng)目涉及的步驟如下
導(dǎo)入必要的庫
從網(wǎng)站上爬取被篡改的pan卡原件
將篡改圖像的形狀縮小為原始圖像
讀取原始圖像和篡改圖像
將圖像轉(zhuǎn)換為灰度圖像
幅圖像之間應(yīng)用結(jié)構(gòu)相似性指數(shù)(SSIM)技術(shù)
計(jì)算閾值和輪廓
體驗(yàn)圖像的實(shí)時輪廓和閾值
導(dǎo)入必要的包
from skimage.metrics import structural_similarity
import imutils
import cv2
from PIL import Image
import requests
Skimage: Scikit-image,或ski-mage,是一個開源的Python 包,在這個項(xiàng)目中,大部分圖像處理技術(shù)將通過scikit-image 來使用
imutils: Imutils 是一系列方便的函數(shù),用于使OpenCV 中的平移、旋轉(zhuǎn)、調(diào)整大小和顯示圖像等基本圖像處理功能變得更容易。
cv2: OpenCV (開源計(jì)算機(jī)視覺庫)是一個編程函數(shù)庫。在這個項(xiàng)目中,圖像的讀取和寫入是通過 cv2 完成的。
PIL: PIL (Python 圖像庫)是 Python 編程語言的免費(fèi)開源附加庫,增加了對打開、操作和保存許多不同圖像文件格式的支持。
創(chuà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庫對來自不同來源的圖像進(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)行圖像處理時出現(xiàn)不必要的錯誤結(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),F(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)換為灰度對于圖像處理的不準(zhǔn)確性非常有益,因?yàn)樵趫D像處理中,許多應(yīng)用程序并不能幫助我們識別重要性,彩色圖像的邊緣以及彩色圖像對于機(jī)器理解有點(diǎn)復(fù)雜,因?yàn)樗鼈冇? 個通道,而灰度只有1 個通道。
在兩幅圖像之間應(yīng)用結(jié)構(gòu)相似性指數(shù) (SSIM) 技術(shù)
首先我們需要了解什么是SSIM。
什么是 SSIM?
**結(jié)構(gòu)相似性指數(shù) (SSIM)**是一種感知度量,用于量化由數(shù)據(jù)壓縮等處理或數(shù)據(jù)傳輸丟失引起的圖像質(zhì)量下降。
SSIM 如何發(fā)揮其功能?
這個指標(biāo)基本上是一個完整的參考,需要來自同一個鏡頭的2 個圖像,這意味著對于人眼來說,2 個圖像是相同的。第二張圖片一般是經(jīng)過壓縮的或者有不同的質(zhì)量,這就是這個指標(biāo)的目標(biāo)。
SSIM 的實(shí)際用途是什么?
SSIM 通常用于視頻行業(yè),但在攝影方面也有很強(qiáng)的應(yīng)用。
SSIM 如何幫助檢測?
SSIM 實(shí)際上衡量的是兩個相似圖像之間的感知差異。它無法判斷兩者中的哪一個更好:必須從知道哪個是原始的以及哪個已經(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)位置方面,圖像差異在哪里。在這里,我們試圖找到原始圖像和篡改圖像之間的相似之處。SSIM分?jǐn)?shù)越低相似度越低,即SSIM分?jǐn)?shù)與兩幅圖像的相似度成正比我們給出了一個閾值“45”,即如果分?jǐn)?shù)>= 80,它將被視為原卡,否則被篡改。通常,對于良好質(zhì)量的重建技術(shù),SSIM 值為 0.97、0.98、0.99。體驗(yàn)圖像上的實(shí)時閾值和輪廓輪廓檢測是一個過程,可以簡單地解釋為連接所有連續(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)用于存儲在表單數(shù)組中的圖像。此函數(shù)使用數(shù)學(xué)公式將灰度圖像轉(zhuǎn)換為二值圖像。查找輪廓適用于二值圖像并檢索輪廓。這些輪廓是形狀分析和識別的有用工具。抓取輪廓,抓取合適的輪廓值。創(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)
邊界矩形幫助找到對象的邊界矩形的寬高比。我們計(jì)算輪廓的邊界框,然后在兩個輸入圖像上繪制邊界框以表示兩個圖像的不同之處**。**#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ù)(可選)簡單地保存圖像。#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)行形狀分析和識別。由于我們的 SSIM 約為 31.2%,我們可以說用戶提供的圖像是偽造的或被篡改的。最后,我們通過顯示具有輪廓、差異和閾值的圖像來可視化圖像之間的差異和相似之處。范圍該項(xiàng)目可用于不同的組織,客戶或用戶需要提供任何類型的 id 才能進(jìn)行驗(yàn)證。該組織可以使用該項(xiàng)目來查明該 ID 是原始的還是偽造的。同樣,這可用于任何類型的ID,如 Aadhar、選民 ID 等。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會
-
即日-5.15立即報(bào)名>>> 【在線會議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評 >> 【評選啟動】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 光計(jì)算迎來商業(yè)化突破,但落地仍需時間
- 6 大模型下半場:Agent時代為何更需要開源模型
- 7 中國“智造”背后的「關(guān)鍵力量」
- 8 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?
- 9 營收猛增46%,昆侖萬維成為AI“爆品工廠”
- 10 地平線自動駕駛方案解讀