YOLO数据集自动生成脚本

利用yolov5和模板匹配制作游戏自动化脚本 已经说了,用这个识别函数就能做到很多事了,如下:1、关闭副本提示。 阅读详情

YOLO数据集自动生成脚本

通过labelImage生成的xml转换为YOLO需要的数据集。
脚本可以自动创建YOLO的目录,并且移动文件、生成YOLO格式数据。

"""
labelImg标注的图片自动生成YOLO需要的数据集、生成训练集、验证集、测试集。
"""

import os
import math
import shutil
import xmltodict
from loguru import logger


class YoloData:
    """
    将labelImg生成的xml格式转换为YOLO数据集
    """
    classes = []
    name_map = {}

    @staticmethod
    def load_xml_file(filename: str) -> dict:
        with open(filename, mode="r", encoding='utf8') as f:
            xml = f.read()
        return xmltodict.parse(xml)['annotation']

    @classmethod
    def to_yolo_data(cls, annotation: dict) -> str:
        filename = annotation['filename']
        width, height = (float(annotation['size']["width"]), float(annotation['size']["height"]))
        classes = annotation['object']
        # 遍历所有的分类
        lines = []
        for c in classes:
            name = c['name']
            box = c['bndbox']
            x1, y1, x2, y2 = (float(box['xmin']), float(box['ymin']), float(box["xmax"]), float(box["ymax"]))
            x = f"{(x1 + x2) / (2 * width):.6f}"
            y = f"{(y1 + y2) / (2 * height):.6f}"
            w = f"{(x2 - x1) / width:.6f}"
            h = f"{(y2 - y1) / height:.6f}"
            line = ' '.join([str(len(cls.classes)), x, y, w, h])
            lines.append(line)
            if name not in cls.classes:
                cls.classes.append(name)
        return "\n".join(lines)

    @classmethod
    def save_classes(cls, path: str):
        with open(path, mode='w', encoding='utf8') as f:
            f.write("\n".join(cls.classes))

    @classmethod
    def main(cls, img_path: str, xml_path: str, folder: str = "coco", per="7:2:1"):
        """
        构建图片与xml文件路径关系
        :param img_path: 所有标注图片的路径
        :param xml_path: 所有标注好图片的xml路径
        :param folder: 在当前目录下自动生成的目录,如果目录存在会被级联删除(特别注意该目录会被删除,不要保存重要数据)
        :param per: 训练集、验证集、测试集 图片占比
        :return:
        """
        # 提前删除文件目录
        if os.path.exists(folder):
            shutil.rmtree(folder)

        # 创建目录结构
        paths = ["label/train", "label/val", "label/test", "images/train", "images/val", "images/test"]
        for path in paths:
            path = os.path.abspath(os.path.join(folder, path))
            if not os.path.exists(path):
                os.makedirs(path)

        # 关联图片与xml文件
        img_map = {".".join(i.split('.')[:-1]): os.path.join(img_path, i) for i in os.listdir(img_path)}
        xml_map = {".".join(i.split('.')[:-1]): os.path.join(xml_path, i) for i in os.listdir(xml_path)}
        path_map = {img_map[name]: xml_map[name] for name in img_map if name in xml_map}

        # 计算训练、验证、测试集占比
        pers = [float(i) for i in per.split(":")]
        train = math.ceil(len(path_map) * pers[0] / sum(pers))
        val = math.ceil(len(path_map) * pers[1] / sum(pers))
        logger.debug(f"{train}, {val}, {train + val},{len(path_map)}")

        # 生成YOLO文件、并且复制图片
        for i, (img_path, xml_path) in enumerate(path_map.items()):
            logger.debug(f"正在转换第【{i}】个xml, {xml_path}")
            annotation = cls.load_xml_file(xml_path)
            text = cls.to_yolo_data(annotation)
            if i < train:
                mid_folder = "train"
            elif train <= i < train + val:
                mid_folder = "val"
            else:
                mid_folder = "test"

            # 构建目录移动文件
            label_path = os.path.abspath(os.path.join(folder, "label", mid_folder, f"{i}.txt"))
            img_name = img_path.split(".")[-1]
            img_dst_path = os.path.abspath(os.path.join(folder, "images", mid_folder, f"{i}.{img_name}"))
            logger.debug(img_dst_path)

            # 生成文件
            shutil.copy(img_path, img_dst_path)
            with open(label_path, mode='w', encoding='utf8') as f:
                f.write(text)

            # 保存训练、验证、测试图片路径
            img_path = os.path.join(*img_dst_path.split(os.path.sep)[-4:])
            img_txt_path = os.path.join(folder, "label", f"{mid_folder}_list.txt")
            with open(img_txt_path, mode='a', encoding='utf8') as f:
                f.write(f"{img_path}\n")

        # 保存classes文件
        classes_path = os.path.abspath(os.path.join(folder, "classes.txt"))
        cls.save_classes(classes_path)
        logger.debug(f"训练集【{train}】张,验证集【{val}】张,测试集【{len(path_map) - train - val}】张,共有【{len(cls.classes)}】个分类")


