新闻中心

百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline

2025-07-22
浏览次数:
返回列表
该内容围绕百度网盘AI大赛文档检测优化赛展开,介绍用Resnet152+Linear网络结构回归文档拐角坐标的方案。包括获取数据、构造含预处理的读取器、定义网络,训练时经多轮训练及调学习率达0.89左右精度,还涉及打包提交文件的相关说明。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

百度网盘ai大赛-图像处理挑战赛:文档检测优化赛 baseline -

百度网盘AI大赛-图像处理挑战赛:文档检测优化赛

使用Resnet152回归图像中文档的拐角坐标完成百度网盘AI大赛-图像处理挑战赛:文档检测优化赛。

比赛介绍

生活中人们使用手机进行文档扫描逐渐成为一件普遍的事情,为了提高人们的使用体验,我们期望通过算法技术去除杂乱的拍摄背景并精准框取文档边缘,选手需要通过深度学习技术训练模型,对给定的真实场景下采集得到的带有拍摄背景的文件图片进行边缘智能识别,并最终输出处理后的扫描结果图片。

评测方式说明

  1. 参赛选手提交的代码和模型只预测文档边缘的heatmap图,由后台评测脚本中预置的算法回归出文档区域的四个角的坐标点,并生成规则的四边形,与GT计算IoU值;
  2. 参赛选手提交的代码和模型直接回归文档区域的四个角的坐标点,并生成规则的四边形,与GT计算IoU值。 注:两种评测方式的结果会放在一个排行榜内,评测脚本中预置的角点回归算法会存在一定的局限性,如果各位参赛选手希望获得更高的分数,建议采用第二种评测方式。

任务分析

本次比赛要求选手设计算法在给定图片中划定一块四边形区域,以尽可能与图片中的文档部分重合。

因此,本次任务可以同时看作回归问题和分割问题。

  • 作为回归问题,需要设计学习器/其他方法寻找四边形的四个拐角坐标
  • 作为分割问题,直接将数据中的segments作为标签训练对应的分割学习器即可

本项目将本次任务看作回归问题来处理,使用Resnet152+Linear的网络结构回归四个角的坐标。

代码部分

获取数据

In [ ]
! wget https://staticsns.cdn.bcebos.com/amis/2025-4/1649731549425/train_datasets_document_detection_0411.zip! unzip -oq /home/aistudio/train_datasets_document_detection_0411.zip! rm -rf __MACOSX
! rm -rf /home/aistudio/train_datasets_document_detection_0411.zip
   

构造数据读取器

通过paddle.io.dataset构造读取器,便于读取数据。

数据预处理包括:

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修
  1. 根据data_info的边缘轮廓信息分别提取四个拐角的位置。
  2. 对图片进行resize和数据增强(调整明暗对比度等参数)
In [ ]
import paddleimport numpy as npimport pandas as pdimport cv2class MyDateset(paddle.io.Dataset):
    def __init__(self, mode = 'train', train_imgs_dir = '/home/aistudio/train_datasets_document_detection_0411/images/', train_txt = '/home/aistudio/train_datasets_document_detection_0411/data_info.txt'):
        super(MyDateset, self).__init__()

        self.mode = mode 
        self.train_imgs_dir = train_imgs_dir        with open(train_txt,'r') as f:
            self.train_infor = f.readlines()    def __getitem__(self, index):
        item = self.train_infor[index][:-1]
        splited = item.split(',')
        img_name = splited[0]

        img = cv2.imread(self.train_imgs_dir+img_name+'.jpg')
        h, w, c = img.shape

        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)        
        # 对图片进行resize,调整明暗对比度等参数
        img = paddle.vision.transforms.resize(img, (512,512), interpolation='bilinear')        if np.random.rand()<1/3:
            img = paddle.vision.transforms.adjust_brightness(img, np.random.rand()*2)        else:            if np.random.rand()<1/2:
                img = paddle.vision.transforms.adjust_contrast(img, np.random.rand()*2)            else:
                img = paddle.vision.transforms.adjust_hue(img, np.random.rand()-0.5)

        img = img.transpose((2,0,1))
        img = img/255

        sites = []        for i in range(1,len(splited),2):
            sites.append([float(splited[i])/w,float(splited[i+1])/h])
        
        label = []        for i in range(4):
            x, y = self.get_corner(sites, i+1)
            label.append(x)
            label.append(y)

        img = paddle.to_tensor(img).astype('float32')
        label = paddle.to_tensor(label).astype('float32')        return img, label    def get_corner(self, sites, corner_flag):
        # corner_flag 1:top_left 2:top_right 3:bottom_right 4:bottom_left
        if corner_flag == 1:
            target_sites = [0,0]        elif corner_flag == 2 :
            target_sites = [1,0]        elif corner_flag == 3 :
            target_sites = [1,1]        elif corner_flag == 4 :
            target_sites = [0,1]

        min_dis = 3
        best_x = 0
        best_y = 0
        for site in sites:            if abs(site[0]-target_sites[0])+abs(site[1]-target_sites[1])<min_dis:
                min_dis=abs(site[0]-target_sites[0])+abs(site[1]-target_sites[1])
                best_x = site[0]
                best_y = site[1]        
        return best_x, best_y    def __len__(self):
        return len(self.train_infor)# 对dataloader进行测试'''
