基于yolov8,制作停车位计数器(附源码)
大家好,YOLO(You Only Look Once) 是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。
YOLO的第一个版本于2015年发布,由于其高速度和准确性,瞬间得到了广大AI爱好者的喜爱。
Ultralytics YOLOv8则是一款前沿、最先进(SOTA)的模型,基于先前YOLO版本的成功,引入了新功能和改进,进一步提升性能和灵活性。
YOLOv8设计快速、准确且易于使用,使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。
项目地址:
https://github.com/ultralytics/ultralytics
其中官方提供了示例,通过Python代码即可实现YOLOv8对象检测算法模型,使用预训练模型来检测我们的目标。而且对电脑需求也不高,CPU就能运行代码。
今天我就给大家介绍三个使用YOLOv8制作的计数器,非常实用。使用到Python版本以及相关Python库。
Python 3.9.7
ultralytics 8.0.178
opencv-contrib-python 4.8.1.78
opencv-python 4.8.0.74
cvzone 1.5.6
技术交流群
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
建了技术交流群&星球!想要本文源码、进交流群的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司,即可。然后就可以拉你进群了。
方式①、添加微信号:mlc2060,备注:技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:技术交流
/ 01 /
客流检测器
使用OpenCV检测顾客,并且设定客人进出区域,实现实时计算进出顾客的数量。
客流量统计对于零售行业来说是非常重要的。
统计每天的进出店人数、过店人数以及人均驻留时间等。
依据这些数据,经营者可以对店铺的经营策略进行调整,实现店铺的经营效益最大化。
接下来就来看一下客流计数器的检测代码吧!
import cv2
import numpy as np
from tracker import \*
import cvzone
import time bg\_subtractor = cv2.createBackgroundSubtractorMOG2(history=200, varThreshold=140) # 打开视频
video\_capture = cv2.VideoCapture(r"store.mp4") def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: point = \[x, y\] print(point) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
tracker = Tracker() area1 = \[(213, 165), (200, 189), (693, 373), (697, 341)\]
area2 = \[(195, 199), (186, 213), (683, 404), (689, 388)\]
er = {}
counter1 = \[\]
ex = {}
counter2 = \[\]
while True: ret, frame = video\_capture.read() if not ret: break frame = cv2.resize(frame, (1028, 500)) mask = bg\_subtractor.apply(frame) \_, mask = cv2.threshold(mask, 245, 255, cv2.THRESH\_BINARY) contours, \_ = cv2.findContours(mask, cv2.RETR\_EXTERNAL, cv2.CHAIN\_APPROX\_SIMPLE) list = \[\] for cnt in contours: area = cv2.contourArea(cnt) if area > 1500: # cv2.drawContours(frame, \[cnt\], -1, (0, 255, 0), 2) x, y, w, h = cv2.boundingRect(cnt) list.append(\[x, y, w, h\]) bbox\_idx = tracker.update(list) for bbox in bbox\_idx: x1, y1, x2, y2, id = bbox cx = int(x1 + x1 + x2) // 2 cy = int(y1 + y1 + y2) // 2 result = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if result >= 0: er\[id\] = (cx, cy) if id in er: result1 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if result1 >= 0: cv2.rectangle(frame, (x1, y1), (x2 + x1, y2 + y1), (0, 255, 0), 3) cvzone.putTextRect(frame, f'{id}', (cx, cy), 2, 2) cv2.circle(frame, (cx, cy), 5, (0, 255, 0), \-1) if counter1.count(id) == 0: counter1.append(id) result2 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if result2 >= 0: ex\[id\] = (cx, cy) if id in ex: result3 = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if result3 >= 0: cv2.rectangle(frame, (x1, y1), (x2 + x1, y2 + y1), (0, 0, 255), 3) cvzone.putTextRect(frame, f'{id}', (cx, cy), 2, 2) cv2.circle(frame, (cx, cy), 5, (0, 255, 0), \-1) if counter2.count(id) == 0: counter2.append(id) cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 0, 255), 2) cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 0, 255), 2) Enter = len(counter1) Exit = len(counter2) cvzone.putTextRect(frame, f'ENTER:-{Enter}', (50, 60), 2, 2) cvzone.putTextRect(frame, f'EXIT:-{Exit}', (50, 130), 2, 2) cv2.imshow('RGB', frame) time.sleep(0.01) if cv2.waitKey(1) & 0xFF == 27: # Press 'Esc' to exit break # 释放资源, 关闭窗口
video\_capture.release()
cv2.destroyAllWindows()
结果如下。
/ 02 /
鸡蛋计数器
使用OpenCV和YOLOv8检测鸡蛋个数。
能够高效、准确、安全可靠的完成鸡蛋个数的统计工作。
基于yolov8-seg实例分割的实时检测。
具体代码如下。
import cv2
from yolo\_segmentation import YOLOSEG
import cvzone
from tracker import \*
import numpy as np ys = YOLOSEG("best.pt") my\_file = open("coco1.txt", "r")
data = my\_file.read()
class\_list = data.split("\\n") cap = cv2.VideoCapture('egg.mp4')
count = 0 def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: point = \[x, y\] print(point) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
tracker = Tracker()
area = \[(434, 39), (453, 629), (473, 634), (456, 36)\]
counter1 = \[\]
while True: ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (1020, 700)) overlay = frame.copy() alpha = 0.5 bboxes, classes, segmentations, scores = ys.detect(frame) bbox\_idx = tracker.update(bboxes) for bbox, seg in zip(bbox\_idx, segmentations): x3, y3, x4, y4, id = bbox cx = int(x3 + x4) // 2 cy = int(y3 + y4) // 2 result = cv2.pointPolygonTest(np.array(area, np.int32), ((cx, cy)), False) if result >= 0: # cv2.rectangle(frame, (x3, y3), (x4, y4), (255, 0, 0), 2) # cv2.polylines(frame, \[seg\], True, (0, 0, 255), 4) cv2.circle(frame, (cx, cy), 4, (0, 255, 0), \-1) cv2.fillPoly(overlay, \[seg\], (0, 0, 255)) cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 2, frame) cvzone.putTextRect(frame, f'{id}', (x3, y3), 1, 1) if counter1.count(id) == 0: counter1.append(id) cv2.polylines(frame, \[np.array(area, np.int32)\], True, (255, 0, 0), 2) ca1 = len(counter1) cvzone.putTextRect(frame, f'Egg: {ca1}', (50, 60), 2, 2) cv2.imshow("RGB", frame) if cv2.waitKey(1) & 0xFF == 27: break
cap.release()
cv2.destroyAllWindows()
运行代码,结果如下。
/ 03 /
停车位计数器
使用OpenCV和YOLOv8检测停车场剩余车位。
提醒车主停车场各个区域的剩余车位信息。
使停车场车位管理更加规范有序,提高车位使用率。
import cv2
import pandas as pd
import numpy as np
from ultralytics import YOLO
import time model = YOLO('yolov8s.pt') def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: colorsBGR = \[x, y\] print(colorsBGR) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB) cap = cv2.VideoCapture('parking1.mp4') my\_file = open("coco.txt", "r")
data = my\_file.read()
class\_list = data.split("\\n") area1 = \[(52, 364), (30, 417), (73, 412), (88, 369)\] area2 = \[(105, 353), (86, 428), (137, 427), (146, 358)\] area3 = \[(159, 354), (150, 427), (204, 425), (203, 353)\] area4 = \[(217, 352), (219, 422), (273, 418), (261, 347)\] area5 = \[(274, 345), (286, 417), (338, 415), (321, 345)\] area6 = \[(336, 343), (357, 410), (409, 408), (382, 340)\] area7 = \[(396, 338), (426, 404), (479, 399), (439, 334)\] area8 = \[(458, 333), (494, 397), (543, 390), (495, 330)\] area9 = \[(511, 327), (557, 388), (603, 383), (549, 324)\] area10 = \[(564, 323), (615, 381), (654, 372), (596, 315)\] area11 = \[(616, 316), (666, 369), (703, 363), (642, 312)\] area12 = \[(674, 311), (730, 360), (764, 355), (707, 308)\] while True: ret, frame = cap.read() if not ret: break time.sleep(1) frame = cv2.resize(frame, (1020, 500)) results = model.predict(frame) # print(results) a = results\[0\].boxes.boxes px = pd.DataFrame(a).astype("float") # print(px) list1 = \[\] list2 = \[\] list3 = \[\] list4 = \[\] list5 = \[\] list6 = \[\] list7 = \[\] list8 = \[\] list9 = \[\] list10 = \[\] list11 = \[\] list12 = \[\] for index, row in px.iterrows(): # print(row) x1 = int(row\[0\]) y1 = int(row\[1\]) x2 = int(row\[2\]) y2 = int(row\[3\]) d = int(row\[5\]) c = class\_list\[d\] if 'car' in c: cx = int(x1 + x2) // 2 cy = int(y1 + y2) // 2 results1 = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if results1 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list1.append(c) cv2.putText(frame, str(c), (x1, y1), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) results2 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if results2 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list2.append(c) results3 = cv2.pointPolygonTest(np.array(area3, np.int32), ((cx, cy)), False) if results3 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list3.append(c) results4 = cv2.pointPolygonTest(np.array(area4, np.int32), ((cx, cy)), False) if results4 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list4.append(c) results5 = cv2.pointPolygonTest(np.array(area5, np.int32), ((cx, cy)), False) if results5 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list5.append(c) results6 = cv2.pointPolygonTest(np.array(area6, np.int32), ((cx, cy)), False) if results6 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list6.append(c) results7 = cv2.pointPolygonTest(np.array(area7, np.int32), ((cx, cy)), False) if results7 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list7.append(c) results8 = cv2.pointPolygonTest(np.array(area8, np.int32), ((cx, cy)), False) if results8 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list8.append(c) results9 = cv2.pointPolygonTest(np.array(area9, np.int32), ((cx, cy)), False) if results9 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list9.append(c) results10 = cv2.pointPolygonTest(np.array(area10, np.int32), ((cx, cy)), False) if results10 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list10.append(c) results11 = cv2.pointPolygonTest(np.array(area11, np.int32), ((cx, cy)), False) if results11 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list11.append(c) results12 = cv2.pointPolygonTest(np.array(area12, np.int32), ((cx, cy)), False) if results12 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list12.append(c) a1 = (len(list1)) a2 = (len(list2)) a3 = (len(list3)) a4 = (len(list4)) a5 = (len(list5)) a6 = (len(list6)) a7 = (len(list7)) a8 = (len(list8)) a9 = (len(list9)) a10 = (len(list10)) a11 = (len(list11)) a12 = (len(list12)) o = (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12) space = (12 - o) print(space) if a1 == 1: cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('1'), (50, 441), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('1'), (50, 441), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a2 == 1: cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('2'), (106, 440), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('2'), (106, 440), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a3 == 1: cv2.polylines(frame, \[np.array(area3, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('3'), (175, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area3, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('3'), (175, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a4 == 1: cv2.polylines(frame, \[np.array(area4, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('4'), (250, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area4, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('4'), (250, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a5 == 1: cv2.polylines(frame, \[np.array(area5, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('5'), (315, 429), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area5, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('5'), (315, 429), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a6 == 1: cv2.polylines(frame, \[np.array(area6, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('6'), (386, 421), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area6, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('6'), (386, 421), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a7 == 1: cv2.polylines(frame, \[np.array(area7, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('7'), (456, 414), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area7, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('7'), (456, 414), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a8 == 1: cv2.polylines(frame, \[np.array(area8, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('8'), (527, 406), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area8, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('8'), (527, 406), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a9 == 1: cv2.polylines(frame, \[np.array(area9, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('9'), (591, 398), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area9, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('9'), (591, 398), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a10 == 1: cv2.polylines(frame, \[np.array(area10, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('10'), (649, 384), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area10, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('10'), (649, 384), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a11 == 1: cv2.polylines(frame, \[np.array(area11, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('11'), (697, 377), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area11, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('11'), (697, 377), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a12 == 1: cv2.polylines(frame, \[np.array(area12, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('12'), (752, 371), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area12, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('12'), (752, 371), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) cv2.putText(frame, 'parking lots: ' + str(space), (23, 40), cv2.FONT\_HERSHEY\_PLAIN, 2, (255, 0, 255), 2) cv2.imshow("RGB", frame) if cv2.waitKey(1) & 0xFF == 27: break
cap.release()
cv2.destroyAllWindows()
# stream.stop()
运行代码,结果如下。
发现效果还不错~
/ 04 /
总结
以上操作,就是三个使用YOLOv8实现的计数视觉项目。
当然我们还可以通过预训练模型实现其它功能。
如果预训练模型的检测效果在你要使用的场景不太好,那就是需要加加数据了~
相关文章:

基于yolov8,制作停车位计数器(附源码)
大家好,YOLO(You Only Look Once) 是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。 YOLO的第一个版本于2015年发布,由于其高速度和准确性,瞬间得到了广大AI爱好者的喜爱。 Ultralytics YOLOv8则是一款前沿、最先进(SOTA)的模型&a…...
C++设计模式:单例模式(饿汉式、懒汉式)
单例模式是什么? 单例模式是一种创建型的软件设计模式。通过单例模式的设计,使得创建的类在当前进程中只有唯一一个实例,并提供一个全局性的访问点,这样可以规避因频繁创建对象而导致的内存飙升情况。 单例模式有三个要点 私有化…...

Django 访问前端页面一直在转异常:ReferenceError:axios is not defined
访问:http://127.0.0.1:8080/ my.html 一、异常: 二、原因 提示:axios找不到!! 查看代码<script src"https://unpkg.com/axios/dist/axios.min.js"></script>无法访问到官网 三、解决 Using j…...

C语言中关于指针的理解
#include <stdio.h> int main() {int a11;int *p&a; //因为a是整型的,所以我们定义指针p的时候要和a的类型一样char b;char *pa&b; //同理,b是字符型,所以这里的pa也要用字符型return 0; }因为*p指向的是地址&…...

MySQL MVCC精讲
版本链 我们前面说过,对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列): trx_idÿ…...

如何快速删除pdf周围的空白
问题:写论文往往需要pdf格式的图片,但pdf往往四周存在大量空白需要手动截图很麻烦 解决: 打开命令行输入:pdfcrop 图片名.pdf...

蓝桥杯c/c++程序设计——数位排序
数位排序【第十三届】【省赛】【C组】 题目描述 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。 当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如࿰…...

【通讯录案例-搭建登录界面 Objective-C语言】
一、来看我们这个通讯录案例 1.接下来啊,我们来做这个通讯录案例, 然后呢,做这么一个应用程序啊, 我们第一步呢,先把界面儿搭了, 然后呢,搭之前,简单的来分析一下, 首先呢,这是,中间儿的这一块儿, 1)有个“账户”、“密码”,这一块儿, 这是一个什么控制器,…...
二叉搜索树、AVL、红黑树、B树
文章目录 二叉搜索树2. avl树3. 红黑树 b树和b树比较适合与磁盘打交道的,磁盘操作耗时,这些树 矮,红黑树、avL树高,比较适合与内存打交道。 二叉搜索树 找一个节点的前驱和后继: 前驱:如果节点有左子树&a…...
格密码:傅里叶矩阵
目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面:有关傅里叶变换的解释太多了,这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…...

flex--伸缩性
1.flex-basis flex-basis 设置的是主轴方向的基准长度,会让宽度或高度失效。 备注:主轴横向:宽度失效;主轴纵向:高度失效 作用:浏览器根据这个属性设置的值,计算主轴上是否有多余空间&#x…...

