大家好,欢迎来到专栏《CV项目实战》,在这个专栏中我们会讲述计算机视觉相关的项目实战,有大型的完整项目,也有精炼的核心算法实战。
本次主要讲述一个完整的图像分割项目的标准流程,涉及数据标注,模型训练,模型测试。
作者&编辑 | 言有三
本文资源与图像分割结果展示
本文篇幅:4300字
背景要求:会使用Python和Pytorch深度学习开源框架
附带资料:Pytorch完整工程和标注工具可以从本文末公众号获取
同步平台:有三AI知识星球(一周内同步全文和Pytorch+Caffe代码,数据集)
1 项目背景
图像处理中,研究者往往只对图像中的某些区域感兴趣,在此基础上才有可能对目标进行后续的处理与分析。图像分割技术就是把图像中属于目标区域的感兴趣区域进行半自动或者自动地提取分离出来,属于计算机视觉领域中最基础的任务之一。
为了让新手们能够一次性体验一个图像分割任务的完整流程,本次我们选择带领大家完成一个天空背景图像分割任务,包括数据集的获取与标注,模型的训练和测试,同时也将这次的实验与上一期内容结合起来,完成嘴唇部位的分割。
2 准备工作
2.1 环境搭建
本次项目开发需要以下环境:
(1) Linux系统,推荐ubuntu16.04或者ubuntu18.04。使用windows系统也可以完成,但是使用Linux效率更高。
(2) 最好拥有一块显存不低于6G的GPU显卡,如果没有使用CPU进行训练速度较慢。
(3) 安装好的Pytorch(或Caffe)
2.2 数据获取
由于没有开源的数据集,我们首先要学会使用爬虫爬取图像,然后对获得的图片数据进行整理,包括重命名,格式统一,如果不清楚整个流程,可以参考我们上一次《【CV项目实战】纯新手如何从零开始完成一个工业级的图像分类任务?》,获得到的图像如下:
2.3 数据标注
接下来,我们需要对数据进行标注。图像分割任务要求对每一个像素进行预测,所以需要像素级别的标注结果,当然我们实际标注的时候往往是通过画轮廓形成闭合区域,下面使用我们自己开发的工具进行标注,步骤包括:
(1) 选择图片。
(2) 导入配置文件。
(3) 标注。
操作指导视频如下,工具获取方式请阅读至本文末尾。
如果要标注多个类别,可以配置多个类和对应的颜色,标注完之后的样本和结果如下:
需要注意的是,标注的结果并不是我们用于训练的标签,因为图像分割本身是对每一个图像像素进行分类,在当前的开源框架中,每一个像素的类别也是从0,1,2,3这样依次增加的。
所以需要把上面的彩色图,转换为单通道图,其中每一个像素值等于它的类别,如果上图中白色作为背景,类别为0,红色作为背景,类别为1,则可以用matlab或者python opencv遍历图像进行转换,python的代码如下。
import cv2
import sys
import os
import numpy as np
imagepaths = os.listdir(sys.argv[1])
for imagepath in imagepaths:
img = cv2.imread(os.path.join(sys.argv[1],imagepath))
mask = (img == (0,0,255)).astype(np.uint8)
cv2.imwrite(os.path.join(sys.argv[2],imagepath),mask)