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

YOLOv5与YOLOv8 训练准备工作(不包含环境搭建)

前言:我发现除了安装环境需要耗费大量时间以外,对于训练前的准备工作也要琢磨一段时间,所以本篇主要讲一下训练前需要准备的工作(主要是XML格式换为txt,以及划分数据集验证集,和训练参数的设置),我在这里都总结一下,留给下次训练的我查看,以及广大网友参考。(默认一些基础的环境例如(CUDA.pytorch.torchvision.opencv)已经搭建好以及安装完requirements)2024.8.6

YOLOv5:

XML格式换为txt,以及划分数据集验证集:

1.首先需要准备好图片(需要训练的图片)和标签(通过labelimg打完标签)按照以下目录存放:
                                         
格式如下:(需要自己完整地创造出以下目录,方便后续进行)
|——VOCdevkit
||——images
        ——train  (空)     
        ——val    (空)
||——labels
        ——train  (空)
        ——val    (空)
||——VOC2007
        ——Annotations  (放置自己的标签XML文件)
        ——JPEGImages   (放置自己的训练图片)
        ——label  (空)  

2.然后在yolov5-5.0目录下(位置不重要)创建xml转YOLO.py 复制粘贴代码↓

代码如下: (没有安装包就pip Install一下)

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import joindef convert(size, box):x_center = (box[0] + box[1]) / 2.0y_center = (box[2] + box[3]) / 2.0x = x_center / size[0]y = y_center / size[1]w = (box[1] - box[0]) / size[0]h = (box[3] - box[2]) / size[1]return (x, y, w, h)def convert_annotation(xml_files_path, save_txt_files_path, classes):xml_files = os.listdir(xml_files_path)print(xml_files)for xml_name in xml_files:print(xml_name)xml_file = os.path.join(xml_files_path, xml_name)out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')out_txt_f = open(out_txt_path, 'w')tree = ET.parse(xml_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))# b=(xmin, xmax, ymin, ymax)print(w, h, b)bb = convert((w, h), b)out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')if __name__ == "__main__":# 需要转换的类别,需要一一对应  替换为自己的类别classes1 = ['red', 'green','blue','bottle']  # 2、voc格式的xml标签文件路径 替换为自己的标签文件文件xml(Annotations)所在绝对路径xml_files1 = r'D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\VOC2007\Annotations'# 3、转化为yolo格式的txt标签文件存储路径  替换为自己想要储存txt标签文件的路径 (label) save_txt_files1 = r'D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\VOC2007\label'convert_annotation(xml_files1, save_txt_files1, classes1)

注:修改一下classes1    xml_files1    save_txt_files1 替换为自己的路径

运行过后会得到自己的txt文件:

                                                      

3.然后把JPEGImages 里的图片和刚刚转换好的label里的文件分别复制到 images/train || labels/train这两个地方:

                            

4.然后在yolov5-5.0目录下(位置不重要)创建划分数据集和验证集.py  复制粘贴代码↓

import os, random, shutildef moveimg(fileDir, tarDir):pathDir = os.listdir(fileDir)  # 取图片的原始路径filenumber = len(pathDir)rate = 0.1  # 自定义抽取图片的比例,比方说100张抽10张,那就是0.1picknumber = int(filenumber * rate)  # 按照rate比例从文件夹中取一定数量图片sample = random.sample(pathDir, picknumber)  # 随机选取picknumber数量的样本图片print(sample)for name in sample:shutil.move(fileDir + name, tarDir + "\\" + name)returndef movelabel(file_list, file_label_train, file_label_val):for i in file_list:if i.endswith('.jpg'):# filename = file_label_train + "\\" + i[:-4] + '.xml'  # 可以改成xml文件将’.txt‘改成'.xml'就可以了filename = file_label_train + "\\" + i[:-4] + '.txt'  # 可以改成xml文件将’.txt‘改成'.xml'就可以了if os.path.exists(filename):shutil.move(filename, file_label_val)print(i + "处理成功!")if __name__ == '__main__':fileDir = r"D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\images\train" + "\\"  # 源图片文件夹路径tarDir = r'D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\images\val'  # 图片移动到新的文件夹路径moveimg(fileDir, tarDir)file_list = os.listdir(tarDir)file_label_train = r"D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\labels\train"  # 源图片标签路径file_label_val = r"D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\labels\val"  # 标签# 移动到新的文件路径movelabel(file_list, file_label_train, file_label_val)

