从零入门AI篡改图片检测(金融场景)#Datawhale十月组队学习

1.大赛背景

在全球人工智能发展和治理广受关注的大趋势下,由中国图象图形学学会、蚂蚁集团、云安全联盟CSA大中华区主办,广泛联合学界、机构共同组织发起全球AI攻防挑战赛。本次比赛包含攻防两大赛道,分别聚焦大模型自身安全和大模型生成内容的防伪检测,涉及信用成长、凭证审核、商家入驻、智能助理等多个业务场景,覆盖机器学习、图像处理与计算机视觉、数据处理等多个算法领域,旨在聚合行业及学界力量共同守护AI及大模型的安全,共同推动AI安全可信技术的发展。

2.赛题二:AI核身-金融场景凭证篡改检测

金融领域交互式自证业务中涵盖信用成长、用户开户、商家入驻、职业认证、商户解限等多种应用场景,通常都需要用户提交一定的材料(即凭证)用于证明资产收入信息、身份信息、所有权信息、交易信息、资质信息等,而凭证的真实性一直是困扰金融场景自动化审核的一大难题。随着数字媒体编辑技术的发展,越来越多的AI手段和工具能够轻易对凭证材料进行篡改,大量的黑产团伙也逐渐掌握PS、AIGC等工具制作逼真的凭证样本,并对金融审核带来巨大挑战。
为此,开设AI核身-金融凭证篡改检测赛道。将会发布大规模的凭证篡改数据集,参赛队伍在给定的大规模篡改数据集上进行模型研发,同时给出对应的测试集用于评估算法模型的有效性。

3.赛题与数据

数据集格式如下:

  • 训练集数据总量为100w,提供篡改后的凭证图像及其对应的篡改位置标注,标注文件以csv格式给出,csv文件中包括两列
  • 测试集分为A榜和B榜,分别包含10w测试数据。测试集中数据格式与训练集中一致,但不包含标注文件。

采用Micro-F1作为评价指标,该分数越高表示排名越靠前。

4.baseline

本任务可以基于检测模型微调,也允许使用基于大模型的方案等。方案不限于:

小模型微调(例如Faster R-CNN、ConvNeXt(Base)+UPerHead、SegNeXt、VAN(B5)+UPerHead等);
使用大模型(例如SAM、Grounded-SAM等);
多模型协同等。

赛事官方给出的baseline是基于SwinTransformer (Large) + Cascade R-CNN的实验结果。

Datawhale提供的是基于yolov8模型的实验结果。

本任务基于Datawhale提供的是基于yolov8模型的baseline展开。

首先需要下载数据集,数据集很大,训练集包括16个文件夹,接近50G.

考虑到机器的限制和训练的效率,使用全量数据来跑是不现实的,也是很贵的。全量数据共有100W+。

那么可行的策略

策略一:就是使用1个train_data来跑,比如training_data-00,跑到收敛,然后再用训好的模型去微调其他数据集。可能需要固定一些层的参数,然后比赛截止前再用全量数据微调一下。提交最后的结果;

策略二:自己采样制作数据集,从16个文件夹中,按一定比例采样数据,最终得到约6W的训练数据集,进行训练,直到收敛。然后再全量数据微调。

在数据处理环节,我们可以查看训练集的样本,可以看到样本的类型,这个样本还是很丰富的。

我用的机器是阿里云V100,单卡,训练6W数据的话,50个epoch需要9h。

感觉这种比赛越来越卷,数据越来越大,对机器的要求越来越高,那么这里面应该是有很多算法工程化的小技巧的,应该是有很多优化的tricks的,这些需要通过不断的实践来提高、积累。

接下里记录一些跑baseline中遇到的问题和解决方法。

1.training_anno = pd.read_csv('./seg_risky_training_anno.csv')

这行代码,baseline里面给的是原始URL,运行有一定概率出现Connection的问题,那么我们可以修改为

!axel -n 12 -a http://mirror.coggle.club/seg_risky_training_anno.csv
training_anno = pd.read_csv('./seg_risky_training_anno.csv')

2.训练集和验证集的划分

baseline里面默认使用了前10000行作为训练集,10000-10150作为验证集,datatrain_00的6W数据没有数据。我们需要采用随机采样来划分训练集和验证集,验证集的比例为0.1。

代码修改后如下:

