YOLOv8-Detect训练自己的数据集
目录
2.2.3 将大的txt分解成多个小txt,txt以图片名字命名
2.2.4 将txt中对应的路径的图片复制到images/train
3.1、设置官方配置文件:default.yaml,可自行修改。
0、引言
本文是使用YOLOv8-Detect训练自己的数据集,数据集包含COCO数据集的人猫狗数据以及自己制作的人猫狗数据集,类别为0:person、1:cat、2:dog三类,大家可根据自己的数据集类别进行调整。
1、环境准备
可以参考这篇博客:深度学习环境搭建-CSDN博客
本文环境:
- Windows10
- python:3.10
- cuda:11.6
- pytorch:1.12.0
- torchvision:0.13.0
2、数据集准备
2.1、创建数据集存放的文件夹
mydata
______images
____________train
_________________001.jpg
____________val
_________________002.jpg
______labels
____________train
_________________001.txt
____________val
_________________002.txt
本人的数据都存放在mydata文件夹中(自定义命名)
目录结构如下:images存放训练集和验证集图片,labels存放训练集和验证集txt
2.2、准备用于YOLOv8-Detect训练的txt
2.2.1 COCO数据集json文件转为xml
从官网下载CoCo数据集的json文件
import argparse, json
import cytoolz
from lxml import etree, objectify
import os, re
def instance2xml_base(anno):
E = objectify.ElementMaker(annotate=False)
anno_tree = E.annotation(
E.folder('VOC2014_instance/{}'.format(anno['category_id'])),
E.filename(anno['file_name']),
E.source(
E.database('MS COCO 2014'),
E.annotation('MS COCO 2014'),
E.image('Flickr'),
E.url(anno['coco_url'])
),
E.size(
E.width(anno['width']),
E.height(anno['height']),
E.depth(3)
),
E.segmented(0),
)
return anno_tree
def instance2xml_bbox(anno, bbox_type='xyxy'):
"""bbox_type: xyxy (xmin, ymin, xmax, ymax); xywh (xmin, ymin, width, height)"""
assert bbox_type in ['xyxy', 'xywh']
if bbox_type == 'xyxy':
xmin, ymin, w, h = anno['bbox']
xmax = xmin+w
ymax = ymin+h
else:
xmin, ymin, xmax, ymax = anno['bbox']
E = objectify.ElementMaker(annotate=False)
anno_tree = E.object(
E.name(anno['category_id']),
E.bndbox(
E.xmin(xmin),
E.ymin(ymin),
E.xmax(xmax),
E.ymax(ymax)
),
E.difficult(anno['iscrowd'])
)
return anno_tree
def parse_instance(content, outdir):
# print('11111',content)
categories = {d['id']: d['name'] for d in content['categories']}
# merge images and annotations: id in images vs image_id in annotations
merged_info_list = list(map(cytoolz.merge, cytoolz.join('id', content['images'], 'image_id', content['annotations'])))
# print('111111111111',merged_info_list)
# convert category id to name
for instance in merged_info_list:
instance['category_id'] = categories[instance['category_id']]
# group by filename to pool all bbox in same file
for name, groups in cytoolz.groupby('file_name', merged_info_list).items():
anno_tree = instance2xml_base(groups[0])
# if one file have multiple different objects, save it in each category sub-directory
filenames = []
# print(groups)
for group in groups:
filenames.append(os.path.join(outdir, re.sub(" ", "_", group['category_id']), os.path.splitext(name)[0] + ".xml"))
anno_tree.append(instance2xml_bbox(group, bbox_type='xyxy'))
for filename in filenames:
etree.ElementTree(anno_tree).write(filename, pretty_print=True)
print("Formating instance xml file {} done!".format(name))
def main(args):
if not os.path.exists(args.output_dir):
os.makedirs(args.output_dir)
content = json.load(open(args.anno_file, 'r'))
if args.type == 'instance':
# make subdirectories
sub_dirs = [re.sub(" ", "_", cate['name']) for cate in content['categories']]
for sub_dir in sub_dirs:
sub_dir = os.path.join(args.output_dir, str(sub_dir))
if not os.path.exists(sub_dir):
os.makedirs(sub_dir)
parse_instance(content, args.output_dir)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--anno_file", help="annotation file for object instance/keypoint", default=r'D:\CoCoData\annotations_14_17\instances_train2017.json')
parser.add_argument("--type", type=str, default='instance', help="object instance or keypoint", choices=['instance', 'keypoint'])
parser.add_argument("--output_dir", help="output directory for voc annotation xml file", default=r'D:\CoCoData\CoCoXml')
args = parser.parse_args()
main(args)
修改文件存放的路径和保存xml文件的路径。
运行后得到80个文件夹,分别为80类的xml文件:
再将需要类别的xml文件整合,得到训练集和验证集xml
2.2.2 将多个xml整合到一个大的txt文件
import os
import random
import xml.etree.ElementTree as ET
import glob
classes = ['person', 'cat', 'dog']
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[2]) / 2.0
y = (box[1] + box[3]) / 2.0
w = min(size[0],box[2] - box[0])
h = min(size[1],box[3] - box[1])
# print(x,y,w,h)
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(xml, list_file):
in_file = open(os.path.join(xml), encoding='utf-8')
tree = ET.parse(in_file)
root = tree.getroot()
xmlsize = root.find('size')
w = int(xmlsize.find('width').text)
h = int(xmlsize.find('height').text)
# print(w,h)
for obj in root.iter('object'):
difficult = 0
if obj.find('difficult') != None:
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
print(cls, "------------------------------------\n")
continue
cls_id = classes.index(cls)
print(cls, cls_id)
xmlbox = obj.find('bndbox')
x0 = float(xmlbox.find('xmin').text)
y0 = float(xmlbox.find('ymin').text)
x1 = float(xmlbox.find('xmax').text)
y1 = float(xmlbox.find('ymax').text)
xmin = min(x0, x1)
ymin = min(y0, y1)
xmax = max(x0, x1)
ymax = max(y0, y1)
# b = (int(xmin), int(ymin), int(xmax), int(ymax))
b = (float(xmin), float(ymin), float(xmax), float(ymax))
# print(b)
bb = convert((w, h), b)
# print(bb)
list_file.write(" "+str(cls_id) +"," + ",".join([str(a) for a in bb]))
if __name__ == "__main__":
random.seed(0)
# 图片路径
cocoImgPath = r'D:\Yolov8\Yolov8_dataset\selfXml\err04'
# Xml路径
cocoXmlPath = r'D:\Yolov8\Yolov8_dataset\selfXml\err04'
#txt保存路径
txtsavepath = r'D:\Yolov8\ultralytics-main\datasets\mydata\selfv8txt'
fileWriteTxt = txtsavepath + '\\'+ cocoImgPath.split('\\')[-1] + '_v8.txt'
xmls = glob.glob(os.path.join(cocoXmlPath, '*.xml'))
list_file = open(fileWriteTxt, 'w', encoding='utf-8')
for xml in xmls:
img = xml.replace(cocoXmlPath, cocoImgPath).replace('.xml', '.jpg')
if not os.path.exists(img):
print(img, ' is not exit')
continue
list_file.write(img)
convert_annotation(xml, list_file)
list_file.write('\n')
list_file.close()
运行以上代码可得到txt,内容如下:图片路径,xmin,ymin,xmax,ymax,classID
2.2.3 将大的txt分解成多个小txt,txt以图片名字命名
import glob
import os
#批量处理,txt存放文件夹
txtpathdir = r'D:\Yolov8\ultralytics-main\datasets\mydata\selfv8txt\err04_v8.txt'
#保存txt路径
savetxtpath = r'D:\Yolov8\ultralytics-main\datasets\mydata\labels\train'
file = open(txtpathdir,'r',encoding='utf-8')
lines = file.readlines()
for line in lines:
line = line.split('\n')[0]
# print(line)
imgdir = line.split(' ')[0]
bboxinfo = line.split(' ')[1:]
# print('imgdir',imgdir)
savetxtdir = os.path.join(savetxtpath,imgdir.split('\\')[-1].replace('.jpg','.txt'))
file = open(savetxtdir, 'w', encoding='utf-8')
# print(savetxtdir)
for i in range(len(bboxinfo)):
# print(bboxinfo[i])
info = bboxinfo[i].split(',')
# print(info)
info1 = ' '.join(info)
print(info1)
file.write(info1+'\n')
运行以上代码,即得到需要的txt
2.2.4 将txt中对应的路径的图片复制到images/train
(根据自己需求,因为我的图片类别多,存放位置也不同,所以需要找到对应的图片用于训练)
import glob
import os
import shutil
txtpathdir = r'D:\Yolov8\ultralytics-main\datasets\mydata\cocotxt\train2017_v8.txt'
saveimgpath = r'D:\Yolov8\ultralytics-main\datasets\mydata\images\train'
file = open(txtpathdir,'r',encoding='utf-8')
lines = file.readlines()
for line in lines:
line = line.split('\n')[0]
imgdir = line.split(' ')[0]
print('imgdir',imgdir)
saveimgdir = os.path.join(saveimgpath,imgdir.split('\\')[-1])
print(saveimgdir)
shutil.copy(imgdir,saveimgdir)
上述步骤可根据实际情况进行调整,这样就得到了可用于训练的数据,train中存放训练数据,val存放验证集。
labels中txt存放的数据格式如下(与官方一致):
分别代表:类别、框的中心点xy坐标以及框的宽高(进行了归一化处理)
3、创建配置文件
3.1、设置官方配置文件:default.yaml,可自行修改。
所有参数参见:https://docs.ultralytics.com/usage/cfg/
3.2、设置data.yaml
根据自己的数据集位置进行修改和配置。
path: D:\Yolov8\ultralytics-main\datasets\mydata # dataset root dir
train: images/train # train images (relative to 'path') 118287 images
val: images/val # val images (relative to 'path') 5000 images
#test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
# Classes
names:
0: person
1: cat
2: dog
nc: 3
3.3、设置yolov8s.yaml
根据自己想使用的权重进行选择,我这里采用的是yolov8s.pt进行训练,类别为3。
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 3 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 18 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 21 (P5/32-large)
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
4、进行训练
上述步骤完成后,即可开始训练。
from ultralytics import YOLO
if __name__ == '__main__':
# modelpath = r'D:\Yolov8\yolov8-detect-pt\yolov8s.pt'
model = YOLO('yolov8s.yaml') # load a pretrained model (recommended for training)
# Train the model
model.train(data='data.yaml')
也可以不使用yaml文件,直接读取.pt文件
from ultralytics import YOLO
if __name__ == '__main__':
modelpath = r'G:\\ultralytics-main\yolov8-detect\yolov8s.pt'
model = YOLO(modelpath) # load a pretrained model (recommended for training)
# Train the model
model.train(data='data.yaml')
训练过程:
训练过程中会保存以下内容,最后得到两个模型分别是:best.pt、last.pt
5、验证模型
训练进程完毕以后可使用一些验证数据进行模型验证,查看模型的识别效果。
from ultralytics import YOLO
import glob
import os
# Load a model
model = YOLO(r'D:\Yolov8\yolov8-detect-pt\best.pt') # load an official model
# Predict with the model
imgpath = r'D:\Yolov8\ultralytics-main\testimgs'
imgs = glob.glob(os.path.join(imgpath,'*.jpg'))
for img in imgs:
model.predict(img, save=True)
预测结果:
6、总结
至此,整个训练预测阶段完成。此过程同样可以在linux系统上进行,在数据准备过程中需要仔细,保证最后得到的数据准确,最好是用显卡进行训练。
有问题评论区见!
相关文章:

