人工智能语义分析(人工智能语义分析技术)

Mark wiens

发布时间:2022-09-09

人工智能语义分析(人工智能语义分析技术)

 

视频: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后,使用如下命令即可

互联网小常识:电子邮件系统使用的协议主要有:简单邮件传送协议(SMTP,端口25);邮局协议第三版(POP3,端口110);Internet消息访问协议版本4(IMAP4,端口143),可以用telnet IP port的方法测试服务是否正常。

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--formatSEG--dataset_dirD:\MyDataset--val_value0.2--test_value0.1

执行上面命令行,会在D:\MyDataset下生成train_list.txt,val_list.txt,test_list.txt,分别存储训练样本信息,验证样本信息,测试样本信息。

手机支架测试图

视频:5.2 语义分割:模型训练

importpaddlex as pdxfrompaddlex import transforms as T数据集格式转换数据集划分paddlex --data_conversion --source labelme --to SEG --pics holder\JPEGImages --annotations holder\Annotations --save_dir holder-segpaddlex --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定义训练和验证时的transformsAPI说明: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 语义分割:模型部署和预测

importpaddlex as pdximportcv2importosimportnumpy 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 语义分割:推理预测

importpaddlexaspdximportcv2importosimportnumpyasnpos.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 语义分割:实现背景与目标分离

importpaddlex as pdximportcv2importosimportnumpy as npmodel=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实现抠图 遍历fori in range(thresh.shape[0]):forj in range(thresh.shape[1]):ifthresh[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()

互联网小常识:VLAN Trunk技术是交换机与交换机之间、交换机与路由器之间存在的一条物理链路,而在这一条物理链路上要传输多个VLAN信息的一种技术。VLAN Trunk采用帧标签的方式,每个帧标签指定一个唯一的VLAN ID。划分VLAN的方法分为基于端口、MAC地址、第三层协议类型或地址。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186