#随机采样划分训练集和验证集,验证集占比0.1
import os
import shutil
import cv2
import glob
import json
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split# 定义一个函数,用于归一化多边形的坐标
def normalize_polygon(polygon, img_width, img_height):return [(x / img_width, y / img_height) for x, y in polygon]# 随机划分训练集和验证集,验证集比例为0.1
train_df, valid_df = train_test_split(training_anno, test_size=0.1, random_state=42)# 处理训练集
for row in train_df.iterrows():shutil.copy(row[1].Path, 'yolo_seg_dataset/train')img = cv2.imread(row[1].Path)img_height, img_width = img.shape[:2]txt_filename = os.path.join('yolo_seg_dataset/train/', row[1].Path.split('/')[-1][:-4] + '.txt')with open(txt_filename, 'w') as up:for polygon in row[1].Polygons:normalized_polygon = normalize_polygon(polygon, img_width, img_height)normalized_coords = ' '.join([f'{coord[0]:.3f} {coord[1]:.3f}' for coord in normalized_polygon])up.write(f'0 {normalized_coords}\n')# 处理验证集
for row in valid_df.iterrows():shutil.copy(row[1].Path, 'yolo_seg_dataset/valid')img = cv2.imread(row[1].Path)img_height, img_width = img.shape[:2]txt_filename = os.path.join('yolo_seg_dataset/valid/', row[1].Path.split('/')[-1][:-4] + '.txt')with open(txt_filename, 'w') as up:for polygon in row[1].Polygons:normalized_polygon = normalize_polygon(polygon, img_width, img_height)normalized_coords = ' '.join([f'{coord[0]:.3f} {coord[1]:.3f}' for coord in normalized_polygon])up.write(f'0 {normalized_coords}\n')

3.推理

我们每练一次就会产生一个train文件,推理的时候需要使用最新训练好的模型参数,防止弄错模型导致结果错误。

from ultralytics import YOLO
import glob
from tqdm import tqdmmodel = YOLO("./runs/segment/train5/weights/best.pt") #注意更新模型,查看segment/train文件夹,防止弄错模型test_imgs = glob.glob('./test_set_A_rename/*/*')

4.结果提交

原始baseline还存在一个问题,提交的格式不正确,赛事要求的提交格式是

 baseline初版给出的是,yolo_seg输出是一堆坐标点,需要转换为满足[左上,右上,右下,左下]格式的矩形框。

代码修改后如下:

# 初始化一个空列表,用于存储每个图像的多边形掩码
Polygon = []# 使用 tqdm 包装循环,显示进度条
for path in tqdm(test_imgs[:]):  # 只处理前10000个图像# 使用模型对当前图像进行推理results = model(path, verbose=False)  # verbose=False 表示不打印推理过程中的详细信息# 获取第一个结果(假设模型返回的是一个结果列表)result = results[0]# 检查是否有检测到的掩码if result.masks is None:# 如果没有检测到掩码,添加一个空列表Polygon.append([])else:# 如果检测到了掩码,将每个掩码转换为所需的格式processed_masks = []for mask in result.masks.xy:# 将每个坐标点转换为浮点数float_mask = [point.astype(float).tolist() for point in mask]# 计算边界框的最小和最大坐标x_coords = [point[0] for point in float_mask]y_coords = [point[1] for point in float_mask]min_x, max_x = min(x_coords), max(x_coords)min_y, max_y = min(y_coords), max(y_coords)# 构建左上、右上、右下、左下的坐标点polygon = [[round(min_x, 1), round(min_y, 1)],  # 左上[round(max_x, 1), round(min_y, 1)],  # 右上[round(max_x, 1), round(max_y, 1)],  # 右下[round(min_x, 1), round(max_y, 1)]   # 左下]processed_masks.append(polygon)# 将处理后的多边形添加到 Polygon 列表中Polygon.append(processed_masks)# 此时,Polygon 列表中存储了每个图像的多边形掩码,每个多边形由4个顶点组成

这里面其实还是存在一些问题的,我查看训练集标签发现的。训练集标签中还存在一些:

1)不规则四边形(非矩形,那么按照代码计算最大最小坐标在生成框应该是不准确的,比如可能存在右下坐标(不是max_x,max_y)比这个最大值小一些,那么按照最大值得到就把这个区域扩大了,其他几个顶点类似),我们无法看到测试集的标签分布,所以无法得知测试集是否存在同样情况;

2)我发现训练集标签还存在一些不是4个点的情况,比如6个点,两个大小矩形连在一起,这种情况在模型中是没有考虑的。

这些可能会影响到最终的得分,不过这是TOP选手需要考虑的哈。

上分情况记录:

YOLOV8

模型参数

YOLO11

模型参数

 由于我们需要在有限的资源下,去尽可能取得高分,对比YOLOv8和YOLO11的模型预训练参数,综合考虑下来选择YOLO11s或者YOLO11l可能效果会更好。

目前自己跑下来的情况,YOLOv8n,跑data0文件6W数据,因为没有连续跑,一共跑了10+50+50+90轮,得分情况如下:从60轮到200轮,提分2分。

训练仍未收敛,预计还需要继续跑,不过感觉后面提分情况有限了。