Yolov11-detect训练自己的数据集
至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

YOLOv10训练自己的数据集
至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

YOLOv10环境搭建、模型预测和ONNX推理
运行后会在文件yolov10s.pt存放路径下生成一个的yolov10s.onnxONNX模型文件。安装完成之后,我们简单执行下推理命令测试下效果,默认读取。终端,进入base环境,创建新环境。(1)onnx模型转换。

YOLOv7-Pose 姿态估计-环境搭建和推理
终端,进入base环境,创建新环境,我这里创建的是p38t17(python3.8,pytorch1.7)安装pytorch:(网络环境比较差时,耗时会比较长)下载好后打开yolov7-pose源码包。imgpath:需要预测的图片的存放路径。modelpath:模型的存放路径。Yolov7-pose权重下载。打开工程后,进入设置。

深度学习硬件基础:CPU与GPU
CPU:叫做中央处理器(central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。[^3]可以形象的理解为有25%的ALU(运算单元)、有25%的Control(控制单元)、50%的Cache(缓存单元)GPU:叫做图形处理器。

YOLOv8-Detect训练CoCo数据集+自己的数据集
至此,整个训练预测阶段完成。此过程同样可以在linux系统上进行,在数据准备过程中需要仔细,保证最后得到的数据准确,最好是用显卡进行训练。有问题评论区见!

YOLOv5中Ghostbottleneck结构shortcut=True和shortcut=False有什么区别
GhostBotleneck结构中的shodcut=True和shorcut=False的区别在干是否使用残差连接。当shorcu=True时,使用残差连接,可以以加速模型的收敛速度和提高模型的准确率,当shorcu=False时,不使用残差连接,可以减少模型的参数数量和计算量。实际上不只是Ghostbottleneck具有残差连接,在C3、C2f等具有Bottleneck模块的结构均可根据此例举一反三。残差块是深度卷积神经网络中的一种基本模块,可以有效地解决梯度消失和梯度爆炸的问题。

基于深度学习的细胞感染性识别与判定
通过引入深度学习技术,我们能够更精准地识别细胞是否受到感染,为医生提供更及时的信息,有助于制定更有效的治疗方案。基于深度学习的方法通过学习大量样本,能够自动提取特征并进行准确的感染性判定,为医学研究提供了更高效和可靠的手段。通过引入先进的深度学习技术,我们能够实现更快速、准确的感染性判定,为医学研究和临床实践提供更为可靠的工具。其准确性和效率将为医学研究带来新的突破,为疾病的早期诊断和治疗提供更可靠的支持。通过大规模的训练,模型能够学到细胞感染的特征,并在未知数据上做出准确的预测。

一文详解TensorFlow模型迁移及模型训练实操步骤
当前业界很多训练脚本是基于TensorFlow的Python API进行开发的,默认运行在CPU/GPU/TPU上,为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练,需要对TensorFlow的训练脚本进行迁移。

改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)
改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)2021.10.30 复现TPH-YOLOv52021.10.31 完成替换backbone为Ghostnet2021.11.02 完成替换backbone为Shufflenetv22021.11.05 完成替换backbone为Mobilenetv3Small2021.11.10 完成EagleEye对YOLOv5系列剪枝支持2021.11.14 完成MQBench对YOLOv5系列量