if __name__ == '__main__':
    YoloData.main(r"D:\dataset\ctrip\JPEGImages", r"D:\dataset\ctrip\Annotations", folder="coco", per="8:1.5:0.5")

第二版

这一版本抽取出了一些公共方法,
把yolo数据转换为labelImg数据、把labelImg数据转换为yolo数据,labelImg的xml数据提取,把标注数据保存为json、csv、Excel、pickle等格式。通过保存的数据加载出图片与xml的关系,然后自动生成文件目录。
目录格式为:
生成的YOLO目录
Annotations:保存所有标注的xml数据
images: 保存YOLO训练是需要的图片数据,分别为训练集、验证集、测试集
JPEGImages: 保存所有的图片数据,汇总,可以用labelImg打开该目录标注,但是生成的folder与这个目录最好不在同一个目录。
labels: 保存所有的标签数据
classes.txt: 保存着所有的分类名称
其他3个txt保存着图片路径,默认在dataset目录下,所以需要在YOLO目录下新建一个dataset目录,然后把数据复制到该目录下。
在这里插入图片描述
代码:

import io
import os
import re
import math
import json
import base64
import shutil
import pickle
import hashlib
import zipfile

import dicttoxml
import xmltodict
import pandas as pd
from PIL import Image
from lxml import etree
from loguru import logger
from typing import Tuple, Iterable, List, Union


def yolo2box(
        width: float,
        height: float,
        box_list: Iterable[Tuple[str, float, float, float, float]],
        sep: int = 0
) -> List[Tuple[str, float, float, float, float]]:
    """
    将YOLO数据转换为坐标数据
    :param width:图片宽度
    :param height:图片高度
    :param box_list:盒子列表
    :param sep: 保留小数N位
    :return: 转换后的盒子数据
    """
    items = list()
    for label, x, y, w, h in box_list:
        x1 = round((x * 2 * width - w * width) / 2, sep)
        x2 = round((w * width + x * 2 * width) / 2, sep)
        y1 = round((y * 2 * height - h * height) / 2, sep)
        y2 = round((y * 2 * height + h * height) / 2, sep)
        if sep == 0:
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
        items.append((label, x1, y1, x2, y2))
    return items


def box2yolo(
        width: float,
        height: float,
        box_list: Iterable[Tuple[str, float, float, float, float]],
        sep: int = 6
) -> list[tuple[str, float, float, float, float]]:
    """
    将box转换为YOLO数据
    :param width: 图片的宽度
    :param height: 图片的高度
    :param box_list: 标注盒子的可迭代数据(label, x1, y1, x2, y2)
    :param sep: 保留小数位数
    :return: 盒子的YOLO数据
    """
    items = list()
    for label, x1, y1, x2, y2 in box_list:
        x = round((x1 + x2) / (2 * width), sep)
        y = round((y1 + y2) / (2 * height), sep)
        w = round((x2 - x1) / width, sep)
        h = round((y2 - y1) / height, sep)
        items.append((label, x, y, w, h))
    return items


