vscode

代码格式化:shift+alt+f

向上或向下移动一行:Alt+Up或Alt+Down

快速开始新一行:ctrl+enter

快速复制一行代码:Shift+Alt+Up 或Shift+Alt+Down

快速保存:Ctrl +S

快速查找:Ctrl + F

快速替换:Ctrl+ H

快速移动一行 alt + ↓或↑

多光标: alt + 鼠标左键

html5

合并单元格

  • 水平合并:colspan
  • 垂直合并:rowspan

h5新标签

  1. <header></header> 头部
  2. <nav></nav> 导航
  3. <section></section>定义文档中的节,比如章节、页眉、页脚
  4. <aside></aside> 侧边栏
  5. <footer></footer> 脚部
  6. <article></article> 代表一个独立的、完整的相关内容块,例如一篇完整的论坛帖子,一篇博客文章,一个用户评论等

查漏补缺

<figure>元素表示文档流中独立的内容块。这个内容通常与主文档相关,但可以被移动到文档的其他位置(如侧边栏、脚注或独立的附件)而不会影响理解文档的其余部分。

<section>元素用于定义文档中的一个区域(section),它通常表示文档中的一个主题或内容块。

图像标题(figcaption)元素用于添加标题以描述 figure 元素中包含的图像。<figcaption> 必须是 <figure> 元素的子元素,并且它必须是 <figure> 中的第一个或最后一个子元素

“URL” 是 “Uniform Resource Locator” 的缩写,中文意思是 “统一资源定位符”。它是一种用于在互联网上定位和访问资源(如网页、图像、视频等)的地址。

fieldset 元素用于在 Web 表单中将相关的输入和标签组合在一起。 fieldset 元素是块级元素,这意味着它们出现在新的一行上。

legend 元素充当 fieldset 元素中内容的标题。 它为用户提供了应该在表单的该部分中输入什么的上下文。

<meta name="viewport" content="width=device-width, initial-scale=1.0" />是一个非常重要的 HTML 元标签,用于控制网页在移动设备上的布局和显示方式

article和section

article标签表示文档、页面、应用或网站的一部分,具有独立性和完整性。它通常包含一些内容,如新闻报道、博客文章、论坛帖子等,这些内容可以被单独地分享、链接和索引。

section标签则表示文档或应用的一部分,但不具有独立性和完整性。它通常用于组织内容,将页面或应用分成不同的部分,例如头部、主体、脚注等。

method 属性指定了如何将表单数据发送到 action 属性中指定的 URL。 表单数据可以通过 GET 请求作为 URL 参数发送(method="get")或通过 POST 请求作为请求正文中的数据发送(method="post")。

给密码 input 元素添加 pattern 属性,要求输入匹配 [a-z0-5]{8,}。上面是一个正则表达式,匹配 8 个以上的小写字母或数字 05

<select><option> 是 HTML 中用于创建下拉列表的元素

<textarea> 是 HTML 中的一个表单元素,用于多行文本输入,允许用户输入和编辑大量文本。

英文全称记忆

<ul> : “Unordered List”

<li> : “List - item”

src: “source”

css text-align: “text alignment”(文本对齐方式)

link rel:relationship

<hr>:“Horizontal Rule”

css3

查漏补缺

opacity 是 CSS 中用于控制元素透明度的属性。它可以设置一个元素的透明度级别,取值范围从 0(完全透明)到 1(完全不透明)

box-shadow 属性允许你在元素周围应用一个或多个阴影。box-shadow: offsetX offsetY blurRadius color;

linear-gradient 是 CSS 中用于创建线性渐变背景的属性。它允许你在元素的背景中定义多种颜色之间的平滑过渡效果

hsla(Hue色相, Saturation饱和度, Lightness, Alpha透明度)是一种在 CSS 中定义颜色的方式,基于 HSL(色相、饱和度、亮度)颜色模型,并且允许设置透明度(alpha 值)。

vh 是 CSS 中的一种相对长度单位,表示视口高度(Viewport Height)的百分比。具体来说,1vh 等于视口高度的 1%。视口是指浏览器窗口中可见的部分,不包括工具栏、地址栏等非内容区域。

em 是 CSS 中的一种相对单位,用于表示元素的字体大小(font-size)的倍数。具体来说,1em 等于当前元素的字体大小。例如,如果一个元素的字体大小为 16px,那么 1em 就等于 16px

rem(Root Em)是 CSS 中的一种相对单位,表示相对于根元素(html 元素)的字体大小(font-size)的倍数。

在 CSS 中,cursor 属性用于定义鼠标指针位于元素上时的形状或图标。它对于改善用户体验非常重要,因为它为用户提供了视觉反馈,让他们知道可与页面上的不同元素进行哪些操作。

z-index属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.box1{
width: 200px;
height: 200px;
background-color: red;
position:absolute;
z-index: 2;
}
.box2{
width: 300px;
height: 300px;
background-color: green;
position:absolute;
z-index: 1;
}

css3新特性

圆角

使用 CSS3 border-radius 属性,你可以给任何元素制作 “圆角”

border-radius 属性,可以使用以下规则:

  1. 四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下角
  2. 三个值: 第一个值为左上角, 第二个值为右上角和左下角,第三个值为右下角
  3. 两个值: 第一个值为左上角与右下角,第二个值为右上角与左下角
  4. 一个值: 四个圆角值相同

阴影

box-shadow 向框添加一个或多个阴影。

1
box-shadow: h-shadow v-shadow blur color;
描述
h-shadow 必选,水平阴影的位置
v-shadow 必选,垂直阴影的位置
blur 可选,模糊距离
color 可选,阴影的颜色

动画

使用@keyframes规则,你可以创建动画

1
2
3
4
5
6
7
8
9
10
11
@keyframes name {
from|0%{
css样式
}
percent{
css样式
}
to|100%{
css样式
}
}

name:动画名称,开发人员自己命名;

percent:为百分比值,可以添加多个百分比值;

animation执行动画

1
animation: name duration timing-function delay iteration-count direction;
描述
name 设置动画的名称
duration 设置动画的持续时间
timing-function 设置动画效果的速率(如下)
delay 设置动画的开始时间(延时执行)
iteration-count 设置动画循环的次数,infinite为无限次数的循环
direction 设置动画播放的方向(如下)
animation-play-state 控制动画的播放状态:running代表播放,而paused代表停止播放
timing-function值 描述
ease 逐渐变慢(默认)
linear 匀速
ease-in 加速
ease-out 减速
ease-in-out 先加速后减速
direction值 描述
normal 默认值为normal表示向前播放
alternate 动画播放在第偶数次向前播放,第奇数次向反方向播放

切换背景颜色

1
<div class="animation"></div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.animation {
width: 300px;
height: 300px;
background-color: red;
animation: anima 5s linear 5s infinite;
}
.animation:hover {
animation-play-state: paused;
}
@keyframes anima {
0% {
background-color: red;
}
50% {
background-color: green;
}
100% {
background-color: blueviolet;
}
}

设置meta标签

使用设备的宽度作为视图宽度并禁止初始的缩放。在<head>标签里加入这个meta标签。

1
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">

参数解释

  1. width = device-width 宽度等于当前设备的宽度
  2. initial-scale 初始的缩放比例(默认设置为1.0)
  3. maximum-scale 允许用户缩放到的最大比例(默认设置为1.0)
  4. user-scalable 用户是否可以手动缩放(默认设置为no)

JS

querySelector()

ES6

常用命令行工具有两种

  1. CMD 命令行工具
  2. PowerShell 命令行工具

CMD命令行

  1. 打开命令行窗口
    1. win:左下角开始,找到运行,点击,输入cmd,回车
    2. win:win+r 快速打开命令行窗口
  2. 选择盘符:盘符名加冒号E:
  3. 查看盘符及目录下文件与文件夹:win:dir
  4. 清空命令行信息:win:cls
  5. 进入文件夹或目录:cd 文件夹名称
  6. 返回到上一级目录:cd ../
  7. 快速补全目录或文件夹名称:tab
  8. 创建文件夹:mkdir 文件夹名称
  9. 查看历史输入过的命令:上下按键

PowerShell

  1. 打开方式
    1. 在开始位置搜索PowerShell打开
    2. 在对应目录按住shift+右键,打开
  2. 其他保持一直

ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现,通常场合,这两个词是可以互换的。

ECMAScript 6(以下简称 ES6)是 JavaScript 语言的标准,在 2015 年 6 月发布。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

TypeScript

为什么你应当使用 TypeScript? TS 十分钟快速入门_哔哩哔哩_bilibili

参考视频和网站推荐

【HTML+CSS+JS+Vue】比大学课程还详细的Web前端教程,整整180集,学完即可兼职就业!附学习文档PDF,随时都能学_前端开发_WEB入门_哔哩哔哩_bilibili

Learn to Code — For Free — Coding Courses for Busy People

题目

  1. 编程实现希尔、快速、堆排序、归并排序算法。要求随机产生10000个数据存入磁盘文件,然后读入数据文件,分别采用不同的排序方法进行排序,并将结果存入文件中。
  2. N(N>10)个居民区之间需要铺设煤气管道。假设任意两个居民区之间都可以铺设煤气管道,但代价不同。要求事先将任意两个居民区之间铺设煤气管道的代价存入磁盘文件中。设计一个最佳方案使得这N个居民区之间铺设煤气管道所需代价最小,并将结果以图形方式在屏幕上输出。

题目一

算法思想

