引言
大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题,以及解决思路和代码实现过程。希望我的经验能对大家有所帮助!💕💕😊
一、比赛背景
在AI技术广泛应用的金融领域,用户在开户、商家入驻、职业认证等场景中,需要上传各类凭证来证明其身份或资质。然而,随着数字编辑和生成技术(如PS、AIGC的普及,越来越多的黑产团伙利用这些工具篡改凭证,给金融自动化审核带来了巨大的挑战。
本次全球AI攻防挑战赛旨在推动AI生成内容的防伪检测与大模型的安全性,联合学术界与产业力量,共同提升AI的可信度与安全性。
二、基本概念
凭证篡改检测是指识别并定位金融凭证(如身份证、收入证明)中被恶意篡改的区域。本次比赛的数据集包含了通过不同编辑手法(如拷贝粘贴、局部删除、图像拼接)篡改的凭证。
- 目标:找出图像中被篡改的区域,并生成精准的多边形标注。
- 评价指标:使用Micro-F1来衡量模型性能,通过检测到的篡改区域与真实标签的重合度计算精确率和召回率。
三、解题思路
为了解决这个问题,我们需要设计一个检测模型,识别图像中的篡改区域并标记其位置。本次比赛使用YOLOv8模型来进行语义分割和检测。我们的解决方案包括以下几个步骤:
- 流程图
- 数据预处理
- 下载并解析训练集、验证集数据。
- 将图像中的多边形标注转换为模型可识别的格式。
- 模型训练
- 利用YOLOv8进行语义分割训练,识别凭证篡改区域。
- 测试与预测
- 使用训练好的模型在测试集上预测篡改区域。
- 结果提交与评估
- 计算Micro-F1得分,根据提交的结果与真实标签对比评估模型表现。
具体代码我们在下面看:
四、代码分析
下载数据模型
这里我们下载数据集和Yolo模型:
!apt update > /dev/null; apt install aria2 git-lfs axel -y > /dev/null
!pip install ultralytics==8.2.0 numpy pandas opencv-python Pillow matplotlib > /dev/null
!axel -n 12 -a http://mirror.coggle.club/seg_risky_testing_data.zip; unzip -q seg_risky_testing_data.zip
!axel -n 12 -a http://mirror.coggle.club/seg_risky_training_data_00.zip; unzip -q seg_risky_training_data_00.zip
!mkdir -p /root/.config/Ultralytics/
!wget http://mirror.coggle.club/yolo/Arial.ttf -O /root/.config/Ultralytics/Arial.ttf
!wget http://mirror.coggle.club/yolo/yolov8n-v8.2.0.pt -O yolov8n.pt
!wget http://mirror.coggle.club/yolo/yolov8n-seg-v8.2.0.pt -O yolov8n-seg.pt
1.数据预处理
我们首先加载数据进行解析,将图像与对应的多边形标注整合。
import pandas as pd
import json
import glob
import cv2
import numpy as np
# 加载训练数据并解析多边形标注
training_anno = pd.read_csv('http://mirror.coggle.club/seg_risky_training_anno.csv')
training_anno['Polygons'] = training_anno['Polygons'].apply(json.loads)
# 查看部分数据示例
training_anno.head()
2. 构建YOLO训练数据集
我们需要将数据转换为YOLO可识别的格式,保存为.txt
文件,并将数据集划分为训练集和验证集。
import os, shutil
# 创建训练和验证集文件夹
os.makedirs('yolo_seg_dataset/train', exist_ok=True)
os.makedirs('yolo_seg_dataset/valid', exist_ok=True)
def normalize_polygon(polygon, img_width, img_height):
"""将多边形坐标归一化为[0,1]区间"""
return [(x / img_width, y / img_height) for x, y in polygon]
# 遍历数据并转换为YOLO格式
for idx, row in training_anno.iterrows():
img = cv2.imread(row['Path'])
img_height, img_width = img.shape[:2]
# 保存标注为txt文件
txt_path = f'yolo_seg_dataset/train/{os.path.basename(row["Path"][:-4])}.txt'
with open(txt_path, 'w') as f:
for polygon in row['Polygons']:
normalized = normalize_polygon(polygon, img_width, img_height)
coords = ' '.join([f'{x:.3f} {y:.3f}' for x, y in normalized])
f.write(f'0 {coords}\n')
3.训练模型
我们使用YOLOv8的预训练模型,并在大规模数据集上微调。
from ultralytics import YOLO
# 加载预训练模型并进行训练
model = YOLO('./yolov8n-seg.pt')
model.train(data='yolo_seg_dataset/data.yaml', epochs=15, imgsz=640)
4.测试集预测
在训练完成后,我们使用测试集来验证模型的性能,并生成提交文件。
from ultralytics import YOLO
import glob
from tqdm import tqdm
model = YOLO("./runs/segment/train/weights/best.pt") # 调用我们选择的模型
# 遍历测试集并预测篡改区域
test_imgs = glob.glob('./test_set_A_rename/*/*')
predictions = []
for path in tqdm(test_imgs):
results = model(path, verbose=False)
result = results[0]
polygons = [mask.xy.tolist() for mask in result.masks] if result.masks else []
predictions.append((os.path.basename(path), polygons))
# 保存结果为CSV文件
import pandas as pd
submit = pd.DataFrame(predictions, columns=['Path', 'Polygon'])
submit.to_csv('track2_submit.csv', index=False)
五、总结
通过本次AI金融攻防赛的学习和实践,我们深入了解了凭证篡改检测这一关键问题,并成功构建了一个基于YOLOv8的检测模型。并且成功生成了数据;OK,初步解析到此结束!更多内容看后续;
相关链接
- 项目地址:Git地址
- 活动地址:AI核身之金融场景凭证篡改检测
- 相关文档:专栏地址
- 作者主页:GISer Liu-CSDN博客
如果觉得我的文章对您有帮助,记得三连+关注哦!🌟