基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中,因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷,基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发构建公众场景下的打架斗殴行为识别系统,这里我们从互联网中采集了相当批量的聚众数据,首先看下效果:
 

接下来看下数据集:

【有打架斗殴】

【无打架斗殴】

数据主要来源于互联网数据采集和后期的人工处理标注。

可以借助我编写的数据集随机划分函数,便捷地生成训练集-测试集,如下所示:

def randomSplit(dataDir="data/",train_ratio=0.80):
    """
    数据集随机划分
    """
    if not os.path.exists("labels.json") or not os.path.exists("dataset.json"):
        pic_list=[]
        labels_list = os.listdir(dataDir)
        labels_list.sort()
        print("labels_list: ", labels_list)
        with open("labels.json", "w") as f:
            f.write(json.dumps(labels_list))
        for one_label in os.listdir(dataDir):
            oneDir=dataDir+one_label+"/"
            one_list=[oneDir+one for one in os.listdir(oneDir)]
            pic_list+=one_list
        length=len(pic_list)
        print("length: ", length)
        train_num=int(length*train_ratio)
        test_num=length-train_num
        print("train_num: ", train_num, ", test_num: ", test_num)
        train_list=random.sample(pic_list, train_num)
        test_list=[one for one in pic_list if one not in train_list]
        dataset={}
        dataset["train"]=train_list
        dataset["test"]=test_list
        with open("dataset.json","w") as f:
            f.write(json.dumps(dataset))
    else:
        print("Not Need To SplitData Again!!!!!")

接下来需要加载本地图像数据来解析创建可直接用于后续模型训练计算的数据集,核心实现如下所示:

def buildDataset():
    """
    加载本地数据集创建数据集
    """
    X_train, y_train = [], []
    X_test, y_test = [], []
    train_list=dataset["train"]
    test_list=dataset["test"]
    picDir = "data/train/"
    #训练集
    for one_path in train_list:
        try:
            print("one_path: ", one_path)
            one_img = parse4Img(one_path)
            one_y = parse4Label(one_pic_classes,labels_list)
            X_train.append(one_img)
            y_train.append(one_y)
        except Exception as e:
            print("train Exception: ", e)
    X_train = np.array(X_train)
    #测试集
    for one_path in test_list:
        try:
            print("one_path: ", one_path)
            one_img = parse4Img(one_path)
            one_y = parse4Label(one_pic_classes,labels_list)
            X_test.append(one_img)
            y_test.append(one_y)
        except Exception as e:
            print("test Exception: ", e)
    X_test = np.array(X_test)

完成数据集的解析构建之后就可以进行模型的开发训练工作了。

这部分可以参考我前面的博文的实现即可,这里就不再赘述了。本文中搭建的轻量级模型结构详情如下所示:

{
	"class_name": "Sequential",
	"config": {
		"name": "sequential_1",
		"layers": [{
			"class_name": "Conv2D",
			"config": {
				"name": "conv2d_1",
				"trainable": true,
				"batch_input_shape": [null, 100, 100, 3],
				"dtype": "float32",
				"filters": 64,
				"kernel_size": [3, 3],
				"strides": [2, 2],
				"padding": "same",
				"data_format": "channels_last",
				"dilation_rate": [1, 1],
				"activation": "relu",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "RandomUniform",
					"config": {
						"minval": -0.05,
						"maxval": 0.05,
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}, {
			"class_name": "MaxPooling2D",
			"config": {
				"name": "max_pooling2d_1",
				"trainable": true,
				"pool_size": [2, 2],
				"padding": "valid",
				"strides": [2, 2],
				"data_format": "channels_last"
			}
		}, {
			"class_name": "Conv2D",
			"config": {
				"name": "conv2d_2",
				"trainable": true,
				"filters": 128,
				"kernel_size": [3, 3],
				"strides": [2, 2],
				"padding": "same",
				"data_format": "channels_last",
				"dilation_rate": [1, 1],
				"activation": "relu",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "RandomUniform",
					"config": {
						"minval": -0.05,
						"maxval": 0.05,
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}, {
			"class_name": "MaxPooling2D",
			"config": {
				"name": "max_pooling2d_2",
				"trainable": true,
				"pool_size": [2, 2],
				"padding": "valid",
				"strides": [2, 2],
				"data_format": "channels_last"
			}
		}, {
			"class_name": "Conv2D",
			"config": {
				"name": "conv2d_3",
				"trainable": true,
				"filters": 256,
				"kernel_size": [3, 3],
				"strides": [2, 2],
				"padding": "same",
				"data_format": "channels_last",
				"dilation_rate": [1, 1],
				"activation": "relu",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "RandomUniform",
					"config": {
						"minval": -0.05,
						"maxval": 0.05,
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}, {
			"class_name": "MaxPooling2D",
			"config": {
				"name": "max_pooling2d_3",
				"trainable": true,
				"pool_size": [2, 2],
				"padding": "valid",
				"strides": [2, 2],
				"data_format": "channels_last"
			}
		}, {
			"class_name": "Flatten",
			"config": {
				"name": "flatten_1",
				"trainable": true,
				"data_format": "channels_last"
			}
		}, {
			"class_name": "Dense",
			"config": {
				"name": "dense_1",
				"trainable": true,
				"units": 256,
				"activation": "relu",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "VarianceScaling",
					"config": {
						"scale": 1.0,
						"mode": "fan_avg",
						"distribution": "uniform",
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}, {
			"class_name": "Dropout",
			"config": {
				"name": "dropout_1",
				"trainable": true,
				"rate": 0.1,
				"noise_shape": null,
				"seed": null
			}
		}, {
			"class_name": "Dense",
			"config": {
				"name": "dense_2",
				"trainable": true,
				"units": 512,
				"activation": "relu",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "VarianceScaling",
					"config": {
						"scale": 1.0,
						"mode": "fan_avg",
						"distribution": "uniform",
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}, {
			"class_name": "Dropout",
			"config": {
				"name": "dropout_2",
				"trainable": true,
				"rate": 0.15,
				"noise_shape": null,
				"seed": null
			}
		}, {
			"class_name": "Dense",
			"config": {
				"name": "dense_3",
				"trainable": true,
				"units": 2,
				"activation": "softmax",
				"use_bias": true,
				"kernel_initializer": {
					"class_name": "VarianceScaling",
					"config": {
						"scale": 1.0,
						"mode": "fan_avg",
						"distribution": "uniform",
						"seed": null
					}
				},
				"bias_initializer": {
					"class_name": "Zeros",
					"config": {}
				},
				"kernel_regularizer": null,
				"bias_regularizer": null,
				"activity_regularizer": null,
				"kernel_constraint": null,
				"bias_constraint": null
			}
		}]
	},
	"keras_version": "2.2.4",
	"backend": "tensorflow"
}

默认200次epoch的迭代计算,训练完成后,对loss曲线和acc曲线进行了对比可视化展示,如下所示:

【loss对比曲线】

【acc对比曲线】

可以看到:模型的效果还是很不错的。

最后编写专用的可视化系统界面,进行实例化推理展示,实例结果如下所示:

后续的工作考虑结合视频连续帧的特点来进一步提升打架斗殴行为的识别精度,感兴趣的话也都可以自行尝试实践一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/124945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05-MySQL-进阶-存储引擎索引SQL优化

一、存储引擎 涉及资料 链接:https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码:Coke ①:MySQL体系结构 1.连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 T…

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换,进程地址空间等等的概念进行了说明,本篇博客会基于这些知识点来 实现一个简单的 shell ,如有疑问,可以参考下述博客:Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计,我想在读者阅读本文之前应该已经有所了解,所以本文的重点是代码的分享和分析。至于具体的原理,我觉得读者不必阅读长篇大论的文章,只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

【STM32】STM32的Cube和HAL生态

1.单片机软件开发的时代变化 1.单片机的演进过程 (1)第1代:4004、8008、Zilog那个年代(大约1980年代之前) (2)第2代:51、PIC8/16、AVR那个年代(大约2005年前) (3)第3代:51、PIC32、Cortex-M0、…

QT事件循环和事件队列的理解

Qt的事件循环机制_qt事件循环流程-CSDN博客 QT-事件循环机制_qt线程事件循环-CSDN博客 一、事件处理流程如图所示: 1.QCoreApplication::postEvent(QObject *receiver,QEvent *event): QCoreApplication::postEvent()函数用于将事件异步地发送到目标对…

机器学习 vs. 数值天气预报,AI 如何改变现有的天气预报模式

数值天气预报是天气预报的主流方法。它通过数值积分,对地球系统的状态进行逐网格的求解,是一个演绎推理的过程。 然而,随着天气预报分辨率不断升高,预报时间逐渐延长,NWP 模式所需要的算力迅速增加,限制了…

CSS 外边距、填充、分组嵌套、尺寸

一、CSS 外边距: CSS margin(外边距)属性定义元素周期的空间。margin清除周围的(外边框)元素区域。margin没有背景颜色,是完全透明的。margin可以单独改变元素的上、下、左、右边距,也可以一次改…

什么叫做阻塞队列的有界和无界

(mic老师面试题摘选) 昨天一个 3 年 Java 经验的小伙伴私信我,他说现在面试怎么这么难啊! 我只是面试一个业务开发,他们竟然问我: 什么叫阻塞队列的有界和无界。现在面试 也太卷了吧! 如果你也遇到过类似…

nanodet训练自己的数据集、NCNN部署到Android

nanodet训练自己的数据集、NCNN部署到Android 一、介绍二、训练自己的数据集1. 运行环境2. 数据集3. 配置文件4. 训练5. 训练可视化6. 测试 三、部署到android1. 使用官方权重文件部署1.1 下载权重文件1.2 使用Android Studio部署apk 2. 部署自己的模型【暂时存在问题】2.1 生成…

如何查看Android 包依赖关系

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、查看依赖关系3.1 方式一3.2 方式二…

安防监控系统视频融合平台EasyCVR页面地图功能细节详解

安防监控视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff…

混沌系统在图像加密中的应用(小波混沌神经网络)

混沌系统在图像加密中的应用(小波混沌神经网络) 前言一、小波混沌神经网络模型二、拓展三、python代码 前言 小波混沌神经网络是一种神经网络模型,结合了小波变换和混沌理论,用于信号处理、分类和预测。该模型基于多层前向神经网…

selenium元素定位与操作

说明:本篇博客基于selenium 4.1.0 在selenium中,想要对元素进行操作,一般需要如下步骤: 在浏览器中查看元素属性,便于selenium在页面中找到该元素在代码中创建元素对象元素操作、获取元素信息 查看元素属性 浏览器…

【快速使用ShardingJDBC的哈希分片策略进行分库分表】

文章目录 🔊博主介绍🥤本文内容🍊1.引入maven依赖🍊2.启动类上添加注解MapperScan🍊3.添加application.properties配置🍊4.普通的自定义实体类🍊5.写个测试类验证一下🍊6.控制台打印…

[架构之路-246]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:获取、分析、定义、验证

目录 前言: 架构师为什么需要了解需求分析 一、需求工程概述 1.1 概述 1.2 需求工程的两大部分 (1)需求开发:系统工程师的职责、目标系统开发角度 (2)需求管理:项目管理者的职责、项目管…

uni-app多端开发

uni-app 多端开发 一、命令创建uni-app 项目二、在微信小程序后台找到 appId 填写 appId三、运行项目四、使用 uni-ui4-1、下载4-2、自动导入4-3、ts项目下载类型校验 (uni-ui 组件库)4-3-1、下载4-3-2、配置 五、持久化 pinia六、数据请求封装七、获取组…

C++day6作业

1.思维导图 2.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在&am…

Spring笔记(四)(黑马)(web层解决方案-SpringMVC)

01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器…

OpenTiny Vue 组件库支持 Vue2.7 啦!

之前 OpenTiny 发布了一篇 Vue2 升级 Vue3 的文章。 🖖少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换button出错了,并且贴出了…

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器

前言 JVM作为Java进阶的知识,是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清…
最新文章