希尔排序:希尔排序是一种基于插入排序的排序算法,通过按一定步长将待排序的元素分组,对每组内的元素进行插入排序,不断缩小步长,最终实现整体排序。希尔排序的时间复杂度依赖于步长的选择,最坏情况下时间复杂度为O(n^2),最好的情况下接近O(nlogn)。

快速排序:快速排序是一种分治法思想的排序算法,选择一个基准元素,将待排序的数组分为左右两部分,左侧部分的元素都小于基准元素,右侧部分的元素都大于基准元素,然后分别对左右两部分进行递归排序。时间复杂度为O(nlogn),最坏情况下为O(n^2)。

堆排序:堆排序是一种选择排序的改进算法,利用堆数据结构(通常是大顶堆或小顶堆)来找到最大值或最小值,并将其移到数组的末尾,然后调整堆。时间复杂度为O(nlogn),适合大数据量排序。

归并排序:归并排序是一种分治法的排序算法,它将待排序的数组分为两部分,分别排序后再合并。时间复杂度为O(nlogn),且具有稳定性。

程序结构

  1. 数据生成:程序首先生成10000个随机数并将其存储到文件 data.txt 中。

  2. 排序算法实现:实现了四种排序算法:希尔排序、快速排序、堆排序和归并排序。

  3. 文件操作:程序从文件中读取数据,然后使用不同的排序算法对数据进行排序,并将排序结果保存到文件中。

测试结果

程序组成

sadf

生成数据

sadffac

排序结果dasfxc

收获与体会

  • 实践了不同排序算法的实现,加深了对算法效率和适用场景的理解。
  • 学会了如何操作文件进行数据存储和读取,增强了文件输入输出的处理能力。

题目二

算法思想描述

本题使用了Kruskal算法来求解最小生成树。Kruskal算法是一种典型的贪心算法,步骤如下:

  1. 先将所有的边按照权重排序。
  2. 从最小的边开始,逐步加入到生成树中,若加入该边不会形成环,就加入生成树,否则跳过该边。
  3. 使用并查集(Union-Find)数据结构来判定是否会形成环。

该算法通过选择最小权重的边逐步构建最小生成树,保证了铺设煤气管道的总代价最小。

程序结构

  1. 文件读取:程序读取包含代价矩阵和节点坐标的文件 costs.txt,并根据这些信息构建图。
  2. 并查集实现:实现了一个并查集数据结构来判断是否形成环。
  3. 图形显示:利用图形库绘制了居民区的分布、各居民区之间的煤气管道代价以及最终的最小生成树。

测试结果

通过程序实现,成功展示了根据最小生成树算法铺设的煤气管道图形,并显示了连接每个居民区的最小代价路径。图形显示了所有居民区和最小生成树路径的直观效果,确保了程序的正确性和可视化。

asdf

收获与体会

  • 通过实现Kruskal算法,深入理解了最小生成树问题以及并查集的使用。
  • 掌握了如何通过图形库展示算法结果,增加了对图论问题的兴趣。
  • 通过实践提高了编程技巧,特别是在图形和图论方面的应用。

环境

vscode

插件:

HTML CSS Support 写css代码

Live Serve 实时预览html网页

Auto Rename Tag 同步修改标签名称

HTML

html (hyper text markup language) 超文本标记语言

网页是又html标签描述出来的

html文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">//文档编码格式
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>//文档标题
</head>

<body>//页面内容

</body>

</html>

块元素(block):块级元素通常用于组织和布局页面的主要结构和内容,例如段落、标题、列表、表格等。它们用于创建页面的主要部分,将内容分隔成逻辑块。

行内元素(inline):行内元素通常用于添加文本样式或为文本中的一部分应用样式。它们可以在文本中插入小的元素,例如超链接、强调文本等。

常用标签

<h1> </h1>一级标签

<p> </p>段落标签

<b> </b> bold 文本加粗

<u> </u> 下划线

<s> </s> 删除线

无序列表

<ul> <li>1</li> <li>2</li> </ul>

有序列表

<ol> <li>1</li> <li>2</li> </ol>

表格

1
2
3
4
5
6
7
8
9
10
<table border="1">//边框宽度为1
<tr>
<th>标题1</th>
<th>标题2</th>
</tr>
<tr>
<td>元素1</td>
<td>元素2</td>
</tr>
</table>

html属性 基本语法:<开始标签 属性名="“属性值”">

<a href="www.zxj-2023.github.io" target="_blank">超链接</a> 超链接,target决定链接打开方式

<br> 换行

<hr> 分割线

<img src="图片路径或链接" alt="代替文本" width="宽度" height="高度"></img> 图片

<div class="名称"></div>块级标签,用于创建页面的布局结构,如导航栏,页眉等

优先级:id>class>标签名

<span></span>包装文本以便对其使用css,js行为或样式等

form标签是html表单的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="#">//URL
<label for="username">用户名:</label>//与span类似,for用于和input的id绑定
<input type="text" id="username" placehoud="请输入用户名">
//input其他属性,value:规定input内的值
<label>密码:</label>
<input type="password" placehoud="请输入密码">

<label>性别:</label>
<input type="radio" name="gender"> 男//单选择 名称一致
<input type="radio" name="gender">

<label>爱好:</label>
<input type="checkbox" name="hobby"> 唱歌//多选
<input type="checkbox" name="hobby"> 跳舞

<input type="submit">//提交按钮 提交表单数据
</form>

CSS

css cascading style sheets 用于定义网页样式和布局的样式表语言,通过CSS,可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式,从而实现更精确的页面设计。

语法:

选择器{

​ 属性1:属性值1;

​ 属性2:属性值2;

}

内部样式表:放在head里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<head>
<style>
p{
color:bule;
font-size:16px;//字体大小
background-color:yellow//背景色
font-family:'KaiTi'//修改字体,楷体
}
</style>
</head>
<body>
<p>
内容
</p>
</body>

外部样式:需在head链接

1
2
3
<head>
<link rel="stylesheet" href="路径">
</head>

内联样式:标签内

1
2
3
<h1 style="color=red;">
内容
</h1>

优先级:内联样式>内部样式表>外部样式

css选择器:

元素选择器:标签名

类选择器:.+类名

id选择器:#+id名

通用选择器:*

子代选择器:父+>+子

后代选择器:父+空格+子

相邻元素选择器:1+2 需要满足相邻条件

伪类选择器

css属性:

CSS 参考手册 |菜鸟教程

<h1 style="font: bolder 50px 'KaiTi';">复合属性</h1> font符合属性示例

区分块、行内、行内块元素width和height的差异

通过display转换以上三者(block,inline,inline-block)

1
2
3
.div-inline{
display:inline;
}

盒子模型:

  1. 内容(content)
  2. 内边距(padding):内容与边框之间的空间
  3. 边框(border):盒子的边界 上右下左
  4. 外边距(margin):盒子与其他元素之间的空间
asdsdf

浮动:改变元素默认的排列顺序,使网页布局更加灵活多变(letf right)

1
2
3
.son{
float:left;
}

清除浮动的方式

1
2
3
.father{
overflow: hidden;
}

定位布局:

相对定位(relative)∶相对于元素在文档流中的正常位置进行定位。

绝对定位(absolute)︰相对于其最近的已定位祖先元素进行定位,不占据文档流。

固定定位(fixed)︰相对于浏览器窗口进行定位。不占据文档流,固定在屏幕上的位置,不随滚动而移动。

1
2
3
4
5
6
7
.box-relative{
position: relative;//相对定位
left:
right:
top:
bottom:
}

JavaScript

JavaScript是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果,增加用户与网页的交互性。 作为一种客户端脚本语言,JavaScript可以直接嵌入HTML,并在浏览器中执行。 与HTML和CSS不同,JavaScript使得网页不再是静态的,而是可以根据用户的操作动态变化的。

客户端脚本:用于在用户浏览器中执行,实现动态效果和用户交互。

网页开发:与HTML和CSS协同工作,使得网页具有更强的交互性和动态性。

后端开发︰使用Node.js,JavaScript 也可以在服务器端运行,实现服务器端应用的开发。

js的导入

内联

1
2
3
<script>
console.log('hello,world');
</script>

外联

1
2
3
<head>
<script src="相对路径"></script>
</head>
1
2
console.log('hello,world')//控制台输出
alert('')//内联弹窗

js语句

1
2
3
4
5
6
7
8
9
10
11
12
//变量
var x;//varible
let t=5;//块级作用域
const PI =3.14;//常量
//条件语句
if(){}else{}
//循环,for,while
//函数
function function_name(){

return 返回值;
}

利用html属性触发事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<body>
<button onclick="click_event()">
点击事件
</button>
<input type="text" onfocus="focus_event()" onblur="blur_event()">
<script>
function click_event()
{
alert('触发点击事件')
}

function focus_event()
{
console.log('获取焦点');
}

function blur_event()
{
console.log('失去焦点');
}
</script>
</body>

DOM

当网页被加载时,浏览器会创建页面的文档对象模型,也就是DOM (Document Object Model) .每个HTML或XML文档都可以被视为一个文档树,文档树是整个文档的层次结构表示。

文档节点是整个文档树的根节点。

DOM为这个文档树提供了一个编程接口,开发者可以使用JavaScript来操作这个树状结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<body>
<div id="box1">ID选择器标签</div>
<div id="box2">类选择器标签</div>

<button>
点击按钮
</button>

<scrip>
var element_id = document.getElementById('box1');//id唯一,获取的是元素
console.log(element_id)

