华为CV比赛

0.赛前准备
0.1 平台注册
点击:华为赛事官网注册网址,进入官网,点击右上角:注册。
图片: https://uploader.shimo.im/f/px0hYqAnKEM9qGxl.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI图片: https://uploader.shimo.im/f/ujKvO03BhWJvSWep.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
0.2 比赛报名
1、点击:华为赛事官网报名地址,进入赛事报名页。创建团队、选择报名来源、完善基础信息,最后提交即可
图片: https://uploader.shimo.im/f/bpIVACFKDMxFw9ko.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
图片: https://uploader.shimo.im/f/0PdWmnv8yFrNvrEM.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
图片: https://uploader.shimo.im/f/unelUS2IjEYXryhT.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
图片: https://uploader.shimo.im/f/Em0N2DwBnVRaxzRT.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
鉴于很多选手在官网下载模版时出错,这里可直接进行下载:
2022全球校园AI算法精英大赛报名补充信息-XX队
信息填写完成后,打包成.zip的压缩文档,将打包好的zip文件上传。(若上传不成功,可将文档转为PDF,再压缩上传即可)
0.3 赛题
车道渲染数据智能质检
在地图业务中,导航过程中所看到的背景道路界面是基于地图数据渲染生成。渲染过程中,部分数据会存在不同程度的问题,导致该部分数据渲染生成的道路存在缺陷,诸如缺边少角,异形道路等。为了更高效的检测这部分数据,降低人工成本,质检模型需要达到更高的准确度。根据问题数据所具有的共同模式建模,提高模型精度是降低成本的关键。希望通过本次比赛,挖掘计算机视觉方向人才,推动该领域发展。

理解
图像二分类问题:图像有没有缺陷
不需要判断出是什么问题

赛题说明
本赛题为选手提供地图渲染数据及其部分标注。训练集包括车道渲染数据的图片集及部分标注,选手使用训练数据进行模型训练。测试集分为A/B两个测试集。测试集仅提供车道渲染数据图片集,选手使用模型预测测试图片是否存在问题。

0.4 比赛数据
比赛数据集下载地址
https://digix-algo-challenge.obs.cn-east-2.myhuaweicloud.com/2022/AI/1d91a246f2b211ec82f95c80b6c7dac5/2022_2_data.zip
比赛数据集名称
2022_2_data.zip
保存位置
AutoDL的公共网盘南京新手区auto-nas/2022_2_data.zip

标注数据

标注文件以csv文件形式给出。每行包括图片名及该图片是否存在问题标注(若存在问题,会给到具体的问题编号)。格式如下:

imagename, defect_type

image_0.png, 1

image_1.png, 0

数据文件说明

本次比赛给出的数据文件及相关信息如下图。
图片: https://uploader.shimo.im/f/GpdtIddxPfdzY1YJ.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI

0.5 结果提交

  1. 至少要提交一次 DIGIX Implementation Instruction 和 Source Code
  2. 首次上传需同时上传3个文件,文件格式如下:submission.csv,DIGIX Implementation Instruction.docx,Source Code.zip。(DIGIX Implementation Instruction.docx文件大小不超过1M,Source Code.zip压缩文件大小不超过5M,submission.csv不超过100M。)

评估方式
选手根据测试集图片,预测图片是否存在问题(无需给出具体问题类别)。比赛使用AUC(Area Under Curve)作为评价指标,AUC 越高,代表结果越优,排名越靠前。

提交方式
选手提交csv文件,编码采用无BOM 的UTF-8。格式如下:

imagename, defect_prob

其中imagename对应测试图片的图片名,defect_prob表示测试图片存在问题的概率。imagename, defect_prob间采用英文逗号分隔。

比赛开始
1.1 代码逻辑
赛题可以抽象为简单的图像分类任务,一般采取深度学习去处理,我们尝试使用CNN来构建我们的模型。我们将问题解决流程抽象为如下几个步骤:
问题分析
数据读取与数据处理
模型搭建与训练
模型验证
结果输出

数据集的构建
函数/模型去拟合 图像》类别 的过程
损失函数(评估准则)
优化器(更新模型)
迭代训练

1.2 代码实现
#安装相关依赖库 如果是windows系统,cmd命令框中输入pip安装,或在Jupyter notebook中!pip安装,参考上述环境配置
#!pip install pandas numpy cv2 torch torchvision codecs PIL glob
#---------------------------------------------------
#导入库
import os
import glob
from PIL import Image
import csv, time
import numpy as np

pytorch相关

import torch
import torchvision
import torch.optim as optim
import torch.nn as nn
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import torch.utils.data as data

device = ‘cuda’ if torch.cuda.is_available() else ‘cpu’
#输出cuda说明使用gpu,输出cpu说明使用cpu,最好使用gpu训练
print(device)

自定义读取数据集 1.构建数据集

class ImageSet(data.Dataset):

def __init__(  # 初始化函数
        self,
        images,
        labels,
        transform):
    self.transform = transform  # 数据处理的过程
    self.images = images
    self.labels = labels
    
def __getitem__(self, item):  # 获取数据集中的数据的方法
    imagename = self.images[item]
    
    # 防止文件出错,这里生成一个随机的照片
    try:
        image = Image.open(imagename)
        image = image.convert('RGB')
    except:
        image = Image.fromarray(np.zeros((256, 256), dtype=np.int8))
        image = image.convert('RGB')
    image = self.transform(image)
    return image, torch.tensor(self.labels[item])