def create_xml(
        img_fp: Union[str, bytes],
        box_list: Iterable[Tuple[str, int, int, int, int]],
        img_size: Tuple[int, int, int] = None,
        is_format: bool = True,
        save_path: str = None
) -> str:
    """
    创建图像标注的xml文件
    :param img_fp: 图片地址或字节码
    :param box_list: 框选的盒子列表
    :param img_size: 图片的大小
    :param is_format: 是否格式化生成的xml
    :param save_path: 保存文件路径
    :return: 格式化的xml对象
    """

    # 构建盒子数据
    objects = list()
    for label, x1, y1, x2, y2 in box_list:
        item = {
            "name": label, "pose": "Unspecified", "truncated": "0", "difficult": "0",
            "bndbox": {"xmin": x1, "ymin": y1, "xmax": x2, "ymax": y2}
        }
        objects.append(item)

    # 判断传入是图片还是图片字节码
    if isinstance(img_fp, str):
        img_fp = path = os.path.abspath(img_fp)
        filename = os.path.basename(path)
    else:
        path = None
        filename = None
        img_fp = io.BytesIO(img_fp)

    # 没有图片尺寸加载图片,计算大小
    if not img_size:
        img = Image.open(img_fp)
        img_size = (img.width, img.height, 3)

    # 生成dict数据
    xml_dict = {
        "annotation": {
            "folder": "JPEGImages", "filename": filename, "path": path,
            "source": {"database": "Unknown"},
            "size": {"width": img_size[0], "height": img_size[1], "depth": img_size[2]},
            "segmented": "0", "object": objects
        }
    }

    xml_txt = dicttoxml.dicttoxml(xml_dict, root=False, attr_type=False, return_bytes=False)
    xml_txt = re.sub("</?object>", "", xml_txt).replace('item', "object")
    # 格式化
    if is_format:
        xml_tree = etree.fromstring(xml_txt)
        etree.indent(xml_tree, space="\t")
        xml_txt = etree.tostring(xml_tree, encoding="utf8").decode('utf8')

    if save_path:
        with open(save_path, mode='wb', encoding='utf8') as f:
            f.write(xml_txt)
    return xml_txt


def load_xml(xml_path: str) -> dict:
    """
    加载labelImg标注的xml, 转换为字典格式
    :param xml_path: 文件路径
    :return:
    """
    with open(xml_path, mode="r", encoding='utf8') as f:
        xml = f.read()
    annotation = xmltodict.parse(xml)['annotation']
    filename = annotation['filename']
    folder = annotation['folder']
    path = annotation.get('path')
    size = annotation['size']
    size = [int(size['width']), int(size['height']), int(size['depth'])]
    classes = annotation['object']
    classes = classes if isinstance(classes, list) else [classes]
    box_list = list()
    for c in classes:
        name = c['name']
        box = c['bndbox']
        x1, y1, x2, y2 = (float(box['xmin']), float(box['ymin']), float(box["xmax"]), float(box["ymax"]))
        box_list.append((name, x1, y1, x2, y2))
    return {"filename": filename, "folder": folder, "path": path, "size": size, "box_list": box_list}


def _create_folders(folder="coco"):
    """创建训练的目录解构"""
    # 提前删除文件目录
    if os.path.exists(folder):
        shutil.rmtree(folder)

    # 创建目录结构
    paths = [
        "labels/train", "labels/val", "labels/test",
        "images/train", "images/val", "images/test", "JPEGImages", "Annotations"
    ]
    for path in paths:
        path = os.path.abspath(os.path.join(folder, path))
        if not os.path.exists(path):
            os.makedirs(path)
    return True