var element_class = document.getElementsByClassName('box2')[0];//类不唯一,获取的是数组
console.log(element_id)

element_id.innerHTML = '修改id标签内容';
element_id.innerText
element_id.style.color
element_id.style.fontSize

//DOM属性绑定事件
var button_element = document.getElementsByTagName('button');

button_element.onclick = function(){
alert('DOM 属性按键触发')
}

button)element.addEventListener('click',click_event)
function click_event(){
alert('通过addEventListener触发')
}
</scrip>
</body>

对象

对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合

1
2
3
4
var user = {
name: 'itbaizhan',
age: '13'
};

对象的每一个键名又称为“属性”(property),它的“键

值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用

1
2
3
4
5
6
var user = {
getName: function (name) {
return name;
}
};
user.getName("itbaizhan") // itbaizhan
image-20211025173456785

参考视频

3小时前端入门教程(HTML+CSS+JS)_哔哩哔哩_bilibili

环境

vscode

插件:

HTML CSS Support 写css代码

Live Serve 实时预览html网页

Auto Rename Tag 同步修改标签名称

HTML

html (hyper text markup language) 超文本标记语言

网页是又html标签描述出来的

html文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">//文档编码格式
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>//文档标题
</head>

<body>//页面内容

</body>

</html>

块元素(block):块级元素通常用于组织和布局页面的主要结构和内容,例如段落、标题、列表、表格等。它们用于创建页面的主要部分,将内容分隔成逻辑块。

行内元素(inline):行内元素通常用于添加文本样式或为文本中的一部分应用样式。它们可以在文本中插入小的元素,例如超链接、强调文本等。

常用标签

<h1> </h1>一级标签

<p> </p>段落标签

<b> </b> bold 文本加粗

<u> </u> 下划线

<s> </s> 删除线

无序列表

<ul> <li>1</li> <li>2</li> </ul>

有序列表

<ol> <li>1</li> <li>2</li> </ol>

表格

1
2
3
4
5
6
7
8
9
10
<table border="1">//边框宽度为1
<tr>
<th>标题1</th>
<th>标题2</th>
</tr>
<tr>
<td>元素1</td>
<td>元素2</td>
</tr>
</table>

html属性 基本语法:<开始标签 属性名="“属性值”">

<a href="www.zxj-2023.github.io" target="_blank">超链接</a> 超链接,target决定链接打开方式

<br> 换行

<hr> 分割线

<img src="图片路径或链接" alt="代替文本" width="宽度" height="高度"></img> 图片

<div class="名称"></div>块级标签,用于创建页面的布局结构,如导航栏,页眉等

优先级:id>class>标签名

<span></span>包装文本以便对其使用css,js行为或样式等

form标签是html表单的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="#">//URL
<label for="username">用户名:</label>//与span类似,for用于和input的id绑定
<input type="text" id="username" placehoud="请输入用户名">
//input其他属性,value:规定input内的值
<label>密码:</label>
<input type="password" placehoud="请输入密码">

<label>性别:</label>
<input type="radio" name="gender"> 男//单选择 名称一致
<input type="radio" name="gender">

<label>爱好:</label>
<input type="checkbox" name="hobby"> 唱歌//多选
<input type="checkbox" name="hobby"> 跳舞

<input type="submit">//提交按钮 提交表单数据
</form>

CSS

css cascading style sheets 用于定义网页样式和布局的样式表语言,通过CSS,可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式,从而实现更精确的页面设计。

语法:

选择器{

​ 属性1:属性值1;

​ 属性2:属性值2;

}

内部样式表:放在head里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<head>
<style>
p{
color:bule;
font-size:16px;//字体大小
background-color:yellow//背景色
font-family:'KaiTi'//修改字体,楷体
}
</style>
</head>
<body>
<p>
内容
</p>
</body>

外部样式:需在head链接

1
2
3
<head>
<link rel="stylesheet" href="路径">
</head>

内联样式:标签内

1
2
3
<h1 style="color=red;">
内容
</h1>

优先级:内联样式>内部样式表>外部样式

css选择器:

元素选择器:标签名

类选择器:.+类名

id选择器:#+id名

通用选择器:*

子代选择器:父+>+子

后代选择器:父+空格+子

相邻元素选择器:1+2 需要满足相邻条件

伪类选择器

css属性:

CSS 参考手册 |菜鸟教程

<h1 style="font: bolder 50px 'KaiTi';">复合属性</h1> font符合属性示例

区分块、行内、行内块元素width和height的差异

通过display转换以上三者(block,inline,inline-block)

1
2
3
.div-inline{
display:inline;
}

盒子模型:

  1. 内容(content)
  2. 内边距(padding):内容与边框之间的空间
  3. 边框(border):盒子的边界 上右下左
  4. 外边距(margin):盒子与其他元素之间的空间
asdsdf

浮动:改变元素默认的排列顺序,使网页布局更加灵活多变(letf right)

1
2
3
.son{
float:left;
}

清除浮动的方式

1
2
3
.father{
overflow: hidden;
}

定位布局:

相对定位(relative)∶相对于元素在文档流中的正常位置进行定位。

绝对定位(absolute)︰相对于其最近的已定位祖先元素进行定位,不占据文档流。

固定定位(fixed)︰相对于浏览器窗口进行定位。不占据文档流,固定在屏幕上的位置,不随滚动而移动。

1
2
3
4
5
6
7
.box-relative{
position: relative;//相对定位
left:
right:
top:
bottom:
}

JavaScript

JavaScript是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果,增加用户与网页的交互性。 作为一种客户端脚本语言,JavaScript可以直接嵌入HTML,并在浏览器中执行。 与HTML和CSS不同,JavaScript使得网页不再是静态的,而是可以根据用户的操作动态变化的。

客户端脚本:用于在用户浏览器中执行,实现动态效果和用户交互。

网页开发:与HTML和CSS协同工作,使得网页具有更强的交互性和动态性。

后端开发︰使用Node.js,JavaScript 也可以在服务器端运行,实现服务器端应用的开发。

js的导入

内联

1
2
3
<script>
console.log('hello,world');
</script>

外联

1
2
3
<head>
<script src="相对路径"></script>
</head>
1
2
console.log('hello,world')//控制台输出
alert('')//内联弹窗

js语句

1
2
3
4
5
6
7
8
9
10
11
12
//变量
var x;//varible
let t=5;//块级作用域
const PI =3.14;//常量
//条件语句
if(){}else{}
//循环,for,while
//函数
function function_name(){

return 返回值;
}

利用html属性触发事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<body>
<button onclick="click_event()">
点击事件
</button>
<input type="text" onfocus="focus_event()" onblur="blur_event()">
<script>
function click_event()
{
alert('触发点击事件')
}

function focus_event()
{
console.log('获取焦点');
}

function blur_event()
{
console.log('失去焦点');
}
</script>
</body>

DOM

当网页被加载时,浏览器会创建页面的文档对象模型,也就是DOM (Document Object Model) .每个HTML或XML文档都可以被视为一个文档树,文档树是整个文档的层次结构表示。

文档节点是整个文档树的根节点。

DOM为这个文档树提供了一个编程接口,开发者可以使用JavaScript来操作这个树状结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<body>
<div id="box1">ID选择器标签</div>
<div id="box2">类选择器标签</div>

<button>
点击按钮
</button>

<scrip>
var element_id = document.getElementById('box1');//id唯一,获取的是元素
console.log(element_id)

var element_class = document.getElementsByClassName('box2')[0];//类不唯一,获取的是数组
console.log(element_id)

element_id.innerHTML = '修改id标签内容';
element_id.innerText
element_id.style.color
element_id.style.fontSize

//DOM属性绑定事件
var button_element = document.getElementsByTagName('button');

button_element.onclick = function(){
alert('DOM 属性按键触发')
}

button)element.addEventListener('click',click_event)
function click_event(){
alert('通过addEventListener触发')
}
</scrip>
</body>

对象

对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合

1
2
3
4
var user = {
name: 'itbaizhan',
age: '13'
};

对象的每一个键名又称为“属性”(property),它的“键

值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用

1
2
3
4
5
6
var user = {
getName: function (name) {
return name;
}
};
user.getName("itbaizhan") // itbaizhan
image-20211025173456785

参考视频

3小时前端入门教程(HTML+CSS+JS)_哔哩哔哩_bilibili

模型环境配置

利用yml导入conda虚拟环境

sad

安装cuda与cudnn

cuda和cudnn的安装教程(全网最详细保姆级教程)_cudnn安装-CSDN博客

使用国内源安装

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install --upgrade tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple

测试gpu运行

as
daf

根据提示补全依赖项

datasetProcess.py 将视频文件转换为 NumPy 数组(.npy 文件),并保存到指定目录中

models_rgb_depth.py 模型

evaluate_rgb_depth.py 跑数据集,返回准确度

asd

prediction_test.py 返回true or false

sadff

前两者需要输入命令行参数

python evaluate_rgb_depth.py --dataset rwf2000 --vidLen 32 --batchSize 4 --mode all --lstmType sepconv --fusionType C --weightsPath models/rgb_rgbdiff_depth_C_6/rwf2000_best_val_acc_Model

gadga
  • --dataset rwf2000: 指定数据集为 rwf2000
  • --vidLen 32: 每个视频序列的帧数为 32。
  • --batchSize 4: 训练和评估的批量大小为 4。
  • --mode all: 模型工作模式为 all,即使用视频帧、帧差和深度图三种输入。
  • --lstmType sepconv: 使用 sepconv 类型的 LSTM 层。
  • --fusionType C: 使用 C 类型的融合策略(特征拼接和注意力机制)。
  • --weightsPath models/rgb_rgbdiff_depth_C_6/rwf2000_best_val_acc_Model: 指定预训练权重文件路径。

