车道渲染数据智能质检赛事介绍
赛题背景:为什么需要做视觉缺陷检测?
导航过程中所看到的背景道路界面是基于地图数据渲染生成,渲染过程中部分数据会存在不同程度的问题。为了更高效的检测这部分数据,降低人工成本,质检模型需要达到更高的准确度。
评价指标:AUC(Area Under Curve)
赛题数据:赛题提供了一些什么数据?需要根据数据完成什么任务?
车道渲染数据,分为训练集和测试集(A/B),标注为csv文件,每行包括图片名及该图片是否存在问题标注。
数据包括7类问题,只需检测是否存在问题。
赛题任务:可将任务抽象为一个什么类型的基本模型?
图像二分类问题
GPU
,尤其指NVIDIA
公司生产的GPU
系列。NVIDIA Driver
,其实它就是一个驱动软件,而前面的显卡就是硬件。CUDA
:并行计算平台和编程模型。cudnn
是一个专门为深度学习计算设计的软件库,里面提供了很多专门的计算函数,如卷积等。CUDA Toolkit Download
下载所需版本,建议选择使用 .run 文件安装,因为使用 .deb可能会将已经安装的较新的显卡驱动替换。 cuda_9.0.176_384.81_linux.run
的目录:sudo chmod +x cuda_9.0.176_384.81_linux.run # 为 cuda_9.0.176_384.81_linux.run 添加可执行权限
./cuda_9.0.176_384.81_linux.run # 安装 cuda_9.0.176_384.81_linux.run
参考链接
nvcc -V
or cat /usr/local/cuda/version.txt
or print(torch.version.cuda)
print(torch.__version__)
print(torch.cuda.is_available())
返回True说明版本是匹配的。# 1.下载数据
wget https://digix-algo-challenge.obs.cn-east-2.myhuaweicloud.com/2022/AI/1d91a246f2b211ec82f95c80b6c7dac5/2022_2_data.zip
# 2. 安装rar解压(root权限下安装)并解压文件
unrar e Filename.rar # 解压指定压缩包内的文件到当前工作目录
# 1. 创建并激活虚拟环境
conda create -n chedao python=3.7
conda activate chedao
# 2. 安装必要的库
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
pip3 install pillow pandas numpy opencv-python glob
配置 jupyter notebook
pip install jupyter
jupyter notebook # 默认打卡8888端口
# 映射远程服务器8888端口到本地8888端口
ssh -L8888:localhost:8888 <user>@<远程服务器IP地址>
# 在本地浏览器访问 localhost:8888
新建 trian.ipynb 文件,输入代码并运行
代码和说明可参见CV项目baseline
实践过程的 train.ipynb 文件:https://download.csdn.net/download/qq_38869560/86539767
输出得到 submission.csv
文件并提交。
多GPU运行设置
因为全部数据集数据量约30G,单GPU训练较慢,故采用多GPU并行计算。采用4块GPU,并进行如下设置:
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
device = 'cuda' if torch.cuda.is_available() else 'cpu'
#输出cuda说明使用gpu,输出cpu说明使用cpu,最好使用gpu训练
print(device)
# 传入训练数据
image, label = image.to(device), label.to(device)
#模型并行化
if torch.cuda.device_count() > 1:
print("Let's use", torch.cuda.device_count(), "GPUs!")
model = nn.DataParallel(model)
model = model.to(device) #使用GPU
根据教程提示,以下方法会有效果:
randcrop
、 randnoise
、 flip
根据图像特点,图片上下边缘存在大量无关,故计划采取中心裁剪,提取中间关键区域
%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
d2l.set_figsize()
img = d2l.Image.open('./train_image/train_25885.png')
d2l.plt.imshow(img);
apply(img, torchvision.transforms.RandomHorizontalFlip())
augs = torchvision.transforms.Compose([
torchvision.transforms.Resize((448, 448)),
torchvision.transforms.CenterCrop((224, 224))])
apply(img, augs)
torchvision 中给出的预训练模型和预训练权重:
MODELS AND PRE-TRAINED WEIGHTS
选择一个模型参数较少同时精度较高的模型:
半监督学习之伪标签(pseudo label,entropy minimization,self-training)
该种方法并未进行尝试。
0.787655
,但仍是一个比较低的值。0.799951
。随机裁剪可以使深度学习网络在训练时,找到对预测有用的特征组。
例如:假设输入图像中包含特征组 ( A , B , C , X , Y ) (A,B,C,X,Y) (A,B,C,X,Y)。其中, A , B , C A,B,C A,B,C为对预测有用的特征组, X , Y X,Y X,Y为噪声。
随机裁剪会将图片裁剪成包含如下特征的小图:
( A , B , X , Y ) ( A , B , C , Y ) ( A , B , C , X ) ( A , B , C ) . . . (A,B,X,Y)\\(A,B,C,Y)\\(A,B,C,X)\\(A,B,C)\\... (A,B,X,Y)(A,B,C,Y)(A,B,C,X)(A,B,C)...
这样,经过大量数据训练后,模型会发现 ( X , Y ) (X,Y) (X,Y)是对预测无用的特征, ( A , B , C ) (A,B,C) (A,B,C)对预测起作用。
torchvision.transforms使用详解
torchvision.transforms这个包中包含resize、crop等常见的data augmentation操作。
transformas.py
定义了各种data augmentation的类
functional.py
每个类中通过调用functional.py中对应的函数完成data augmentation操作
使用例子
import torchvision
import torch
data_transforms = {
'train': transforms.Compose([
transforms.ToPILImage(),
transforms.Resize(256),
# transforms.RandomResizedCrop(224,scale=(0.5,1.0)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), transform=data_transforms[x], loader=None),for x in ['train', 'val']}
功能 | 函数 |
---|---|
随机裁剪 | transforms.RandomCrop |
中心裁剪 | transforms.CenterCrop |
随机长宽比裁剪 | transforms.RandomResizedCrop |
上下左右中心裁剪 | transforms.FiveCrop |
上下左右中心裁剪后翻转 | transforms.TenCrop |
功能 | 函数 |
---|---|
依概率p水平翻转 | transforms.RandomHorizontalFlip |
依概率p垂直翻转 | transforms.RandomVerticalFlip |
随机旋转 | transforms.RandomRotation |
功能 | 函数 |
---|---|
resize | transforms.Resize |
标准化 | transforms.Normalize |
转为tensor | transforms.ToTensor |
填充 | transforms.Pad |
修改亮度、对比度和饱和度 | transforms.ColorJitter |
转灰度图 | transforms.Grayscale |
线性变换 | transforms.LinearTransformation() |
仿射变换 | transforms.RandomAffine |
依概率p转为灰度图 | transforms.RandomGrayscale |
将数据转换为PILImage | transforms.ToPILImage |
transforms.Lambda |
函数 | 功能 |
---|---|
transforms.RandomChoice(transforms) | 从给定的一系列transforms中选一个进行操作 |
transforms.RandomApply(transforms, p=0.5) | 给一个transform加上概率,以一定的概率执行该操作 |
transforms.RandomOrder | 将transforms中的操作顺序随机打乱 |