教你使用基于计算机视觉的PAN卡欺诈检测

磐创AI

    什么是计算机视觉?计算机视觉是人工智能的一个领域,它训练计算机解释和理解视觉世界。使用来自相机和视频的数字图像以及深度学习模型,机器可以准确地识别和分类物体——然后对它们“看到”的东西做出反应。
    计算机视觉任务包括获取、处理、分析和理解数字图像的方法
    图像处理中的计算机视觉主要专注于处理原始输入图像以增强它们使其做好完成其他任务的准备。计算机视觉专注于从输入图像或视频中提取信息,以正确理解它们,从而像人脑一样预测视觉输入。
    
    目的
    该项目的目的是使用计算机视觉检测 PAN 卡的篡改/欺诈。这个项目将帮助不同的组织检测他们的员工或客户或任何人提供给他们的 Id,即 PAN 卡是否是原件。
    对于这个项目,我们将计算 PAN 卡原件和用户上传的 PAN 卡的结构相似度——这是这个项目的灵魂,我们将在本博客后面深入讨论。
    同样,在这个项目中,借助涉及计算机视觉技术的图像处理,我们将检测 PAN 卡的给定图像是原件还是篡改(假)PAN 卡。
    本项目涉及的步骤如下
    导入必要的库
    从网站上爬取被篡改的pan卡原件
    将篡改图像的形状缩小为原始图像
    读取原始图像和篡改图像
    将图像转换为灰度图像
    幅图像之间应用结构相似性指数(SSIM)技术
    计算阈值和轮廓
    体验图像的实时轮廓和阈值
    导入必要的包
    from skimage.metrics import structural_similarity
    import imutils
    import cv2
    from PIL import Image
    import requests
    Skimage: Scikit-image,或ski-mage,是一个开源的Python 包,在这个项目中,大部分图像处理技术将通过scikit-image 来使用
    imutils: Imutils 是一系列方便的函数,用于使OpenCV 中的平移、旋转、调整大小和显示图像等基本图像处理功能变得更容易。
    cv2: OpenCV (开源计算机视觉库)是一个编程函数库。在这个项目中,图像的读取和写入是通过 cv2 完成的。
    PIL: PIL (Python 图像库)是 Python 编程语言的免费开源附加库,增加了对打开、操作和保存许多不同图像文件格式的支持。
    创建用于存储图像的文件夹和子文件夹,你可以手动创建它(可选)。
    !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库对来自不同来源的图像进行网络抓取。加载原始图像和用户提供的图像# 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)
    正如你在上面的输出中所看到的,原始图像的原始大小和篡改图像的原始大小不同,这将导致在进行图像处理时出现不必要的错误结果,这就是将图像缩小到相同形状的原因。将篡改图像的格式转换为与原始图像类似的格式。
    # 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)
    现在,如果你将看到输出图像(原始图像和篡改图像)的形状被缩小到相同的形状,即(250,160)。现在的图像处理将比以前更加平滑和准确。如果需要,我们可以更改图像的格式(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 卡进行比较。# 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')
    现在在上面的代码中,我们使用 cv2 的**imread()**函数读取图像(原件和篡改)。
    将图像转换为灰度
    # Convert the images to grayscale
    original_gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
    tampered_gray = cv2.cvtColor(tampered, cv2.COLOR_BGR2GRAY)
    在上面的代码中,我们使用参数为cv2.COLOR_BGR2GRAY 的 cv2函数cvtColor()将原始图像(原始PAN卡和用户给定的PAN卡)转换为灰度图像。但是为什么我们需要将它们转换为灰度?原因如下:将图像转换为灰度对于图像处理的不准确性非常有益,因为在图像处理中,许多应用程序并不能帮助我们识别重要性,彩色图像的边缘以及彩色图像对于机器理解有点复杂,因为它们有3 个通道,而灰度只有1 个通道。
    在两幅图像之间应用结构相似性指数 (SSIM) 技术
    首先我们需要了解什么是SSIM。
    什么是 SSIM?
    **结构相似性指数 (SSIM)**是一种感知度量,用于量化由数据压缩等处理或数据传输丢失引起的图像质量下降。
    SSIM 如何发挥其功能?
    这个指标基本上是一个完整的参考,需要来自同一个镜头的2 个图像,这意味着对于人眼来说,2 个图像是相同的。第二张图片一般是经过压缩的或者有不同的质量,这就是这个指标的目标。
    SSIM 的实际用途是什么?
    SSIM 通常用于视频行业,但在摄影方面也有很强的应用。
    SSIM 如何帮助检测?
    SSIM 实际上衡量的是两个相似图像之间的感知差异。它无法判断两者中的哪一个更好:必须从知道哪个是原始的以及哪个已经暴露于诸如压缩或过滤器之类的附加处理来推断。# 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).astype("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
    让我们分解一下上面代码中刚刚发生的事情结构相似性指数帮助我们准确地确定在x,y 坐标位置方面,图像差异在哪里。在这里,我们试图找到原始图像和篡改图像之间的相似之处。SSIM分数越低相似度越低,即SSIM分数与两幅图像的相似度成正比我们给出了一个阈值“45”,即如果分数>= 80,它将被视为原卡,否则被篡改。通常,对于良好质量的重建技术,SSIM 值为 0.97、0.98、0.99。体验图像上的实时阈值和轮廓轮廓检测是一个过程,可以简单地解释为连接所有连续点(连同边界)的曲线,具有相同的颜色或强度。该算法确实找到了图像的边缘,但也将它们置于层次结构中。# 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)
    在这里,我们使用计算机视觉的阈值函数,该函数将自适应阈值应用于存储在表单数组中的图像。此函数使用数学公式将灰度图像转换为二值图像。查找轮廓适用于二值图像并检索轮廓。这些轮廓是形状分析和识别的有用工具。抓取轮廓,抓取合适的轮廓值。创建边界框(轮廓)# 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)
    边界矩形帮助找到对象的边界矩形的宽高比。我们计算轮廓的边界框,然后在两个输入图像上绘制边界框以表示两个图像的不同之处**。**#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()**函数显示原始图像及其轮廓(边界框)。此外,你可以使用**save()**函数(可选)简单地保存图像。#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
    
    推断:这与篡改图像类似,但可以注意到篡改图像中缺少某些轮廓。这是上述结果的说明
    
    # 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
    
    推断:这是根据加热阈值显示轮廓的另一种交互式的方式,即通过查找加热区域(文本/图像区域)和正常区域(没有文本/图像)。加热区,即具有文本/图像的区域将显示在深色区域中,而另一种区域显示为浅色区域。#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
    
    推论:这里的一切都是一样的,我们只能看到颜色作用的变化,这里白色表示加热区,黑色表示正常区。总结找出图像的结构相似性有助于我们找到图像形状的差异或相似性。同样,根据该阈值为转换为灰度二值的图像找出阈值轮廓也有助于我们进行形状分析和识别。由于我们的 SSIM 约为 31.2%,我们可以说用户提供的图像是伪造的或被篡改的。最后,我们通过显示具有轮廓、差异和阈值的图像来可视化图像之间的差异和相似之处。范围该项目可用于不同的组织,客户或用户需要提供任何类型的 id 才能进行验证。该组织可以使用该项目来查明该 ID 是原始的还是伪造的。同样,这可用于任何类型的ID,如 Aadhar、选民 ID 等。