def relation_xml_img(img_paths: str, xml_paths: str, save_filename: str = None) -> List[dict]:
    """
    关联标注的xml与img数据
    :param img_paths: 图片的目录
    :param xml_paths: 标注后的xml目录
    :param save_filename: 保存的CSV文件路径
    :return:
    """
    # 关联图片与xml文件
    img_map = {".".join(i.split('.')[:-1]): os.path.join(img_paths, i) for i in os.listdir(img_paths)}
    xml_map = {".".join(i.split('.')[:-1]): os.path.join(xml_paths, i) for i in os.listdir(xml_paths)}
    path_map = {img_map[name]: xml_map[name] for name in img_map if name in xml_map}

    # 提取xml中的数据
    items = list()
    for i, (img_path, xml_path) in enumerate(path_map.items()):
        logger.debug(f'正在加载第【{i}】张图片,共有【{len(path_map)}】张!{img_path}')
        xml_dict = load_xml(xml_path)
        with open(img_path, mode='rb') as f:
            b64img = base64.b64encode(f.read()).decode('utf8')
        xml_dict['b64img'] = b64img
        xml_dict['img_id'] = hashlib.md5(b64img.encode('utf8')).hexdigest()
        items.append(xml_dict)

    # 没有文件名直接返回
    if not save_filename:
        return items

    # 保存文件
    if save_filename.endswith('.json'):
        with open(save_filename, mode='w', encoding="utf8") as f:
            json.dump(items, f, ensure_ascii=False)
    elif save_filename.endswith('.pkl'):
        with open(save_filename, mode='wb') as f:
            pickle.dump(items, f)
    elif save_filename.endswith('.csv'):
        df = pd.DataFrame(items)
        df.to_csv(save_filename, index=False)
    elif save_filename.split('.')[-1] in ['xls', 'xlsx']:
        df = pd.DataFrame(items)
        df.to_excel(save_filename, index=False)
    else:
        raise Exception("文件名错误!")

    return items


def load_data(data_path: str):
    """加载数据"""
    if data_path.endswith('.json'):
        with open(data_path, mode='r', encoding="utf8") as f:
            items = json.load(f)
    elif data_path.endswith('.pkl'):
        with open(data_path, mode='rb') as f:
            pickle.load(f)
    elif data_path.endswith('.csv'):
        items = pd.read_csv(data_path).to_dict(orient="records")
    elif data_path.split('.')[-1] in ['xls', 'xlsx']:
        items = pd.read_excel(data_path).to_dict(orient="records")
    else:
        raise Exception("不支持该类型的数据格式!")
    return items


def save_file(path: str, content: bytes):
    """保存文件"""
    with open(path, mode="wb") as f:
        f.write(content)


def create_yolo_folder(data: Union[str, list], folder: str = "coco", per="7:2:1", classes: dict = None, is_zip=False):
    """
    创建YOLO格式数据目录
    :param data: 数据或者数据所在目录
    :param folder: 保存目录
    :param per: 训练、验证、测试图片占比
    :param classes: 分类字典{分类标签名:下标}
    :param is_zip: 是否压缩文件夹
    :return:
    """
    # 提前删除文件目录
    if os.path.exists(folder):
        shutil.rmtree(folder)

    # 创建目录结构
    paths = [
        "labels/train", "labels/val", "labels/test",
        "images/train", "images/val", "images/test", "JPEGImages", "Annotations"
    ]
    for path in paths:
        path = os.path.abspath(os.path.join(folder, path))
        if not os.path.exists(path):
            os.makedirs(path)

    # 2.加载数据、转换为YOLO格式并保存
    images = load_data(data) if isinstance(data, str) else data
    # 计算训练、验证、测试集占比
    pers = [float(i) for i in per.split(":")]
    train = math.ceil(len(images) * pers[0] / sum(pers))
    val = math.ceil(len(images) * pers[1] / sum(pers))
    logger.debug(f"{train}, {val}, {train + val},{len(images)}")
    classes = classes if classes else {}

    length = len(str(len(images)))
    for i, image in enumerate(images):
        # 拆分图片,计算中间目录名称
        if i < train:
            mid_folder = "train"
        elif train <= i <= train + val:
            mid_folder = "val"
        else:
            mid_folder = "test"

        # 构建需要保存的文件名称
        img_filename = os.path.join(folder, "images", mid_folder, f"{i}.jpg".zfill(length + 4))
        label_filename = os.path.join(folder, "labels", mid_folder, f"{i}.txt".zfill(length + 4))
        jpg_filename = os.path.join(folder, "JPEGImages", f"{i}.jpg".zfill(length + 4))
        annotation_filename = os.path.join(folder, "Annotations", f"{i}.xml".zfill(length + 4))
        img_txt_filename = os.path.join(folder, f"{mid_folder}_list.txt")

        # 提取数据创建xml文件,构建YOLO格式
        size = image['size']
        box_list = image['box_list']
        b64img = image['b64img']

        img_bytes = base64.b64decode(b64img.encode('utf8'))
        xml_txt = create_xml(img_bytes, box_list=box_list, img_size=size)

        # 生成YOLO格式数据
        yolo_box = box2yolo(size[0], size[1], box_list)
        # 生成分类字典映射
        for box in yolo_box:
            if box[0].strip().upper() in [chr(i) for i in range(0, 97 + 40)]:
                print("PPP", img_filename)
            if box[0] in classes:
                continue
            classes[box[0]] = len(classes)
        label_txt = "\n".join([f"{classes[label]} {x1} {y1} {x2} {y2}" for label, x1, y1, x2, y2 in yolo_box])

        # 保存文件
        save_file(img_filename, img_bytes)
        save_file(jpg_filename, img_bytes)
        save_file(annotation_filename, xml_txt.encode('utf8'))
        save_file(label_filename, label_txt.encode('utf8'))
        with open(img_txt_filename, mode='a', encoding='utf8') as f:
            f.write(f"dataset\{img_filename}\n")

    # 保存分类
    cls_filename = f"{folder}\classes.txt"
    with open(cls_filename, mode='w', encoding='utf8') as f:
        f.write("\n".join(classes))

    if is_zip:
        with zipfile.ZipFile(f"{folder}.zip", 'w', zipfile.ZIP_DEFLATED) as zip:
            for root, paths, files in os.walk(folder):
                for file in files:
                    zip.write(os.path.join(root, file))
    logger.debug(f'所有分类:{classes}')
    logger.debug(f'所有分类:{list(classes)}')
    logger.debug(f"训练集【{train}】张,验证集【{val}】张,测试集【{len(images) - train - val}】张,共有【{len(classes)}】个分类")


