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的更多相关文章

  1. 笔记:基于DCNN的图像语义分割综述

    写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...

  2. 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割

    遥感数据集 1. UC Merced Land-Use Data Set 图像像素大小为256*256,总包含21类场景图像,每一类有100张,共2100张. http://weegee.vision ...

  3. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...

  4. 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)

    图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...

  5. 使用LabVIEW实现基于pytorch的DeepLabv3图像语义分割

    前言 今天我们一起来看一下如何使用LabVIEW实现语义分割. 一.什么是语义分割 图像语义分割(semantic segmentation),从字面意思上理解就是让计算机根据图像的语义来进行分割,例 ...

  6. 基于FCN的图像语义分割

    语义图像分割的目标在于标记图片中每一个像素,并将每一个像素与其表示的类别对应起来.因为会预测图像中的每一个像素,所以一般将这样的任务称为密集预测.(相对地,实例分割模型是另一种不同的模型,该模型可以区 ...

  7. CRF图像语义分割

    看了Ladicky的文章Associative Hierarchical CRFs for Object Class Image Segmentation,下载他主页的代码,文章是清楚了,但代码的RE ...

  8. 推荐一些用CRF做图像语义分割的资源

    原文地址:http://blog.sina.com.cn/s/blog_5309cefc01014nri.html 首先是code,以前找了很多,但发现比较好用的有: 1. Matlab版的UGM:h ...

  9. 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.

    from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...

随机推荐

  1. [LeetCode]-009-Palindrome_Number

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  2. 不能访问windows installer服务

    xp系统安装msi类型的安装程序出现以下错误: 不能访问windows installer服务. 解决办法 1:运行cmd -> regsvr32 msi.dll 运行services.msc- ...

  3. kurento搭建以及运行kurento-hello-world

    搭建环境的系统是ubuntu 1.kurento服务器搭建 运行如下脚本即可完成安装 #!/bin/bash echo "deb http://ubuntu.kurento.org trus ...

  4. leetcode 53. Maximum Subarray 、152. Maximum Product Subarray

    53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...

  5. Android:adb shell 命令详解

    安卓系统是基于Linux系统开发,也就支持常见的Linux的命令,这些命令都保存在手机“/system/bin”的目录下,通过adb shell 便可以调用这些命令. 进入“/system/bin”该 ...

  6. 应用安全 - 中间件 - Apache - Apache POI

    CVE-2014-3529 Date2014 类型 注入XML外部实体访问外部实体资源或者读取任意文件 影响范围 Apache POI 3.10-FINAL及以前版本 复现 CVE-2016-5000 ...

  7. Windows.命令行(CMD)_执行命令&环境变量

    1.CMD命令中如果 命令有换行的话,就使用 ^来连接(这就类似于 Linux命令行中 \ 的作用) 2.环境变量 2.1.显示 所有环境变量的值,命令:set 2.2.显示 某个环境变量的值,命令 ...

  8. Java String == && equal

    [.net超级群:27921837] Java中equals和==的区别 java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,flo ...

  9. 20191110 Spring Boot官方文档学习(4.2)

    4.2.外部化配置 Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码.您可以使用Properties文件,YAML文件,环境变量和命令行参数来外部化配置.属性值可以 ...

  10. 堆排序 && Kth Largest Element in an Array

    堆排序 堆节点的访问 通常堆是通过一维数组来实现的.在数组起始位置为0的情形中: 父节点i的左子节点在位置(2*i+1); 父节点i的右子节点在位置(2*i+2); 子节点i的父节点在位置floor( ...