linux中主从复制的架构和读写分离的方式
读写分离 互相主从架构注意点 双主双从架构注意点 一主多从架构注意点 读写分离概念部署jdk环境上传文件,解压文件配置环境变量 部署mycat环境mycat配置文件给所有数据库创建访问用户配置 server.xml配置 schema.xml启动mycat查看启动端口日志负载均衡测试 遇到的问…...

Ubuntu 22.04.3 Server 设置静态IP 通过修改yaml配置文件方法
目录 1.查看网卡信息 2.修改yaml配置文件 3.应用新的网络配置 4.重新启动网络服务 文章内容 本文介绍Ubuntu 22.04.3 Server系统通过修改yaml配置文件配置静态 ip 的方法。 1.查看网卡信息 使用ifconfig命令查看网卡信息获取网卡名称 如果出现Command ifconfig not fo…...

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控
一、背景与需求 在公共场所和大型活动的管理中,人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况,无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法,基于计算机视觉技术…...
Kotlin 接口
Kotlin 的接口可以既包含抽象方法的声明也包含实现;接口无法保存状态;可以有属性但必须声明为抽象或提供访问器实现 1、定义 使用关键字 interface 来定义接口 interface MyInterface {fun bar()fun foo() {// 可选的方法体} } 2、 实现接口 一个类…...

Qt前端技术:5.QSS
这个是表示QFrame中的pushButton中的子类和它子类的子类都将背景变为red 写成大于的时候表示只有直接的子类对象才会变 这个图中的QGroupBox和QPushButton都是QFrame的直接的子类 这个中的QGroupBox是QFrame的直接的子类但是QPushButton 是QGroupBox的子类,QPushB…...

在Centos7中利用Shell脚本:实现MySQL的数据备份
目录 自动化备份MySQL 一.备份数据库脚本 1.创建备份目录 2.创建脚本文件 3.新建配置文件(连接数据库的配置文件) 4.给文件权限(mysql_backup.sh) 编辑 5.执行命令 (mysql_backup.sh) 编辑 二.数据库通过备份恢复 1.创建脚…...

大一C语言查缺补漏 12.24
遗留问题: 6-1 1 在C语言中,如果要保留小数的话,一定要除以2.0,而不是2。 设整型变量m,n,a,b的值均为1,执行表达式(m a>b)||(n a<b)后,表达式的值以及变量m和n的值是&#…...
程序员宝典:常用的免费好物API
六位图片验证码生成:包括纯数字、小写字母、大写字母、大小写混合、数字小写、数字大写、数字大小写等情况。 四位图片验证码生成:四位图片验证码生成,包括纯数字、小写字母、大写字母、大小写混合、数字小写、数字大写、数字大小写等情况。…...

关于“Python”的核心知识点整理大全41
目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py 我们将最高得分圆整…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...