if __name__ == '__main__':
    jpeg_path = r"D:\github\yolov7\dataset\mt_color\JPEGImages"
    annotation_path = r"D:\github\yolov7\dataset\mt_color\Annotations"
    # 关联xml与img数据
    folder = "mt_color"
    filename = f"{folder}.json"
    relation_xml_img(jpeg_path, annotation_path, save_filename=filename)
    # 生成YOLO格式文件夹
    create_yolo_folder(filename, folder=folder, is_zip=True)

只需要改变floder名称和两个路径即可把xml文件和图片数据关联起来。

python yolov5 脚本制作(第2部分:图片标记并生成对应标签文件、数据集的训练、使用训练出来的权重文件) 阅读详情

相关推荐

YOLO训练全流程辅助脚本开发实战

目标检测作为计算机视觉的核心任务,YOLO系列算法凭借其优异的实时性能成为工业界首选方案。在工程实践中,完整的模型开发流程涉及数据准备、训练优化、模型部署等多个环节,需要配套的辅助工具链支持。通过Python脚本实现数据集格式转换、训练过程监控、模型剪枝优化等关键功能,能够显著提升算法开发效率。以YOLOv5为例,其官方工具库包含数据增强、学习率搜索、mAP计算等实用脚本,这些模块化组件构成了目标检测项目的技术基础设施。在实际应用中,合理使用训练辅助脚本可以解决类别不平衡、显存不足等典型工程问题,同时确保模

weixin_30333885的博客 366

使用YOLO进行脚本开发的基本配置

原因就不解释了,业余爱好试开发可以直接安装python,但是随着项目增多,环境管理,版本控制就是大问题了,Anaconda可以有效创建不同环境,对包进行有效管理,且自带python。直接安装 ,路径设置下,直接下一步下一步下一步,还是老问题,注意安装路径,注意版本控制。例子:conda activate script_yolo_xyq。例子:conda activate script_yolo_xyq。例子:conda activate script_yolo_xyq。1.1.专业版的会自带部分包,

weixin_43179768的博客 1462

告别手动转换!用Python脚本一键搞定AnyLabeling标注到YOLO v11实例分割数据集

本文介绍了一个全自动化的Python脚本,能够将AnyLabeling标注文件一键转换为YOLO v11实例分割数据集所需的格式。该脚本解决了中文编码问题,智能划分训练集、验证集和测试集,并保持标签顺序一致性,显著提升计算机视觉项目的数据处理效率。

weixin_30275415的博客 432

yolov8训练进阶:自定义训练脚本,从配置文件载入训练超参数

