图像语义分割python_图像语义分割出的json文件和原图,用plt绘制图像mask

1、弱监督

由于公司最近准备开个新项目,用深度学习训练个能够自动标注的模型,但模型要求的训练集比较麻烦,,要先用ffmpeg从视频中截取一段视频,在用opencv抽帧得到图片,所以本人只能先用语义分割出的json文件和原图,合成图像的mask。

2、环境安装

操作系统:windows 7

python环境:3.6.4

所需要的库:numpy,matplotlib,PIL,opencv-python

软件:ffmpeg

3、截取视频

截取一段视频中一直有同一个人出现的视频段。

#-*- coding: utf-8 -*-

importosdefcut(filename, start, end):assert os.path.exists(filename) is True, "The soruse file is not exists."start1= start.replace(":","")

end1= end.replace(":","")#print(start1 + " " + end1)

videoname = "{}{}-{}.mp4".format(filename.rsplit(".",1)[0],start1,end1)

cmd= "ffmpeg -i {} -vcodec copy -acodec copy -ss {} -to {} {} -y".format(filename,start,end,videoname)

result=os.popen(cmd)returnresultif __name__ == "__main__":

file= input("需要截取的视频:")

start= input("起始时间(HH:MM:SS):")

end= input("结束时间(HH:MM:SS):")print(cut(file, start, end))

输出结果:

左边这个是原视频,右边这个是截取的视频

4、视频抽帧

从视频中,每隔40帧抽取一张图片。

importcv2defget_video_pic(name,zhen):

path= name.rsplit(".",1)[0]

cap=cv2.VideoCapture(name)for i in range(1,int(cap.get(7)),zhen):

cap.set(1, i)

rval, frame=cap.read()ifrval:

picname= "{}{}.jpg".format(path,str(i))

cv2.imwrite(picname, frame)

cap.release()if __name__ == "__main__":

video= r"C:/Users/yuanpeng.xie/Desktop/test/yongcun-3.30-3.36.mp4"frame= 40get_video_pic(video,int(frame))print("over")

输出结果:

视频总共好像是131帧,每隔40帧抽取一次就是下面这四张图片

5、图像予以分割标注

自己找工具去标,保存成json文件

输出结果:

json文件部分内容

6、用json文件和原图,用plt绘制图像mask

importnumpy as npimportmatplotlib.pyplot as pltimportmatplotlib.image as imgfrom PIL importImageimportosimportjsondefPictureToMask(d_object, sourcePicture):'''得到原图的宽度和高度'''im=Image.open(sourcePicture)

size=list(im.size)

width=size[0]

height= size[1]'''将图片的像素的宽度和高度换算成英寸的宽度和高度'''dpi= 80 #分辨率

ycwidth = width/dpi #宽度(英寸) = 像素宽度 / 分辨率

ycheight = height/dpi #高度(英寸) = 像素高度 / 分辨率

color= ["g","r","b","y","skyblue","k","m","c"]

fig, ax= plt.subplots(figsize=(ycwidth,ycheight))for region ind_object:'''将传进来的x轴坐标点和y轴坐标点转换成numpy数组,相加后转置成多行两列'''x=np.array(d_object[region][0])

y= np.array(d_object[region][1]) * -1xy=np.vstack([x,y]).T'''#设置画框的背景图片为原图

fig = plt.figure(figsize=(ycwidth,ycheight),dpi=dpi)

bgimg = img.imread(sourcePicture)

fig.figimage(bgimg)'''

'''将numpy中的坐标连城线,绘制在plt上'''plt.plot(xy[:,0],xy[:,1],color=color[int(region)])

plt.fill_between(xy[:,0],xy[:,1],facecolor=color[int(region)]) #对该分割区域填充颜色

plt.xticks([0,width])

plt.yticks([0,-height])

plt.axis("off")#保存图片

path = sourcePicture.rsplit(".",1)[0]print(sourcePicture)print(path)

plt.savefig(path+ "-mask.png", format='png', bbox_inches='tight', transparent=True, dpi=100) #bbox_inches='tight' 图片边界空白紧致, 背景透明

#plt.show()

defgetJson(filepath):'''从文件夹获取json文件内容,返回字典'''files=os.listdir(filepath)for file infiles:if file.split(".")[1] == "json":

jsonfile= filepath +filebreakjsonstr= open(jsonfile,"r",encoding="utf8").read()

d_json=json.loads(jsonstr)#print(d_json)

returnd_jsondefgetPath():'''输入图片文件夹路径'''filepath= input("图片文件夹路径:")if filepath.endswith != "/" or filepath.endswith != "\\":

filepath= filepath + "/"

returnfilepathdefmain():

filepath=getPath()

d_json=getJson(filepath)for key ind_json:

data=d_json.get(key)

pictureName= data["filename"]

d_object={}for region in data["regions"]:

l_object=[]

x= data["regions"][region]["shape_attributes"]["all_points_x"]

y= data["regions"][region]["shape_attributes"]["all_points_y"]

l_object.append(x)

l_object.append(y)

d_object[region]=l_object

sourcePicture= filepath +pictureName

PictureToMask(d_object, sourcePicture)if __name__ == "__main__":

main()

输出结果:

图像mask

7、小问题

有一个小问题,就是mask的尺寸会比原图尺寸大,因为保存是会把整个figure保存,等于mask多了个边框,后来翻资料,将mask的大小调成和figure成一样。

plt.axes([0,0,1,1])

然后再把图片保存

去掉代码中的bbox_inches='tight'这句话,就可以将mask保存成和原图一样的尺寸了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值