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

基于YOLOv5模型的火焰识别系统

大家好,YOLOv5模型能够快速准确地检测到火灾火焰,在火灾初期甚至是刚刚出现火苗时就发出警报。这为及时采取灭火措施争取了宝贵的时间,极大地降低了火灾造成的损失。系统可以对特定区域进行持续实时监测,无论白天还是夜晚,都能及时察觉火灾的发生。相比传统的人工巡检或基于传感器的检测方法,具有更高的时效性和可靠性。本文将介绍基YOLOv5模型的火灾火焰检测系统,涵盖准备工作、模型训练等方面。

1.准备工作

在PC机上配置环境,即正常按照requirements安装依赖包,根据实际情况可以自身爬取图片。通过网上的资料下载相关数据集,大部分数据集是无标注的数据集。如下载的数据集无标注,那么使用lableImg进行标注,且将标注文件的保存格式设置为PascalVOC的类型,即xml格式的label文件,而后通过脚本将标签格式转换为.txt文件,并在文件上添加类别信息和对数据进行归一化。脚本脚本代码如下:

import os
import xml.etree.ElementTree as ET
from decimal import Decimaldirpath = '/home/jiu/data_change/label_0'  # 原来存放xml文件的目录
newdir = '/home/jiu/data_change/labels'  # 修改label后形成的txt目录if not os.path.exists(newdir):os.makedirs(newdir)for fp in os.listdir(dirpath):root = ET.parse(os.path.join(dirpath, fp)).getroot()xmin, ymin, xmax, ymax = 0, 0, 0, 0sz = root.find('size')width = float(sz[0].text)height = float(sz[1].text)filename = root.find('filename').textprint(fp)with open(os.path.join(newdir, fp.split('.')[0] + '.txt'), 'a+') as f:for child in root.findall('object'):  # 找到图片中的所有框sub = child.find('bndbox')  # 找到框的标注值并进行读取sub_label = child.find('name')xmin = float(sub[0].text)ymin = float(sub[1].text)xmax = float(sub[2].text)ymax = float(sub[3].text)try:  # 转换成yolov的标签格式,需要归一化到(0-1)的范围内x_center = Decimal(str(round(float((xmin + xmax) / (2 * width)),6))).quantize(Decimal('0.000000'))y_center = Decimal(str(round(float((ymin + ymax) / (2 * height)),6))).quantize(Decimal('0.000000'))w = Decimal(str(round(float((xmax - xmin) / width),6))).quantize(Decimal('0.000000'))h = Decimal(str(round(float((ymax - ymin) / height),6))).quantize(Decimal('0.000000'))print(str(x_center) + ' ' + str(y_center)+ ' '+str(w)+ ' '+str(h))#读取需要的标签if sub_label.text == 'fire':f.write(' '.join([str(0), str(x_center), str(y_center), str(w), str(h) + '\n']))except ZeroDivisionError:print(filename, '的 width有问题')

​ 此处提供本人所使用的火焰数据集,该数据集一共2059张带火焰的图片,并将其分为训练集和测试集,其中训练集1442张,测试集617张;同样的将label也分为训练集和测试集,其图片和其label相对应。 

txt标签:

2.项目实现

对配置文件修改,新建一个.yaml文件,在其中添加(根据实际情况修改文件路径):

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: D:\a\fire_yolo_format\images\train
val: D:\a\fire_yolo_format\images\val# number of classes
nc: 2# class names
names: ['fire', 'nofire']

在train.py的parse_opt()函数中,修改’–weights’、‘–data’、'–imgsz’等配置,其如下所示:

def parse_opt(known=False):parser = argparse.ArgumentParser()parser.add_argument('--weights', type=str, default=ROOT / 'pretrained/yolov5s.pt', help='initial weights path')parser.add_argument('--cfg', type=str, default=ROOT / 'models/yolov5s.yaml', help='model.yaml path')parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')parser.add_argument('--epochs', type=int, default=300)parser.add_argument('--batch-size', type=int, default=4, help='total batch size for all GPUs, -1 for autobatch')parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')parser.add_argument('--rect', action='store_true', help='rectangular training')parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')parser.add_argument('--noval', action='store_true', help='only validate final epoch')parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')# parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')parser.add_argument('--multi-scale', default=True, help='vary img-size +/- 50%%')parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')parser.add_argument('--name', default='exp', help='save to project/name')parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')parser.add_argument('--quad', action='store_true', help='quad dataloader')parser.add_argument('--linear-lr', action='store_true', help='linear LR')parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')parser.add_argument('--freeze', type=int, default=0, help='Number of layers to freeze. backbone=10, all=24')parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')# Weights & Biases argumentsparser.add_argument('--entity', default=None, help='W&B: Entity')parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')opt = parser.parse_known_args()[0] if known else parser.parse_args()return opt

 ’–weights’:添加yolov5的预训练权重文件,此处使用的是yolov5s.pt。如使用其他预训练权重文件,则在val.py中也应当相应修改