train_dataset=MyDateset()

train_dataloader = paddle.io.DataLoader(
    train_dataset,
    batch_size=16,
    shuffle=True,
    drop_last=False)

for step, data in enumerate(train_dataloader):
    img, label = data
    print(step, img.shape, label.shape)
    break

'''
   

定义网络结构

In [ ]
class MyNet(paddle.nn.Layer):
    def __init__(self):
        super(MyNet,self).__init__()
        self.resnet = paddle.vision.models.resnet152(pretrained=True, num_classes=0)
        self.flatten = paddle.nn.Flatten()
        self.linear = paddle.nn.Linear(2048, 8)    def forward(self, img):
        y = self.resnet(img)
        y = self.flatten(y)
        out = self.linear(y)        return out
   

训练

第一次训练后参数为0.66左右,重复训练+调整学习率可以达到0.89左右。

In [ ]
model = MyNet()
model.train()

train_dataset=MyDateset()# 需要接续之前的模型重复训练可以取消注释# param_dict = paddle.load('./model.pdparams')# model.load_dict(param_dict)train_dataloader = paddle.io.DataLoader(
    train_dataset,
    batch_size=16,
    shuffle=True,
    drop_last=False)

max_epoch=10scheduler = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.0001, T_max=max_epoch)
opt = paddle.optimizer.Adam(learning_rate=scheduler, parameters=model.parameters())

now_step=0for epoch in range(max_epoch):    for step, data in enumerate(train_dataloader):
        now_step+=1

        img, label = data
        pre = model(img)
        loss = paddle.nn.functional.square_error_cost(pre,label).mean()
        loss.backward()
        opt.step()
        opt.clear_gradients()        if now_step%100==0:            print("epoch: {}, batch: {}, loss is: {}".format(epoch, step, loss.mean().numpy()))

paddle.s*e(model.state_dict(), 'model.pdparams')
   

打包提交

本题目提交需要提交对应的模型和预测文件。predict.py需要读取同目录下的模型信息,并预测坐标点-保存为json或预测分割后的图片-保存为图片形式。

想要自定义训练模型,只需要将predict.py中的模型和process函数中的do something 替换为自己的模型内容即可。

提交分割模型时,取消predict中52行的注释部分即可保存分割后的图片信息

如果不想自己反复训练模型可以直接从fork后就有的model.pdparams文件开始训练,这个模型精度为0.88~

In [ ]
# 压缩可提交文件! zip submit.zip model.pdparams predict.py
   

以上就是百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline的详细内容,更多请关注其它相关文章!


# 中文网  # 大连信息化网站优化好处  # 全网推广品牌营销  # 陕西建设网站设计模板  # 如皋律师网站推广  # 兖州推广营销如何做  # 社群营销和群推广  # 可口可乐的网络营销推广  # 仙居seo是什么细节模式  # 廊坊哪家网站推广好  # 东营提高关键词排名  # 戛纳  # 开源  # 首款  # 系列产品  # ai  # 边缘  # 美图  # 图像处理  # 百度网  # 文档  # type  # latte  # udio  # red  # cos  # 百度  # 百度网盘  # macos 


相关栏目: 【 行业资讯67740 】 【 技术百科0 】 【 网络运营39195


相关推荐: j*a怎么读取char数组  如何更新苹果ios16  买的5g手机但是没有5g网络怎么办  type-c全能接口是什么意思  空调power灯一直闪是什么意思  如何加装固态硬盘  春运车站抢票和网上抢票  爱奇艺视频怎么下载到手机u盘怎么转换格式方法  夸克缺什么登录不了  交管12123协议头不完整是啥意思  交管12123协议头不完整怎么解决  element ui的好处  typescript性能如何  市盈率和市净率是什么意思  typescript和哪个语音很像  进口超级维特拉三门版power是什么意思  typescript接口有什么用  j*a数组怎么新增值  j*a怎么清除数组  台达plc只有power灯亮是什么意思  ai文件在线打开工具有哪些  学typescript需要多久  怎么在爱奇艺中投屏到电视最新方法  typescript中范围如何设定  固态硬盘如何测试  苹果16promax有哪些颜色  市盈率动亏损是什么意思  萝卜快跑的收费标准是什么  win10锁屏壁纸怎么换360锁屏壁纸吗  单片机引脚怎么改成上拉  远程桌面如何发送命令  春运抢票最快几天能成功  广东春运抢票怎么抢的  typescript多久能学会  内网和外网区别 内网和外网有什么区别  NoSQL数据库有哪些特点  如何以命令符运行程序  为什么有的夸克带电  内在市盈率是什么意思  如何去除计算器的命令  苹果16会升级哪些  react怎么使用 typescript  typescript有什么框架  如何查看win10版本命令行  为什么youtube音乐打不开  early什么意思  电动车power灯亮红灯是什么意思  跑步机power键是什么意思  如何学好typescript  debian和ubuntu的区别是什么 

搜索