新手学习yolov8目标检测小记1

一、复现

        网上有很多教程,复现yolov8的目标检测。在复现的过程中,会用到模型yolov8n.pt,可以选择命令下载和网站下载。复现后,runs文件包下会生成最优的权重文件best.py,在ultralytics/assets中放一张图片,按照remead指示,输入命令,用权重文件best.py做预测。运行之后,runs/detect/predict中的图片就是预测识别之后的。

二、数据集

1、准备

        搜集一些你需要进行目标检测的图片,比如网上下载、自行拍摄等,可以使用旋转个、放大、缩小、调亮度的方式,对数据进行扩增。代码如下:需要修改第83行的文件夹路径,改为自己存放图片的路径即可。

# -*- coding: utf-8 -*-import cv2
import numpy as np
import os.path
import copy# 椒盐噪声
def SaltAndPepper(src, percetage):SP_NoiseImg = src.copy()SP_NoiseNum = int(percetage * src.shape[0] * src.shape[1])for i in range(SP_NoiseNum):randR = np.random.randint(0, src.shape[0] - 1)randG = np.random.randint(0, src.shape[1] - 1)randB = np.random.randint(0, 3)if np.random.randint(0, 1) == 0:SP_NoiseImg[randR, randG, randB] = 0else:SP_NoiseImg[randR, randG, randB] = 255return SP_NoiseImg# 高斯噪声
def addGaussianNoise(image, percetage):G_Noiseimg = image.copy()w = image.shape[1]h = image.shape[0]G_NoiseNum = int(percetage * image.shape[0] * image.shape[1])for i in range(G_NoiseNum):temp_x = np.random.randint(0, h)temp_y = np.random.randint(0, w)G_Noiseimg[temp_x][temp_y][np.random.randint(3)] = np.random.randn(1)[0]return G_Noiseimg# 昏暗
def darker(image, percetage=0.9):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get darkerfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = int(image[xj, xi, 0] * percetage)image_copy[xj, xi, 1] = int(image[xj, xi, 1] * percetage)image_copy[xj, xi, 2] = int(image[xj, xi, 2] * percetage)return image_copy# 亮度
def brighter(image, percetage=1.5):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get brighterfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = np.clip(int(image[xj, xi, 0] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 1] = np.clip(int(image[xj, xi, 1] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 2] = np.clip(int(image[xj, xi, 2] * percetage), a_max=255, a_min=0)return image_copy# 旋转
def rotate(image, angle, center=None, scale=1.0):(h, w) = image.shape[:2]# If no rotation center is specified, the center of the image is set as the rotation centerif center is None:center = (w / 2, h / 2)m = cv2.getRotationMatrix2D(center, angle, scale)rotated = cv2.warpAffine(image, m, (w, h))return rotated# 翻转
def flip(image):flipped_image = np.fliplr(image)return flipped_image# 图片文件夹路径
file_dir = r'E:\yolo_data\mx/'
for img_name in os.listdir(file_dir):img_path = file_dir + img_nameimg = cv2.imread(img_path)# cv2.imshow("1",img)# cv2.waitKey(5000)# 旋转rotated_90 = rotate(img, 90)cv2.imwrite(file_dir + img_name[0:-4] + '_r90.jpg', rotated_90)rotated_180 = rotate(img, 180)cv2.imwrite(file_dir + img_name[0:-4] + '_r180.jpg', rotated_180)for img_name in os.listdir(file_dir):img_path = file_dir + img_nameimg = cv2.imread(img_path)# 镜像flipped_img = flip(img)cv2.imwrite(file_dir + img_name[0:-4] + '_fli.jpg', flipped_img)# 增加噪声# img_salt = SaltAndPepper(img, 0.3)# cv2.imwrite(file_dir + img_name[0:7] + '_salt.jpg', img_salt)img_gauss = addGaussianNoise(img, 0.3)cv2.imwrite(file_dir + img_name[0:-4] + '_noise.jpg', img_gauss)# 变亮、变暗img_darker = darker(img)cv2.imwrite(file_dir + img_name[0:-4] + '_darker.jpg', img_darker)img_brighter = brighter(img)cv2.imwrite(file_dir + img_name[0:-4] + '_brighter.jpg', img_brighter)blur = cv2.GaussianBlur(img, (7, 7), 1.5)#      cv2.GaussianBlur(图像,卷积核,标准差)cv2.imwrite(file_dir + img_name[0:-4] + '_blur.jpg', blur)

2、标注        

        将jpg图片使用labelme标注或者make sence(Make Sense),我使用的后者,后者是网页版的,可以批量导入,进行标注。标注完后,导出为yolov8需要的数据格式,即txt的标注文件。

3、划分

        将数据集按照训练集、测试集、验证集=8:1:1的比例进行划分,代码如下:第84、85、86行分别需要改成自己的需要划分的图片的地址、txt文件的地址,以及划分后存放的位置。运行后,我的split文件结构是split下有images和labels,这两个下级文件都含有test、train、val。

# 将图片和标注数据hatDataXml文件,按比例切分为 训练集和测试集 分割后的在split文件中
import shutil
import random
import os
import argparse# 检查文件夹是否存在
def mkdir(path):if not os.path.exists(path):os.makedirs(path)def main(image_dir, txt_dir, save_dir):# 创建文件夹mkdir(save_dir)images_dir = os.path.join(save_dir, 'images')labels_dir = os.path.join(save_dir, 'labels')img_train_path = os.path.join(images_dir, 'train')img_test_path = os.path.join(images_dir, 'test')img_val_path = os.path.join(images_dir, 'val')label_train_path = os.path.join(labels_dir, 'train')label_test_path = os.path.join(labels_dir, 'test')label_val_path = os.path.join(labels_dir, 'val')mkdir(images_dir)mkdir(labels_dir)mkdir(img_train_path)mkdir(img_test_path)mkdir(img_val_path)mkdir(label_train_path)mkdir(label_test_path)mkdir(label_val_path)# 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改train_percent = 0.8val_percent = 0.1test_percent = 0.1total_txt = os.listdir(txt_dir)num_txt = len(total_txt)list_all_txt = range(num_txt)  # 范围 range(0, num)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# 在全部数据集中取出trainval_test = [i for i in list_all_txt if not i in train]# 再从val_test取出num_val个元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = os.path.join(image_dir, name + '.jpg')srcLabel = os.path.join(txt_dir, name + '.txt')if i in train:dst_train_Image = os.path.join(img_train_path, name + '.jpg')dst_train_Label = os.path.join(label_train_path, name + '.txt')shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)elif i in val:dst_val_Image = os.path.join(img_val_path, name + '.jpg')dst_val_Label = os.path.join(label_val_path, name + '.txt')shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)else:dst_test_Image = os.path.join(img_test_path, name + '.jpg')dst_test_Label = os.path.join(label_test_path, name + '.txt')shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)if __name__ == '__main__':"""python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data"""parser = argparse.ArgumentParser(description='split datasets to train,val,test params')parser.add_argument('--image-dir', type=str, default='/Users/jing/Documents/code/ultralytics-8.1.0/hatDataXml/JPEGImages', help='image path dir')parser.add_argument('--txt-dir', type=str, default='/Users/jing/Documents/code/ultralytics-8.1.0/hatDataXml/Annotations', help='txt path dir')parser.add_argument('--save-dir', default='/Users/jing/Documents/code/ultralytics-8.1.0//split', type=str, help='save dir')args = parser.parse_args()image_dir = args.image_dirtxt_dir = args.txt_dirsave_dir = args.save_dirmain(image_dir, txt_dir, save_dir)

划分后,在datasets下新建文件DataSet1Parts,下级目录新建test、train、val,再下级分别新建images和labels,将划分好的,按照文件名复制进去。

三、改yaml

        打开ultralytics/cfg/datasets/,复制文件coco128.yaml,命名为mydata.yaml,修改路径如下,其中nc代表类别数,names代表类别名称,按照自己的数据集改即可。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco/
# Example usage: yolo train data=coco128.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco128  ← downloads here (7 MB)path: ../datasets/DataSet1Parts
test: test/images
train: train/images
val: val/imagesnc: 3
#names: ['cnn','mxn','xcn']names:0: cnn1: mxn2: xcn

四、训练及验证

1、训练

        在Terminal控制台输入命令:

#终端复制以下代码训练
#yolo train data=/Users/jing/Documents/code/ultralytics-8.1.0/ultralytics/cfg/datasets/mydata.yaml model=yolov8n.pt epochs=100 lr0=0.01 batch=4

2、验证

#验证测试结果,找图片放在ultralytics/assets文件夹下
#输入以下代码测试,使用效果最好的权重文件 best.pt
# yolo predict model=/Users/jing/Documents/code/ultralytics-8.1.0/runs/detect/train16/weights/best.pt source=/Users/jing/Documents/code/ultralytics-8.1.0/ultralytics/assets/ceshi.JPG

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索未来通信的新边界:AQChat一款融合AI的在线匿名聊天

探索未来通信的新边界:AQChat一款融合AI的在线匿名聊天 在数字时代,即时通讯变得无处不在,但隐私和性能仍旧是许多用户和开发者关注的焦点。今天,我要介绍一个开创性的开源项目 —— AQChat,它不仅重定义了在线匿名聊…

Ollama+Open WebUI本地部署Llama3 8b(附踩坑细节)

先展示一下最终结果,如下图所示: 1. 添加环境变量 在下载 ollama 之前,先去配置环境变量,确保模型下载到我们想要的地方 win10 和 win11 输入path或者环境变量: 增加系统环境变量 变量名不可更改,必须是O…

[ARM-2D 专题]3. ##运算符

C语言的宏系统相当强大,它允许使用##符号来处理预处理期的文本替换。这种用法被称为标记连接(token pasting)操作,其结果是将两个标记紧紧地连接在一起,而省略掉它们之间的所有空格。在复杂的宏定义中,运用…

学习使用js实现导出excel表格导出csv表格的方法示例,并支持中文汉字

学习使用js实现导出excel表格导出csv表格的方法示例 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>下载表格</title></head> <body><script type"application/javascript">function …

Debian/Ubuntu linux安装软件

1、官方软件商店安装 2、deb包安装 报错不是sudoers&#xff0c;首先将用户添加到sudo su -l adduser USERNAME sudo exit然后&#xff0c;退出桌面环境并再次登录。 您可以通过输入以下内容来检查上述过程是否成功&#xff1a; groups下载deb包 altshiftf4或右键打开命令行…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

安卓实现输入快递单号生成二维码,摄像头扫描快递单号生成的二维码,可以得到快递信息

背景&#xff1a; 1、实现二维码的生成和识别2、实现andriod&#xff08;或虚拟机&#xff09;部署&#xff0c;调用摄像头3、实现网络管理&#xff0c;包括数据库【取消】2、3可以组队实现&#xff0c;1必须单人实现 过程&#xff1a; 安卓APP主界面 输入快递单号信息&#…

HTML页面定时刷新指南

在Web开发中&#xff0c;有时我们需要定时刷新页面&#xff0c;以确保用户总是看到最新的数据。HTML提供了一种简单的方式来实现这一点&#xff0c;那就是使用<meta>标签的http-equiv属性。 什么是<meta>标签&#xff1f; <meta>标签是HTML文档的头部&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 剩余银饰的重量(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 剩余银饰的重量(100分) 🌍 评测功能需要订阅专栏后私信联系…

关于伪标头那些事

前言 看到伪标头&#xff0c;不少同学可能会比较陌生&#xff0c;因为谁让它默默无闻呢&#xff1f; 当然博主把它比喻为一个来自传输层的“共享盒子”。提到共享&#xff0c;我想大家有所体会了。这里给大家贴一张直观的图例&#xff0c;可以静静观摩之。 Q&#xff1a;什么是…

MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

网络安全:SQL注入防范

文章目录 网络安全&#xff1a;SQL注入防范引言防范措施概览使用参数化查询示例代码 输入验证和过滤示例代码 使用ORM框架示例代码 其他防范措施结语 网络安全&#xff1a;SQL注入防范 引言 在上一篇文章中&#xff0c;我们介绍了SQL注入攻击的基础知识。本文将重点讨论如何防…

Redis 的分布式 Session 与本地 Session 的区别

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

python字符串通过切片方式去掉最后一个字符

在Python中&#xff0c;你可以使用切片&#xff08;slicing&#xff09;来去掉字符串的最后一个字符。字符串的切片是通过使用冒号:分隔的索引来完成的&#xff0c;格式为[start:stop:step]。如果你想要去掉最后一个字符&#xff0c;你可以使用索引-1&#xff08;表示最后一个字…

C++之函数重载

函数重载概念&#xff1a; 是函数的一种特殊情况&#xff0c; C 允许在 同一作用域中 声明几个功能类似 的同名函数 &#xff0c;这 些同名函数的 形参列表(参数个数 或 类型 或 类型顺序)不同 &#xff0c;常用来处理实现功能类似数据类型 不同的问题。 #include<iostre…

shell循环控制

shell双层循环 双层循环和循环语句的使用&#xff0c;while和until的 语法使用 echo 打印 echo -n 表示不换行输出 echo -e 输出转义字符 \b&#xff1a;相当于退格键&#xff08;backspace&#xff09; \n&#xff1a;换行&#xff0c;相当于回车键 \f&#xff1a;换行…

Postman接口测试工具详解(高清图例)

一、引言 1. 介绍接口测试的重要性 在当今软件开发领域&#xff0c;接口&#xff08;API&#xff09;已成为不同系统、服务或组件之间交互的桥梁。随着微服务架构的普及&#xff0c;接口的重要性日益凸显。然而&#xff0c;接口的复杂性和多样性也带来了诸多挑战&#xff0c;其…

月球全月地质图和4.5亿像素月面标注地图

嫦娥六号都在月球挖到土特产了&#xff0c;那你知道月球到底长什么样子吗&#xff1f; 现在我们就为你分享一下月球的全月地质图&#xff0c;以及4.5亿像素月面带标注的地图&#xff0c;你可以在文末查看该数据的领取方法。 月球全月地质图 对于月球的探索&#xff0c;美国和…

arsetryhtehrwgefwadasdadasd

48b91400000080f7ffff48b8bd427ae5d594bfd6488b0948f7e148b8cdcccccccccccccc48c1ea1748f7e24c8bea49c1ed02 直接在windbg中把执行内存修改为上面这一串字节序列&#xff0c;运行完成后r13中将包含当前时间戳&#xff0c;可使用如下代码转换成人类可阅读时间格式 /*代码BEGIN*…

YOLOv8 + SAM实现自动标注分割数据集【附完整源码+步骤详解】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…