人工智能语义分析(人工智能语义分析技术)
视频: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 pdx
importcv2
importos
importnumpy 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 语义分割:推理预测
importpaddlex
aspdx
importcv2
importos
importnumpy
asnp
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 语义分割:实现背景与目标分离
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