该脚本通过argparse来接受命令行参数,并设置到超参数字典,和yolov5的启动脚本类似。data: 数据集配置文件hyp: 参数配置文件(上一节我们建立的)model: 模型权重或者模型结构配置文件其他参数根据名字就显而易见了。本文介绍了如何使用自定义训练脚本的方式启动yolov8的训练,有效的结合命令行和配置文件的优点,即可以灵活的修改训练参数,又可以用配置文件来管理我们的训练超参数。并通过修改文件,支持了DDP训练。

Awesome Computer Vision, 做计算机视觉的程序员 1万+

保姆级教程:用Python脚本一键搞定CCPD数据集转YOLO格式(附完整代码)

本文提供了一份详细的Python脚本教程,帮助用户将CCPD数据集一键转换为YOLO格式,适用于车牌识别等计算机视觉任务。教程涵盖文件名解析、坐标转换、数据集划分等核心步骤,并附完整代码,助力研究者快速进入模型训练阶段。

weixin_30383279的博客 326

将yolo格式数据集转换为coco格式数据集

实操将YOLO格式数据集转换为COCO格式

Li_yan的博客 1万+

YOLO11数据集划分脚本使用说明,自动生成train/val集

本文介绍了基于星图GPU平台自动化部署YOLO11镜像的方法,结合内置脚本可高效完成数据集划分与模型训练准备。通过该平台,用户能快速实现图像分割任务中的数据预处理,适用于模型微调、AI应用开发等场景,显著提升开发效率。

weixin_32005771的博客 705

《YOLO 数据集下载全攻略》:此文为AI自动生成

YOLO(You Only Look Once)数据集在计算机视觉领域具有至关重要的地位。它广泛应用于多个领域,如自动驾驶、视频监控、机器人视觉、增强现实、医疗图像分析和无人机等。在自动驾驶中,YOLO 数据集能够帮助系统实时检测路面上的行人、车辆和交通标志等对象,为安全驾驶提供决策依据。据统计,在自动驾驶领域,使用 YOLO 数据集进行目标检测,能够在每秒钟处理数十帧图像,大大提高了自动驾驶系统的反应速度和安全性。

zheng_ruiguo的专栏 3390

【学长笔记】关于车牌识别的CCPD数据集的预处理(YOLO)

本文基于 CCPD2019(Chinese City Parking Dataset) 数据集,开发了一套自动生成 YOLO 格式标签 的 Python 脚本,极大提高了训练数据准备的效率。

apple_53308981的博客 1194

将coco格式数据集转换为yolo格式数据集

将coco格式的数据集转换成yolo格式

Li_yan的博客 5726

YOLO数据集分割脚本:从准备到实施

YOLO(You Only Look Once)是一种先进的、实时的目标检测系统。它的名字揭示了它的设计理念:只需一眼,就能确定图像中所有目标的位置和类别。YOLO将目标检测问题转化为一个回归问题,直接在图像中预测目标的边界框和类别概率。这种方法使得YOLO在处理速度和准确性方面都有出色的表现。YOLO的模型结构简单,易于实现,同时也方便进行进一步的优化和扩展。YOLO系统主要包括以下几个关键步骤:图像预处理,目标检测,非极大值抑制等。这些步骤共同完成从输入图像到目标检测结果的转换。

weixin_33481022的博客 922

3分钟搞定CCPD数据集转换:Python脚本自动生成YOLO格式标签(附完整代码)

本文详细介绍了如何通过Python脚本将CCPD车牌数据集自动转换为YOLO格式标签。通过解析CCPD文件名中编码的边界框坐标,并计算归一化中心点与宽高,实现高效、准确的批量转换。文中提供了完整的健壮代码,包含错误处理与可视化验证,帮助开发者快速构建可用于YOLO模型训练的车牌检测数据集。

weixin_29089057的博客 223

保姆级教程:Synology NAS共享文件夹从创建到权限设置的完整流程

本文提供了一份详尽的Synology NAS共享文件夹创建与权限设置指南。重点讲解了如何将NAS接入企业AD域,并利用域管理员账户进行集中身份验证和权限管理。文章从基础概念、域环境配置、文件夹创建、精细化权限分配到客户端访问与维护,完整覆盖了构建安全高效企业级文件共享空间的全流程,旨在帮助管理员实现便捷的团队协作与数据安全管理。

u9v0w的博客 556

如何用labelimg标注yolo数据集,并利用工具自动划分数据集