注:修改一下

fileDir   = ——\VOCdevkit\images\train           (images\train 所在的绝对路径)

tarDir    = ——\VOCdevkit\images\val               (images\val 所在的绝对路径)

file_label_train   = ——\VOCdevkit\labels\train      (labels\train 所在的绝对路径)

file_label_val      =——\VOCdevkit\labels\val         (labels\val 所在的绝对路径)

运行代码即可得到训练集和验证集

训练参数设置:

1.在data文件夹下创建xxx.yaml :可以复制随便一个yaml文件然后改个名字(我的为GKS.yaml)和内容

                                                         

内容如下:(具体看注释)

# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC/
# Train command: python train.py --data voc.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /VOC
#     /yolov5# download command/URL (optional)
#download: bash data/scripts/get_voc.sh# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\images\train  # 存放自己的训练集
val: D:\yolov5\yolov5-5.0\yolov5-5.0\VOCdevkit\images\val      # 存放自己的验证集# number of classes
nc: 4        #自己的标签分类个数 在这里我的是四个  ↓# class names
names: [ 'red','green','blue','bottle' ]  #标签分类名字 最好按照固定的顺序

然后进入如下目录:

                                             

复制yolov5s.yaml(根据自己所需模型大小选择)   改名为xxx.yaml(这里我的为yolov5_GKS.yaml)

其他都不动,修改nc:xxx(修改为你的标签分类数量,我的是4)

至此基本内容已经准备好了!

然后进入 train.py

 改一下这几个路径,对应上面自己定义的yaml文件夹即可

parser.add_argument("--weights", type=str, default="D:\yolov5\yolov5-master\weights\yolov5s.pt", help="initial weights path")  #权重文件需要自己下载
parser.add_argument("--cfg", type=str, default="D:\yolov5\yolov5-master\models\yolov5_GKS.yaml", help="model.yaml path")   #在models下的yaml文件
parser.add_argument("--data", type=str, default="D:\yolov5\yolov5-master\data\GKS.yaml", help="dataset.yaml path")          #在data下的yaml文件

其他参数可以看网上的自定义

至此可以开始训练了!

YOLOv8:

相比于YOLOv5 YOLOv8配置更简单一些:

XML格式换为txt,以及划分数据集验证集:

1.首先在yolov8目录下新建文件data                                                         D:\yolov8\data 
2.在data下创建images文件夹用于存放                                                     D:\yolov8\data\images (把训练图片放在这里面)
3.在data下创建Annotations文件夹用于存放打标签xml文件                         D:\yolov8\data\Annotations (把训练xml文件放在这里面)
4.在data下创建labels文件夹用于存放YOLO格式txt文件                     D:\yolov8\data\labels (暂时为空)

整体结构如下:

2.在data下创建:1.XML转TXT格式.py 文件 

复制黏贴以下代码进行XML格式转化为TXT格式:      (具体细节看注释)

import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import joinclasses = ['red','green','blue','bottle']  #修改自己的训练分类def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(xmlpath, xmlname):with open(xmlpath, "r", encoding='utf-8') as in_file:txtname = xmlname[:-4] + '.txt'txtfile = os.path.join(txtpath, txtname)tree = ET.parse(in_file)root = tree.getroot()filename = root.find('filename')img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)h, w = img.shape[:2]res = []for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:classes.append(cls)cls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))if len(res) != 0:with open(txtfile, 'w+') as f:f.write('\n'.join(res))if __name__ == "__main__":postfix = 'jpg'imgpath = 'D:\yolov8\data\images'          #修改为自己images的绝对路径xmlpath = 'D:\yolov8\data\Annotations'     #修改为自己Annotations的绝对路径txtpath = 'D:\yolov8\data\labels'          #修改为自己要储存的txt文件的绝对路径if not os.path.exists(txtpath):os.makedirs(txtpath, exist_ok=True)list = os.listdir(xmlpath)error_file_list = []for i in range(0, len(list)):try:path = os.path.join(xmlpath, list[i])if ('.xml' in path) or ('.XML' in path):convert_annotation(path, list[i])print(f'file {list[i]} convert success.')else:print(f'file {list[i]} is not xml format.')except Exception as e:print(f'file {list[i]} convert error.')print(f'error message:\n{e}')error_file_list.append(list[i])print(f'this file convert failure\n{error_file_list}')print(f'Dataset Classes:{classes}')

运行完后会发现labels文件夹下会多出txt文件,这就代表成功了!

2.在data下创建:2.划分测试训练验证集.py 文件

复制黏贴以下代码进行训练集测试集验证集的划分:

# coding=gb2312
import os
import random
import shutil# 原数据集目录
root_dir = 'D:\yolov8\data'      #改为data文件夹的绝对路径
# 划分比例
train_ratio = 0.7
valid_ratio = 0.2
test_ratio = 0.1# 设置随机种子
random.seed(42)# 拆分后数据集目录
split_dir = 'D:\yolov8\data'     #改为data文件夹的绝对路径 (跟上面是同一个路径)
os.makedirs(os.path.join(split_dir, 'train', 'images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'train', 'labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid', 'images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid', 'labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test', 'images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test', 'labels'), exist_ok=True)# 获取图片文件列表
image_files = os.listdir(os.path.join(root_dir, 'images'))
label_files = os.listdir(os.path.join(root_dir, 'labels'))# 随机打乱文件列表
combined_files = list(zip(image_files, label_files))
random.shuffle(combined_files)
image_files_shuffled, label_files_shuffled = zip(*combined_files)# 根据比例计算划分的边界索引
train_bound = int(train_ratio * len(image_files_shuffled))
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))# 定义移动函数
def move_files(src_image_dir, src_label_dir, dest_image_dir, dest_label_dir, files):for image_file, label_file in files:src_image_path = os.path.join(src_image_dir, image_file)src_label_path = os.path.join(src_label_dir, label_file)dest_image_path = os.path.join(dest_image_dir, image_file)dest_label_path = os.path.join(dest_label_dir, label_file)shutil.copyfile(src_image_path, dest_image_path)shutil.copyfile(src_label_path, dest_label_path)# 移动文件到划分后的目录
move_files(os.path.join(root_dir, 'images'), os.path.join(root_dir, 'labels'),os.path.join(split_dir, 'train', 'images'), os.path.join(split_dir, 'train', 'labels'),combined_files[:train_bound])move_files(os.path.join(root_dir, 'images'), os.path.join(root_dir, 'labels'),os.path.join(split_dir, 'valid', 'images'), os.path.join(split_dir, 'valid', 'labels'),combined_files[train_bound:valid_bound])move_files(os.path.join(root_dir, 'images'), os.path.join(root_dir, 'labels'),os.path.join(split_dir, 'test', 'images'), os.path.join(split_dir, 'test', 'labels'),combined_files[valid_bound:])

执行完后即可得到此次训练所需要的训练集、测试集、验证集了!

目录如下:

训练参数设置:

跟YOLOv5一样,本次我们需要准备两个yaml文件如图所示:

一个是xxx.yaml (我的叫data.yaml)训练集验证集测试集路径文件:

可以首先复制黏贴任意一个xxx.yaml文件到data目录下,然后删除所有内容再直接复制以下代码: 

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
train: D:\yolov8\data\train # 改为自己的训练集的绝对路径
val: D:\yolov8\data\valid # 改为自己的验证集的绝对路径
test: D:\yolov8\data\test # 改为自己的测试集的绝对路径nc: 4  #改为训练类别个数# Classes
names: ['red','green','blue','bottle']  #改为自己的训练类别名字

                                                                注意看注释

一个是xxx.yaml (我的叫yolov8n.yaml)训练集验证集测试集路径文件如下图所示:

可以复制这个路径下的文件(可选择自己的模型,我选的是yolov8.yaml)到data目录下,改为自己想要的名字,然后只需要修改nc:xxx为自己训练类别个数即可

然后我们还需要从官网上下载一个yolov8n.pt 文件到data目录下

官方网址如下:

https://github.com/ultralytics/ultralytics?tab=readme-ov-fileicon-default.png?t=N7T8https://github.com/ultralytics/ultralytics?tab=readme-ov-file点YOLOv8n 下载权重文件放到data目录下

至此我们的文件目录应该长这样:

然后如果我们要训练,直接在终端执行如下代码:

yolo task=detect mode=train model=D:\yolov8\data\yolov8n.yaml  data=D:\yolov8\data\data.yaml epochs=300 workers=5 device=0