def __len__(self):
    return len(self.images)

import pandas as pd
import codecs

训练集标注数据

lines = codecs.open(‘train_label.csv’).readlines()
train_label = pd.DataFrame({
‘image’: [‘train_image/’ + x.strip().split(‘,’)[0] for x in lines],
‘label’: [x.strip().split(‘,’)[1:] for x in lines],
})

将标签进行二值化处理

train_label[‘new_label’] = train_label[‘label’].apply(lambda x: int(‘0’ in x))
import cv2, os
def check_image(path):
try:
if os.path.exists(path):
return True
else:
return False
except:
return False

筛选路径存在的训练集

train_is_valid = train_label[‘image’].apply(lambda x: check_image(x) )
train_label = train_label[train_is_valid]

数据扩增方法

trfs = transforms.Compose([
transforms.Resize((224, 224)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

训练集dataset和dataloder

这里我们使用前1000张图片进行训练,后续可以自行修改

train_dataset = ImageSet(train_label[‘image’].values[:1000],
train_label[‘new_label’].values[:1000],
trfs)
train_loader = DataLoader(
train_dataset,
batch_size=32,
shuffle=True,
num_workers=1,
pin_memory=True,
)

测试集dataset和dataloder

test_images = glob.glob(‘./test_images/*’)
test_dataset = ImageSet(test_images, [0] * len(test_images), trfs)
test_loader = DataLoader(
test_dataset,
batch_size=32,
shuffle=False,
num_workers=5,
pin_memory=True,
)

for data in train_loader:
break

for data in test_loader:
break

#如果出现BrokenPipeError: [Errno 32] Broken pipe,调整DataLoader中num_workers = 0
#num_workers参数是指在进行数据集加载时,启用的线程数目,windows下多线程可能出问题

加载resnet18预训练模型

model = torchvision.models.resnet18(pretrained=True)
model.fc = torch.nn.Linear(512, 2)
model = model.to(‘cuda’) #使用GPU

模型优化器

optimizer = optim.SGD(model.parameters(), lr=0.001)

模型损失函数

loss = nn.CrossEntropyLoss()

设置迭代轮数epochs,可调整,轮数越多,所花时间越久

epochs = 3
for epoch in range(epochs):
start_t = time.time()
epoch_l = 0
epoch_t = 0

# 批量训练
for batch_idx, batch in enumerate(train_loader):
    optimizer.zero_grad()
    image, label = batch
    image, label = image.to('cuda'), label.to('cuda')
    output = model(image) # 正向传播
    l = loss(output, label) # 计算损失
    l.backward()
    optimizer.step()
    batch_l = l.item()
    epoch_l += batch_l
    batch_t = time.time() - start_t
    epoch_t += batch_t
    start_t = time.time()
    
    # 打印loss
    if batch_idx % 10 == 0:
        print(l.item(), batch_idx, len(train_loader))
epoch_t = epoch_t / len(train_loader)
epoch_l = epoch_l / len(train_loader)
print('...epoch: {:3d}/{:3d}, loss: {:.4f}, average time: {:.2f}.'.format(
    epoch + 1, epochs, epoch_l, epoch_t))

model.eval()
to_prob = nn.Softmax(dim=1)
with torch.no_grad():
imagenames, probs = list(), list()
for batch_idx, batch in enumerate(test_loader):
image, _ = batch
image = image.to(‘cuda’)
pred = model(image)
prob = to_prob(pred)
prob = list(prob.data.cpu().numpy())
probs += prob

import csv
with open(‘submission.csv’, ‘w’,newline = ‘’, encoding=‘utf8’) as fp:
writer = csv.writer(fp)
writer.writerow([‘imagename’, ‘defect_prob’])
for imagename, prob in zip(test_images, probs):
imagename = os.path.basename(imagename)
writer.writerow([imagename, str(prob[0])])

本次教程完成了基础的模型搭建和训练过程,在学习版数据后可以在30分钟左右完成实践。如果想要获取更好的精度,可以从如下几个角度进行改进:
使用更多的训练数据进行训练,但需要更多的算力和时间
加入额外的数据扩增操作,需要选择合适的变换
使用更加强大的深度学习模型

1.6结果提交
在提交结果处提交,提交 submission.csv(程序生成的CSV文件),查看自己的成绩排名
图片: https://uploader.shimo.im/f/WeJDJAJjw1ZdtPdB.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
特别注意首次提交需要三个文件Source Code.zip为你的代码压缩文件、DIGIX Implementation Instruction.docx为官方提供文件、submission.csv为你的结果文件,注意文件名必须一致。
图片: https://uploader.shimo.im/f/H0ZMcS5jgJWISRh8.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjM1MDk3NTYsImZpbGVHVUlEIjoiemRreUI5ZUtyZGhOMGFBNiIsImlhdCI6MTY2MzUwOTQ1NiwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo3Nzc5NjkwM30.ZiNbnycCW3AAufgRuaK_dLzJwF5XGJbOQvM6hKVEskI
点击头像 - 个人中心,可以看见提交结果的分数,或者在排行榜中输入队伍名称亦可

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值