这里写目录标题
西瓜数据集准备
数据集使用说明
https://github.com/TommyZihao/Train_Custom_Dataset/tree/main/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2%E6%95%B0%E6%8D%AE%E9%9B%86
下载整理好之后的数据集
# 删除原有的数据集目录(如有)
rm -rf Watermelon87_Semantic_Seg_Mask.zip Watermelon87_Semantic_Seg_Mask
# 下载数据集压缩包
wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20230130-mmseg/dataset/watermelon/Watermelon87_Semantic_Seg_Mask.zip
# 解压
unzip Watermelon87_Semantic_Seg_Mask.zip >> /dev/null
# 删除压缩包
rm -rf Watermelon87_Semantic_Seg_Mask.zip
查看文件夹目录结构
pip install seedir emoji -i https://pypi.tuna.tsinghua.edu.cn/simple
import seedir as sd
sd.seedir('Watermelon87_Semantic_Seg_Mask', style='emoji', depthlimit=2)
西瓜数据集可视化
导入工具包
import os
import cv2
import numpy as np
from PIL import Image
from tqdm import tqdm
import matplotlib.pyplot as plt
%matplotlib inline
查看单张图像及其语义分割标注
# 指定单张图像路径
img_path = 'Watermelon87_Semantic_Seg_Mask/img_dir/train/045_sozai_l.jpg'
mask_path = 'Watermelon87_Semantic_Seg_Mask/ann_dir/train/045_sozai_l.png'
img = cv2.imread(img_path)
mask = cv2.imread(mask_path)
img.shape
mask.shape
输出结果
(300, 440, 3)
(300, 440, 3)
mask灰度图标注含义
np.unique(mask)
输出结果
array([0, 1, 2, 3, 4, 5], dtype=uint8)
类别名称 | 类别语义 | 标注类别 | 灰度图像素值 |
---|---|---|---|
/ | 背景 | / | 0 |
red | 西瓜红瓤 | 多段线(polygon) | 1 |
green | 西瓜外壳 | 多段线(polygon) | 2 |
white | 西瓜白皮 | 多段线(polygon) | 3 |
seed-black | 西瓜黑籽 | 多段线(polygon) | 4 |
seed-white | 西瓜白籽 | 多段线(polygon) | 5 |
plt.figure(figsize=(10, 6))
plt.imshow(mask*50)
plt.axis('off')
plt.show()
将语义分割标注叠加在原图上显示
# 每个类别的 BGR 配色
palette = [
['background', [127,127,127]],
['red', [0,0,200]],
['green', [0,200,0]],
['white', [144,238,144]],
['seed-black', [30,30,30]],
['seed-white', [8,189,251]]
]
palette_dict = {}
for idx, each in enumerate(palette):
palette_dict[idx] = each[1]
print(palette_dict)
输出结果
{0: [127, 127, 127],
1: [0, 0, 200],
2: [0, 200, 0],
3: [144, 238, 144],
4: [30, 30, 30],
5: [8, 189, 251]}
mask = mask[:,:,0]
# 将整数ID,映射为对应类别的颜色
viz_mask_bgr = np.zeros((mask.shape[0], mask.shape[1], 3))
for idx in palette_dict.keys():
viz_mask_bgr[np.where(mask==idx)] = palette_dict[idx]
viz_mask_bgr = viz_mask_bgr.astype('uint8')
# 将语义分割标注图和原图叠加显示
opacity = 0.2 # 透明度越大,可视化效果越接近原图
label_viz = cv2.addWeighted(img, opacity, viz_mask_bgr, 1-opacity, 0)
plt.figure(figsize=(10, 6))
plt.imshow(label_viz[:,:,::-1])
plt.axis('off')
plt.show()
批量可视化图像和标注
# 指定图像和标注路径
# 训练集
PATH_IMAGE = 'Watermelon87_Semantic_Seg_Mask/img_dir/train'
PATH_MASKS = 'Watermelon87_Semantic_Seg_Mask/ann_dir/train'
# 测试集
# PATH_IMAGE = 'Watermelon87_Semantic_Seg_Mask/img_dir/val'
# PATH_MASKS = 'Watermelon87_Semantic_Seg_Mask/ann_dir/val'
# n 行 n 列可视化
n = 5
# 透明度越大,可视化效果越接近原图
opacity = 0.2
fig, axes = plt.subplots(nrows=n, ncols=n, figsize=(16, 12))
for i, file_name in enumerate(os.listdir(PATH_IMAGE)[:n**2]):
# 载入图像和标注
img_path = os.path.join(PATH_IMAGE, file_name)
mask_path = os.path.join(PATH_MASKS, file_name.split('.')[0]+'.png')
img = cv2.imread(img_path)
mask = cv2.imread(mask_path)
mask = mask[:,:,0]
# 将预测的整数ID,映射为对应类别的颜色
viz_mask_bgr = np.zeros((mask.shape[0], mask.shape[1], 3))
for idx in palette_dict.keys():
viz_mask_bgr[np.where(mask==idx)] = palette_dict[idx]
viz_mask_bgr = viz_mask_bgr.astype('uint8')
# 将语义分割标注图和原图叠加显示
label_viz = cv2.addWeighted(img, opacity, viz_mask_bgr, 1-opacity, 0)
# 可视化
axes[i//n, i%n].imshow(label_viz[:,:,::-1])
axes[i//n, i%n].axis('off') # 关闭坐标轴显示
fig.suptitle('Image and Semantic Label', fontsize=30)
# plt.tight_layout()
plt.savefig('outputs/D-2.jpg')
plt.show()