后面准备跑一下YOLO11s看看效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452368.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果,发现遇到中文时出现乱码,导致无法正常进行响应断言,很影响工作。于是,察看了其他测试人员的解决方案,发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…

轻松应对PDF编辑难题:四款免费pdf编辑器实测体验

作为一名办公室文员,每天处理各种文件是家常便饭。而PDF文档因其格式稳定、不易篡改的特性,在工作中扮演着重要角色。但编辑PDF文件却不像编辑Word文档那样简单,这就需要一款得心应手的PDF编辑器。今天,我就来分享一下我使用过的几…

如何利用解析器绕过访问控制

0x01 前言 每年blackhat总是会有一些新奇的攻击思路值得大家学习,在2024年blackhat的议题中发现一篇很有意思的文章,作者提出了一套基于邮箱的欺骗攻击思路,利用RFC标准中对SMTP协议中邮箱地址的特性,提供一系列绕过技巧&#xf…

揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

文章目录 前言➰一、关联式容器1.1 关联式容器的概述1.2 关联式容器的工作原理1.3 关联式容器的核心特性 ➰二、键值对2.1 键值对的基本概念2.2 键值对在C中的实现 ➰三、树形结构的关联式容器3.1 树形结构的特点3.2 使用场景 ➰四、set的使用与定义4.1 set的基本特性4.2 set的…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程,并创建美观、一致的用户界面?您的搜索到此为止!我们的Flutter UI组件库(JUI)提供了广泛的预构建、可自定义组件,帮助您快速构建…

RHCE--ntp客户端,时间服务器服务端

NTP 是网络时间协议( Network Time Protocol )的简称,通过 udp 123 端口进行网络时钟同步。 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器( NTP )同步&#…

计算机网络:数据链路层 —— 以太网(Ethernet)

文章目录 局域网局域网的主要特征 以太网以太网的发展100BASE-T 以太网物理层标准 吉比特以太网载波延伸物理层标准 10吉比特以太网汇聚层交换机物理层标准 40/100吉比特以太网传输媒体 局域网 局域网(Local Area Network, LAN)是一种计算机网络&#x…

基于SSM果蔬经营系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商品信息管理,类型管理,系统管理,订单管理 前台账号功能包括:系统首页,个人中心,商品信息,广告…

爬虫+数据保存

爬虫以及数据保存 这篇文章, 分享如何将爬虫爬到的数据, 保存到excel表格当中。 文章目录 1.安装保存数据的第三方库openpyxl并使用 2.爬虫加单表数据保存 3.爬虫加多表数据保存 4.实战 一、安装保存数据的第三方库openpyxl并使用 我们需要安装openpyxl的第三方库 安装…

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 ❤️TCP: 一、创建项目,命名为Server,继承QWidget 二、添加Qt设计师…

CentOS7安装RabbitMQ-3.13.7、修改端口号

本文安装版本: Erlang:26.0 官网下载地址 Erlang RabbitMQ:3.13.7 官网下载地址 RabbitMQ RabbitMQ和Erlang对应关系查看:https://www.rabbitmq.com/which-erlang.html 注:安装erlang之前先安装下依赖文件&#xff0…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统,功能带有卡密生成和添加黑名单等,源码放在我的网盘里已经两年之久,由于玖逸现在已经跑路了所以现在发出来分享给大家,需要的可以自己拿去而开,反正功能也不是很多具体的自己…

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序,可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外,它还能轻松地将这些测试添加到自动回归测试流程中。 现在,…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统,是一个支持前后端分离设计的 客户端(C/S)项目,该示例项目前端xaml使用UI库 ,Material Design Themes UI 来构建用户界面,确保…

C# -- Abstract、Virtual、interface

一、Virtual方法(虚方法) 1)virtual 关键字用于在基类(父类)中修饰方法 2)基类中定义了virtual方法,派生类中使用override重写该方法 二、Abstract方法(抽象方法) 1&…

【ssh】Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22

Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22 问题描述解决办法 问题描述 Connection reset by 8.155.1.xxx port 22解决办法 关掉代理 VPN

CTFHUB技能树之XSS——存储型

开启靶场&#xff0c;打开链接&#xff1a; 发现地址栏中的URL没有GET传参&#xff0c;而且这次是“Hello&#xff0c;no name” 还是跟反射型一样的流程&#xff1a; 先注入一下看看&#xff1a; <script>alert(1)</script> 但界面的结果还是“Hello&#xff0c…

【网络协议】之 HTTP 协议详解

HTTP 协议是 Web 的基石&#xff0c;它定义了客户端和服务器之间的通信规则。本文将深入地探讨 HTTP 的核心概念&#xff0c;包括工作原理、请求方法、状态码以及不同 HTTP 版本的演进。 一、HTTP 的工作原理 HTTP 协议基于客户端-服务器模型&#xff0c;遵循请求-响应的循环&…

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …