[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)
之前写了一个基于YOLOv8z做旋转目标检测的文章,内容写得不够好,内容也比较杂乱。现如今YOLO已经更新到11了,数据集也集齐了无人机和卫星的农业大棚,所以这次就写一个基于YOLO11 OBB的农业大棚旋转检测。
1. 下载源码配置环境
在https://github.com/ultralytics/ultralytics网页下载YOLO11源码,解压缩后创建虚拟环境即可,环境创建不是很难,这里就不细说了。
2. 数据集准备
2.1 数据标注
这里我使用LabelImg2标注无人机和卫星影像,我是在一整张大幅影像上对影像中的农业大棚进行标注的,最后面使用算法将影像裁剪成合适的尺寸用于训练,后面会详细介绍整个流程。

卫星影像中的农业大棚

无人机影像中的农业大棚
在LabelImg2上标注好数据,LabelImg2标注是五点式,即旋转框的中心x,y坐标、旋转框的长度和宽度、旋转角度。如下图所示:

影像大小为 7176 X 5080 ,影像为RGB3通道,标注了两个旋转框,旋转框标签为默认的"dog"
2.2 XML标注文件转DOTA格式标签文件(TXT)
新建一个名为roxml_to_dota.py的python脚本,复制粘贴下面的代码:
# 文件名称 :roxml_to_dota.py
# 功能描述 :把rolabelimg标注的xml文件转换成dota能识别的xml文件,
# 再转换成dota格式的txt文件
# 把旋转框 cx,cy,w,h,angle,或者矩形框cx,cy,w,h,转换成四点坐标x1,y1,x2,y2,x3,y3,x4,y4
import os
import xml.etree.ElementTree as ET
import mathcls_list = ['dog'] # 修改为自己的标签def edit_xml(xml_file, dotaxml_file):"""修改xml文件:param xml_file:xml文件的路径:return:"""# dxml_file = open(xml_file,encoding='gbk')# tree = ET.parse(dxml_file).getroot()tree = ET.parse(xml_file)objs = tree.findall('object')for ix, obj in enumerate(objs):x0 = ET.Element("x0") # 创建节点y0 = ET.Element("y0")x1 = ET.Element("x1")y1 = ET.Element("y1")x2 = ET.Element("x2")y2 = ET.Element("y2")x3 = ET.Element("x3")y3 = ET.Element("y3")# obj_type = obj.find('bndbox')# type = obj_type.text# print(xml_file)if (obj.find('robndbox') == None):obj_bnd = obj.find('bndbox')obj_xmin = obj_bnd.find('xmin')obj_ymin = obj_bnd.find('ymin')obj_xmax = obj_bnd.find('xmax')obj_ymax = obj_bnd.find('ymax')# 以防有负值坐标xmin = max(float(obj_xmin.text), 0)ymin = max(float(obj_ymin.text), 0)xmax = max(float(obj_xmax.text), 0)ymax = max(float(obj_ymax.text), 0)obj_bnd.remove(obj_xmin) # 删除节点obj_bnd.remove(obj_ymin)obj_bnd.remove(obj_xmax)obj_bnd.remove(obj_ymax)x0.text = str(xmin)y0.text = str(ymax)x1.text = str(xmax)y1.text = str(ymax)x2.text = str(xmax)y2.text = str(ymin)x3.text = str(xmin)y3.text = str(ymin)else:obj_bnd = obj.find('robndbox')obj_bnd.tag = 'bndbox' # 修改节点名obj_cx = obj_bnd.find('cx')obj_cy = obj_bnd.find('cy')obj_w = obj_bnd.find('w')obj_h = obj_bnd.find('h')obj_angle = obj_bnd.find('angle')cx = float(obj_cx.text)cy = float(obj_cy.text)w = float(obj_w.text)h = float(obj_h.text)angle = float(obj_angle.text)obj_bnd.remove(obj_cx) # 删除节点obj_bnd.remove(obj_cy)obj_bnd.remove(obj_w)obj_bnd.remove(obj_h)obj_bnd.remove(obj_angle)x0.text, y0.text = rotatePoint(cx, cy, cx - w / 2, cy - h / 2, -angle)x1.text, y1.text = rotatePoint(cx, cy, cx + w / 2, cy - h / 2, -angle)x2.text, y2.text = rotatePoint(cx, cy, cx + w / 2, cy + h / 2, -angle)x3.text, y3.text = rotatePoint(cx, cy, cx - w / 2, cy + h / 2, -angle)# obj.remove(obj_type) # 删除节点obj_bnd.append(x0) # 新增节点obj_bnd.append(y0)obj_bnd.append(x1)obj_bnd.append(y1)obj_bnd.append(x2)obj_bnd.append(y2)obj_bnd.append(x3)obj_bnd.append(y3)tree.write(dotaxml_file, method='xml', encoding='utf-8') # 更新xml文件# 转换成四点坐标
def rotatePoint(xc, yc, xp, yp, theta):xoff = xp - xc;yoff = yp - yc;cosTheta = math.cos(theta)sinTheta = math.sin(theta)pResx = cosTheta * xoff + sinTheta * yoffpResy = - sinTheta * xoff + cosTheta * yoffreturn str(int(xc + pResx)), str(int(yc + pResy))def totxt(xml_path, out_path):# 想要生成的txt文件保存的路径,这里可以自己修改files = os.listdir(xml_path)i = 0for file in files:tree = ET.parse(xml_path + os.sep + file)root = tree.getroot()name = file.split('.')[0]output = out_path + '\\' + name + '.txt'file = open(output, 'w')i = i + 1objs = tree.findall('object')for obj in objs:cls = obj.find('name').textbox = obj.find('bndbox')x0 = int(float(box.find('x0').text))y0 = int(float(box.find('y0').text))x1 = int(float(box.find('x1').text))y1 = int(float(box.find('y1').text))x2 = int(float(box.find('x2').text))y2 = int(float(box.find('y2').text))x3 = int(float(box.find('x3').text))y3 = int(float(box.find('y3').text))if x0 < 0:x0 = 0if x1 < 0:x1 = 0if x2 < 0:x2 = 0if x3 < 0:x3 = 0if y0 < 0:y0 = 0if y1 < 0:y1 = 0if y2 < 0:y2 = 0if y3 < 0:y3 = 0for cls_index, cls_name in enumerate(cls_list):if cls == cls_name:file.write("{} {} {} {} {} {} {} {} {} {}\n".format(x0, y0, x1, y1, x2, y2, x3, y3, cls, cls_index))file.close()# print(output)print(i)if __name__ == '__main__':# -----**** 第一步:把xml文件统一转换成旋转框的xml文件 ****-----roxml_path = r'D:\data\yolov8_obb\origin_xml' # labelimg2标注生成的原始xml文件路径dotaxml_path = r'D:\data\yolov8_obb\dota_xml' # 转换后dota能识别的xml文件路径,路径需存在,不然报错out_path = r'D:\data\yolov8_obb\dota_txt' # 转换后dota格式的txt文件路径,路径需存在,不然报错filelist = os.listdir(roxml_path)for file in filelist:edit_xml(os.path.join(roxml_path, file), os.path.join(dotaxml_path, file))# -----**** 第二步:把旋转框xml文件转换成txt格式 ****-----totxt(dotaxml_path, out_path)
注意事项:
【1】运行代码之前将cls_list = ['dog'] # 修改为自己的标签,不修改也不会报错,只是转换后的TXT中将没有任何数据
【2】小心修改文件路径,别搞错了,即
if __name__ == '__main__':# -----**** 第一步:把xml文件统一转换成旋转框的xml文件 ****-----roxml_path = r'D:\data\yolov8_obb\origin_xml' # labelimg2标注生成的原始xml文件路径dotaxml_path = r'D:\data\yolov8_obb\dota_xml' # 转换后dota能识别的xml文件路径,路径需存在,不然报错out_path = r'D:\data\yolov8_obb\dota_txt' # 转换后dota格式的txt文件路径,路径需存在,不然报错filelist = os.listdir(roxml_path)for file in filelist:edit_xml(os.path.join(roxml_path, file), os.path.join(dotaxml_path, file))# -----**** 第二步:把旋转框xml文件转换成txt格式 ****-----totxt(dotaxml_path, out_path)
下面是转换后的TXT格式的标签文件(此时的标签还不是OBB数据集的格式,还需要再转换)

2.3 标签更改
我在标注的过程中使用的是LabelImg2软件中默认的标签名,即"dog"。在这里我使用代码将其中的标签修改为自己的标签,即"dp"。
新建一个名为change_label.py的python文件,复制粘贴下面的代码:
import osdef replace_text_in_files(folder_path, old_text, new_text):# 遍历指定文件夹for filename in os.listdir(folder_path):# 检查文件是否是.txt文件if filename.endswith(".txt"):file_path = os.path.join(folder_path, filename)# 读取文件内容with open(file_path, 'r', encoding='utf-8') as file:file_data = file.read()# 替换文本updated_data = file_data.replace(old_text, new_text)# 写入更改后的内容with open(file_path, 'w', encoding='utf-8') as file:file.write(updated_data)# 调用函数,将'dog'替换为'dp'
replace_text_in_files(r'D:\yolo11\greenhouse\roxml_to_dota\xml_to_txt', 'dog', 'dp')
下面是更改标签后的txtTXT文件内容:

2.4 DOTA格式标签文件转换为YOLO OBB训练所需的格式
(1)TIF格式影像转换为PNG格式
创建一个名为tif_to_png.py的python文件,复制粘贴下面的代码:
import os
import tifffile
from PIL import Image
import numpy as npdef tif2png_high_quality(tif_folder, png_folder):"""将tif文件夹中的所有tif图像转换为png图像,并尽可能保持图像质量。Args:tif_folder: 包含tif图像的文件夹路径。png_folder: 保存png图像的文件夹路径。"""if not os.path.exists(png_folder):os.makedirs(png_folder)for filename in os.listdir(tif_folder):if filename.endswith(".tif") or filename.endswith(".tiff"):tif_filepath = os.path.join(tif_folder, filename)png_filepath = os.path.join(png_folder, filename.replace(".tif", ".png").replace(".tiff", ".png"))try:# 使用tifffile库读取tif图像,可以更好地处理各种tif格式和元数据tif_image = tifffile.imread(tif_filepath)# 如果tif图像是多通道的,需要进行一些处理,例如转换为RGB图像或者分别保存每个通道if tif_image.ndim == 3 and tif_image.shape[2] > 3: #处理多波段图像,例如大于3个波段的遥感图像# 可以选择需要的波段合成RGB图像,或者保存所有波段为单独的png文件# 这里以合成RGB图像为例,假设前三个波段是RGB波段tif_image = tif_image[:,:,:3] # 取前三个波段tif_image = np.clip(tif_image, 0, 255).astype(np.uint8) # 裁剪像素值到0-255,并转换为uint8类型img = Image.fromarray(tif_image)elif tif_image.dtype == np.uint16: #16位图像处理,转换为8位img = Image.fromarray((tif_image / 256).astype(np.uint8))else: # 其他情况直接转换img = Image.fromarray(tif_image)# 使用 Pillow 库保存 png 图像, 可以指定更高的压缩质量img.save(png_filepath, "PNG", compress_level=1) # compress_level 1 表示最小压缩,质量最高print(f"已将 {tif_filepath} 转换为 {png_filepath}")except Exception as e:print(f"转换 {tif_filepath} 时出错: {e}")# 示例用法:
tif_folder = "tif_images" # 替换为你的tif图像文件夹路径
png_folder = "png_images" # 替换为你想保存png图像的文件夹路径
tif2png_high_quality(tif_folder, png_folder)
设置好图像文件夹路径,将TIF图像转换为PNG格式的图像
(2)在项目代码目录下面创建下面的文件夹结构,然后将划分好的图像和标签文件放到相应的文件夹中 (这里我直接使用v8教程里面的图)


