通过百度网盘分享的文件:语义分割弹幕.zip
链接:https://pan.baidu.com/s/19KLTPmfMPFmNAQkmnriuYg?pwd=9jnm
提取码:9jnm
--来自百度网盘超级会员V2的分享
面向对象
相关程序在面向对象.py中
# 定义两个学生字典,包含学生的姓名和年龄
student1 = {'name':'Bob','age':21}
student2 = {'name':'Alice','age':22}# 定义一个函数输出学生信息
def print_info(student):# 格式化输出学生的姓名和年龄print('姓名:%s,年龄:%d' % (student['name'],student['age']))# 输出学生1和学生2的信息
print_info(student1)
print_info(student2)# 定义一个学生类(面向对象的思想)
class Student():# 初始化方法,用于创建一个学生对象,接受姓名、年龄和体重作为参数def __init__(self,name,age,weight):self.__name = name # 姓名是私有属性self.age = age # 年龄是公共属性self.__weight = weight # 体重是私有属性# 定义一个方法,输出学生的详细信息def info(self):print('姓名:%s,年龄:%d,体重:%d' % (self.__name, self.age, self.__weight))# 定义一个方法,修改学生的年龄,并输出修改后的信息def change_age(self, new_age):self.age = new_ageself.info()# 创建学生对象,实例化Student类
student1 = Student('John', 22, 65)
student2 = Student('Lisa', 24, 57)# 输出学生1和学生2的详细信息
student1.info()
student2.info()# 修改学生2的年龄,并输出修改后的信息
student2.change_age(38)# 输出学生2的修改后年龄
print(student2.age)
这个程序展示了如何使用字典和面向对象编程(OOP)来管理学生的信息。首先,我们定义了两个字典 student1
和 student2
,然后使用一个函数 print_info
输出学生信息。接着,定义了一个 Student
类,通过类的构造函数 init
和方法 info
来管理学生的属性和行为。
面向对象思想的简介:
面向对象编程(OOP)是一种程序设计范式,通过将数据和操作数据的方法(函数)组织成对象来模拟现实世界中的事物。在本程序中,我们通过 Student
类来封装学生的属性(姓名、年龄、体重)和行为(如输出信息和修改年龄)。下面是OOP的几个核心概念:
-
类(Class):类是一个模板或蓝图,它定义了对象的结构和行为。在程序中,
Student
类定义了学生对象的姓名、年龄和体重属性,以及显示信息和修改年龄的方法。 -
对象(Object):对象是类的实例,通过类来创建。每个对象都可以拥有类定义的属性和方法。例如,
student1
和student2
是Student
类的对象。 -
封装(Encapsulation):封装是OOP的一个重要特性,它将数据(属性)和操作数据的行为(方法)绑定在一起,并且可以隐藏对象的具体实现(如私有属性)。在上面的代码中,
__name
和__weight
是私有属性,它们不能在类外直接访问,只能通过类内部的方法进行操作。 -
继承(Inheritance):通过继承,可以创建一个新的类,该类可以继承一个已有类的属性和方法,并可以扩展或修改其功能。在这个例子中,继承没有直接涉及,但它是OOP中一个重要的特性。
-
多态(Polymorphism):多态允许不同的对象在响应相同消息时有不同的表现形式。虽然这里没有显示多态,但我们可以通过继承和方法重写来实现这一特性。
通过面向对象的方式,我们能够将学生的属性和行为封装成一个 Student
类,这使得代码更易于扩展、维护和管理。
图像分割-语义分割
图像分割简介
图像分割是计算机视觉中的一项重要任务,其目的是将图像划分为多个有意义的区域或“标签”区域,从而便于进一步的处理或分析。在图像分割过程中,像素被分类到不同的区域中,每个区域通常具有某种共同的属性,如颜色、纹理或亮度。
图像分割的目标是通过算法使得图像中具有相似特征的区域被划分为一个区域。这一过程有助于计算机理解和分析图像的内容,广泛应用于医学图像分析、自动驾驶、视频监控等领域。
语义分割(Semantic Segmentation)
语义分割是图像分割中的一种特殊类型,其主要目的是将图像中的每个像素分配给一个特定的类别。语义分割不仅仅是将图像分割成多个区域,而是将每个区域(即每个像素)归类为一种特定的物体或物体的一部分。例如,在一张包含道路、汽车和行人的图像中,语义分割会将图像中的每个像素标记为“道路”,“汽车”,“行人”或其他类。
语义分割的特点
-
像素级别的分类:语义分割的关键特征是它不仅仅是将图像分成若干大块区域,而是要为每个像素分配一个标签。这样,每个像素都可以被赋予一个类别,这对于一些细粒度的图像分析非常有用。
-
不区分物体实例:语义分割关注的是每个像素的类别,而不是物体的实例。也就是说,语义分割无法区分同类物体的不同实例。例如,如果图像中有多个汽车,语义分割会把所有的汽车像素标记为“汽车”,而不会区分这些汽车的具体不同。
-
类别标签:每个像素都会被分配一个类别标签,标签代表该像素所属的物体类别。例如,“人”,“车”,“树”,“天空”是常见的类别标签。
语义分割的应用
-
自动驾驶:通过对道路、行人、车辆等元素的语义分割,自动驾驶系统能够更好地理解周围环境,为决策提供支持。
-
医学图像分析:在医学影像(如MRI、CT扫描图像)中,语义分割可以帮助医生识别和标注肿瘤、器官等结构,辅助诊断。
-
卫星图像分析:在遥感图像中,语义分割能够帮助区分不同类型的地形,如森林、河流、城市建筑等。
-
机器人视觉:机器人可以通过语义分割识别场景中的不同物体,进而进行导航或抓取操作。
实例分割(Instance Segmentation)简介
实例分割(Instance Segmentation)是计算机视觉中的一项任务,结合了目标检测和语义分割的特点,其目的是为图像中的每一个像素分配一个标签,并且区分同类物体的不同实例。与语义分割相比,实例分割不仅需要为每个像素分配一个类别标签,还需要区分同一类中的不同个体(即不同的物体实例)。这使得实例分割成为一个更复杂、更精确的任务。
语义分割 vs 实例分割
-
语义分割:将图像分割成不同的类别区域,但不能区分同一类物体的不同实例。例如,图像中的所有汽车会被标记为“汽车”,而不会区分它们是不同的汽车。
-
实例分割:不仅对每个像素进行分类,还要将同类物体的不同实例分开。比如,在图像中,所有的汽车像素会被标记为“汽车”,但是不同的汽车会有不同的实例ID。
实例分割的特点
-
像素级别的分类:实例分割的任务与语义分割类似,需要对图像中的每个像素进行分类。
-
区分不同实例:与语义分割不同,实例分割的核心任务是区分同一类物体的不同实例。在图像中,如果有多个汽车,它们会被标记为同一类,但每个汽车会有一个独立的标签或实例ID。
-
多重任务:实例分割结合了目标检测和语义分割的任务。在实例分割中,除了进行像素级的分类外,还要检测图像中的物体实例并将其分割出来。
实例分割的应用
实例分割具有广泛的应用,特别是在需要精确识别和分割多个物体实例的场景中:
-
自动驾驶:实例分割帮助自动驾驶系统识别和区分道路上的不同车辆、行人、交通标志等,提高环境理解的精度。
-
医学图像分析:在医学图像(如CT或MRI扫描图像)中,实例分割可以帮助医生区分并定位不同的病变区域或器官,为诊断和治疗提供支持。
-
机器人视觉:机器人可以使用实例分割技术识别并精确定位不同的物体,进行抓取、导航或其他任务。
-
视频监控:在视频监控中,实例分割能够帮助分辨和跟踪不同的行人、车辆等物体,进行行为分析或异常检测。
代码教程
语义分割与实例分割 demo
相关程序在实例分割demo.py和语义分割demo.py中
conda create -n myenv python=3.8#创建一个3.8的环境
conda activate myenv#进入环境
# 语义分割Demo
# 安装使用方法:https://pixellib.readthedocs.io/en/latest/index.html# python=3.8# TensorFlow
# Windows:pip3 install tensorflow==2.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple (最新版的2.8可能会报错)
# macOS:conda install -c conda-forge tensorflow
# pip install scikit-image==0.18.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip install scipy==1.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip install Pillow==8.4.0 numpy==1.21.2 -i https://pypi.tuna.tsinghua.edu.cn/simple# pip install protobuf==3.20.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip3 install imgaug -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip3 install pixellib --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
语义分割:
运行需要一点时间,并不是卡了~
实例分割结果:
语义分割所有人的类别都是同一种颜色,实例分割则是每个人是不一样的颜色
你可以运行一下我的实例分割demo和语义分割demo,体验一下效果
代码中target_classes = instance.select_target_classes(person=True)#可选择类别
可以选择类别
这里我的实例分割选择person进行测试
或者你将segment_target_classes=target_classes去掉,就可以识别所有类别了
防档弹幕
接下来就是防挡弹幕教程:
1、先运行防挡弹幕图片.py
2、获得图片测试效果后,用弹幕测试效果.py
如图是我第10帧的弹幕效果,我这个弹幕测试效果.py主要是测试
@param text_list list 本泳道文字列表
@param w,h int 泳道宽度和高度
@param color tuple 泳道文字颜色
@param size int 文字大小
@param speed int 文字速度(像素/帧)
然后就能控制弹幕的移动、弹幕大小、弹幕颜色等等信息,有点类似与b站的弹幕效果,只是b站以UI的形式进行调节,我们还没包装好,是用程序内部调节的。
修改frame = layer.generate_frame(10)中的数字就是第几帧弹幕。
3、然后我先对视频进行预处理,提取出模板
因为我们rcnn提取木弹幕的时间是非常久的,所以需要提前将每一个模板给保存下来,后面我们在应用时就可以省下rcnn的推理过程。
运行防档弹幕视频1.py
注意这里先运行vp.video2masks()进行制作模板
等制作完成后再注释vp.video2masks(),调用 vp.video_composite()
效果如下:
切换人像背景:
运行切换人像背景.py
大致效果如下: