视频:5.1 语义分割:数据集采集、转换和划分
语义分割
语义数据的标注推荐使用LabelMe标注工具。
注意:LabelMe对于中文支持不够友好,因此请不要在如下的路径以及文件名中出现中文字符!
准备工作
- 将收集的图像存放于JPEGImages文件夹下,例如存储在D:\MyDataset\JPEGImages
- 创建与图像文件夹相对应的文件夹Annotations,用于存储标注的json文件,如D:MyDataset\Annotations
- 打开LabelMe,点击”Open Dir“按钮,选择需要标注的图像所在的文件夹打开,则”File List“对话框中会显示所有图像所对应的绝对路径,接着便可以开始遍历每张图像,进行标注工作
目标边缘标注
- 打开多边形标注工具(右键菜单->Create Polygon)以打点的方式圈出目标的轮廓,并在弹出的对话框中写明对应label(当label已存在时点击即可,此处请注意label勿使用中文),具体如下提所示,当框标注错误时,可点击左侧的“Edit Polygons”再点击标注框,通过拖拉进行修改,也可再点击“Delete Polygon”进行删除。
- 点击右侧”Save“,将标注结果保存到中创建的文件夹Annotations目录中
格式转换
LabelMe标注后的数据还需要进行转换为SEG格式,才可以用于语义分割任务的训练,创建保存目录D:\dataset_seg,在python环境中安装paddlex后,使用如下命令即可
paddlex --data_conversion --source labelme --to SEG \ --pics D:\MyDataset\JPEGImages \ --annotations D:\MyDataset\Annotations \ --save_dir D:\dataset_seg
数据集划分
转换完数据后,为了进行训练,还需要将数据划分为训练集、验证集和测试集,同样在安装paddlex后,使用如下命令即可将数据划分为70%训练集,20%验证集和10%的测试集
paddlex --split_dataset --format SEG --dataset_dir D:\MyDataset --val_value 0.2 --test_value 0.1
执行上面命令行,会在D:\MyDataset下生成train_list.txt, val_list.txt, test_list.txt,分别存储训练样本信息,验证样本信息,测试样本信息。

手机支架测试图
视频:5.2 语义分割:模型训练
import paddlex as pdxfrom paddlex import transforms as T#数据集格式转换#数据集划分#paddlex --data_conversion --source labelme --to SEG --pics holder\JPEGImages --annotations holder\Annotations --save_dir holder-seg#paddlex --split_dataset --format SEG --dataset_dir holder-seg --val_value 0.2 --test_value 0.1# 输出推理模型# paddlex -export_inference --model_dir best_model --save_dir inference# 定义训练和验证时的transforms# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.mdtrain_transforms = T.Compose([ T.Resize(target_size=512), T.RandomHorizontalFlip(), T.Normalize( mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),])eval_transforms = T.Compose([ T.Resize(target_size=512), T.Normalize( mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),])# 定义训练和验证所用的数据集# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.mdtrain_dataset = pdx.datasets.SegDataset( data_dir='holder-seg', file_list='holder-seg/train_list.txt', label_list='holder-seg/labels.txt', transforms=train_transforms, shuffle=True)eval_dataset = pdx.datasets.SegDataset( data_dir='holder-seg', file_list='holder-seg/val_list.txt', label_list='holder-seg/labels.txt', transforms=eval_transforms, shuffle=False)# 初始化模型,并进行训练# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/train/visualdl.mdnum_classes = len(train_dataset.labels)model = pdx.seg.FastSCNN(num_classes=num_classes)# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/semantic_segmentation.md# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/parameters.mdmodel.train( num_epochs=10, train_dataset=train_dataset, train_batch_size=4, eval_dataset=eval_dataset, learning_rate=0.05, save_dir='output/fastscnn')
视频:5.3.1 语义分割:模型部署和预测
import paddlex as pdx import cv2import osimport numpy as np model=pdx.load_model("output/fastscnn-holder/best_model")image_name="holder/holder-test1.jpg"img=cv2.imread(image_name)result=model.predict(img)vis_img=pdx.seg.visualize(img,result,save_dir=None)cv2.imshow("result",vis_img)cv2.waitKey(0)cv2.destroyAllWindows()
视频:5.3.2 语义分割:推理预测
import paddlex as pdx import cv2import osimport numpy as np #os.environ["CUDA_VISBLE_DEVICES"]="0,1"predictor=pdx.deploy.Predictor("output/fastscnn-holder/inference_model",use_gpu=True)image_name="holder/holder-test1.jpg"img=cv2.imread(image_name)result=predictor.predict(img)#print(result)#生成结果图vis_img=pdx.seg.visualize(newimg,result,save_dir=None)cv2.imshow("res",vis_img)cv2.waitKey(0)cv2.destroyAllWindows()
视频:5.4 语义分割:实现背景与目标分离
import paddlex as pdx import cv2import osimport numpy as np # model=pdx.load_model("output/fastscnn-holder/best_model")# image_name="holder/holder-test1.jpg"# img=cv2.imread(image_name)# result=model.predict(img)# vis_img=pdx.seg.visualize(img,result,save_dir=None)# cv2.imshow("result",vis_img)# cv2.waitKey(0)# cv2.destroyAllWindows()#os.environ["CUDA_VISBLE_DEVICES"]="0,1"predictor=pdx.deploy.Predictor("output/fastscnn-holder/inference_model",use_gpu=True)image_name="holder/holder-test1.jpg"img=cv2.imread(image_name)result=predictor.predict(img)#生成一幅空白图片newimg=np.zeros((img.shape),dtype=np.uint8)cv2.imshow("newimg",newimg)#print(result)#生成结果图vis_img=pdx.seg.visualize(newimg,result,save_dir=None)#生成mask,先转灰度,再二值化gray=cv2.cvtColor(vis_img,cv2.COLOR_BGR2GRAY)ret,thresh=cv2.threshold(gray,0,255,cv2.THRESH_BINARY)cv2.imshow("thresh",thresh)#mask实现抠图 遍历for i in range(thresh.shape[0]): for j in range(thresh.shape[1]): if thresh[i,j]==0: img[i,j]=[0,0,255]cv2.imshow("bg",img) res=cv2.add(img,newimg,mask=thresh)cv2.imshow("res",res)cv2.waitKey(0)cv2.destroyAllWindows()

评论留言