‘–data’:数据集的配置文件,即上面定义的.yaml文件

‘–imgsz’:输入图片的大小

在detect.py的parse_opt()函数中,同样修改’–weights’、‘–source’、'–imgsz’等配置,其如下所示:

def parse_opt():parser = argparse.ArgumentParser()parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')parser.add_argument('--conf-thres', type=float, default=0.5, help='confidence threshold')parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')parser.add_argument('--view-img', action='store_true', help='show results')parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')parser.add_argument('--nosave', action='store_true', help='do not save images/videos')parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')parser.add_argument('--augment', action='store_true', help='augmented inference')parser.add_argument('--visualize', action='store_true', help='visualize features')parser.add_argument('--update', action='store_true', help='update all models')parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')parser.add_argument('--name', default='exp', help='save results to project/name')parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')opt = parser.parse_args()opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expandprint_args(FILE.stem, opt)return opt

即’–weights’:添加训练好的权重文件

‘–source’:测试图片的路径或测试视频的路径

‘–imgsz’:输入图片的大小

3.训练与测试

如在pycharm中运行,可直接运行train.py文件;如使用终端运行,则运行指令为:

python train.py --img 320 --batch 16 --epoch 300 --data data/coco128.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --device '0'

图片测试:

# -*- coding: UTF-8 -*-
import time
import cv2
import torch
import copy
from models.experimental import attempt_load
from utils.datasets import letterbox
from utils.general import check_img_size, non_max_suppression, scale_coords, xyxy2xywhdef load_model(weights, device):model = attempt_load(weights, map_location=device)  # load FP32 modelreturn modeldef show_results(img, xywh, conf, class_num):h, w, c = img.shapelabels = ['fire']tl = 1 or round(0.002 * (h + w) / 2) + 1  # line/font thicknessx1 = int(xywh[0] * w - 0.5 * xywh[2] * w)y1 = int(xywh[1] * h - 0.5 * xywh[3] * h)x2 = int(xywh[0] * w + 0.5 * xywh[2] * w)y2 = int(xywh[1] * h + 0.5 * xywh[3] * h)cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), thickness=tl, lineType=cv2.LINE_AA)tf = max(tl - 1, 1)  # font thicknesslabel = str(labels[int(class_num)]) + ': ' + str(conf)[:5]cv2.putText(img, label, (x1, y1 - 2), 0, tl / 3, [0, 0, 255], thickness=tf, lineType=cv2.LINE_AA)return imgdef detect_one(model, image_path, device):# Load modelimg_size = 320conf_thres = 0.3iou_thres = 0.2orgimg = cv2.imread(image_path)  # BGR# orgimg = image_pathimg0 = copy.deepcopy(orgimg)assert orgimg is not None, 'Image Not Found ' + image_pathh0, w0 = orgimg.shape[:2]  # orig hwr = img_size / max(h0, w0)  # resize image to img_sizeif r != 1:  # always resize down, only resize up if training with augmentationinterp = cv2.INTER_AREA if r < 1  else cv2.INTER_LINEARimg0 = cv2.resize(img0, (int(w0 * r), int(h0 * r)), interpolation=interp)imgsz = check_img_size(img_size, s=model.stride.max())  # check img_sizeimg = letterbox(img0, new_shape=imgsz)[0]# Convertimg = img[:, :, ::-1].transpose(2, 0, 1).copy()  # BGR to RGB, to 3x416x416# Run inferencet0 = time.time()img = torch.from_numpy(img).to(device)img = img.float()  # uint8 to fp16/32img /= 255.0  # 0 - 255 to 0.0 - 1.0if img.ndimension() == 3:img = img.unsqueeze(0)# Inferencepred = model(img)[0]# Apply NMSpred = non_max_suppression(pred, conf_thres, iou_thres)print('pred: ', pred)print('img.shape: ', img.shape)print('orgimg.shape: ', orgimg.shape)# Process detectionsfor i, det in enumerate(pred):  # detections per imagegn = torch.tensor(orgimg.shape)[[1, 0, 1, 0]].to(device)  # normalization gain whwhif len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(img.shape[2:], det[:, :4], orgimg.shape).round()# Print resultsfor c in det[:, -1].unique():n = (det[:, -1] == c).sum()  # detections per classfor j in range(det.size()[0]):xywh = (xyxy2xywh(torch.tensor(det[j, :4]).view(1, 4)) / gn).view(-1).tolist()conf = det[j, 4].cpu().numpy()class_num = det[j, 4].cpu().numpy()orgimg = show_results(orgimg, xywh, conf, class_num)# Stream resultsprint(f'Done. ({time.time() - t0:.3f}s)')cv2.imshow('orgimg', orgimg)cv2.imwrite('filename.jpg',orgimg)if cv2.waitKey(0) == ord('q'):  # q to quitraise StopIterationif __name__ == '__main__':device = torch.device("cuda" if torch.cuda.is_available() else "cpu")weights = '/home/jiu/project/fire_detect/runs/train/exp/weights/best.pt'model = load_model(weights, device)# using imagesimage_path = '/home/jiu/project/fire_detect/test_images/1.jpg'detect_one(model, image_path, device)print('over')

