当前位置: 首页 > news >正文

闭眼检测实现

引言

        这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下:

1. 实时监测眼睛状态
   通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR,实时判断眼睛是否闭合。

2. 闭眼警报
   当程序检测到用户闭眼时,通过在图像上显示 "Eyes Closed" 的文本和相应的标志,发出闭眼警报。

3. 可视化眼睛区域:
   通过在图像上绘制眼睛区域的多边形线段,直观地展示程序检测到的眼睛的位置。

4. 实时图像显示:
   将处理后的图像实时显示在窗口中,使用户能够实时观察眼睛状态的监测结果。

5. 交互式退出:
   用户可以通过按下键盘上的 Esc 键来退出程序,实现交互式控制。

啊啊啊啊啊啊那有那些应用场景呢?^_^

具体应用场景:

- 驾驶员状态监测:
          在汽车驾驶过程中,监测驾驶员的眼睛状态,及时发现驾驶员是否疲劳或注意力不集中。

- 睡眠监测:
          用于睡眠监测系统,检测用户在睡眠时的眼睛状态,可能用于分析睡眠质量。

- 用户注意力监测:
          在用户界面交互系统中,监测用户的眼睛状态,判断用户是否在关注屏幕。

- 医疗应用:
          在医疗领域中,监测患者的眼睛状态,特别是在眼科医疗中可能会有一些应用。

注意:
        这段代码的精度和稳定性可能受多方面因素影响,如光照条件、摄像头质量等。在实际应用中,可能需要进一步优化和调整参数,以适应不同场景和需求。

1.依赖组件:

        这段代码使用了以下几个主要的组件和库:

1. OpenCV (cv2): OpenCV 是一个计算机视觉库,用于图像和视频处理。在这里,它被用于打开摄像头、转换图像格式、进行图像处理以及显示图像。

2. Dlib: Dlib 是一个包含用于机器学习、计算机视觉和图像处理的工具的 C++ 库。在这里,它的 Python 接口被用于进行人脸检测和关键点检测。

3. NumPy: NumPy 是一个用于科学计算的 Python 库,提供了对多维数组的支持。在这里,NumPy 用于处理数组和数学计算。

4. SciPy: SciPy 是一个用于科学计算的 Python 库,提供了在 NumPy 基础上构建的更多高级功能。在这里,SciPy 的 `distance` 模块被用于计算欧氏距离。

        这些库的组合使得这段代码能够实现从摄像头中检测人脸,提取关键点,并通过计算眼睛的纵横比 (EAR) 判断眼睛是否闭上。如果您有关于这些库的具体问题,或者希望了解它们的更多细节,请随时提问。


2.欧氏距离

        因为涉及到了欧氏距离这个数学知识,所以我还是介绍一下,以免大家懵了

        欧式距离(Euclidean Distance)是欧几里德空间中两点之间的直线距离。对于二维空间中的两个点(x1,y1)(x2,y2),它们之间的欧式距离 d 可以通过以下公式计算:

d = \sqrt{(x1 - x2)^{2} + (y1 - y2)^{2}}

        这个公式基于勾股定理,即直角三角形的斜边长度等于两条直角边长度的平方和的平方根。

        在计算机视觉和图像处理中,欧式距离常用于测量两个点之间的空间距离,或者两个向量之间的相似度。在这里,代码中可能使用了欧式距离来计算眼睛的宽度和高度,从而进行进一步的眼睛状态判断。


3.计算眼睛的横纵比

# 计算眼睛的纵横比 (EAR)
def calculate_ear(eye):# 计算垂直方向的欧氏距离vertical_1 = distance.euclidean(eye[1], eye[5])vertical_2 = distance.euclidean(eye[2], eye[4])# 计算水平方向的欧氏距离horizontal = distance.euclidean(eye[0], eye[3])# 计算纵横比ear = (vertical_1 + vertical_2) / (2.0 * horizontal)return ear

        在眼睛特征点的标记中,通常使用一个包含多个关键点的列表或数组表示眼睛的形状。这些关键点的索引通常按照特定的顺序排列,以表示眼睛的不同部位。

        在计算眼睛的 EAR 时,eye[x] 中的 x 是眼睛特征点列表中的索引值,代表了不同的关键点。具体的含义取决于你使用的眼睛特征点标记方案,但一般而言,这些关键点通常按照眼睛的周围轮廓从左上角开始,按逆时针方向标记。

常见的眼睛特征点标记包括:

- eye[0]:眼睛的左侧,水平中心
- eye[1]:眼睛的上边缘,左侧
- eye[2]:眼睛的上边缘,右侧
- eye[3]:眼睛的右侧,水平中心
- eye[4]:眼睛的下边缘,右侧
- eye[5]:眼睛的下边缘,左侧

请注意,具体的标记方案可能会因使用的数据集或库而有所不同。


4.加载 Dlib 的人脸检测器和关键点检测器

# 加载 Dlib 的人脸检测器和关键点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("D:\\Study\\PythonStudy\\people_68_face\\shape_predictor_68_face_landmarks.dat")

        1. dlib.get_frontal_face_detector(): 这是 Dlib 库提供的一个人脸检测器,用于检测图像中的人脸。get_frontal_face_detector() 返回一个人脸检测器对象,可以用于在图像中找到人脸的位置。

        2.dlib.shape_predictor("D:people_68_face\\shape_predictor_68_face_landmarks.dat文件路径"): 这是 Dlib 提供的关键点检测器,用于检测人脸的关键点,通常是面部的特定位置,如眼睛、鼻子、嘴巴等。shape_predictor 对象需要一个训练好的模型文件,该文件包含了在训练过程中学到的关键点位置的信息。在这里,模型文件的路径是指定的 shape_predictor_68_face_landmarks.dat 文件。

        这两个检测器的结合通常用于在图像中检测人脸并找到人脸的关键点位置,为后续的任务(如眼睛状态检测)提供基础。

        这个文件我已经上传


5.获取左右眼的索引

# 获取左右眼的索引
(left_eye_start, left_eye_end) = (42, 48)
(right_eye_start, right_eye_end) = (36, 42)

        这部分代码定义了左眼和右眼在检测到的人脸关键点中的索引范围。

- left_eye_start 和 left_eye_end 分别表示左眼的起始索引和结束索引。在人脸的 68 个关键点中,左眼的关键点通常是从索引 42 开始,到索引 48 结束

- right_eye_start 和 right_eye_end 分别表示右眼的起始索引和结束索引。在人脸的 68 个关键点中,右眼的关键点通常是从索引 36 开始,到索引 42 结束

        这些索引范围用于从检测到的人脸关键点中提取左眼和右眼的具体位置信息,以便后续进行眼睛状态的检测。


6.获取两只眼睛的关键点索引
 

# 获取两只眼睛的关键点索引
(left_eye_indices, right_eye_indices) = (
list(range(left_eye_start, left_eye_end)), list(range(right_eye_start, right_eye_end)))

        这部分代码用于创建包含左眼和右眼关键点索引的列表。

- left_eye_indices 是一个包含左眼关键点索引的列表,使用 list(range(left_eye_start, left_eye_end)) 来生成一个范围从 left_eye_start 到 left_eye_end - 1 的索引列表。

- right_eye_indices 是一个包含右眼关键点索引的列表,使用 list(range(right_eye_start, right_eye_end)) 来生成一个范围从 right_eye_start 到 right_eye_end - 1 的索引列表。

这两个列表将用于提取左眼和右眼的具体关键点位置信息。


7. 打开摄像头

老演员了,不介绍了

# 打开摄像头
cap = cv2.VideoCapture(0)


8.读取一帧图像用于处理

    ret, frame = cap.read()if not ret:break

        这部分代码是从摄像头读取一帧图像的常见做法。在视频处理中,cap.read() 会读取视频的下一帧,ret 表示读取是否成功,如果成功,则 ret 为 True同时 frame 包含了读取到的图像帧。如果 ret 为 False,说明视频已经读取到结尾,此时应该退出循环。

        这种检查 ret 的方式是一种常见的确保视频读取不会超出结尾的方法。


9.转换为灰度图

    # 转换为灰度图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        这一部分代码将读取到的彩色图像转换为灰度图像。在图像处理中,有时候我们会选择在灰度图像上进行操作,因为它只有一个通道,处理起来相对简单,而且对于一些任务如人脸检测来说,灰度图像已经足够cv2.cvtColor() 函数用于颜色空间的转换,cv2.COLOR_BGR2GRAY 表示将图像从BGR(彩色)转换为灰度。

        但是在这里主要是为了减轻处理的难度,提升性能,毕竟我的电脑是轻薄本,真的太难受了。没办法使用GPU处理


10.人脸检测

    # 人脸检测faces = detector(gray)

        这一部分代码使用 detector 对灰度图像进行人脸检测。detector(gray) 返回检测到的人脸的矩形区域的列表。这里使用的是 Dlib 的人脸检测器


11.获取脸部关键点

# 获取关键点
landmarks = predictor(gray, face)
landmarks_points = [(landmarks.part(point).x, landmarks.part(point).y) for point in range(68)]


- predictor(gray, face): 使用Dlib的关键点检测器 predictor 检测人脸上的关键点。
- landmarks: 包含检测到的人脸关键点的对象。
- landmarks_points: 将关键点的 x 和 y 坐标存储为元组的列表。

        这部分代码使用 Dlib 的关键点检测器 (predictor) 获取人脸上的 68 个关键点的坐标。 landmarks_points 变量包含了这些坐标。


12.获取眼部关键点坐标

        # 获取左右眼的关键点坐标left_eye = landmarks_points[left_eye_indices[0]:left_eye_indices[-1] + 1]right_eye = landmarks_points[right_eye_indices[0]:right_eye_indices[-1] + 1]

这段代码用于从检测到的面部关键点中提取左眼和右眼的关键点坐标。

- left_eye_indices 和 right_eye_indices 是左右眼的关键点索引范围,分别包含了人脸关键点中左眼和右眼的索引。

- landmarks_points 包含了检测到的面部的所有68个关键点的坐标。

- left_eye 存储了左眼的关键点坐标,通过使用左眼的索引范围从 landmarks_points 中进行切片操作得到。

- right_eye 存储了右眼的关键点坐标,同样是通过切片操作得到。

        这样,通过 left_eye 和 right_eye,你可以获得左眼和右眼的关键点坐标,从而进行后续的处理,比如计算眼睛的形状、检测眨眼等。


13.计算左右眼的横纵比

# 计算左右眼的EAR
left_ear = calculate_ear(left_eye)
right_ear = calculate_ear(right_eye)

这段代码用于计算左眼和右眼的EAR(Eye Aspect Ratio,眼睛纵横比)。

- calculate_ear 是一个函数,接收一个眼睛的关键点坐标列表作为参数,并返回计算得到的眼睛的EAR值。

- left_ear 存储了左眼的EAR值,通过调用 calculate_ear 函数传入左眼的关键点坐标得到。

- right_ear 存储了右眼的EAR值,通过调用 calculate_ear 函数传入右眼的关键点坐标得到。

通过计算眼睛的EAR值,可以用来判断眼睛的状态,例如是否闭眼。


14.判断是否闭眼

# 判断是否闭眼
if left_ear < 0.2 and right_ear < 0.2:cv2.putText(frame, "Eyes Closed", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

这段代码用于根据左眼和右眼的 EAR 值来判断是否闭眼。具体来说:

- 如果左眼和右眼的 EAR 值都小于 0.2,那么被认为是闭眼状态

        通过 cv2.putText 函数,在视频帧上添加文字信息,显示 "Eyes Closed",文字的位置是 (50, 50),字体大小为 1,颜色为红色 (0, 0, 255),厚度为 2。这是一种简单的闭眼状态的可视化提示。


15.绘制眼部线条

# 可视化眼睛区域
left_eye_int = np.array(left_eye, dtype=np.int32)
right_eye_int = np.array(right_eye, dtype=np.int32)
cv2.polylines(frame, [left_eye_int], isClosed=True, color=(255, 255, 0), thickness=1)
cv2.polylines(frame, [right_eye_int], isClosed=True, color=(255, 255, 0), thickness=1)

这段代码的目的是在视频帧上可视化左右眼的区域,具体来说:

- left_eye_int 和 right_eye_int 分别将左眼右眼的关键点坐标转换为整数型数组。

- cv2.polylines 函数用于绘制多条线段,这里用于绘制眼睛区域的轮廓线。

        [left_eye_int] 和 [right_eye_int] 是轮廓线的坐标isClosed=True 表示将轮廓线闭合(连接起点和终点),color=(255, 255, 0) 设置线的颜色为蓝色thickness=1 设置线的厚度。这样就在视频帧上画出了左右眼的轮廓线,以便于可视化。


16.显示画面

# 显示图像cv2.imshow('Eye Status', frame)

        这部分代码用于在窗口中显示处理后的图像。cv2.imshow('Eye Status', frame) 将处理后的图像(带有眼睛状态信息和可视化的眼睛区域)显示在名为 "Eye Status" 的窗口中。在这个窗口中,你可以看到实时的视频流,并且通过绘制的眼睛区域和相应的文字(例如 "Eyes Closed")来表示眼睛的状态。


17.监听键盘退出

    # 退出循环if cv2.waitKey(1) & 0xFF == 27:break

        这段代码是为了检测键盘输入,如果检测到按键为 "Esc" 键(其ASCII码为27),就退出循环,从而结束程序的执行。通常,在实时视频处理中,这样的退出机制可以帮助你方便地停止程序的执行。

        cv2.waitKey(1) 会等待键盘输入,其参数表示等待的时间(单位为毫秒)。如果在这段时间内检测到键盘输入,那么它会返回按键的 ASCII 码值。因为我们通常是检测是否按下了某个特定的按键,所以要与某个 ASCII 码值进行比较。

        在这里,0xFF 是一个十六进制常数,对应于二进制的 11111111。这是一个掩码,通过与 cv2.waitKey(1) 的结果进行按位与(bitwise AND)操作,可以获取按键的 ASCII 码值

        所以,cv2.waitKey(1) & 0xFF == 27 这个条件表达式的意思是:如果检测到的按键的 ASCII 码值为 27(对应于 Esc 键),则条件成立。在这种情况下,通常会退出循环,结束程序的执行。


 18.释放资源

# 释放资源
cap.release()
cv2.destroyAllWindows()

19.整体参考代码

import cv2
import dlib
from scipy.spatial import distance
import numpy as np# WenJGo
# 计算眼睛的纵横比 (EAR)
def calculate_ear(eye):# 计算垂直方向的欧氏距离vertical_1 = distance.euclidean(eye[1], eye[5])vertical_2 = distance.euclidean(eye[2], eye[4])# 计算水平方向的欧氏距离horizontal = distance.euclidean(eye[0], eye[3])# 计算纵横比ear = (vertical_1 + vertical_2) / (2.0 * horizontal)return ear# 加载 Dlib 的人脸检测器和关键点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("D:\\Study\\PythonStudy\\people_68_face\\shape_predictor_68_face_landmarks.dat")# 获取左右眼的索引
(left_eye_start, left_eye_end) = (42, 48)
(right_eye_start, right_eye_end) = (36, 42)# 获取两只眼睛的关键点索引
(left_eye_indices, right_eye_indices) = (
list(range(left_eye_start, left_eye_end)), list(range(right_eye_start, right_eye_end)))# 打开摄像头
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 转换为灰度图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人脸检测faces = detector(gray)for face in faces:# 获取关键点landmarks = predictor(gray, face)landmarks_points = [(landmarks.part(point).x, landmarks.part(point).y) for point in range(68)]# 获取左右眼的关键点坐标left_eye = landmarks_points[left_eye_indices[0]:left_eye_indices[-1] + 1]right_eye = landmarks_points[right_eye_indices[0]:right_eye_indices[-1] + 1]# 计算左右眼的EARleft_ear = calculate_ear(left_eye)right_ear = calculate_ear(right_eye)# 判断是否闭眼if left_ear < 0.2 and right_ear < 0.2:cv2.putText(frame, "Eyes Closed", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# 可视化眼睛区域left_eye_int = np.array(left_eye, dtype=np.int32)right_eye_int = np.array(right_eye, dtype=np.int32)cv2.polylines(frame, [left_eye_int], isClosed=True, color=(255, 255, 0), thickness=1)cv2.polylines(frame, [right_eye_int], isClosed=True, color=(255, 255, 0), thickness=1)# 显示图像cv2.imshow('Eye Status', frame)# 退出循环if cv2.waitKey(1) & 0xFF == 27:break# 释放资源
cap.release()
cv2.destroyAllWindows()

结语

呃,如果我会自己训练模型然后使用就好了。我只能说,加油吧加油吧!!!

期待有一天

春风得意马蹄疾,一日看尽长安花

ヾ( ̄▽ ̄)Bye~Bye~

拜拜

相关文章:

闭眼检测实现

引言 这段代码是一个实时眼睛状态监测程序&#xff0c;可以用于监测摄像头捕获的人脸图像中的眼睛状态&#xff0c;判断眼睛是否闭合。具体应用实现作用说明如下&#xff1a; 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流&#xff0c;检测人脸关键点并计算眼睛的 EAR&a…...

系列六、Java垃圾回收器主要有哪些?

一、Java垃圾回收器主要有哪些? UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParallelNewGC、UseParallelOldGC、UseG1GC...

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis

目录 【7】Spring Boot 3 集成组件&#xff1a;缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…...

说说Java中的不可重入锁

什么是锁&#xff1f; 简单来讲在Java中&#xff0c;锁是一种用于并发控制的机制&#xff0c;用于保护共享资源&#xff0c;防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;每个对象都有一个相关联的…...

C++学习 --vector

目录 1&#xff0c; 什么是vector 2&#xff0c; 创建vector 2-1&#xff0c; 标准数据类型 2-2&#xff0c; 自定义数据类型 2-3&#xff0c; 其他创建方式 3&#xff0c; 操作vector 3-1&#xff0c; 赋值 3-2&#xff0c; 添加元素 3-2-1&#xff0c; 添加元素(assi…...

Android图片涂鸦,Kotlin(1)

Android图片涂鸦&#xff0c;Kotlin&#xff08;1&#xff09; import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…...

upload-labs(1-17关攻略详解)

upload-labs pass-1 上传一个php文件&#xff0c;发现不行 但是这回显是个前端显示&#xff0c;直接禁用js然后上传 f12禁用 再次上传&#xff0c;成功 右键打开该图像 即为位置&#xff0c;使用蚁剑连接 连接成功 pass-2 源码 $is_upload false; $msg null; if (isse…...

《 机器人基础 》期末试卷(A)

一、填空题&#xff08;30分&#xff0c;每空2分&#xff09; 1. 按照相机的工作方式&#xff0c;机器人常用相机分为1&#xff09;__ 单目摄像头 2&#xff09;__ 双目摄像头 _ 3&#xff09;_深度摄像头_ 三类。 2. 度量地图强调…...

Azure Machine Learning - Azure AI 搜索中的矢量搜索

矢量搜索是一种信息检索方法&#xff0c;它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本&#xff0c;因此搜索引擎会匹配与查询最相似的矢量&#xff0c;而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…...

3 redis实现一个消息中间件

使用list实现一个队列&#xff0c;可以从左侧入队&#xff0c;也可以从右侧入对 即可以从左侧读取&#xff0c;也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标&#xff0c;以 -1 表示列表的最后一个元素&#xff0c; -2 表示列表的…...

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。

遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...

C语言结构体

#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...

【Python大数据笔记_day10_Hive调优及Hadoop进阶】

hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮助定位问…...

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…...

C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别

System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法&#xff0c;它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法&#xff1a; CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法&#xff0c;可以用于复制一个…...

Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决

Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…...

CSS 文本属性篇

文字颜色 属性名&#xff1a;color作用&#xff1a;控制文字的颜色可选值&#xff1a; 1.颜色名 color: blue; 2.rgb或rgba color:rgb(132, 220, 254); color:rgba(132, 220, 254,0.5); 3.hex或hexa&#xff08;十六进制&#xff09; color:#0078d4; color:#0078d48b; 4.hsl或h…...

Activiti,Apache camel,Netflex conductor对比,业务选型

Activiti,Apache camel,Netflex conductor对比&#xff0c;业务选型 1.activiti是审批流&#xff0c;主要应用于人->系统交互&#xff0c;典型应用场景&#xff1a;请假&#xff0c;离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…...

pythom导出mysql指定binlog文件

要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…...

TDengine 跨版本迁移实战

TDengine 3.0 已经退出了近一年&#xff0c;目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法&#xff1a; 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...