PyTorch中nn.Module的继承类中方法foward是自动执行的么?
在 PyTorch的 nn.Module中,forward方法并不是自动执行的,但它是在模型进行前向传播时必须调用的一个方法。当你实例化一个继承自torch.nn.Module的自定义类并传入输入数据时,需要通过调用该实例来实现前向传播计算,这实际上会隐式地调用forward方法。

基于神经网络——鸢尾花识别(Iris)
鸢尾花识别是学习AI入门的案例,这里和大家分享下使用Tensorflow2框架,编写程序,获取鸢尾花数据,搭建神经网络,最后训练和识别鸢尾花。

深度学习知识点全面总结
深度学习定义:一般是指通过训练多层网络结构对未知数据进行分类或回归深度学习分类:有监督学习方法——深度前馈网络、卷积神经网络、循环神经网络等; 无监督学习方法——深度信念网、深度玻尔兹曼机,深度自编码器等。深度神经网络的基本思想是通过构建多层网络,对目标进行多层表示,以期通过多层的高层次特征来表示数据的抽象语义信息,获得更好的特征鲁棒性。神经网络的计算主要有两种:前向传播(foward propagation, FP)作用于每一层的输入,通过逐层计算得到输出结果;

为什么深度学习神经网络可以学习任何东西
尽管如此,神经网络在处理一些对计算机而言极具挑战性的任务上表现出色,特别是在需要直觉和模糊逻辑的领域,如计算机视觉和自然语言处理,神经网络已经彻底改变了这些领域的面貌。在探讨神经网络如何学习的过程中,我们首先遇到了一个基本问题:如果我们不完全知道一个函数的形式,只知道它的部分输入和输出值,我们能否对这个函数进行逆向工程?重要的是,只要知道了这个函数,就可以针对任意输入x计算出对应的输出y。一种简单而有力的思考世界的方式,通过结合简单的计算,我们可以让计算机构造任何我们想要的功能,神经网络,从本质上讲,