基础概念。

aMI3Brh8B的博客 226

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4951

STM32解析航模遥控器的PPM信号

使用STM32对航模遥控器的PPM信号进行解析

qq_44343584的博客 9734

果园智能化分选突破口 | YOLO苹果成熟度目标检测数据集分享 | YOLO格式 | 苹果识别

果园智能化分选突破口 | YOLO苹果成熟度目标检测数据集分享 | YOLO格式 | 苹果识别

2403_88545703的博客 235

xHCI驱动学习(1) 核心数据结构

虽然Linux内核拥有C语言构建的身体,但它骨子里散发的是面向对象的气质,这一个个的对象就是struct。面对一个内核模块的时候,首先要找出关键的struct和它们之间的关系,才能摸清代码的骨骼脉络。今天来理清USB xHCI相关的数据结构类型usb_hcd、xhci_hcd、hc_driver和全局变量xhci_pci_driver、xhci_hc_driver、xhci_pci_hc_driver之间的关系。

1万+

YOLO训练常用python脚本

【代码】YOLO训练常用python脚本。

programC47的博客 51

【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果(附项目源码)

本文介绍了Unity中实现传送门效果的完整流程。通过第一人称角色控制器实现移动,使用PortalView脚本和自定义Unlit Shader渲染门内场景,巧妙利用相机位置和旋转同步实现动态视角。重点解决了近裁剪面问题,确保远距离渲染正确性。最后通过PortalTeleporter脚本实现传送功能,检测碰撞并计算相对位置进行瞬移。该方法无需复杂插件,代码简洁高效,适用于各类3D场景中的传送门实现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

R数据分析:广义估计方程式GEE的做法和解释

好久没有更新文章了,因为同学们咨询的问题有点多,另一个原因就是自己实在太懒。。。。 今天继续给大家写广义估计方程式GEE。 In statistics, a generalized estimating equation (GEE) is used to estimate the parameters of a generalized linear model with a possible unknown correlation between outcomes. 上面的英文解释告诉我们,当我们

Codewar的博客 1万+

高效实现Labelme到YOLO格式转换的自动化脚本解析

本文详细解析了如何通过自动化脚本实现Labelme到YOLO格式的高效转换,包括坐标转换核心算法、数据集自动划分技巧及YAML配置文件生成。文章还提供了常见问题排查和高级功能扩展建议,帮助开发者快速处理目标检测项目中的标注格式转换问题。

7up55的博客 283

【硬刚Hive】HIVE基础(20):Hive函数(9) over 窗口函数

欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_优快云博客 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 优快云博客!本文首发优快云论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hive部分补充。 hive窗口函数语法 在前言中我们已经说了avg()、sum()、max()、min()是分析函数,而over()才是窗..

微信搜:import_bigdata,大数据领域硬核原创作者 888

【YOLO】X-Anylabeling 数据集标注

本文将介绍如何使用软件进行 YOLO 格式的数据集标注与导出。对于初学者来说,建议参考进行安装与使用。特别是在第1.2节“Running from GUI”中,详细介绍了如何通过GUI进行操作。为了快速开始,建议前往页面,下载适合你系统的GUI版本。我个人下载并使用的是X-AnyLabeling自动标注数据集并训练自己的YOLO11目标检测模型(推荐)【YOLO】X-AnyLabeling自动标注工具,AI帮你解放双手(官方文档)

AbaAbaxxx_的博客 9865

大模型的应用与微调:如何调用 LLM?从 OpenAI API 到本地部署

本篇文章介绍了如何调用 OpenAI、DeepSeek、Manus、通义千问等大模型 API,并探讨了 LLM 本地部署的方法。在实际应用中,可以根据需求选择云端 API 或本地化部署方案,以满足不同的计算需求和隐私要求。下一篇:大模型微调与 RAG 技术(LoRA、QLoRA、向量数据库)

晴天彩虹雨的博客 1157

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

yolo数据集可通用任何yolo模型 构建自己的数据集模型 如何训练自己的数据集

yolo数据集可通用任何yolo模型 构建自己的数据集模型 如何训练自己的数据集

2401_88440984的博客 1849

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Docker安装与操作
.123456.
博客等级 码龄9年 15粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值