语义分割tensorflow2.x以上版本实现!!!
整篇文章基于tensorflow2.x版本自带的keras编写代码
使用的编译软件及python为Pycharm+Anaconda。有关两个软件的安装与配置自行度娘即可。
依赖库
1.安装Anaconda3******.exe文件
2.安装pycharm*******.exe文件
3.在电脑左下角‘开始’处找到安装好的Anaconda文件夹,打开该文件夹下的Anaconda-Prompt终端
4.创建环境
5.在打开的终端输入 conda create -n python35 python=3.5 创建环境。PS:我喜欢用python3.5
6.创建成功后激化环境,失败自行度娘解决 activate python35
7.pip安装以下库,某些不会用 例:pip install tensorflow 最新版本即可
tensorflow
six >=1.8.0
Augmentor
numpy
opencv-python
pandas
matplotlib
Pillow
xlwt
xlrd
sklearn
tensorboardX
torchvision==0.2.2
分割数据集
任意标注,按类标注给定RGB像素值即可,工具lableme、ps皆可。标注的标签图像类型本文需要和原图一致,即RGB三通道图像。
例:
用ps标注,把眼睛标注为[66,0,88]
原图、标签图像名字需一一对应,放在不同文件下
例:
分为三个数据集
读取数据
直接干代码!!!
导入必要依赖包
"""
Author: W_maoxian
Begin Date: 20201009
End Date: 20201010
"""
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import cv2 as cv
import os
import collections
from densenet import DenseNet
import matplotlib.pyplot as plt
import datetime
使用opencv读取图像
"""
Author: W_maoxian
Begin Date: 20201009
End Date: 20201010
"""
def load_image_from_directory(images_dir, img_size, isLabel=False, classes=None, isOneHot=False, suffix='.png', dtype=np.float32):
"""
从数据集目录中加载图像数组
:param images_dir: 数据集目录,原图或标签,该文件夹下直接是图像,三通道,24位深度
:param img_size: 网络要求的图像大小
:param isLabel: 是否为标签, 测试集的标签由于只是显示作用,不参与训练,因此保持默认False即可
:param classes: 类,与isLabel相匹配,isLabel=True时,必须赋值
:param suffix: 图像后缀
:param dtype: 图像数据类型
:return: 返回图像数组,[图像个数,高,宽,通道数]
"""
images_path = []
for fname in os.listdir(images_dir):
if fname.endswith(suffix) and not fname.startswith('.'):
images_path.append(os.path.join(images_dir, fname)) # 数组填充,将图像绝对路径添加至数组images_path末尾
images_path = sorted(images_path) # 按顺序整理
images = [] # 创建空数组
for i, path in enumerate(images_path):
img = cv.imdecode(np.fromfile(path, dtype=np.uint8), cv.IMREAD_COLOR) # 可为中文路径读取图像
# img = cv.imread(path) # 读取图像, 无中文路径
if img.shape[:2] is not img_size:
img = cv.resize(img, dsize=img_size, interpolation=cv.INTER_NEAREST) # 不满足条件重置图像尺寸
img = img[:, :, ::-1] # 交换图像通道
if isLabel:
if isOneHot:
newImg = np.zeros(img.shape[:2] + (len(classes),), dtype=dtype) # 创建空数组用于储存图像数组
for j, value in enumerate(classes.values()):
newImg[np.bitwise_and(np.bitwise_and(img[:, :, 0] == value[0], img[:, :, 1] == value[1]), img[:, :, 2] == value[2]), j] = 1 # 把标签转为one-hot形式
img = newImg
else:
for j, value in enumerate(classes.values()):
img[np.bitwise_and(np.bitwise_and(img[:, :, 0] == value[0], img[:, :, 1] == value[1])