图像语义分割出的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 -*-
- import os
- def cut(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)
- return result
- if __name__ == "__main__":
- file = input("需要截取的视频:")
- start = input("起始时间(HH:MM:SS):")
- end = input("结束时间(HH:MM:SS):")
- print(cut(file, start, end))
输出结果:
左边这个是原视频,右边这个是截取的视频
4、视频抽帧
从视频中,每隔40帧抽取一张图片。
- import cv2
- def get_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()
- if rval:
- 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 = 40
- get_video_pic(video,int(frame))
- print("over")
输出结果:
视频总共好像是131帧,每隔40帧抽取一次就是下面这四张图片
5、图像予以分割标注
自己找工具去标,保存成json文件
输出结果:
json文件部分内容
6、用json文件和原图,用plt绘制图像mask
- import numpy as np
- import matplotlib.pyplot as plt
- import matplotlib.image as img
- from PIL import Image
- import os
- import json
- def PictureToMask(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 in d_object:
- '''将传进来的x轴坐标点和y轴坐标点转换成numpy数组,相加后转置成多行两列'''
- x = np.array(d_object[region][0])
- y = np.array(d_object[region][1]) * -1
- xy = 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()
- def getJson(filepath):
- '''从文件夹获取json文件内容,返回字典'''
- files = os.listdir(filepath)
- for file in files:
- if file.split(".")[1] == "json":
- jsonfile = filepath + file
- break
- jsonstr = open(jsonfile,"r",encoding="utf8").read()
- d_json = json.loads(jsonstr)
- #print(d_json)
- return d_json
- def getPath():
- '''输入图片文件夹路径'''
- filepath = input("图片文件夹路径:")
- if filepath.endswith != "/" or filepath.endswith != "\\":
- filepath = filepath + "/"
- return filepath
- def main():
- filepath = getPath()
- d_json = getJson(filepath)
- for key in d_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保存成和原图一样的尺寸了
图像语义分割出的json文件和原图,用plt绘制图像mask的更多相关文章
- 笔记:基于DCNN的图像语义分割综述
写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...
- 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割
遥感数据集 1. UC Merced Land-Use Data Set 图像像素大小为256*256,总包含21类场景图像,每一类有100张,共2100张. http://weegee.vision ...
- 【Keras】基于SegNet和U-Net的遥感图像语义分割
上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...
- 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...
- 使用LabVIEW实现基于pytorch的DeepLabv3图像语义分割
前言 今天我们一起来看一下如何使用LabVIEW实现语义分割. 一.什么是语义分割 图像语义分割(semantic segmentation),从字面意思上理解就是让计算机根据图像的语义来进行分割,例 ...
- 基于FCN的图像语义分割
语义图像分割的目标在于标记图片中每一个像素,并将每一个像素与其表示的类别对应起来.因为会预测图像中的每一个像素,所以一般将这样的任务称为密集预测.(相对地,实例分割模型是另一种不同的模型,该模型可以区 ...
- CRF图像语义分割
看了Ladicky的文章Associative Hierarchical CRFs for Object Class Image Segmentation,下载他主页的代码,文章是清楚了,但代码的RE ...
- 推荐一些用CRF做图像语义分割的资源
原文地址:http://blog.sina.com.cn/s/blog_5309cefc01014nri.html 首先是code,以前找了很多,但发现比较好用的有: 1. Matlab版的UGM:h ...
- 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.
from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...
随机推荐
- vmware fusion 找不到可以连接的有效对等进程
红框会有什么提示 vmware...,你点击允许
- iOS自动化--Spaceship使用实践
Spaceship ### 脚本操作 证书,app,provision等一些列apple develop后台操作,快速高效. github地址 spaceship开发文档 文档有列出常用的api调用d ...
- HDU6534 Chika and Friendly Pairs(莫队,树状数组)
HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...
- 你的第一个Quartz程序
package org.quartz.examples.example1; import java.util.Date; import org.slf4j.Logger; import org.slf ...
- js中的相等
概述 今天学习 jest,看文档的时候发现 jest 用到了 Object.is(),以前没有见过,所以记录下来,供以后开发时参考,相信对其他人也有用. 注意:Object.is的文档在这里 Obje ...
- Linux_Grub2、系统启动流程_RHEL7
目录 目录 前言 系统启动流程 控制RHEL7启动过程 编辑gurbcfg RHEL7启动级别 修改系统运行级别 RHEL7破密码步骤 grup2加密防止破密码 initramfs文件 前言 RHEL ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置
新建Account实体类 生成getter和setter还有toString方法 先创建dao类 全局的配置,这里要改成package 创建多对一的关系 在查询的时候输出user这个对象的内容 建立查 ...
- OPEN SQL:插入、删除、修改语法
1. UPDATE 用于实现对数据据的更新操作,语法如下: UPDATE <dbtab> set f1...fn (where <condition>). UPDATE < ...
- Centos6.5安装配置svn服务器
一. yum安装svn服务器 yum -y install subversion 二. 检测安装结果 svnserve --version //显示安装结果,表示安装成功了 三. 创建代码仓库目录 m ...
- pycharm运行测试用例遇到错误:ZeroDivisionError: float division by zero的原因
运行测试用例报错:ZeroDivisionError: float division by zero 一般是因为测试用例模块命名没有以test开头,导致unittest找不到用例,用例总数为0,导致除 ...