深度学习与神经网络
神经网络是一种模拟人脑神经元行为的计算模型,神经网络由大量的神经元(在计算领域中常被称为“节点”或“单元”)组成,并且这些神经元被分为不同的层,分别为输入层、隐藏层和输出层。每一个神经元都与前一层的所有神经元相连接,连接的强度(或权重)代表了该连接的重要性。神经元接收前一层神经元的信息(这些信息经过权重加权),然后通过激活函数(如Sigmoid、ReLU等)处理,将结果传递到下一层。输入层接收原始数据,隐藏层负责处理这些数据,而输出层则将处理后的结果输出。

labelme安装与使用教程(内附一键运行包和转格式代码)
Labelme是一个开源的图像标注工具,由麻省理工学院的计算机科学和人工智能实验室(CSAIL)开发。它主要用于创建计算机视觉和机器学习应用所需的标记数据集。LabelMe让用户可以在图片上标注对象和区域,为机器学习模型提供训练数据。它支持多种标注类型,如矩形框、多边形和线条等。它是用 Python 编写的,并使用 Qt 作为其图形界面。

将AP-10K数据集Json格式转成Yolov8-Pose姿态的txt格式
class-index>是对象的类的索引,<x> <y> <width> <height>是边界框的坐标,<px1> <py1> <px2> <py2> ... <pxn> <pyn>是关键点的像素坐标。这样就将AP-10K数据集Json格式转成Yolov8-Pose的txt格式了。将txt的信息可视化在图片上进行验证。检查生成的txt是否准确。