查找的概念

查找(Searching) :就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素( 或记录)。

查找表(Search Table) :是由同一类型的数据元素(或记录)构成的集合。

关键字(Key) :数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。例如,在由一个学生元素构成的数据集合中,学生元素中“学号”这一数据项的值唯一地标识一名学生。

静态查找表(Static Search Table) :只作查找操作的查找表。 动态查找表(Dynamic Search Table) : 在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。

平均查找长度 :在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度,则是所有查找过程中进行关键字的比较次数的平均值,其数学定义为$\ ASL=\sum_{i=1}^{n}P_iC_i$

式中,n是查找表的长度;P是查找第i个数据元素的概率,一般认为每个数据元素的查找概率相等,即P,= 1/n;C;是找到第i个数据元素所需进行的比较次数。平均查找长度是衡量查找算法效率的最主要的指标。

顺序表查找

顺序查找

1
2
3
4
5
6
7
8
9
10
11
/*有哨兵顺序查找*/
int Sequential_Search(int *a, int n, int key){
int i;
a[0] = key; //设置a[0]为关键字,称之为“哨兵”
i = n; //循环从数组尾部开始
while(a[i] != key){
i--;
}
return i; //返回0则说明查找失败
}

这种在查找方向的尽头放置“哨兵”免去了在查找过程中每一次比较后都要判断查找位置是否越界的小技巧,看似与原先差别不大,但在总数据较多时,效率提高很大,是非常好的编码技巧。 上述顺序表查找时间复杂度是O (n) 。

折半查找

当查找表是有序表时,可采用折半查找的方法。

算法思路:

image-20241215134842077
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Binary_Search(SeqList L, ElemType key){
int low = 0, high = L.length - 1, mid;
while(low <= high){
mid = (low + hight)/2; //取中间位置
if(L.elem[mid] == key){
return mid; //查找成功返回所在位置
}else if(L.elem[mid] > key){
high = mid - 1; //从前半部分继续查找
}else{
low = mid + 1; //从后半部分继续查找
}
}
return -1; //查找失败,返回-1
}
image-20241215134858075

折半查找的过程可用二叉树来描述,称为判定树。

image-20241215135512761

节点的树高代表该节点的查询次数

因此,长度为13的有序表进行折半查找的平均查找长度ASL=(1×1+2×2+3×4+4×6)/13 =41/13。

折半查找的时间复杂度为 O(log2n),平均情况下比顺序查找的效率高。

分块查找

为了减少索引项的个数,我们可以对数据集进行分块,使其分块有序,然后再对每一块建立一个索引项,从而减少索引项的个数。

分块有序,是把数据集的记录分成了若千块,并且这些块需要满足两个条件:

  • 块内无序:即每一块内的记录不要求有序。

  • 块间有序:例如,要求第二块所有记录的关键字均要大于第一块中所有记录的关键字,第三块的所有记录的关键字均要大于第二块的所有记录关键字…因为只有块间有序,才有可能在查找时带来效率。

对于分块有序的数据集,将每块对应一个索引项, 这种索引方法叫做分块索引。如下图所示,我们定义的分块索引的索引项结构分三个数据项:

  • 最大关键码:它存储每一块中的最大关键字,这样的好处就是可以使得在它之后的下一块中的最小关键字也能比这一块最大的关键字要大;

  • 块长:存储了块中的记录个数,以便于循环时使用;

  • 块首指针:用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历。

825a789b2d39804be6b9aede1bbc0ba1

在分块索引表中查找,就是分两步进行: 1.在分块索引表中查找要查关键字所在的块。由于分块索引表是块间有序的,因此很容易利用折半、插值等算法得到结果。例如在上图的数据集中查找62,我们可以很快可以从左上角的索引表中由57<62<96得到62在第三个块中。 2.根据块首指针找到相应的块,并在块中顺序查找关键码。

树表的查找

二叉排序树

二叉排序树(也称二叉查找树)或者是一棵空树,或者是具有下列特性的二叉树:

  1. 若左子树非空,则左子树上所有结点的值均小于根结点的值
  2. 若右子树非空,则右子树上所有结点的值均大于根结点的值
  3. 左、右子树也分别是一棵二叉排序树。

根据二叉排序树的定义,左子树结点值<根结点值<右子树结点值,所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。例如,下图所示二叉排序树的中序遍历序列为123468。

bec1d08d423a4860887667fb980dfbea

二叉排序树的插入和建立

在一棵二叉排序树中插入值为系的结点的步骤如下:

①若二叉排序树为空,则生成值为k的新结点s,同时将新结点s作为根结点插入。

②若k小于根结点的值,则在根的左子树中插入值为k的结点。

③若k大于根结点的值,则在根的右子树中插入值为k的结点。

④若k等于根结点的值,表明二叉排序树中已有此关键字,则无需插入。

二叉排序树插入算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 //构造函数
BiNode(int k) : key(k), lchild(nullptr), rchild(nullptr) {};
// 递归插入函数
void Insert(BiNode*& ptr, int k) {
if (ptr == nullptr) { // 如果当前指针为空,插入新节点
ptr = new BiNode(k);
return;
}
if (k < ptr->key) {
Insert(ptr->lchild, k); // 递归插入到左子树
} else if (k > ptr->key) {
Insert(ptr->rchild, k); // 递归插入到右子树
}
// 如果k等于当前节点值,则不插入(BST通常不允许重复值)
}
// 插入值到BST
void Insert(int k) {
Insert(root, k);
}

二叉排序树的建立

1
2
3
4
5
6
7
// 构造函数:利用数组 a[] 和大小 n 建立二叉排序树
BiSortTree(int a[], int n) {
root = nullptr; // 初始化根节点为空
for (int i = 0; i < n; ++i) {
Insert(root, a[i]); // 插入数组中的每个元素
}
}
image-20241215144119644

二叉排序树的查找过程

根据二叉排序树的定义,在二叉排序树中查找给定值k的过程如下:

①若二叉排序树为空,则表明查找失败,返回空指针;否则,若给定值k等于根结点的值,则表明查找成功,返回根结点。

②若给定值k小于根结点的值,则继续在根的左子树中查找。

③若给定值k大于根结点的值,则继续在根的右子树中查找。

1
2
3
4
5
6
7
8
9
10
11
12
// 非递归查找函数
BiNode* Search2(BiNode* ptr, int k) {
while (ptr) {
if (k == ptr->key) // 找到目标节点
return ptr;
else if (k < ptr->key) // 查找左子树
ptr = ptr->lchild;
else // 查找右子树
ptr = ptr->rchild;
}
return nullptr; // 未找到
}

若二叉排序树是平衡的(即形态均匀),则进行查找的时间复杂度为 O(log2n);若退化为一棵单支树(最极端和最差的情况),则其时间复杂度为 O(n)。对于一般情况,其时间复杂度可以认为是 O(log2n)

二叉排序树的删除

二叉排序树的查找和插入都很简单,但是删除操作就要复杂一些,此时要删除的结点有三种情况:

  1. 叶子结点;
  2. 仅有左或右子树的结点;
  3. 左右子树都有的结点;

前两种情况都很简单,第一种只需删除该结点不需要做其他操作;第二种删除后需让被删除结点的直接后继接替它的位置;复杂就复杂在第三种,此时我们需要遍历得到被删除结点的直接前驱或者直接后继来接替它的位置,然后再删除

第三种情况如下图所示:

1fa9d70c1f0ef1ab673061a9c2e39a08

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点,
并返回TRUE;否则返回FALSE
*/
bool DeleteBST(BiTree *T, int key){
if(!T){
return FALSE;
}else{
if(key == T->data){
//找到关键字等于key的数据元素
return Delete(T);
}else if(key < T -> data){
return DeleteBST(T -> lchild, key);
}else{
return DeleteBST(T -> rchild, key);
}
}
}

下面是Delete()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*从二叉排序树中删除结点p,并重接它的左或右子树。*/
bool Delete(BiTree *p){
BiTree q, s;
if(p->rchild == NULL){
//右子树为空则只需重接它的左子树
q = p;
p = p->lchild;
free(q);
}else if(p->lchild == NULL){
//左子树为空则只需重接它的右子树
q = p;
p = p->rchild;
free(q);
}else{
//左右子树均不空
q = p;
s = p->lchild; //先转左
while(s->rchild){//然后向右到尽头,找待删结点的前驱
q = s;
s = s->rchild;
}
//此时s指向被删结点的直接前驱,p指向s的父母节点
p->data = s->data; //被删除结点的值替换成它的直接前驱的值
if(q != p){
q->rchild = s->lchild; //重接q的右子树
}else{
q->lchild = s->lchild; //重接q的左子树
}
pree(s);
}
return TRUE;
}

二叉排序树的查找性能取决于二叉排序树的形状

例如{ 62 , 88 , 58 , 47 , 35 , 73 , 51 , 99 , 37 , 93 } {62,88,58,47,35,73,51,99,37,93}{62,88,58,47,35,73,51,99,37,93}这样的数组,我们可以构建如下左图的二叉排序树。但如果数组元素的次序是从小到大有序,如{35,37,47,51,58,62,73,88,93,99},则二叉排序树就成了极端的右斜树,如下面右图的二叉排序树: f33a1ebf98e14082fb0df30072964e09