其中model = yolov8n.yaml的绝对路径 data = data.yaml的绝对路径 epochs为训练轮数 device = 0代表使用GPU训练 如果没有可以去掉device = 0

至此就已经可以开始训练了!

附上摄像头检测代码:

import cv2
from ultralytics import YOLO# 模型加载权重
model = YOLO(r'xxx\weights\best.pt')  #训练出最好的权重绝对路径
# 视频路径
cap = cv2.VideoCapture(0)
# 对视频中检测到目标画框标出来
while cap.isOpened():# Read a frame from the videosuccess, frame = cap.read()if success:# Run YOLOv8 inference on the frameresults = model(frame,conf=0.7)# Visualize the results on the frameannotated_frame = results[0].plot()# Display the annotated framecv2.imshow("YOLOv8 Inference", annotated_frame)# Break the loop if 'q' is pressedif cv2.waitKey(1) & 0xFF == ord("q"):breakelse:# Break the loop if the end of the video is reachedbreak# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

如有不懂希望可以在评论区多多交流!谢谢!

相关文章:

YOLOv5与YOLOv8 训练准备工作(不包含环境搭建)

前言:我发现除了安装环境需要耗费大量时间以外,对于训练前的准备工作也要琢磨一段时间,所以本篇主要讲一下训练前需要准备的工作(主要是XML格式换为txt,以及划分数据集验证集,和训练参数的设置)…...

字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真

前期我们介绍过很多语音合成的模型,比如ChatTTS,微软语音合成大模型等,随着大模型的不断进步,其合成的声音基本跟真人没有多大的区别。本期介绍的是字节跳动自家发布的语音合成模型Seed-TTS。 Seed-TTS 推理包含四个功能模块&…...

微信小程序教程011-3:京西购物商城实战之Home页实现

文章目录 3、首页3.0 创建home分支3.1 配置网络请求3.2 轮播图区域3.2.1 请求轮播图的数据3.2.2 渲染轮播图的UI结构3.2.3 配置小程序分包3.2.4 点击轮播图跳转到商品详情页3.2.5 封装 uni.$showMsg() 方法3.3 分类导航区域3.3.1 获取分类导航的数据3.3.2 渲染分类导航的UI结构…...

使用 Manim 创建一个二维坐标平面【NumberPlane】

NumberPlane 是 Manim 中用于创建一个二维坐标平面的类。它可以帮助用户在场景中可视化坐标轴、网格线以及其他数学概念。具体来说,它的功能包括: 坐标轴:NumberPlane 提供了 x 轴和 y 轴,通常是中心对称的,允许用户清…...

Android.mk(TODO)

Android.mk 文件是 Android 构建系统(基于 GNU Make)的一个核心部分,用于定义如何构建项目中的模块。在 Android 中,Android.mk 文件主要用于描述本地模块(如库、可执行文件等)的构建信息。以下是 Android.…...

WPF datagrid 选中某一行后让第一列的checkbox选中

在 WPF 中的 DataGrid 中,如果希望在选中某一行后让该行的第一列中的 CheckBox 选中,可以通过绑定和事件处理来实现。以下是具体的步骤: 绑定数据:确保 DataGrid 的数据源绑定到一个支持 INotifyPropertyChanged 接口的集合。模板…...

洛谷 P1347 排序(福建省历届夏令营)(图论:拓扑排序)

题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列&#xff0c;例如&#xff0c;一个有序的数列 A,B,C,D表示 A<B,B<C,C<D。在这道题中&#xff0c;我们将给你一系列形如 A<B的关系&#xff0c;并要求你判断是否能够根据这些关系确定这个…...

Redis 缓存击穿、穿透、雪崩

1. 缓存击穿 问题描述&#xff1a; 缓存击穿是指缓存中没有但数据库中有的数据&#xff08;一般是缓存时间到期&#xff09;&#xff0c;这时由于并发用户特别多&#xff0c;同时读缓存没读到数据&#xff0c;又都去数据库去取数据&#xff0c;引起数据库压力瞬间增大&#xf…...

使用开源RustDesk部署远程控制服务

使用开源RustDesk部署远程控制服务 文档编写时间&#xff1a;2024/8/1 一、部署环境 操作系统&#xff1a;Ubuntu 2204 LTS IP地址&#xff1a;192.168.108.115 开源软件项目地址&#xff1a;rustdesk/rustdesk-server: RustDesk Server Program (github.com) 参考文档&a…...