讲解光流估计 liteflownet3
LiteFlowNet3 是光流估计模型 LiteFlowNet 的最新版本。它采用了轻量级的网络结构,具有较小的模型参数和计算复杂度,同时具备较高的计算效率和准确性。LiteFlowNet3 的设计目标是在保持较小模型尺寸的同时,提供与传统光流估计算法相当甚至更好的性能。

讲解异常: cv::Exception,位于内存位置 0x00000059E67CE590 处
在使用OpenCV进行图像处理和计算机视觉任务时,异常是一种常见的异常情况,通常由于内存分配失败引起。在解决该异常时,我们应该考虑增加系统可用内存、优化算法和数据集,以及检查代码中的内存管理问题。通过这些方法,我们可以更好地处理异常,提高系统的稳定性和性能。希望本文能够帮助您理解和解决异常,并顺利进行OpenCV图像处理和计算机视觉任务。

讲解Unsupported gpu architecture ‘compute_*‘2017解决方法
在使用2017年以前的NVIDIA GPU进行深度学习训练时,经常会遇到"Unsupported GPU Architecture 'compute_*'"的错误。本篇文章将介绍该错误的原因并提供解决方法。

YOLOv8-Pose训练自己的数据集
至此,整个YOLOv8-Pose模型训练预测阶段完成。此过程同样可以在linux系统上进行,在数据准备过程中需要仔细,保证最后得到的数据准确,最好是用显卡进行训练。有问题评论区见!