运行结果:

在这里插入图片描述

也可直接使用detect.py进行测试,并得到效果图。

摄像头测试:

# -*- coding: UTF-8 -*-
import time
import cv2
import torch
import copy
from models.experimental import attempt_load
from utils.datasets import letterbox
from utils.general import check_img_size, non_max_suppression, scale_coords, xyxy2xywhdef load_model(weights, device):model = attempt_load(weights, map_location=device)  # load FP32 modelreturn modeldef show_results(img, xywh, conf, class_num):h, w, c = img.shapelabels = ['fire']tl = 1 or round(0.002 * (h + w) / 2) + 1  # line/font thicknessx1 = int(xywh[0] * w - 0.5 * xywh[2] * w)y1 = int(xywh[1] * h - 0.5 * xywh[3] * h)x2 = int(xywh[0] * w + 0.5 * xywh[2] * w)y2 = int(xywh[1] * h + 0.5 * xywh[3] * h)cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), thickness=tl, lineType=cv2.LINE_AA)tf = max(tl - 1, 1)  # font thicknesslabel = str(labels[int(class_num)]) + ': ' + str(conf)[:5]cv2.putText(img, label, (x1, y1 - 2), 0, tl / 3, [0, 0, 255], thickness=tf, lineType=cv2.LINE_AA)return imgdef detect_one(model, image_path, device):# Load modelimg_size = 320conf_thres = 0.3iou_thres = 0.2orgimg = image_pathimg0 = copy.deepcopy(orgimg)assert orgimg is not None, 'Image Not Found ' + image_pathh0, w0 = orgimg.shape[:2]  # orig hwr = img_size / max(h0, w0)  # resize image to img_sizeif r != 1:  # always resize down, only resize up if training with augmentationinterp = cv2.INTER_AREA if r < 1  else cv2.INTER_LINEARimg0 = cv2.resize(img0, (int(w0 * r), int(h0 * r)), interpolation=interp)imgsz = check_img_size(img_size, s=model.stride.max())  # check img_sizeimg = letterbox(img0, new_shape=imgsz)[0]# Convertimg = img[:, :, ::-1].transpose(2, 0, 1).copy()  # BGR to RGB, to 3x416x416# Run inferencet0 = time.time()img = torch.from_numpy(img).to(device)img = img.float()  # uint8 to fp16/32img /= 255.0  # 0 - 255 to 0.0 - 1.0if img.ndimension() == 3:img = img.unsqueeze(0)# Inferencepred = model(img)[0]# Apply NMSpred = non_max_suppression(pred, conf_thres, iou_thres)print('pred: ', pred)print('img.shape: ', img.shape)print('orgimg.shape: ', orgimg.shape)# Process detectionsfor i, det in enumerate(pred):  # detections per imagegn = torch.tensor(orgimg.shape)[[1, 0, 1, 0]].to(device)  # normalization gain whwhif len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(img.shape[2:], det[:, :4], orgimg.shape).round()# Print resultsfor c in det[:, -1].unique():n = (det[:, -1] == c).sum()  # detections per classfor j in range(det.size()[0]):xywh = (xyxy2xywh(torch.tensor(det[j, :4]).view(1, 4)) / gn).view(-1).tolist()conf = det[j, 4].cpu().numpy()class_num = det[j, 4].cpu().numpy()orgimg = show_results(orgimg, xywh, conf, class_num)# Stream resultsprint(f'Done. ({time.time() - t0:.3f}s)')return orgimgif __name__ == '__main__':device = torch.device("cuda" if torch.cuda.is_available() else "cpu")weights = '/home/jiu/project/fire_detect/runs/train/exp/weights/best.pt'model = load_model(weights, device)# using cameracap = cv2.VideoCapture(0)while cap.isOpened():_, frame = cap.read()frame = detect_one(model, frame, device)cv2.imshow("img", frame)cv2.waitKey(1)print('over')