也就是说,我们希望二叉排序树是比较平衡的,即其深度与完全二叉树相同,那么查找的时间复杂也就为 O(log2n),近似于折半查找。 不平衡的最坏情况就是像上面右图的斜树,查找时间复杂度为O(n),这等同于顺序查找。 因此,如果我们希望对一个集合按二叉排序树查找,最好是把它构建成一棵平衡的二叉排序树

平衡二叉树

平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。

我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF

那么平衡二叉树上所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。

a1f704e077a99af5d0e5491cfbd18b50

平衡二叉树的插入

新结点插入后,若造成查找路径上的某个结点不再平衡,则需要做出相应的调整。可将调整的规律归纳为下列4种情况:

  1. LL平衡旋转(右单旋转):由于在结点A的左孩子(L)的左子树(L)上插入了新结点
c1f0364ace56db6d49fe314233364370
  1. RR平衡旋转(左单旋转):由于在结点A的右孩子(R)的右子树(R)上插入了 新结点
741cd35f51fbb8eab58cd2dbb8988875
  1. LR平衡旋转(先左后右双旋转):由于在A的左孩子(L)的右子树(R)上插入新结点
53cabfa17150d6a0c98b467098d6379d
  1. RL平衡旋转(先右后左双旋转):由于在A的右孩子(R)的左子树(L)上插入新结点
fcb6dda8bd30d25a55cab887fb332c04

举例

image-20241215152052099

B树

B树,又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。 B树是所有结点的平衡因子均等于0的多路平衡查找树。

下图所示的B树中所有结点的最大孩子数m = 5,因此它是一棵5阶B树,在m mm阶B树中结点最多可以有m个孩子。可以借助该实例来分析上述性质: 91938989f25f6c683f053d6b71647591

B树(B-树) - 删除_哔哩哔哩_bilibili

参考文献

数据结构:查找(Search)【详解】_index.search返回什么结构-CSDN博客

答辩稿

各位评委老师大家好,我是我们组的主持人张熙浚,我们组的研究方向是基于多模态特征融合的视频暴力行为识别方法的研究

接下来我会从四个方面介绍我们的项目

首先是背景与意义,暴力行为对社会危害极大,即使公共场所存在大量监控摄像头,但这些视频片段通常被用来在暴力犯罪发生后提供线索和证据,而很少被用来实时监控并阻止暴力行为。

由于监控人员不可能实时监控每一个摄像头产生的视频,所以部署暴力行为监测系统,能够节约人力资源,降低监控人员因疲劳而造成的风险,这十分关键

接下来,我将讲述当前暴力行为检测的研究现状。主流的人体动作识别把数据模态分为2类:视觉模态和非视觉模态。不同模态的数据有着各自的独特优势。

目前主流的单模态深度学习方法存在以下缺点。但真实的暴力事件场景往往存在以下特点。因此,我们提出了基于多模态的暴力事件检测,通过结合多种数据来源,从多个角度捕捉行为特征,尤其是在面对复杂环境、多人交互和遮挡等问题时,具有显著的优势。

接下来我会通过几篇论文中的方法介绍行为识别算法的研究现状

这一篇提出了数据集Rwf-2000,同时提出一种的双流网络架构,他们充分利用了RGB数据提供的外观信息和光流提供的运动信息,但缺点在于光流法计算量大、存储成本高,仅仅适用于光照条件良好、不拥挤的情况

这一篇是基于骨架的方法,通过提取人体骨骼关节,构成三维骨架阵列,通过骨架点卷积,实现分类。

优点是骨架可以很好的表示人体运动信息,但问题在于仅使用骨架数据,效果高度依赖于位姿估计的精度,无法有效应对存在遮挡的情况,同时因为仅使用骨架数据,其他信息存在缺失

这一篇是基于 2D CNN + RNN 的方法,2D CNN 提供强大的空间特征提取能力,RNN 提供强大的时间序列建模能力。将两者结合,能够更好地理解视频中的空间和时间信息。这一篇使用简单快速的预处理方法减少了冗余的背景信息,但其仅使用RGB模态,提取的特征不够全面

接下来我将介绍我们的研究内容与方法

我们的研究内容大致包含三个部分:1.提出一种基于多模态特征融合的视频暴力行为识别算法2.提出一种自适应的注意力算法用于多模态融合3.完成人体暴力行为检测系统的设计,接下来我将依次为大家介绍

第一部分,在特征提取阶段,为了区分暴力行为与非暴力行为,我们选择了三个要素进行提取:人体姿态、运动趋势和幅度、人物之间的位置关系,为了获取以上三个要素,研究工作包括下列内容:

a.RGB模态的去除冗余信息 为了避免原生RGB图像冗余信息影响模型判断,我们决定对于原生RGB图像进行冗余信息去除工作,首先计算一个视频中所有帧的均值,记为平均帧,用每一帧减去平均帧:去除不变的背景,保留运动的人体。

b.运动趋势与幅度特征的提取 目前主流反映物体运动趋势的方法是光流法,但我们考虑到光流图像在低像素复杂场景下效果不佳,且易受光照条件改变,并且计算量巨大,于是我们决定采取帧差法,通过对视频图像序列中相邻两帧作差分运算,来获得运动目标轮廓,以很好地适用于存在多个运动目标的情况。

c.深度模态的提取 在原始的RGB模态,复杂场景中难以分辨人物间的相对位置关系。因此,我们选取深度模态,其去除了颜色和纹理信息,并提供三维结构信息和人体轮廓,我们利用该论文提出的深度估计算法,对原始RGB视频进行深度估计,得到深度图,其清晰地反映了三维空间中人物间的相对位置关系。

算法框架方面,我们选择了CNN-LSTM的深度学习网络LSTM擅长处理时序数据,而CNN能够从视频帧中提取空间特征。通过结合两者的优势,并以此构建了算法框架。

第二部分我们提出了一种自适应的注意力算法用于多模态融合,动态调整每个模态的权重,强调有用的信息特征,抑制不太有用的特征,从而应对不同场景。

池化,全连接层,归一化函数

第三部分,我们完成了人体暴力行为检测系统的设计,刻画了系统的边界及大小,人体暴力行为检测系统是一个自动检测暴力行为的智能视频监控系统。该系统采用了四层架构,即访问层,表示层、业务层以及数据层。 包含暴力检测模块,用户管理模块,视频源管理模块

我们已经初步构建了暴力行为的检测流程,系统包含离线分析和在线监测两种模式

为了提高检测速度和避免资源浪费,根据传入视频的总帧数进行判断,采取提示过短、一次预测或是多轮预测。

离线分析不依赖实时的监控视频,可对任意视频进行分析。它 的优点是它不依赖于视频监控系统,可以直接选择视频开始分析。

在线监测是暴力行为检测系统提供的另一种检测方式。它旨在利用监控视频资源,进行实时的暴力行为检测,达到即时分析并报警提示的功能。

最后是进度安排,我们已经完成算法大部分的编写,后续会继续完成系统的开发

谢谢各位老师观看,请各位老师批评指正

疑问与解惑

为什么暴力行为检测隶属于人体行为识别

人体行为识别(Human Activity Recognition, HAR)是一个广泛的领域,旨在通过传感器或视频数据来识别和分析人的各种动作或行为。暴力行为检测(Violent Behavior Detection, VBD)是这一领域的一个子任务,其核心目标是识别出具有暴力性质的特定行为,如打斗、推搡、殴打等。

暴力行为检测隶属于人体行为识别,主要原因是暴力行为本质上也是一种“人体行为”,通过分析人体的运动模式、姿态变化、动作轨迹等特征,能够有效识别出暴力事件。

对于暴力行为的定义是什么?

暴力行为通常指的是一种以伤害他人或具有威胁性、攻击性目的的行为。

之前的暴力行为检测方向是什么,现在侧重于人体动作本身有什么好处吗?

暴力行为的检测方法传统上主要依赖于视频监控中检测到的图像信息、声音信号以及动作的特征。早期的检测方法侧重于基于背景和环境的变化,声学信号分析

现代的暴力行为检测越来越注重人体动作本身的识别,这有几个显著的好处:

  1. 精确度提高:通过分析人体动作的细节,尤其是肢体的动态变化(如运动轨迹、速度、姿势变化),可以更准确地判断是否为暴力行为。
  2. 降低误报率:单纯依靠环境变化或者声学分析容易受其他因素干扰(如背景噪音、非暴力事件的运动),而人体动作本身可以提供更加直接、可靠的行为判定依据。
  3. 多模态融合:现代的暴力行为检测往往不仅仅依赖于单一的视觉信息,还结合了深度学习、动作识别等技术,可以从多个角度进行判断。通过分析人体动作特征和其他环境数据(如声音、位置等),可以更好地识别暴力事件。
  4. 实时监控:实时检测人体动作变化对于暴力行为的早期预警至关重要,尤其是在公共安全或视频监控系统中,动作识别可以即时检测到潜在的暴力行为并进行响应。

综上,侧重人体动作本身不仅可以提升检测的准确性,还能更好地从动态和连续的角度识别暴力行为,提高系统的实时性和鲁棒性。

单模态的人体动作识别的缺点有哪些

