1、弱监督

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

2、环境安装

操作系统:windows 7

python环境:3.6.4

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

软件:ffmpeg

3、截取视频

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

  1. # -*- coding: utf-8 -*-
  2. import os
  3.  
  4. def cut(filename, start, end):
  5. assert os.path.exists(filename) is True, "The soruse file is not exists."
  6.  
  7. start1 = start.replace(":","")
  8. end1 = end.replace(":","")
  9. #print(start1 + " " + end1)
  10. videoname = "{}{}-{}.mp4".format(filename.rsplit(".",1)[0],start1,end1)
  11. cmd = "ffmpeg -i {} -vcodec copy -acodec copy -ss {} -to {} {} -y".format(filename,start,end,videoname)
  12. result = os.popen(cmd)
  13. return result
  14.  
  15. if __name__ == "__main__":
  16. file = input("需要截取的视频:")
  17. start = input("起始时间(HH:MM:SS):")
  18. end = input("结束时间(HH:MM:SS):")
  19. print(cut(file, start, end))

输出结果:

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

4、视频抽帧

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

  1. import cv2
  2.  
  3. def get_video_pic(name,zhen):
  4. path = name.rsplit(".",1)[0]
  5. cap = cv2.VideoCapture(name)
  6. for i in range(1,int(cap.get(7)),zhen):
  7. cap.set(1, i)
  8. rval, frame = cap.read()
  9. if rval:
  10. picname = "{}{}.jpg".format(path,str(i))
  11. cv2.imwrite(picname, frame)
  12. cap.release()
  13.  
  14. if __name__ == "__main__":
  15. video = r"C:/Users/yuanpeng.xie/Desktop/test/yongcun-3.30-3.36.mp4"
  16. frame = 40
  17. get_video_pic(video,int(frame))
  18. print("over")

输出结果:

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

5、图像予以分割标注

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

输出结果:

  json文件部分内容

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

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib.image as img
  4. from PIL import Image
  5. import os
  6. import json
  7.  
  8. def PictureToMask(d_object, sourcePicture):
  9. '''得到原图的宽度和高度'''
  10. im = Image.open(sourcePicture)
  11. size = list(im.size)
  12. width = size[0]
  13. height = size[1]
  14.  
  15. '''将图片的像素的宽度和高度换算成英寸的宽度和高度'''
  16. dpi = 80 #分辨率
  17. ycwidth = width/dpi #宽度(英寸) = 像素宽度 / 分辨率
  18. ycheight = height/dpi #高度(英寸) = 像素高度 / 分辨率
  19.  
  20. color = ["g","r","b","y","skyblue","k","m","c"]
  21. fig, ax = plt.subplots(figsize=(ycwidth,ycheight))
  22. for region in d_object:
  23. '''将传进来的x轴坐标点和y轴坐标点转换成numpy数组,相加后转置成多行两列'''
  24. x = np.array(d_object[region][0])
  25. y = np.array(d_object[region][1]) * -1
  26. xy = np.vstack([x,y]).T
  27. '''
  28. #设置画框的背景图片为原图
  29. fig = plt.figure(figsize=(ycwidth,ycheight),dpi=dpi)
  30. bgimg = img.imread(sourcePicture)
  31. fig.figimage(bgimg)
  32. '''
  33. '''将numpy中的坐标连城线,绘制在plt上'''
  34. plt.plot(xy[:,0],xy[:,1],color=color[int(region)])
  35. plt.fill_between(xy[:,0],xy[:,1],facecolor=color[int(region)]) #对该分割区域填充颜色
  36. plt.xticks([0,width])
  37. plt.yticks([0,-height])
  38. plt.axis("off")
  39. #保存图片
  40. path = sourcePicture.rsplit(".",1)[0]
  41. print(sourcePicture)
  42. print(path)
  43. plt.savefig(path + "-mask.png", format='png', bbox_inches='tight', transparent=True, dpi=100) # bbox_inches='tight' 图片边界空白紧致, 背景透明
  44. #plt.show()
  45.  
  46. def getJson(filepath):
  47. '''从文件夹获取json文件内容,返回字典'''
  48. files = os.listdir(filepath)
  49. for file in files:
  50. if file.split(".")[1] == "json":
  51. jsonfile = filepath + file
  52. break
  53. jsonstr = open(jsonfile,"r",encoding="utf8").read()
  54. d_json = json.loads(jsonstr)
  55. #print(d_json)
  56. return d_json
  57.  
  58. def getPath():
  59. '''输入图片文件夹路径'''
  60. filepath = input("图片文件夹路径:")
  61. if filepath.endswith != "/" or filepath.endswith != "\\":
  62. filepath = filepath + "/"
  63. return filepath
  64.  
  65. def main():
  66. filepath = getPath()
  67. d_json = getJson(filepath)
  68. for key in d_json:
  69. data = d_json.get(key)
  70. pictureName = data["filename"]
  71. d_object = {}
  72. for region in data["regions"]:
  73. l_object = []
  74. x = data["regions"][region]["shape_attributes"]["all_points_x"]
  75. y = data["regions"][region]["shape_attributes"]["all_points_y"]
  76. l_object.append(x)
  77. l_object.append(y)
  78. d_object[region] = l_object
  79. sourcePicture = filepath + pictureName
  80. PictureToMask(d_object, sourcePicture)
  81.  
  82. if __name__ == "__main__":
  83. main()

输出结果:

  图像mask

7、小问题

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

  1. 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. vmware fusion 找不到可以连接的有效对等进程

    红框会有什么提示 vmware...,你点击允许

  2. iOS自动化--Spaceship使用实践

    Spaceship ### 脚本操作 证书,app,provision等一些列apple develop后台操作,快速高效. github地址 spaceship开发文档 文档有列出常用的api调用d ...

  3. HDU6534 Chika and Friendly Pairs(莫队,树状数组)

    HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...

  4. 你的第一个Quartz程序

    package org.quartz.examples.example1; import java.util.Date; import org.slf4j.Logger; import org.slf ...

  5. js中的相等

    概述 今天学习 jest,看文档的时候发现 jest 用到了 Object.is(),以前没有见过,所以记录下来,供以后开发时参考,相信对其他人也有用. 注意:Object.is的文档在这里 Obje ...

  6. Linux_Grub2、系统启动流程_RHEL7

    目录 目录 前言 系统启动流程 控制RHEL7启动过程 编辑gurbcfg RHEL7启动级别 修改系统运行级别 RHEL7破密码步骤 grup2加密防止破密码 initramfs文件 前言 RHEL ...

  7. 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置

    新建Account实体类 生成getter和setter还有toString方法 先创建dao类 全局的配置,这里要改成package 创建多对一的关系 在查询的时候输出user这个对象的内容 建立查 ...

  8. OPEN SQL:插入、删除、修改语法

    1. UPDATE 用于实现对数据据的更新操作,语法如下: UPDATE <dbtab> set f1...fn (where <condition>). UPDATE < ...

  9. Centos6.5安装配置svn服务器

    一. yum安装svn服务器 yum -y install subversion 二. 检测安装结果 svnserve --version //显示安装结果,表示安装成功了 三. 创建代码仓库目录 m ...

  10. pycharm运行测试用例遇到错误:ZeroDivisionError: float division by zero的原因

    运行测试用例报错:ZeroDivisionError: float division by zero 一般是因为测试用例模块命名没有以test开头,导致unittest找不到用例,用例总数为0,导致除 ...