比赛地址:https://tianchi.aliyun.com/competition/entrance/531795/introduction
学习内容:https://github.com/datawhalechina/team-learning/tree/master/03%20%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AE%9E%E8%B7%B5%EF%BC%88%E8%A1%97%E6%99%AF%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E8%AF%86%E5%88%AB%EF%BC%89
使用工具:Google Colab
使用语言:Python
数据读取和扩增
- 图像读取:数据的读取有两个较为常用的库 Pillow 和 OpenCV,这两个库都可以用来读取数据。
- Pillow库
- Pillow是Python图像处理函式库(PIL)的一个分支。Pillow提供了常见的图像读取和处理的操作,而且可以与ipython notebook无缝集成,是应用比较广泛的库。
from PIL import Image #导入Pillow库
- Pillow库有图像操作和图像处理的函数,是图像处理的必备库
- Pillow的官方文档:https://pillow.readthedocs.io/en/stable/
- OpenCV库
- 功能比Pillow库要强大,除了有更多的图像处理和图像操作的函数,还内置了很多的图像特征处理算法,如关键点检测、边缘检测和直线检测等。
- OpenCV官网:https://opencv.org/
OpenCV Github:https://github.com/opencv/opencv
OpenCV 扩展算法库:https://github.com/opencv/opencv_contrib
.
.
.
.
.
- 数据扩增 :可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力。 常用的库有torchvision、imgaug、albumentations
-
torchvision库
transforms.CenterCrop ——对图片中心进行裁剪
transforms.ColorJitter ——对图像颜色的对比度、饱和度和零度进行变换
transforms.FiveCrop ——对图像四个角和中心进行裁剪得到五分图像
transforms.Grayscale ——对图像进行灰度变换
transforms.Pad ——使用固定值进行像素填充
transforms.RandomAffine ——随机仿射变换
transforms.RandomCrop ——随机区域裁剪
transforms.RandomHorizontalFlip ——随机水平翻转
transforms.RandomRotation ——随机旋转
transforms.RandomVerticalFlip ——随机垂直翻转
- https://github.com/pytorch/vision
pytorch官方提供的数据扩增库,提供了基本的数据数据扩增方法,可以无缝与torch进行集成;但数据扩增方法种类较少,且速度中等;
-
imgaug库
from imgaug import augmenters as iaa #augmenters是常用的类
iaa.Sequential() # 产生一个处理图片的Sequential
iaa.someOf() #将Augmenter中的部分变换应用在图片处理上,而不是应用所有的Augmenter。
iaa.WithColorspace() #在某个特定的颜色空间对图像进行变换。
iaa.WithChannels() #从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去。
iaa.Scale() #将图像缩放到固定大小。
iaa.CropAndPad() #截取(crop)或者填充(pad),填充时,被填充区域为黑色。
- iaa.Sequential([
iaa.Crop(px=(0, 16)), # 在距离边框0~16个像素中随机裁剪
iaa.Fliplr(0.5), # 50%的可能性使图片水平镜面翻转。
iaa.GaussianBlur(sigma=(0, 3.0)) # blur images with a sigma of 0 to 3.0
]) - https://github.com/aleju/imgaug
imgaug是常用的第三方数据扩增库,提供了多样的数据扩增方法,且组合起来非常方便,速度较快;
-
albumentations库
- 具体函数可以去百度搜索一下
- https://albumentations.readthedocs.io
是常用的第三方数据扩增库,提供了多样的数据扩增方法,对图像分类、语义分割、物体检测和关键点检测都支持,速度较快。
-
对labels的同步扩增
- 对xml文件操作,可使用 ElementTree库进行操作。
- 在Python标准库中,ElementTree有两种实现方式:一种是纯Python的实现xml.etree.ElementTree,另一种是速度更快一点的xml.etree.cElementTree。
- 步骤:
- 读取原影像bounding boxes坐标
(读取xml文件并使用ElementTree对xml文件进行解析,找到每个object的坐标值。)
- 生成变换序列
(用imgaug库的函数,产生一个处理图片的Sequential。)
- bounding box 变化后坐标计算
(先读取该影像对应xml文件,获取所有目标的bounding boxes,然后依次计算每个box变化后的坐标。)
- 将bbox坐标计算出来后,输出xml文件
- 读取原影像bounding boxes坐标