单模态人体动作识别(即仅使用一种数据模态,如视觉、声音、加速度等)存在以下主要缺点:

  1. 信息局限性

    单一模态只能捕获动作的部分信息,可能导致对动作的理解不够全面。例如,仅依赖视觉模态可能无法捕获细微的物理接触或动作的力度变化。

  2. 环境敏感性

    单模态方法对环境条件过于依赖。例如,视觉模态在光照不足或存在遮挡的情况下表现不佳,而非视觉模态(如加速度计)在传感器未正确佩戴或被干扰时表现不佳。

  3. 无法应对模糊或模态冲突

    单模态方法难以处理模糊的行为信号或区分相似动作。例如,在视觉模态中,某些动作(如挥手与投掷)可能在外观上十分相似。

  4. 鲁棒性差

    单模态在面对复杂场景(如多人交互、噪音、遮挡等)时,容易出现误判或漏判。例如,在仅依赖声音模态时,背景噪音可能干扰动作识别。

  5. 缺乏上下文信息

    单模态通常难以捕获行为发生的上下文。例如,仅通过视觉识别到一个人弯腰的动作,可能无法判断是捡拾物品还是摔倒

暴力行为场景有哪些特点,使用多模态对这些特点的优势有哪些

暴力行为场景通常具有以下几个显著特点,这些特点对检测系统提出了更高的要求:

  1. 动态性强

    暴力行为往往是迅速发生的,例如打斗、推搡、摔倒等动作可能在短时间内完成,导致动作的变化非常快。

  2. 多人交互

    暴力行为通常涉及两个或更多个体之间的互动,如互相推搡、打斗或攻击等。多个目标的运动和交互增加了识别的复杂度。

  3. 复杂的姿态变化

    暴力行为中的人物姿态变化通常非常剧烈,涉及肢体的快速摆动、抓握、推拉等动作,且可能伴随一定的身体接触。

  4. 不规则的空间布局

    在暴力行为场景中,人物可能会在空间内迅速移动,动作的方向和速度可能会发生剧烈变化。背景也可能因为人物的动态而发生显著变化。

  5. 潜在的遮挡

    在暴力行为中,人物之间的动作可能会出现遮挡(例如,两人打斗时,其中一个人可能被另一个人挡住)。这种情况给基于视觉的检测带来了挑战。

  6. 噪声与干扰因素

    背景中的其他活动、环境变化、背景噪声等都可能干扰暴力行为的识别。例如,打斗声可能被背景音乐、交通噪声等因素掩盖。

多模态(即结合多种数据来源或感知方式,如视觉、声音、传感器数据等)方法能够弥补单模态方法的不足,通过结合视觉、声音和传感器等多模态信息,可以更好地应对这些挑战,提升暴力行为检测的准确性、鲁棒性和实时性。多模态方法能够综合各类信息,从多个角度捕捉行为特征,尤其是在面对复杂环境、多人交互和遮挡等问题时,具有显著的优势。

2D CNN + RNN 的优点

2D CNN(卷积神经网络)与 RNN(递归神经网络)的结合是行为识别中的一种常见方法,尤其适用于视频行为识别任务。其主要优点包括:

  1. 空间特征与时间依赖性的有效结合
  • 2D CNN:能够从视频帧中提取空间特征,如人物的姿态、背景和动作细节。通过多层卷积,CNN能够识别局部和全局的空间信息。
  • RNN(LSTM/GRU):RNN特别擅长处理时序数据,可以建模视频帧之间的时间依赖关系,捕捉动作的动态变化和时间长短的依赖,适应动作序列的连续性和长期依赖。
  • 优点:2D CNN 提供强大的空间特征提取能力,RNN 提供强大的时间序列建模能力。将两者结合,能够更好地理解视频中的空间和时间信息,提升行为识别的准确性。
  1. 自动特征学习
  • 传统方法依赖手工特征提取(如HOG、光流等),需要依赖专家知识且难以适应多样的场景。而 2D CNN 能够自动学习空间特征,减少了人工设计特征的依赖,提高了对复杂场景的适应能力。
  • RNN 则可以自动从数据中学习到行为模式的时间序列特征,不需要事先设定固定的时间模型或参数。
  1. 鲁棒性强,适应性好
  • 2D CNN 通过卷积层提取多层次的空间特征,具有较好的鲁棒性,能够应对不同背景和复杂场景中的视频数据。
  • RNN 具有处理不规则、可变时间长度序列的能力,能够识别动态变化的动作和突发行为,提高了模型的适应性。
  1. 可扩展性强
  • 2D CNN 和 RNN 的组合能够很好地扩展到不同的视频数据规模、场景和复杂度上。随着数据集的增大,模型仍然能够通过更深的网络层次和更多的时序数据进行训练,进一步提升识别效果。

答辩稿——初版

各位评委老师大家好,我是我们组的主持人张熙浚,我们组的研究方式是基于多模态特征融合的视频暴力行为识别方法研究

接下来我会从五个方面介绍我们的项目

首先是背景与意义,暴力行为对社会危害极大,即使诸如学校、商场、银行、车站等公共场所存在大量监控摄像头,产生了大量的视频片段,但这些片段通常被用来在暴力犯罪发生后提供线索和证据,而很少被用来实时识别并停止暴力行为。

这便引出了我们项目的目的,我们希望利用计算机视觉技术,赋予机器暴力行为的判别能力,从而及时发现暴力行为并能有效降低其带来的危害,而且大大降低了人力成本,在安防领域有极大的应用价值。

暴力行为的检测方法早期的检测方法主要是依靠设立一些规则,或是依靠背景和环境的变化,这些方法在很多方面存在不足,包括受环境因素影响大,特征提取和分析能力有限,计算效率低等问题

而现代的暴力行为检测越来越注重人体动作本身的识别,其通过分析人体动作的细节,尤其是肢体的动态变化,不仅可以提升检测的准确性,还能更好地从动态和连续的角度识别暴力行为,提高系统的实时性和鲁棒性。

由于监控人员不可能实时监控每一个摄像头产生的视频,所以部署视频暴力行为识别系统,能够节约用于监控的人力资源,降低监控人员因疲劳或走神而造成的漏检风险,一旦识别到暴力行为立即警示相关人员,进一步采取相应措施。由此可以得出我们项目研究的现实意义和应用场景。

接下来,我将讲述当前暴力行为检测的研究背景和挑战,并引出我们的解决方案。多种不同的数据形态都可以用来表示人类的动作和行为。主流的人体动作识别把这些模态分为2类:视觉模态和非视觉模态。这些数据模态是对不同的信息来源进行编码,根据应用场景的不同,不同模态的数据有着不同的独特优势。

目前主流的单模态深度学习方法存在以下缺点:信息单一、对环境敏感、鲁棒性较差,难以应对复杂场景等。但真实的暴力事件场景往往存在以下特点:存在复杂姿态变化,多人交互,大量环境噪声等。因此,我们提出了基于多模态的暴力事件检测,通过结合多种数据来源,从多个角度捕捉行为特征,尤其是在面对复杂环境、多人交互和遮挡等问题时,具有显著的优势。

随着深度学习和计算机视觉技术的发展,深度学习方法已经成为了行为识别算法的主流方向,接下来我会通过几篇论文中的方法介绍研究现状

这一篇是早提出使用深度学习方法解决视频暴力行为识别任务,直接将视频输入三维卷积进行建模

这一篇提出了数据集Rwf-2000,同时提出一种的双流网络架构,他们充分利用了RGB数据提供的外观信息和光流提供的运动信息,但缺点在于光流法计算、存储成本高,适用于光照条件良好、不拥挤的情况

这一篇提出了一种弱监督方法,即通过少量的标签(例如,仅标记视频是否包含暴力,而不是标记具体的暴力事件位置和类型)来训练模型。他选取视频帧最关键的区域,但使用I3D作为骨干网络,参数量巨大(1300万)

这一篇是基于骨架的方法,通过提取人体骨骼关节点构成三维骨架阵列,根据局部区域点的特征和时空位置信息,构建特定的权重分布策略,通过骨架点卷积实现分类。优点是骨架可以很好的表示人体运动信息,但问题在于仅使用骨架数据,效果高度依赖于位姿估计的精度,无法有效遮挡情况,同时因为仅使用骨架数据,其他信息缺失

这一篇是基于 2D CNN + RNN 的方法,2D CNN 提供强大的空间特征提取能力,RNN 提供强大的时间序列建模能力。将两者结合,能够更好地理解视频中的空间和时间信息,提升行为识别的准确性。这一篇使用简单快速的预处理方法突出了人体,减少了冗余的背景信息,但其仅使用RGB模态,提取的特征不够全面

我们的研究内容大致包含三个部分:1.提出一种基于多模态特征融合的视频暴力行为识别算法2.提出一种自适应的注意力算法用于多模态融合3.完成人体暴力行为检测系统的设计,接下来我将依次为大家介绍

第一部分,在特征提取阶段,为了区分暴力行为与非暴力行为,我们选择了三个要素进行提取:人体姿态、运动(趋势、幅度)、人物之间的位置关系,为了获取以上三个要素,并保证模型的通用性和现实性,需要从原始的RGB图像中提取以上特征,研究工作包括下列内容:

a.RGB模态的去除冗余信息 为了避免原生RGB图像冗余信息影响模型判断,减少计算量,我们决定对于原生RGB图像进行冗余信息去除工作,首先计算一个视频中所有帧的均值,记为平均帧(主要包含背景信息,因为背景在所有视频帧中几乎保持不变)用每一帧减去平均帧:去除(不变的)背景,保留(运动的)人体。通过简易的预处理,去除了冗余的背景信息,聚焦于人体的外观、姿态。