相关文章:

基于YOLOv5模型的火焰识别系统

大家好&#xff0c;YOLOv5模型能够快速准确地检测到火灾火焰&#xff0c;在火灾初期甚至是刚刚出现火苗时就发出警报。这为及时采取灭火措施争取了宝贵的时间&#xff0c;极大地降低了火灾造成的损失。系统可以对特定区域进行持续实时监测&#xff0c;无论白天还是夜晚&#xf…...

多模态AI:开启人工智能的新纪元

在人工智能的璀璨星河中&#xff0c;多模态AI技术正逐渐成为一颗耀眼的明星。随着科技的飞速发展&#xff0c;AI技术正以前所未有的速度迈向新的高峰&#xff0c;其中多模态AI的兴起尤为引人注目。本文将深入探讨多模态AI的定义、技术原理、应用场景以及未来发展趋势。 ps.图…...

麒麟信安支撑2024年电力监控系统网络安全加固培训护航电力网络安全!

在网络安全形势日益复杂的今天&#xff0c;电力行业的网络安全尤为重要。为提升电力监控系统网络安全运维人员的专业技能&#xff0c;由国调中心网安处精心策划&#xff0c;国家电网技术学院组织开展的“2024年电力监控系统网络安全加固培训”于近日圆满结束。麒麟信安作为重要…...

横表和纵表 中的横表

图1 图2...

7个常用的JavaScript数组操作进阶用法

文章目录 1、查找数组中的最大值方法一&#xff1a;使用 Math.max 和展开运算符方法二:使用 for 循环逐一比较 2、查找数组中的第二大值方法一&#xff1a;排序后取第二大值方法二&#xff1a;遍历找到第二大值 3、去除数组中的重复项4、合并两个有序数组并保持有序5、旋转数组…...

Spark的Standalone集群环境安装

一.简介 与MR对比&#xff1a; 概念MRYARNSpark Standalone主节点ResourceManagerMaster从节点NodeManagerWorker计算进程MapTask&#xff0c;ReduceTaskExecutor 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接…...

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import …...

shukla方差和相对平均偏差

参考资料&#xff1a;实用统计学【李奉令】 Eberhart-Russell模型、Shukla模型、相对平均偏差稳定性分析比较 相对平均偏差在品种稳定性分析中的作用 1、Shukla方差 生物统计中&#xff0c;用于描述一个群体离散程度的统计量有离差、方差、极差等&#xff0c; 国内品种区域试…...

双指针(二)双指针到底是怎么个事

