当前位置: 首页 > 编程日记 > 正文

CV08-数据预处理与数据增强

复现车道线分割项目(Lane Segmentation赛事说明在这里),学习数据预处理和数据增强。学习分为Model、Data、Training、Inference、Deployment五个阶段,也就是建模、数据、训练、推断、部署这五个阶段。现在进入的是Data阶段。项目的第一名也就是baseline在这里https://github.com/gujingxiao/Lane-Segmentation-Solution-For-BaiduAI-Autonomous-Driving-Competition

一、数据预处理

1.1 数据的说明

对于竞赛数据集:
使用Gray_Label里面的灰度标签;Labels_Fixed是RGB标签,只是灰度和RGB的一个映射关系,Gray_Label用于训练,Label_Fixed方便查看。使用Road02-04里面的数据,数据里面的lable不要使用,那些label是无效的。

数据增强肯定可以增加准确率,但是在项目开始时,不建议使用。应先建立baseline,尽快是模型能够跑起来,再想办法提高精度。

1.2 观察数据

注意观察数据。观察数据的分布、数据不平衡问题、异常、错误等。发现问题,要用数据清洗的办法解决。什么情况下进行数据清洗?与任务无关的、不能训练模型的、不包含目标特征的图片,剪裁掉无用的部分。由于GPU的限制,在服务器上建立训练用的张量NCHW里面的N一般选择2。

要注意维度的转换, NHWC维度转换为NCHW维度。利用张量的transpose方法转换维度。

数据不平衡会有什么问题?如果二分类类别不平衡,A分类99%,B分类1%,那么模型学不到东西。因为给一个图片就标记A就可以获得99%的正确率。

数据的data和label对应可以用文件名匹配的办法,文件名是时间戳命名的。观察数据集,每个图片的大小H×W=1710×3384。图片分辨率很大,不能全部加载,否则会把内存耗尽。面对这样的数据,在内存小、GPU性能差时怎么办?可以减小batch_size,resize降低图像分辨率,对图片剪裁crop。

1.3 label的处理

训练的时候,label要使用trainId。因为trainId是0-8连续的9个分类,方便做成one-hot向量label。
提交结果时,将推断映射到trainId对应的任意一个id就行。
注意:ignoreInEval列,ignoreInEval==True表示忽略,表示这个数据集里面就没有这个分类,因此不必要关注。直接将这类trainId变成背景类void。
注意:trainId==4的这个类别,ignoreInEval都是True,说明整个这个类别在数据集里面都没有。那么,就把这个类别忽略掉,后面的递进补上,5变成4,6变成5……8变成7。这样最终,实际只有8个分类。

1.4 生成CSV文件

前面提到data和label对应,用程序处理一下,生成CSV格式文件。CSV文件有两列,一列data的绝对路径,一列label的绝对路径。这个可以用pandas库来处理。列举一下pandas库的用法。

个人比较喜欢第一种用法,columns指定csv文件中有几列,这里是image和label两列。data是一个列表类型,每个元素都是一个item数据。这样就可以想写几条就写j