解决方案:avcodec_receive_packet AVERROR(EAGAIN)
FFmpeg是一个开源的跨平台音视频处理工具集,它由一个主命令行工具和一组库组成,提供了音视频编解码、格式转换、流媒体处理、音视频过滤、音视频录制和播放等功能。错误,我们将继续循环,直到获取到一个有效的数据包或遇到其他错误。同时,根据实际情况,调整解码器的缓冲区大小也可能有助于提高解码性能和减少错误发生的频率。然后,我们获取音频解码器并创建解码器上下文,并进行解码器的初始化。错误,并在实际应用场景中对解码后的音频数据包进行处理和分析。你可以根据自己的需求,进一步扩展和定制代码。,如果是的话,我们继续循环。

讲解from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver,
相比于AdaGrad,AdaDelta算法进一步减少了学习率震荡的问题,并提供了更平稳的优化过程。以上六个模块在Caffe中发挥着重要的作用,为深度学习模型的训练和优化提供了基础支持。通过合理选择和配置这些模块,我们可以根据具体任务和模型需求进行高效的训练和推理。它是一种自适应学习率方法,通过使用梯度平方的滑动平均值来调整每个参数的学习率。如果你对Caffe框架、深度学习模型训练有进一步的兴趣,建议你阅读Caffe的官方文档和资源,深入学习和探索。模块,我们可以创建和操控神经网络,从而进行模型训练和推理。

将labelme标注的人体姿态Json文件转成训练Yolov8-Pose的txt格式
最近在训练Yolov8-Pose时遇到一个问题,就是如何将自己使用labelme标注的Json文件转化成可用于Yolov8-Pose训练的txt文件。

讲解Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False
"Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False" 错误提示表明您的代码尝试将一个在 CUDA 设备上训练好的模型加载到不支持 CUDA 的设备上,或者是将其加载到 CPU 上。在 PyTorch 中,当您试图将一个已经在 CUDA 设备上训练好的模型加载到 CPU 上时,或者当尝试将一个在 CUDA 设备上训练好的模型加载到不支持 CUDA 的设备上时,就会出现这个错误。

【卷积神经网络】YOLO 算法原理
文章浏览阅读128次。在计算机视觉领域中,目标检测(Object Detection)是一个具有挑战性且重要的新兴研究方向。目标检测不仅要预测图片中是否包含待检测的目标,还需要在图片中指出它们的位置。2015年,Joseph Redmon, Santosh Divvala 等人提出第一个 YOLO 模型,该模型具有实时性高、支持多物体检测的特点,已成为目标检测领域热门的研究算法。本文主要介绍 YOLO 算法及其基本原理。

解码知识图谱:从核心概念到技术实战
本文深入探索了知识图谱的核心概念、发展历程、研究内容以及其在表示、存储、获取、构建和推理方面的技术细节。结合Python和PyTorch示例代码,文章旨在为读者提供一个全面、深入且实用的知识图谱概览,帮助广大技术爱好者和研究者深化对此领域的认识。

NLP技术如何为搜索引擎赋能
在全球化时代,搜索引擎不仅需要为用户提供准确的信息,还需理解多种语言和方言。本文详细探讨了搜索引擎如何通过NLP技术处理多语言和方言,确保为不同地区和文化的用户提供高质量的搜索结果,同时提供了基于PyTorch的实现示例,帮助您更深入地理解背后的技术细节。