(3)编写转换标注格式的代码
创建一个名为convert_dota_to_yolo_obb.py的python文件,复制粘贴下面的代码:
import syssys.path.append('D:\yolo11')from ultralytics.data.converter import convert_dota_to_yolo_obbconvert_dota_to_yolo_obb('D:\yolo11\greenhouse\data')
由于官方源码转换代码用的是VOC数据集,所以这里我们需要修改ultralytics/data/
converter.py中的类别名,改成自己的数据集类别名。修改ultralytics/data/converter.py中的代码

转换后的OBB数据集格式的标签会保存在labels\train和labels\val中(训练需要使用的就是这两个文件夹,train_original和val_original用不到)

转换后的OBB数据集格式的标签文件中的内容

2.5 png格式影像裁剪
在项目代码目录下面创建下面的文件夹结构,然后将OBB格式的标签文件和对应的图像放到相应的文件夹中 (里面的train_original和val_original文件夹不需要,截图里面多余了)


创建一个名为split_images.py的python文件,复制粘贴下面的代码:
from ultralytics.data.split_dota import split_test, split_trainval# 分割训练集和验证集,同时包含标签。标签需要是YOLO格式的,
# 即:0 0.332813 0.164062 0.403125 0.15 0.45 0.373437 0.379688 0.389062
#
# @param data_root str,数据根目录的路径。
# @param save_dir str,保存分割后数据集的目录路径。
# @param rates list,用于设定不同尺度分割比例的列表,例如[0.5, 1.0, 1.5]表示三个尺度。
# @param gap int,设定在数据集中间隔多少个样本进行一次分割。
split_trainval(data_root=r"D:\yolo11\datasets",save_dir=r"D:\yolo11\DOTAv1.0-split",rates=[1.0, 1.5], # multiscale 1.0(640x640) 1.5(426x426)gap=100,
)# 分割测试集,不包含标签。
#
# @param data_root str,数据根目录的路径。
# @param save_dir str,保存分割后数据集的目录路径。
# @param rates list,用于设定不同尺度分割比例的列表,例如[0.5, 1.0, 1.5]表示三个尺度。
# @param gap int,设定在数据集中间隔多少个样本进行一次分割。
split_test(data_root=r"D:\yolo11\datasets",save_dir=r"D:\yolo11\DOTAv1.0-split",rates=[1.0, 1.5], # multiscalegap=100,
运行代码之前记得调整导入函数的参数,运行代码之后裁剪的图像和对应的标注文件会在DOTAv1.0-split文件夹中
这里我其实有点疑惑,我原本是想把所有图像裁剪了再划分数据集,但是这里按照ultralytics里面的代码意思,似乎是先将所有的大幅影像先划分为训练影像、验证影像和测试影像,裁剪之后即是对应的数据集,但是先将所有的大幅影像先划分为训练影像、验证影像和测试影像的做法似乎不太科学,因为这样的话每个数据集中的图像差异可能比较大,我觉得可能不如裁剪之后随机划分数据集的做法,个人目前比较粗浅的看法。。。
2.6 挑选有标签的图像
裁剪得到的图像数量和标签数量是不匹配的,有些没有标签的图像没有舍弃掉。所有这里需要写个算法将有标签的图像挑选出来,与标签一一对应。
创建一个名为pick_images.py的python文件,复制粘贴下面的代码:
import os
import shutil# 定义路径
labels_dir = '/yolo11/greenhouse/DOTAv1.0-split/labels/train'
images_dir = '/yolo11/greenhouse/DOTAv1.0-split/images/train'
pick_dir = '/yolo11/greenhouse/DOTAv1.0-split/images/pick'# 确保 pick_dir 存在
os.makedirs(pick_dir, exist_ok=True)# 获取 labels_dir 下的所有 .txt 文件
label_files = [f for f in os.listdir(labels_dir) if f.endswith('.txt')]for label_file in label_files:# 提取文件名(不包括扩展名)base_name = os.path.splitext(label_file)[0]# 构建对应的图像文件路径image_jpg_path = os.path.join(images_dir, base_name + '.jpg')image_png_path = os.path.join(images_dir, base_name + '.png')# 检查是否存在对应的图像文件if os.path.exists(image_jpg_path):# 复制图像文件到 pick_dirshutil.copy(image_jpg_path, pick_dir)print(f"已复制 {image_jpg_path} 到 {pick_dir}")elif os.path.exists(image_png_path):# 复制图像文件到 pick_dirshutil.copy(image_png_path, pick_dir)print(f"已复制 {image_png_path} 到 {pick_dir}")else:print(f"未找到与 {label_file} 对应的图像文件")
2.7 数据集划分
先构建好文件夹结构,文件夹结构如下(所有图像放在img文件夹下,所有txt放在dotatxt文件夹下)

使用下面的代码划分数据集
import os
import random
import shutilrandom.seed(42)"""
该脚本用于将给定的数据集分割成训练集和测试集。
数据集应包含图像和对应的标注文件。
脚本会按照90%训练集和10%测试集的比例进行分割,并将图像和标注文件分别复制到相应的文件夹中。
"""# 设置数据集文件夹路径和输出文件夹路径
data_folder = 'data_mouse_ro'
img_folder = 'data_mouse_ro/dataset/images'
label_folder = 'data_mouse_ro/dataset/labels'# 计算每个子集的大小
# 总文件数乘以0.9得到训练集大小,其余为测试集大小
total_files = len(os.listdir(os.path.join(data_folder, 'img')))
train_size = int(total_files * 0.9)
test_size = int(total_files - train_size)# 获取所有图像文件的文件名列表,并进行随机打乱
image_files = os.listdir(os.path.join(data_folder, 'img'))
random.shuffle(image_files)# 复制图像和标注文件到相应的子集文件夹中
# 枚举每个图像文件,根据索引决定复制到训练集还是测试集文件夹
for i, image_file in enumerate(image_files):base_file_name = os.path.splitext(image_file)[0] # 获取文件名(不包括扩展名)image_path = os.path.join(data_folder, 'img', image_file)label_path = os.path.join(data_folder, 'dotatxt', base_file_name + '.txt')# 根据索引判断文件应复制到训练集还是测试集if i < train_size:shutil.copy(image_path, os.path.join(img_folder, 'train')) # 复制图像到训练集shutil.copy(label_path, os.path.join(label_folder, 'train_original')) # 复制标注到训练集else:shutil.copy(image_path, os.path.join(img_folder, 'val')) # 复制图像到测试集shutil.copy(label_path, os.path.join(label_folder, 'val_original')) # 复制标注到测试集
3. 模型配置
4. 训练
5. 验证
写的比较急,后面再完善。。。
相关文章:
[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)
之前写了一个基于YOLOv8z做旋转目标检测的文章,内容写得不够好,内容也比较杂乱。现如今YOLO已经更新到11了,数据集也集齐了无人机和卫星的农业大棚,所以这次就写一个基于YOLO11 OBB的农业大棚旋转检测。 1. 下载源码配置环境 在h…...
【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义
文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代,安全问题已成为技术领域不可忽视的…...
Redis——个人笔记留存
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是…...
人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236
# 清理环境信息,与上课内容无关 import os os.environ["LANGCHAIN_PROJECT"] "" os.environ["LANGCHAIN_API_KEY"] "" os.environ["LANGCHAIN_ENDPOINT"] "" os.environ["LANGCHAIN_TRACING_V…...
linux上jdk1.8安装elasticsearch6.8.5踩坑总结
先在windows上下载了elasticsearch8安装成功后,本来是想在linux上也安装一个一样的版本,然后发现各种启动不了,查了一天原来jdk版本不同,需要下载不同版本的elasticsearch,我测试了8,7,6&#x…...
Three.js教程_02场景、相机与渲染器全面解析
Three.js 场景、相机与渲染器全面解析 Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 图形。本文将深入解析 Three.js 中的几个核心概念,并介绍它们的用法及拓展方法。内容包括场景、相机、渲染器、网格对象、光源、坐标轴、控制器和…...
【数据结构】动态规划-基础篇
针对动态规划问题,我总结了以下5步: 确定dp数组以及下标的含义; 递推公式; dp数组如何初始化; 遍历顺序; 打印dp数组(用来debug); 以上5步适用于任何动态规划问题&#x…...
opencv读取展示图片
import time import cv2 # 创建窗口 cv2.namedWindow(window, cv2.WINDOW_AUTOSIZE) # cv2.WINDOW_AUTOSIZE自动大小,不允许修改窗口大小 cat cv2.imread("./6.jpg", 0) # opencv默认读取bgr,0代表的是灰度图模式,1是彩色图 # 展示名字为window…...
网站访问统计A/B测试与数据分析
在网站运营中,访问统计和数据分析是优化用户体验和提高转化率的关键工具。A/B测试作为一种数据驱动的方法,能够帮助网站运营者验证设计和内容的有效性。A/B测试的基本原理是同时展示两个不同的版本(A和B),通过比较它们…...
前端开发 之 15个页面加载特效下【附完整源码】
文章目录 十二:铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三:扇形百分比加载特效1.效果展示2.HTML完整代码 十四:四色圆环显现加载特效1.效果展示2.HTML完整代码 十五:跷跷板加载特效1.效果展示2.HTML完整代码 十二ÿ…...
详解八大排序(六)------(三路划分,自省排序,归并排序外排序)
文章目录 1. 快排之三路划分1. 1 三路划分的诞生由来1. 2 三路划分的具体思路1. 3 代码实现 2. 快排之自省排序2. 1 自省排序的目的2. 2 自省排序的思路2. 3 自省排序的实现代码 3. 归并排序外排序3. 1 外排序介绍3. 2 归并排序外排序的思路3. 3 归并排序的实现代码 1. 快排之三…...
【Java从入门到放弃 之 从字节码的角度异常处理】
从字节码的角度异常处理 生成字节码Javap 命令的使用基本语法 字节码文件testTryCatchtestTryCatchFinallytestTryWithResource 如果大家对与java的异常使用还有问题或者还不太了解,建议先看一下我之前写的Java异常了解一下基本 的异常处理知识,再看这篇…...
Java虚拟机(JVM)中的元空间(Metaspace)一些关键点的总结
• 元空间的引入:在Java 8中,JVM的内存结构经历了变化,其中方法区被替代为元空间(Metaspace)。元空间用于存储类的元数据信息,包括类的名称、方法、字段等信息。 • 存储位置:与方法区不同&…...
小程序 模版与配置
WXML模版语法 一、数据绑定 1、数据绑定的基本原则 (1)在data中定义数据 (2)在WXML中使用数据 2、在data中定义页面的数据 3、Mustache语法的格式(双大括号) 4、Mustache语法的应用场景 (…...
当大的div中有六个小的div,上面三个下面三个,当外层div高变大的时候我希望里面的小的div的高也变大
问: 当大的div中有六个小的div,上面三个下面三个,当外层div高变大的时候我希望里面的小的div的高也变大 回答: 这时候我们就不能写死六个小的div的高度,否则上下的小的div的间距就会变大,因为他们的高度…...
MySQL——操作
一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删…...
Python语法之正则表达式详解以及re模块中的常用函数
正则表达式详解及re模块中的常用函数 概念、作用和步骤 概念: 本身也是一个字符串,其中的字符具有特殊含义,将来我们可以根据这个字符串【正则表达式】去处理其他的字符串,比如可以对其他字符串进行匹配,切分…...
《地球化学》
《地球化学》主要报道近代地球化学, 特别是其主要分支学科, 如岩石地球化学、元素地球化学、有机地球化学、环境地球化学、矿床地球化学、实验地球化学、生物地球化学、天体化学、计算地球化学、分析地球化学、海洋地球化学、沉积地球化学、纳米地球化学、油气地球化学和同位素…...
alpine openssl 编译
./config no-shared --prefix/usr/local/openssl apk add musl-dev gcc g apk add linux-headers ssh root 登录 编辑 SSH 配置文件 打开 SSH 配置文件 /etc/ssh/sshd_config: vi /etc/ssh/sshd_config PermitRootLogin yes...
【AI模型对比】AI新宠Kimi与ChatGPT的全面对比:技术、性能、应用全揭秘
文章目录 Moss前沿AI技术背景Kimi人工智能的技术积淀ChatGPT的技术优势 详细对比列表模型研发Kimi大模型的研发历程ChatGPT的发展演进 参数规模与架构Kimi大模型的参数规模解析ChatGPT的参数体系 模型表现与局限性Kimi大模型的表现ChatGPT的表现 结论:如何选择适合自…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