import pandas as pddf = pd.DataFrame(data=abspaths,  # csv文件数据,每个元素是一条数据columns=['image', 'label'])  # 两列 image、label# 生成csv文件
save = pd.DataFrame({'image':image_list, 'label':label_list})
save_shuffle = shuffle(save)
save_shuffle.to_csv('../data_list/train.csv', index=False)# 读取csv文件
data_dir = './data_list/train.csv'
train_list = pd.read_csv(data_dir)

1.5 推断

推断的方式可以用模型融合。baseline里面的模型融合就是三个模型的推断做平均值,用平均值作为推断。

1.6 其他内容

补充一些知识。语义分割常见的数据集:PASCAL VOC 2012、cityscapes等;Lane Segmentation的数据集是阿波罗数据集的一部分。阿波罗数据集的论文地址https://arxiv.org/abs/1803.06184,论文题目The ApolloScape Open Dataset for Autonomous Driving and its Application

语义分割的Label比较特殊,是和原图大小一样的图。或者label比原图要小,因为只对其中一部分感兴趣。要有自己的工具,可以参考COCO API,地址https://github.com/cocodataset/cocoapi

二、数据增强

  • 数据增强的目的是:提升特征的鲁棒性与模型的泛化性。
  • 一般来讲,数据增强是可以提升模型性能,但是并不是所有方法都成立,要考虑性价比。
  • 数据增强与数据集和任务存在一定关联性。(色彩增强对分类问题有效、翻转等对目标检测有效)

复现的常用的数据增强的代码在这里https://github.com/Ascetics/Pytorch-SegToolbox/blob/master/utils/augment.py

2.1 数据增强——基于pixel

  • 亮度。图像均值反应。也就是改变了图像的均值。
  • 对比度。均值不变的情况下,缩放差别。也就是图像均值不变,各色彩的方差增大。
  • 颜色饱和度。RGB转向HSV,再增加饱和度。

代码示例

import torch
import torchvision.transforms.functional as TF
import matplotlib.pyplot as plt
import numpy as np
import random
import os
from PIL import Image, ImageFilter
from utils.tools import get_proj_rootclass PairAdjustColor(object):def __init__(self, factors=(0.3, 2.)):super(PairAdjustColor, self).__init__()self.factors = factorspassdef __call__(self, image, label=None):"""调整亮度、对比度、饱和度只调整image,不调整label:param image: [H,W,C] PIL Image RGB 0~255:param label: [H,W] PIL Image trainId:return: [H,W,C] PIL Image RGB 0~255,  [H,W] PIL Image trainId"""brightness_factor = random.uniform(*self.factors)contrast_factor = random.uniform(*self.factors)saturation_factor = random.uniform(*self.factors)image = TF.adjust_brightness(image, brightness_factor)image = TF.adjust_contrast(image, contrast_factor)image = TF.adjust_saturation(image, saturation_factor)return image, labelpass

2.2 数据增强——基于位置变换

  • 水平或垂直翻转
  • 平移
  • 旋转
  • 缩放
  • 剪裁

以水平或垂直翻转为例

class PairRandomHFlip(object):def __init__(self):super(PairRandomHFlip, self).__init__()passdef __call__(self, image, label=None):"""图像随机左右翻转:param image: [H,W,C] PIL Image RGB:param label: [H,W] PIL Image trainId:return: [H,W,C] PIL Image RGB,  [H,W] PIL Image trainId"""if random.uniform(0, 1) < 0.5:  # 50%的概率会翻转image = TF.hflip(image)  # 左右翻转if label is not None:label = TF.hflip(label)return image, labelpassclass PairRandomVFlip(object):def __init__(self):super(PairRandomVFlip, self).__init__()passdef __call__(self, image, label=None):"""图像随机上下翻转:param image: [H,W,C] PIL Image RGB:param label: [H,W] PIL Image trainId:return: [H,W,C] PIL Image RGB,  [H,W] PIL Image trainId"""if random.uniform(0, 1) < 0.5:  # 50%的概率会翻转image = TF.vflip(image)  # 上下翻转if label is not None:label = TF.vflip(label)return image, labelpass

注意缩放的时候,image用bilinear差值,label只能用nearest插值。这是因为label中分类是从0,1,2……n_class-1的,插值会产生新的不存在的label。比如,图像的label是555777,bilinear插值变成5556677777,这里面66就是新的在原有label里面不存在的,用nearest差值就可以不会有这个问题。

2.3 数据增强——其他

  • Mixup方法,两个目标融合成一个目标
  • Cutout随机丢弃图像中的一部分,就相当于针对遮挡问题的增强。在图像中随机找到一个部分,像素全部置0。
  • AutoArgument

以Cutout为例

class PairRandomFixErase(object):def __init__(self, mask_size=64, value=0):"""按照固定大小,随机遮挡图像中的某一块方形区域:param mask_size: 被遮挡的区域大小,默认64x64:param value: 被遮挡的部分用value值填充"""super(PairRandomFixErase, self).__init__()self.mask_size = mask_sizeself.value = valuepassdef __call__(self, image, label=None):"""按照固定大小,随机遮挡图像中的某一块方形区域:param image: [C,H,W] tensor,必须是tensor:param label: [H,W] tensor,必须是tensor:return: [C,H,W] tensor,  [H,W] tensor"""_, h, w = image.shapetop = random.randint(0, h - self.mask_size)  # 随机到遮挡部分的topleft = random.randint(0, w - self.mask_size)  # 随机到遮挡部分的leftif random.uniform(0, 1) < 0.5:  # 随机遮挡image = TF.erase(image, top, left, self.mask_size, self.mask_size,v=self.value, inplace=True)return image, labelpass

三、常用的图像增强库

可以考虑使用已经成熟的图像增强库,比如iaa、Albumentations等。

相关文章:

ORB_SLAM2程序入口(System.cc)

程序入口 ORB_SLAM2的程序入口为src/System.cc。在CMakeList.txt中可知&#xff0c;ORB_SLAM2的可执行程序为&#xff1a; Examples/Stereo/stereo_kitti.cc等。 add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc) target_link_libraries(stereo_kitti ${PROJECT…

HDU 6229 Wandering Robots 找规律+离散化

题目链接&#xff1a;Wandering Robots 题解&#xff1a;先讲一下规律&#xff0c;对于每一个格子它可以从多少个地方来有一个值&#xff08;可以从自己到自己&#xff09;&#xff0c;然后答案就是统计合法格子上的数与所有格子的数的比值 比如说样例的3 0格子上的值就是 3 4 …

app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档

定义打开URL的方法 - (void)openURL:(NSString *)urlStr {NSURL *url [NSURL URLWithString:urlStr];UIApplication *app [UIApplication sharedApplication];if ([app canOpenURL:url]) { #ifdef __IPHONE_10_0[app openURL:url options:[NSDictionary dictionary] complet…

XML学习总结

1、XML结构 2、XmlNodeType值为一个枚举类型&#xff1a; 假设我们对一个XML文件进行遍历&#xff0c;不推断节点是否为Element类型。就会将文本节点遍历出来&#xff0c;出现#test。 3、XmlElement和XmlNode的差别&#xff1a;&#xff08;摘自CSDN论坛&#xff09; &#xff…

Linux01-基本操作与Shell

目录 一、环境 二、Linux目录结构及基本操作 2.1 Linux目录结构 2.2 基本操作 三、shell 3.1 shell的意义 3.2 su - 一、环境 2019年搞下RHCE的证书&#xff0c;但是一直没有整理Linux学习的笔记&#xff0c;为了不让到手的知识被遗忘&#xff0c;从今天起整理Linux学习…

ORB_SLAM2中Tracking线程的三种追踪方式

1、参考关键帧追踪模式 bool Tracking::TrackReferenceKeyFrame()对参考关键帧中的路标点进行跟踪。在Tracking线程中&#xff0c;每传入一帧&#xff0c;都会进行位姿优化。 以上一帧的位姿为当前位姿进行优化。 &#xff08;1&#xff09;计算当前帧的词袋 mCurrentFra…

nodejs 中间件 反向代理 接口转发

背景 随着后端业务系统的增加&#xff0c;纵向需求不断扩展&#xff0c;一个业务系统已经无法满足需求了&#xff0c;衍生出多个业务系统&#xff0c;对外暴露的ip、端口就可能有多个&#xff0c;此时不方便外部接口调用&#xff0c;有些特殊行业客户出于安全性考虑不发提供多…

oneinstack

https://oneinstack.com/转载于:https://www.cnblogs.com/diyunpeng/p/9740895.html

最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...

比如&#xff1a; procedure TForm1.Button1Click(Sender: TObject);begin CnTrayIcon1.OnClick ; // 这句就是不能通过&#xff01;&#xff01;end; 有过路的高手&#xff0c;指点学生一下。谢谢转载于:https://www.cnblogs.com/hahy8008/p/6783614.html

Linux02-帮助手册

目录 一、man手册 1.1 man的基本使用 1.2 mandb更新文档 二、/usr/share/doc 三、access.redhat.com 门户 一、man手册 1.1 man的基本使用 man就是mannual的缩写&#xff0c;手册的意思。Linux的命令很多&#xff0c;参数选项更多&#xff0c;人脑一般是记不住的&…

ORB_SLAM2中Tracking线程

Tracking线程是ORB_SLAM2的主线程。在System.cc中&#xff0c;使用构造函数进行了初始化&#xff0c;开启了三个线程。 可执行程序—>System构造函数&#xff08;初始化三个线程&#xff09;—>处理输入的帧&#xff08;TrackMonocular&#xff09;—>调用Tracking线程…

selenium的基础知识点

from selenium import webdriver from scrapy.selector import Selector#模拟登陆 browser webdriver.Chrome(executable_pathChromedriver.exe) #路径是Chromedriver.exe的存放位置&#xff0c;windows下只要配置好这个环境就不需要了browser.get(http://w) #需要登陆的那个网…

iOS 直播专题2-音视频采集

从设备(手机)的摄像头、MIC中采集音频、视频的原始数据ios的音视频采集可以从AVFoundation框架里采集 视频采集 这里我们选取GPUImage来采集视频,因为这个框架集成了很多视频滤镜,例如美颜 采集流程: 摄像头采集视频代码 GPUImageVideoCamera.m // 从前摄像头或后摄像头…

bzoj 4871: [Shoi2017]摧毁“树状图”

4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status][Discuss]Description 自从上次神刀手帮助蚯蚓国增添了上千万人口&#xff08;蚯口&#xff1f;&#xff09;&#xff0c;蚯蚓国发展得越来越繁荣了&#xff01…

Linux03-本地账户和组

目录 一、本地账户/etc/passwd 二、本地组/etc/group 三、切换账户su - 四、增删改本地账户useradd、userdel、usermod 五、账户默认配置文件/etc/login.defs 六、设置密码passwd(5)命令 七、增删改组groupadd、groupdel和groupmod 八、通过sudo以root身份运行命令 九…

ORB_SLAM2单目初始化策略

基本流程 单目初始化程序存储在Initializer.cc中   需要注意&#xff0c;对于双目/RGB-D相机&#xff0c;初始化时&#xff0c;由于可以直接获得相机的深度信息&#xff0c;因此无需求H/F&#xff0c;直接作为关键帧插入就行。   使用RANSACDLT求解H&#xff0c;RANSAC八点…

Powerdesigner逆向工程64位Oracle数据库

Powerdesigner老版本不支持64位Client&#xff0c;新版本弄不到破解码 解决方法&#xff0c;用Powerdesigner32位Oracle Clent访问64位Oracle Server 遇到的坑分享下 安装完64位的Oracle Server ,32位的 Oracle Clent默认的listener.ora文件有PROGRAM和ENVS这两个节点 Plsql(3…

运行jsp时,报错404

The origin server did not find a current reprsentation for the target resource or is not willing to disclose that one exists. 解决&#xff1a; 1. web.xml文件位置是否放错&#xff0c;应该放在WebContent/WEB-INF文件夹中 2. web.xml文件中是否有拼写错误&#xff0…

iOS 直播专题3-前置处理

前置处理 对视频添加美颜、水印、滤镜等对音频进行混音、消除环境音、声音特效等上一篇iOS 直播专题2-音视频采集提到视频采集采用的是GPUImage框架,这个框架集成了很多滤镜效果 这里主要介绍美颜、水印处理 处理流程: 美颜 这里的美颜效果用的是GPUImageBeautyFilter 功…

ORA-10873解决办法

今天&#xff0c;发现SAP系统的oracle数据库宕掉了。报错ORA-10873&#xff0c;经过查证解决该问题。记录一下&#xff0c;备忘。 一、问题 Oracle版本为12.1.0.2.0&#xff0c;在启动服务器后启动数据库startup&#xff0c;报错ORA-10873。 二、查证 到SAP Support Portal上…

ORB_SLAM2局部建图线程

局部建图线程入口&#xff1a;可执行程序在初始化三个线程的时候&#xff0c;在System.cc的构造函数中进入局部建图线程 mpLocalMapper new LocalMapping(mpMap, //指定使iomanipmSensorMONOCULAR); // TODO 为什么这个要设置成为MONOCULAR&#xff1f;&#xff1f;&#…

十一连测day1

这次测试&#xff0c;是福建第三中学的某同学出的&#xff0c;感觉难度还行吧&#xff0c;今天我就浅谈一下这场比赛的时间分配与心得 打开题目&#xff0c;看到了T1&#xff0c;这题是一道计数题吧&#xff0c;感觉心态一下子就崩了&#xff0c;100%的数据点应该是组合数学容斥…

iOS 直播专题5-推流

常用的推流协议有: 协议内容RTP实时流传输协议,但不保证服务质量RTCPRTP数据流协议的一个姐妹协议,为RTP提供服务质量反馈SRTP & SRTCPRTP和RTCP的安全版本,提供数据加密、消息认证功能RTSP控制声音或影像的多媒体数据串流协议RTMPADOBE公司播放器与服务器之间多媒体数…

centos6.5-vsftp搭建

我的机子是默认是没有的vsftp。 yum install -y vsftp 创建账户专为ftp而生。useradd ftp01 更改账户不可登录系统。usermod -s /sbin/nologin ftp01 vsftp默认是可以匿名登录的&#xff0c;也是默认的端口&#xff0c;这些不安全选项都要修改&#xff01; anonymous_enableYES…

Linux04-文件系统权限与ACL权限

目录 一、文件系统权限 1.1、认识文件系统权限 1.2、管理文件系统权限 1.3、特殊权限 1.4、默认权限 二、ACL权限 2.1、ACL本质是文件系统的一个挂载选项 2.2、更改文件的ACL权限 2.3、设置文件和目录的默认ACL权限 Linux中的权限管理分为两种类型 用户自主访问控制&…

ORB_SLAM2帧Frame

在追踪线程的一开始就会创建一个帧 cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double &timestamp)构造函数 在构造函数中&#xff0c;会对特征点进行提取。 ExtractORB(0,imGray);特征点分配至网格 将图像划分为48*64的网格&#xff0c;然后将…

Servlet的基本架构

Servlet的基本架构&#xff1a; package test;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Serv…

ORACLE 用户权限管理

Oracle创建用户的语法&#xff1a; CREATE USER username IDENTIFIED BY password OR IDENTIFIED EXETERNALLY OR IDENTIFIED GLOBALLY AS CNuser [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE temptablespace] [QUOTA [integer K[M] ] [UNLIMITED] ] ON tables…

iOS 直播专题6-流媒体服务器

常用的流媒体服务器有: nginx、SRS、BMS 这里主要介绍nginx、SRS 这里都用docker来运行流媒体服务器 docker 安装 下载Mac版docker stable 直接安装 注册一个docer账号直接登录SRS 安装 SRS guthub地址:https://github.com/ossrs/srs/ 启动上面安装的docker软件后,打开终端…

Linux05-进程管理

目录 一、进程 1.1、进程ID 1.2、列出进程 1.3、进程前后台 二、使用信号控制进程 三、以管理员身份注销用户&#xff08;踢掉在线用户&#xff09; 四、监控进程活动 4.1、负载平均值 4.2、实时进程监控 进程是已启动的可执行程序的运行中的实力。它由以下部分组成&a…