b.运动趋势与幅度特征的提取 目前主流反映物体运动趋势的方法是光流法,但我们考虑到光流图像在低像素复杂场景下效果不佳,且易受光照条件改变的影响,于是决定采取帧差法,通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,以很好地适用于存在多个运动目标的情况,算法相对实现简单,程序设计复杂度低,对光线等场景变化不太敏感,能够适应各种动态环境,有着比较强的鲁棒。

c.深度模态的提取 在原始的RGB模态中,复杂场景中,人物多且受光照影响严重,难以分辨人物间的相对位置关系。为了反映人物之间的位置关系,我们选取深度模态,其去除了颜色和纹理信息并提供三维结构信息和人体轮廓,我们利用Depth estimation算法,对原始RGB视频进行深度估计,得到视点到场景中各点之间的距离作为像素点的图片,即深度图,其划分了近景与远景,刻画了人物的轮廓,反映了三维空间中人物间的相对位置关系。

我们选择了CNN-LSTM的深度学习方法LSTM擅长处理时序数据,可以建模视频帧之间的时间依赖关系,而CNN能够从视频帧中提取空间特征。通过结合两者的优势,我们可以让模型同时考虑到数据的时序信息和空间信息,减少参数降低过拟合风险,从而提供更精确的预测、更出色的性能以及更高的训练效率,并以此构建了算法思路。

第二部分,针对多模态融合中权重数值处理的问题,我们提出了一种自适应的注意力算法用于多模态融合,让模型自适应地学习不同模态特征之间的权重关系,允许模型根据具体任务动态调整每个模态的重要性,强调信息特征,抑制不太有用的特征,从而更灵活地应对不同的场景。

第三部分,我们完成了人体暴力行为检测系统的设计,刻画了系统的边界及大小,人体暴力行为检测系统是一个自动检测暴力行为的智能视频监控系统。该系统采用了三层架构,即表示层、业务层以及数据层。 它被设计成一个Web系统,主要以网页的形式显示在PC 显示器上

我们已经初步构建了暴力行为的检测流程,系统包含离线分析和在线监测两种模式

离线分析不依赖实时的监控视频,可对任意视频进行后处理式的分析。它 的优点是它不依赖于视频监控系统,可以直接选择视频开始分析,在视频来源 和分析时机的选择上更自由。

在线监测是人体暴力行为检测系统提供的另一种检测方式。它旨在利用监 控视频资源,进行实时的暴力行为检测,达到即时分析并报警提示的功能。这 一功能极大地降低了人工分析实时监控视频的成本,便于管理人员进行安全监 管,提高了监管的效率。

为了提高检测速度和避免资源浪费,根据传入视频的总帧数进行判断,采取提示过短、一次预测或是多轮预测。

最后是进度安排,我们已经完成算法大部分的编写,后续会继续完成系统的开发

谢谢各位老师观看,请各位老师批评指正

了解Langchain

LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。

一句话概括就是:langchain 完成了对数据一个提炼、查找的完全链路。它并不能提供数据源、查找理由,只是一种方法的凝练。

数据源支持由用户等自行提供,因此它支持本地知识库的搭建,合理想象未来的学生课设系统将会是:金融知识系统(使用 langchain 爬取金融网站提取摘要凝练成知识)、图书简介系统(使用 langchain 对图书提取摘要进行展示)……

安装

Jupyter 就是一个非常好用的 Python 语言编程工具。

或者说是一个 Python 编程语言、以及更多其他编程语言的,交互式集成开发环境。

Jupyter 的一个非常重要的优点,就是 写程序的界面,和运行程序的界面,在一起。

jubyter notebook的安装:pip install jupyterlab

web页面的启动:jupyter-lab

vscode:创建.ipynb格式的文件


langchain的安装:pip install langchain

提供一种LLM集成解决方案,一份代码支持快速同时支持gpt大模型、国产大模型(通义千问、文心一言、百度千帆、讯飞星火等)、本地开源大模型(Ollama)

项目地址:NanGePlus/LLMTest: 为实现代码的高扩展性和兼容性,提出一套综合解决方案,支持多种大模型类型的无缝集成,包括GPT系列大模型、国内主流模型(如通义千问、智谱AI等),以及本地化部署的大模型(如qwen2.5)。

前期准备

openai-api代理:云雾 API

安装One-Api

songquanpeng/one-api: OpenAI 接口管理 & 分发系统,支持 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元,可用于二次分发管理 key,仅单可执行文件,已打包好 Docker 镜像,一键部署,开箱即用. OpenAI key management & redistribution system, using a single API for all LLMs, and features an English UI.

利用exe

One API

默认账号密码:root 12345

创建渠道,这里以阿里通义千问为例

获取API-KEY:阿里云百炼

2024年最新免费AI大模型API汇总及国内大模型使用教程(附代码)_免费大模型api-CSDN博客

image-20241216103856131

使用 Ollama 非常简单,只需要按照以下步骤:

  1. 安装 Ollama : 根据你的操作系统,从 Ollama 官网下载并安装最新版本。
  2. 启动 Ollama : 打开终端或命令行,输入 ollama serve 命令启动 Ollama 服务器。
  3. 下载模型: 在模型仓库找到想要的模型,然后使用 ollama pull 命令下载,例如 ollama pull llama3:70b
  4. 运行模型 : 使用 ollama run 命令启动模型,例如 ollama run llama3:70b
  5. 开始聊天 : 在终端中输入你的问题或指令,Ollama 会根据模型生成相应的回复。
  6. 查看模型列表ollama list
image-20241216115902772

项目

初始化:采用pycharm+anaconda

image-20241216120328229

安装依赖

pip install -r requirements.txt 每个软件包后面都指定了本次视频测试中固定的版本号 注意: 截止2024.10.18,langchain最新版本为0.3.3,langchain-openai最新版本为0.2.2

调整api,调整 utils/myLLM.py 内容

image-20241216131346999

调整 llmTest.py 内容

LLM_TYPE = “oneapi” # openai:调用gpt模型;oneapi:调用oneapi方案支持的模型(这里调用通义千问)

参考文献

langchain-ai/langchain:🦜🔗构建上下文感知推理应用程序

LangChain 入门与避坑指北 - 知乎

LangChain中文网

Jupyter 是什么-CSDN博客

在 Visual Studio Code 中使用 Jupyter Notebook_Vscode中文网

Ollama:从入门到进阶

GraphRAG

最新消息是11.26凌晨,微软宣布将推出 GraphRAG 的全新迭代版本LazyGraphRAG 核心亮点是极低的使用成本,其数据索引成本仅为现有GraphRAG 的 0.1%。此外,LazyGraphRAG 引入了全新的混合数据检索方法,大幅提升了生成结果的准确性和效率。该版本将很快开源,并纳入到 GitHub GraphRAG 库中 原文链接如下:https://www.microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost/


支持的检索方式

Naive Search Naive 模式是最简单的检索策略,它直接基于输入查询计算向量相似度,返回最接近的结果,不进行任何额外的优化或复杂处理 Local Search Local 模式只在本地上下文范围内进行检索。它聚焦于用户当前输入的特定领域或某部分数据,不会考虑全局数据 Global Search Global 模式会在整个知识库范围内进行检索,试图找到与查询最相关的信息,而不局限于当前上下文或局部区域 Hybrid Search Hybrid 模式结合了 Local 和 Global 的优势,同时考虑局部上下文和全局信息,综合结果以提高答案的相关性和覆盖范围

Anaconda

Anaconda,中文大蟒蛇,是一个开源的Anaconda是专注于数据分析的Python发行版本,包含了conda、Python等190多个科学包及其依赖项。

Anaconda就是可以便捷获取包且对包能够进行管理,包括了python和很多常见的软件库和一个包管理器conda。常见的科学计算类的库都包含在里面了,使得安装比常规python安装要容易,同时对环境可以统一管理的发行版本

为什么要安装Anaconda?

Anaconda对于python初学者而言及其友好,相比单独安装python主程序,选择Anaconda可以帮助省去很多麻烦,Anaconda里添加了许多常用的功能包,如果单独安装python,这些功能包则需要一条一条自行安装,在Anaconda中则不需要考虑这些,同时Anaconda还附带捆绑了两个非常好用的交互式代码编辑器(Spyder、Jupyter notebook)。

简单来说,Anconda,可以理解成运输车,每当下载Anconda的时候,里面不仅包含了python,还有180多个库(武器)一同被打包下载下来。

下载完Anconda之后,再也不用一个个下载那些库了。

集成开发环境搭建Anaconda+PyCharm

【大模型应用开发基础】集成开发环境搭建Anaconda+PyCharm_哔哩哔哩_bilibili

LightRAG与GraphRAG运行对比

NanGePlus/LightRAGTest: LightRAG与GraphRAG在索引构建、检索测试中的耗时、模型请求次数、Token消耗金额、检索质量等方面进行对比

命令行终端中执行如下命令安装依赖包 cd LightRAG pip install -e . cd GraphRAG pip install graphrag==0.5.0


测试文本 测试文本均为使用西游记白话文前九回内容,文件名为book.txt 模型配置 大模型使用OpenAI(代理方案),Chat模型均使用gpt-4o-mini,Embedding模型均使用text-embedding-3-small 其他配置 笔记本均为MacBook Pro2017,网速、python环境均相同


LightRAG测试

(1)构建索引

打开命令行终端,执行如下指令 cd LightRAG/nangeAGICode python test.py 注意 在运行脚本之前,需要调整相关代码将如下代码块打开,检索相关的代码块注释

