5.人工智能-语义瓜分_语义_数据
把稳: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.***, val_list.***, test_list.***,分别存储演习样本信息,验证样本信息,测试样本信息。
手机支架测试图
***: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.***', label_list='holder-seg/labels.***', transforms=train_transforms, shuffle=True)eval_dataset = pdx.datasets.SegDataset( data_dir='holder-seg', file_list='holder-seg/val_list.***', label_list='holder-seg/labels.***', 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()
本文系作者个人观点,不代表本站立场,转载请注明出处!