Coco-LIC基于ubuntu的vscode进行断点调试

1、下vscode和插件 参考这个也行 https://zhuanlan.zhihu.com/p/704522656 2、编译debug版本并修改json 要在 Visual Studio Code (VSCode) 中进行断点调试 ROS 任务&#xff0c;你需要进行以下几个步骤&#xff1a; ### 1. 安装所需插件 - **C/C 插件**: 提供对 C 代码的调试…...

【Web】从TFCCTF-FUNNY浅析PHPCGI命令行注入漏洞利用

目录 背景 CVE-2012-1823 发散利用 法一&#xff1a;读文件 法二&#xff1a;数据外带 背景 CVE-2012-1823 PHP-CGI远程代码执行漏洞&#xff08;CVE-2012-1823&#xff09;分析 | 离别歌 省流&#xff1a; 命令行参数不光可以通过#!/usr/local/bin/php-cgi -d include…...

对比一下在 OpenCV 和 AE 中如何实现常用效果 [精]

确实&#xff0c;Adobe After Effects (AE) 也是一个功能强大的工具&#xff0c;特别擅长处理图像和视频的视觉效果和动画。很多在 OpenCV 中实现的图像处理和增强效果&#xff0c;AE 也可以轻松完成&#xff0c;甚至以更加直观的方式实现。下面对比一下在 OpenCV 和 AE 中如何…...

docker安装及使用

一、docker优点及作用 优点&#xff1a; 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用&#xff1a;资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…...

HTML前端面试基础(一)

HTML面试题可以涵盖多个方面&#xff0c;包括HTML基础、HTML5新特性、标签语义化、元素分类、属性理解等。以下是一些常见的HTML面试题及其简要答案&#xff1a; 1. HTML基础 问题&#xff1a; 请解释一下HTML文档的基本结构。 答案&#xff1a; HTML文档的基本结构包括<…...

[Git][多人协作][下]详细讲解

目录 1.不同分支下多人协作2.远程分⽀删除后&#xff0c;本地git branch -a依然能看到 1.不同分支下多人协作 ⼀般情况下&#xff0c;如果有多需求需要多⼈同时进⾏开发&#xff0c;是不会在⼀个分⽀上进⾏多⼈开发&#xff0c;⽽是⼀个需求或⼀个功能点就要创建⼀个feature分…...

MySQL笔记(七):索引

一、索引优化速度 创建对应字段的索引&#xff0c;只对该列有效&#xff0c;只能提高该列的查询速度 创建索引后&#xff0c;查询速度变快&#xff0c;但是表占用空间变大 create index 索引名 on 表名(需要创建索引的列)二、索引的原理 普通索引允许该字段重复 全文索引&#…...

JS 原型和原型链

构造函数 封装是面向对象思想中比较重要的一部分&#xff0c;js 面向对象可以通过构造函数实现的封装。 同样的将变量和函数组合到了一起并能通过 this 实现数据的共享&#xff0c;所不同的是 JS 借助构造函数创建出来的实例对象之间是彼此不影响的 存在浪费内存的问题&#…...

【无标题】图像增强技术:直方图均衡化、拉普拉斯算子、对数变换与伽马变换

图像增强技术&#xff1a;直方图均衡化、拉普拉斯算子、对数变换与伽马变换 在图像处理领域&#xff0c;图像增强是一种关键技术&#xff0c;用于提升图像的视觉效果和质量。本文将介绍四种常用的图像增强方法&#xff1a;直方图均衡化、拉普拉斯算子、对数变换和伽马变换。我…...

自动化专业英语

前言 电子信息、电气工程、自动化专业英语词汇汇总&#xff0c;不定期更新 常用 Asynchronous&#xff1a;异步synchronous&#xff1a;同步notification&#xff1a;通知blade&#xff1a;平面shaft&#xff1a;轴magnetic&#xff1a;磁场的bearing&#xff1a;轴承valve&…...

如何使用 Python 进行数据可视化,比如绘制折线图?

要使用Python进行数据可视化&#xff0c;可以使用matplotlib库来绘制折线图。以下是一个简单的示例代码&#xff1a; 首先&#xff0c;确保已安装matplotlib库。可以使用以下命令安装&#xff1a; pip install matplotlib在Python脚本中导入matplotlib库&#xff1a; import…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...