(2)逐一测试

执行如下指令 cd LightRAG/nangeAGICode python test.py 注意 在运行脚本之前,需要注释如下构建索引代码,取消检索相关的代码块注释

GraphRAG测试

(1)构建索引

打开命令行终端,执行如下指令 cd GraphRAG graphrag index –root ./

(2)逐一测试

graphrag query –root ./ –method local –query “这个故事的核心主题是什么?” graphrag query –root ./ –method global –query “这个故事的核心主题是什么?” graphrag query –root ./ –method drift –query “这个故事的核心主题是什么?”


img

利用neo4j可视化

测试文本 测试文本均为使用西游记白话文前九回内容 模型配置 大模型均使用OpenAI(代理方案),Chat模型均使用gpt-4o,Embedding模型均使用text-embedding-3-small 其他配置 笔记本均为MacBook Pro2017,网速、python环境均相同

1
2
3
4
5
# gpt大模型相关配置根据自己的实际情况进行调整
OPENAI_API_BASE = "https://api.wlai.vip/v1"
OPENAI_CHAT_API_KEY = "sk-Tuza9B8WYo1vkBAAmmLeQjuOl1VTP9Dd0nuKxqnLOaJJMZZd"
OPENAI_CHAT_MODEL = "gpt-4o"
OPENAI_EMBEDDING_MODEL = "text-embedding-3-small"

LightRAG构建索引测试

(1)安装textract依赖包

通过指令 pip install textract 安装时会报错,报错的原因是 其元数据文件中使用了不再被支持的版本约束符号(<=0.29.*),而当前 pip 和 setuptools 不再接受这种格式 解决方案:下载依赖包源码,修改相应参数后本地进行安装 https://pypi.org/project/textract/1.6.5/#description cd textract-1.6.5 pip install .

(2) 创建neo4j数据库实例

推荐使用云服务进行测试,链接地址如下: https://console-preview.neo4j.io/tools/query 注册登录成功,直接新建实例即可

也可以用本地neo4j

1
2
3
4
5
# 数据库连接相关参数配置
NEO4J_URI="bolt://localhost:7687"
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="zxj03051218"
NEO4J_DATABASE="neo4j"

(3)增量索引构建及知识图谱可视化测试

运行如下指令进行索引构建 cd LightRAG/nangeAGICode1201 python insertTest.py python queryTest.py 每一次构建完成,先清除数据库中的数据再运行如下指令进行可视化 在运行之前需要根据自己的实际情况进行参数的调整 python graph_visual_with_html.py

python graph_visual_with_neo4j.py 在数据库中进行查询测试 MATCH (n:PERSON) WHERE n.displayName CONTAINS ‘唐僧’ RETURN n LIMIT 25;

MATCH (n:PERSON) WHERE n.displayName CONTAINS ‘八戒’ RETURN n LIMIT 25;

MATCH (n:PERSON) WHERE n.displayName CONTAINS ‘沙和尚’ RETURN n LIMIT 25;

清除数据 MATCH (n) CALL { WITH n DETACH DELETE n } IN TRANSACTIONS OF 25000 ROWS;

MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

image-20241221160947727
image-20241221160843951

LightRAG和GraphRAG生成的知识图谱对比

运行如下指令将GraphRAG生成的知识图谱进行可视化展示 cd GraphRAG/utils python graph_visual_with_neo4j.py 在运行脚本前根据自己的实际情况进行调整,修改文件所在路径为存储增量数据的文件路径 GRAPHRAG_FOLDER=“/Users/janetjiang/Desktop/agi_code/LightRAGTest/GraphRAG/output” 在数据库中进行查询测试 MATCH (n:__Entity__) WHERE n.name CONTAINS ‘唐僧’ RETURN n LIMIT 25;

MATCH (n:__Entity__) WHERE n.name CONTAINS ‘八戒’ RETURN n LIMIT 25;

MATCH (n:__Entity__) WHERE n.name CONTAINS ‘沙和尚’ RETURN n LIMIT 25;

清除数据 MATCH (n) CALL { WITH n DETACH DELETE n } IN TRANSACTIONS OF 25000 ROWS;

参考文献

LightRAG与GraphRAG对比评测,从索引构建、本地检索、全局检索、混合检索等维度对请求大模型次数、Token消耗、金额消耗、检索质量等方面进行全面对比_哔哩哔哩_bilibili

还是搞不懂Anaconda是什么?读这一篇文章就够了-CSDN博客

什么是 Neo4j?

Neo4j 是一个开源的图形数据库,由 Neo4j 公司开发和维护。作为图数据库的代表,Neo4j 使用图理论中的节点和边(关系)来表示和存储数据,相较于传统的关系型数据库(如 MySQL、PostgreSQL)和其他 NoSQL 数据库(如文档型、键值型数据库),Neo4j 在处理复杂关系和连接性强的数据方面具有显著优势。

主要特点:

  • 图模型:使用节点、关系和属性来建模数据,直观地反映实体及其之间的关联。
  • Cypher 查询语言:专为图数据库设计的声明式查询语言,语法简洁,易于表达复杂的图形查询。
  • 高性能:优化的存储和索引机制,能够高效地处理大规模图数据和复杂查询。
  • ACID 事务支持:保证数据的一致性和可靠性,适用于需要强事务保障的应用场景。

为什么需要 Neo4j?

在许多应用场景中,数据之间存在复杂的关系和连接性。传统的关系型数据库在处理多层级的关联查询时,往往需要大量的联接操作(JOIN),这会导致查询性能下降,尤其是在数据规模庞大时。而 Neo4j 通过图模型天然适合表示和处理这种高度连接的数据,能够更高效地执行复杂的关系查询。

主要需求原因:

  1. 复杂关系处理:需要频繁进行多级关联查询,如社交网络、推荐系统等。
  2. 灵活的数据模型:数据结构可能随时间变化,图数据库提供了更大的灵活性。
  3. 性能需求:需要在大规模数据集上执行快速的关系查询和遍历操作。
  4. 实时性:需要实时分析和处理数据关系,如欺诈检测、网络安全等。
ed250b8ea580015278be07a9233448c2

GraphRAG的理解

GraphRAG=Graph(知识图谱)+RAG技术

GraphRAG 是一种结合了图结构检索增强生成(RAG)的方法,旨在增强语言模型(如大规模预训练的变换器模型)的推理能力和信息检索能力。这个方法通常用于处理复杂的推理任务,尤其是当涉及到大规模知识库或图形数据时,GraphRAG可以通过图的结构来有效地组织信息,从而提高模型在生成和推理时的效率和准确性。

图结构(Graph)

  • 通常用于表示节点之间的关系和依赖,在处理复杂知识结构时非常有用。在GraphRAG中,图结构帮助捕捉信息之间的关系,能够有效地组织和链接不同的知识点,尤其是在涉及多个实体和关系的任务中。

检索增强生成(RAG)

  • RAG 是一种将信息检索与生成模型结合的框架。它的核心思想是,模型在生成答案时不仅仅依赖于其预训练时获得的知识,还会从一个外部数据库或文档库中检索相关的信息来增强回答的准确性和上下文适应性。

Neo4j的安装

  1. 官网下载社区版
  2. 安装JDK,java11
  3. 配置环境变量
  4. 启动Neo4j
1
2
3
4
5
6
7
8
9
常用命令
# 启动服务
neo4j(.bat) start
# 重启服务
neo4j(.bat) restart
# 停止服务
neo4j(.bat) stop
# 控制台模式启动
neo4j(.bat) console
  1. 进入到 http://localhost:7474

账号密码 neo4j zxj03051218

第一次进入前安装neo4j 的服务

1
neo4j install-service

查看版本 neo4j –version

apoc用处

数据导入和导出:使用APOC插件可以轻松导入和导出不同格式的数据到Neo4j图数据库。您可以将数据从关系型数据库、CSV文件、JSON等转换为图形数据,并相反地,将图形数据导出到其他格式。 图形算法:APOC提供了许多有用的图形算法,如PageRank、社区发现(例如Louvain算法),路径分析等。这些算法可以帮助您发现数据之间的关联性和模式,并从中提取有价值的信息。 数据清洗和转换:APOC提供了丰富的过程和函数,用于数据清洗和转换。您可以使用它来处理字符串、时间、密码学等方面的数据,并进行必要的清洗和格式化。 可视化:APOC支持将图形数据转换为其他可视化工具所需的格式,例如Gephi、D3.js等。这使得您可以将您的图形数据以更直观的方式呈现,进一步探索和交流。 地理空间分析:APOC提供了与地理空间数据相关的功能,如计算两个地点之间的距离、查找附近的地点等。这对于在地理空间上分析和查询数据特别有用。

我应该是主要用到了数据导入和导出的功能,因为要将构建好的所以传到本地neo4j上

apoc插件安装

知识图谱基本工具Neo4j使用笔记 五 :APOC插件安装及简单应用_neo4j apoc-CSDN博客

版本 neo4j 4.4.39

APOC插件下载:apoc-4.4.0.9-all.jar(注意apoc要与neo4j版本对应)

Releases · neo4j/apoc

将下载的 apoc-4.4.0.9-all.jar 直接复制到neo4j/plugins文件夹

修改APOC的配置文件

打开配置文件将,这一下内容的注释去掉

1
dbms.security.procedures.unrestricted=apoc.*

参考文献

java - 我的Neo4j探索之旅 - 初识Neo4j(一) - 个人文章 - SegmentFault 思否

0%