一.有效的三角形个数 有效的三角形个数 class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int i0,end nums.length-1;int count 0;for( i end;i>2;i--){int left 0;int right i-1;while(left<right){if(nums[left]nums[right]>nums…...

vscode通过remote-ssh连接远程开发机

文章目录 安装扩展注意事项:tips其他参数安装扩展 安装VS Code和SSH-Remote扩展:首先,需要确保你已经在本地计算机上安装了VS Code,并且在扩展市场中搜索并安装了"Remote - SSH"扩展。配置SSH:在本地计算机上,打开VS Code的命令面板(使用快捷键"Ctrl+Shi…...

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目&#xff0c;使用 uniapp 的 uni.getLocation 发现H5端定位不准确&#xff0c;比如余杭区会定位到临平区&#xff0c;根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本&#xff0c;是直接使用高德地图的api获取定位。 1.首…...

SQL HAVING子句

SQL 是一种基于“面向集合”思想设计的语言。HAVING 子句是一个聚合函数&#xff0c;用于过滤分组结果。 1 实践 1.1 缺失的编号 图 连续编号记录表t_seq_record 需求&#xff1a;判断seq 列编号是否有缺失。 SELECT 存在缺失的编号 AS res FROM t_seq_record HAVING COUN…...

计算机视觉基础:OpenCV库详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机视觉基础&#xff1a;OpenCV库详解 计算机视觉基础&#xff1a;OpenCV库详解 计算机视觉基础&#xff1a;OpenCV库详解 引…...

UI自动化测试工具(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 常用工具 1、QTP&#xff1a;商业化的功能测试工具&#xff0c;收费&#xff0c;可用于web自动化测试 2、Robot Framework&#xff1a;基于Python可扩展的关…...

AJAX 全面教程:从基础到高级

AJAX 全面教程&#xff1a;从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX&#xff08;Asynchronous JavaScript and XML…...

ONLYOFFICE 8.2测评:功能增强与体验优化,打造高效办公新体验

引言 随着数字化办公需求的不断增长&#xff0c;在线办公软件市场竞争愈加激烈。在众多办公软件中&#xff0c;ONLYOFFICE 无疑是一个颇具特色的选择。它不仅支持文档、表格和演示文稿的在线编辑&#xff0c;还通过开放的接口与强大的协作功能&#xff0c;吸引了众多企业和个人…...

Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!

在地球46亿年的漫长历史长河中&#xff0c;生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌&#xff1f;如何理解关键演化节点的具体过程&#xff1f;10月23日&#xff0c;Science Robotics发表重磅综述&#xff0c;首次系统性提出"古生物启发…...

uni-app表格带分页,后端处理过每页显示多少条

uni-app表格带分页&#xff0c;后端处理过每页可以显示多少条&#xff0c;一句设置好了每页显示的数据量&#xff0c;不需要钱的在进行操作&#xff0c;在进行对数据的截取 <th-table :column"column" :listData"data" :checkSort"checkSort"…...

基于STM32设计的矿山环境监测系统(NBIOT)_262

文章目录 一、前言1.1 项目介绍【1】开发背景【2】研究的意义【3】最终实现需求【4】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】上位机开发思路1.3 项目开发背景【1】选题的意义【2】摘要【3】国内外相关研究现状【5】参考文献1.4 开发工具的选择【1】设备端开发【2】…...

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…...

219页华为供应链管理:市场预测SOP计划、销售预测与存货管理精要

一、华为ISC供应链管理 华为的集成供应链&#xff08;ISC&#xff09;领先实践和SISC&#xff08;Siyuan Integrated Supply Chain&#xff09;架构体现了其在供应链管理领域的深度和广度&#xff0c;以下是7点关键介绍&#xff1a; 全面的供应链视野&#xff1a;华为ISC涵盖…...

mac 安装指定的node和npm版本

mac 安装指定的node和npm版本 0.添加映像&#xff1a; export N_NODE_MIRRORhttps://npmmirror.com/mirrors/node 1、使用 npm 全局安装 n npm install -g n 如果报了sudo chown -R 502:20 "/Users/xxx/.npm" sudo npm install -g n 2、根据需求安装指定版本的 node …...

为什么分布式光伏规模是6MW为界点?

安科瑞 Acrel-Tu1990 最近&#xff0c;能源局颁布了一项规定&#xff0c;明确指出6兆瓦&#xff08;MW&#xff09;及以上的分布式光伏电站必须实现自发自用&#xff0c;自行消纳电力。多个省份的能源局进一步规定&#xff0c;规模超过6兆瓦的电站需按照集中式管理进行操作。此…...

arm64架构的linux 配置vm_page_prot方式

在 ARM64 架构上&#xff0c;通过 vm_page_prot 属性可以修改 UIO 映射内存的访问权限及缓存策略&#xff0c;常见的有非缓存&#xff08;Non-cached&#xff09;、写合并&#xff08;Write Combine&#xff09;等。下面是 ARM64 常用的 vm_page_prot 设置及其对应的操作方式。…...

vue3 + naive ui card header 和 title 冲突 bug

背景描述 最近发现一个 naive ui 上的问题&#xff0c;之前好好的&#xff0c;某一次升级后就出现了一个 bug&#xff0c;Modal 使用 card 布局后&#xff0c;Header Solt 下面的内容不见了&#xff0c;变成了 title&#xff0c;因为这个 solt 里面是有操作 action 的&#xf…...

Ubuntu 22.04.5 LTS配置 bond

本次纯实验&#xff0c;不会讲解bond功能&#xff0c;配置bond mode 1 和 mode 4 如何配置 确定内核模块是否加载 实验使用root用户权限&#xff0c;非root用户使用sudo 调用root权限 rootubuntu22:~# lsmod | grep bonding rootubuntu22:~# modprobe bonding rootubuntu22:~# …...

100种算法【Python版】第58篇——滤波算法之卡尔曼滤波

本文目录 1 算法步骤2 算法示例2.1 示例描述2.2 python代码3 算法应用:二维运动目标跟踪问题滤波算法是用于从信号中提取有用信息、去除噪声或估计系统状态的技术。在时间序列分析、信号处理和控制系统中,滤波算法起着关键作用。 1 算法步骤 卡尔曼滤波(Kalman Filter)的…...

关于几种卷积

1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权&#xff0c;对于一个通道来说&#xff0c;每个像素点加权是一样的&am…...

51单片机教程(五)- LED灯闪烁

1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…...

VUE3中Element table表头动态展示合计信息(不是表尾合计)

一、背景 原型上需要对两个字段动态合计&#xff0c;输出摘要信息 原先想到是的Element的 :summary-method&#xff0c;发现不是动态&#xff0c;所以换监听来实现 二、vue代码 <el-table v-model"loading" :data"itemList"><el-table-column la…...

寿光市网站建设/太原seo网站管理

其实国内有很多的大网盘&#xff0c;也有很多用户在用。比如360网盘&#xff0c;百度网盘&#xff0c;等等。但是谁都无法确定国内的服务器会不会奔溃等情况&#xff0c;这时候我们可以使用OwnCloud建立自己的私有的存储网盘 OwnCloud概述&#xff1a; OwnCloud是一个开源免费…...

网站空间租用费用/昆山seo网站优化软件

PPT的制作与美化已成为当下职场人必备的一项技能。在PPT制作中&#xff0c;排版往往是最为难的一个环节。可以说排版的好坏直接决定一份PPT质量的高低。今天整理了几个PPT制作超实用的小技巧&#xff0c;虽然看上去不起眼&#xff0c;但是可以提升小伙伴们的工作效率&#xff0…...

如何用flash做网站/营销技巧培训

环境&#xff1a;VC toolkit 2003 SystemC 2.0.1 为了找出SystemC定义了哪些全局变量/静态变量&#xff0c;我在crt/src/crt0dat.c的 void _initterm(_PVFV * pfbegin, _PVFV * pfend) 函数中设下断点&#xff0c;at Line 598&#xff1a; if ( *pfbegin ! NULL ) …...

云服务器做网站好吗/手机seo关键词优化

时间戳与时间之间的转换&#xff0c;需要一个中间过程&#xff0c;即将先将时间或时间戳先转为时间元组&#xff01; 1、时间转时间戳&#xff1a; import datetime, time s datetime.datetime(2016,6,22) time.mktime(s.timetuple())# 1466524800.0 2、时间戳转时间: timeTup…...

阿里云做网站可以免备案吗/seo综合查询工具有什么功能

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff0c;支付清算体系的简介 支付清算体系是一个国家的金融基础设施&#xff0c;或说公共服务。我国由央行主管此事&#xff0c;目前大体维持“结算-清算”二级制的支付体系。通俗地讲&#xff0c;银行与商户、消费…...

厦门百度推广排名优化/seo优化6个实用技巧

1、因果图 鱼骨图 输入与输入关系&#xff1a;异、或、唯一、要求 输入与输出关系&#xff1a;恒等、非、与、或 2、正交试验表 因子&#xff1a;所有参与试验的影响试验结果的条件称为因子 水平&#xff1a;影响试验因子的取值或输入称为水平 整齐可比&#xff1a;在同…...