ultralytics-yolov8

yolov8

安装环境

装pytorch

conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge

安装用到的包
requirements.txt

ultralytics
tqdm
scikit-learn
pyaml
shapely
pyclipper
scikit-image
imgaug
lmdb
tqdm
rapidfuzz
cython
Pillow
pyyaml
requests
pip install -r requirements.txt

数据标注

标注网站

得到via_region_data.csv,格式

{"42.243.238.32-202406181512034.jpg418013": {"fileref": "","size": 418013,"filename": "42.243.238.32-202406181512034.jpg","base64_img_data": "","file_attributes": {},"regions": [{"shape_attributes": {"name": "rect","x": 324,"y": 179,"width": 279,"height": 108},"region_attributes": {}},{"shape_attributes": {"name": "rect","x": 766,"y": 248,"width": 227,"height": 154},"region_attributes": {}}]},
}

其中(x,y)是左上角坐标, (x + width, y + height)是右下角坐标

经过统计:
平均:12142158
最小:768
1360
最大:1440*2560

总 890, 408 background, 482 front
train 712, 325 background
val 89, 39 background
test 89, 41+? background

转换格式

转成yolov8的格式, 格式为

label_id x y w h

其中

x , y , w , h ∈ [ 0 , 1 ] x, y, w, h \in \left[0, 1\right] x,y,w,h[0,1]
转换

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import json
import osimport cv2
from tqdm import tqdmimg_dir = r"E:\ccc\origin_images"
json_path = r"E:\ccc\via_region_data.json"
label_dir = r"E:\ccc\origin_labels"if __name__ == "__main__":with open(json_path, "r") as f:label_data: dict = json.load(f)os.makedirs(label_dir, exist_ok=True)cnt = 0tot = 0for label in tqdm(label_data.values()):filename = label["filename"]img = cv2.imread(os.path.join(img_dir, filename))h, w, _ = img.shapecategory = 0empty_region = Truewith open(os.path.join(label_dir, os.path.splitext(filename)[0] + ".txt"), "w") as f:for region in label["regions"]:empty_region = Falsex = region["shape_attributes"]["x"]y = region["shape_attributes"]["y"]width = region["shape_attributes"]["width"]height = region["shape_attributes"]["height"]x_center = (x + (x + width)) / 2.0y_center = (y + (y + height)) / 2.0x_center_norm = x_center / wy_center_norm = y_center / hwidth_norm = width / wheight_norm = height / hf.write("{} {:.6f} {:.6f} {:.6f} {:.6f}\n".format(category, x_center_norm, y_center_norm, width_norm, height_norm))if empty_region:cnt += 1tot += 1print("non_empty: {}; empty: {}; total: {}".format(tot - cnt, cnt, tot))

划分数据集

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import os
import shutil
from glob import globimport yaml
from sklearn.model_selection import train_test_split
from tqdm import tqdmimg_dir = r"E:\ccc\origin_images"
label_dir = r"E:\ccc\origin_labels"
train_ratio = 0.8
val_ratio = 0.1
test_ratio = 0.1
root_path = r"E:\ccc"
img_train_path = r"images\train"
img_val_path = r"images\val"
img_test_path = r"images\test"
label_train_path = r"labels\train"
label_val_path = r"labels\val"
label_test_path = r"labels\test"
yaml_path = "config.yaml"def copy_files(label_paths, img_dir, target_label_dir, origin_img_dir):os.makedirs(img_dir, exist_ok=True)os.makedirs(target_label_dir, exist_ok=True)for label in tqdm(label_paths):img = os.path.join(origin_img_dir, os.path.splitext(os.path.basename(label))[0] + ".jpg")shutil.copy(img, img_dir)shutil.copy(label, target_label_dir)if __name__ == "__main__":# img_paths = list(glob(os.path.join(img_dir, '*')))label_paths = list(glob(os.path.join(label_dir, "*")))# img_paths.sort()label_paths.sort()is_empty = []for path in label_paths:with open(path, "r") as f:data = f.read().strip()if not data:is_empty.append(True)else:is_empty.append(False)train_val_label, test_label, train_val_is_empty, test_is_empty = train_test_split(label_paths, is_empty, test_size=test_ratio, shuffle=True)train_label, val_label, train_is_empty, val_is_empty = train_test_split(train_val_label,train_val_is_empty,test_size=val_ratio / (train_ratio + val_ratio),shuffle=True,)train_img = [os.path.splitext(path)[0] + ".jpg" for path in train_label]val_img = [os.path.splitext(path)[0] + ".jpg" for path in val_label]test_img = [os.path.splitext(path)[0] + ".jpg" for path in test_label]copy_files(train_label,os.path.join(root_path, img_train_path),os.path.join(root_path, label_train_path),img_dir,)copy_files(val_label,os.path.join(root_path, img_val_path),os.path.join(root_path, label_val_path),img_dir,)copy_files(test_label,os.path.join(root_path, img_test_path),os.path.join(root_path, label_test_path),img_dir,)config = {"path": root_path,"train": img_train_path,"val": img_val_path,"test": img_test_path,"names": {0: "box"},}yaml_dir = os.path.dirname(yaml_path)if yaml_dir:os.makedirs(yaml_dir, exist_ok=True)with open(yaml_path, "w", encoding="utf-8") as f:yaml.dump(config, f)

会自动划分数据集和生成需要的yaml
参考:coco128.yaml

训练yolo

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from ultralytics import YOLOif __name__ == '__main__':# Load a model# model = YOLO("yolov8n.yaml")  # build a new model from YAMLmodel = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)# model = YOLO("yolov8n.yaml").load("yolov8n.pt")  # build from YAML and transfer weights# Train the model# results = model.train(data="config.yaml", epochs=100, imgsz=640, device="cpu", single_cls=True, save=True, workers=0)results = model.train(data="config.yaml", epochs=100, imgsz=640, device=[0], single_cls=True, save=True, workers=8)

测试yolo

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from ultralytics import YOLOif __name__ == "__main__":model = YOLO("runs/detect/train/weights/best.pt")  # load a custom model# Validate the modelmetrics = model.val(data="config.yaml", split="val", plots=True)  # no arguments needed, dataset and settings remembered# metrics = model.val(#     data="config.yaml", split="test", plots=True# )  # no arguments needed, dataset and settings remembered# print(metrics)print("map50-95: ", metrics.box.map)  # map50-95print("map50: ", metrics.box.map50)  # map50print("map75: ", metrics.box.map75)  # map75# print('map50-95 of each category: ',metrics.box.maps)  # a list contains map50-95 of each category

预测yolo

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import os
from glob import globimport cv2
from ultralytics import YOLOmodel_path = "runs/detect/train/weights/best.pt"
imgs_dir = "/mnt/data/ccc/Eudemons_final"
gt_dir = "/mnt/data/ccc/Eudemons_v3/labels/test"
crop_dir = "/mnt/data/ccc/crop"
save_dir = "/mnt/data/ccc/overlay"
draw_predict = True
# draw_gt = True
draw_gt = False
pad = 0.035def get_name_v1(filename, dir_name, idx):return os.path.join(dir_name, "{}{}.jpg".format(filename, f"_{idx}" if idx > 0 else ""))def get_name_v2(path, dir_name, idx):filename, ext = os.path.splitext(os.path.basename(path))mac = os.path.basename(os.path.dirname(path))return os.path.join(dir_name, "{}_{}{}{}".format(mac, filename, f"_{idx}" if idx > 0 else "", ext))if __name__ == "__main__":model = YOLO(model_path)  # load a custom modelpaths = list(glob(os.path.join(imgs_dir, "*", "*.jpg")))draw_predict = draw_predict and save_dirdraw_gt = draw_gt and gt_dir and os.path.exists(gt_dir) and save_dirif draw_predict:os.makedirs(save_dir, exist_ok=True)os.makedirs(crop_dir, exist_ok=True)# results = model(os.path.join(imgs_dir, "*.jpg"), stream=True)results = model(os.path.join(imgs_dir, "*", "*.jpg"), stream=True)for result in results:# result.save(os.path.basename(result.path))path = result.pathfilename = os.path.splitext(os.path.basename(path))[0]h, w = result.orig_shapeorig_img = result.orig_imgboxes = result.boxesboxes_num = boxes.shape[0]confidence = boxes.conf.tolist()xyxy = boxes.xyxy.tolist()for idx, (x1, y1, x2, y2) in enumerate(xyxy):x_pad = (x2 - x1) * pady_pad = (y2 - y1) * padx1 -= x_pady1 -= y_padx2 += x_pady2 += y_padx1 = max(0, int(x1))y1 = max(0, int(y1))x2 = min(w, int(x2))y2 = min(h, int(y2))cv2.imwrite(# get_name_v1(filename, crop_dir, idx),get_name_v2(path, crop_dir, idx),orig_img[y1:y2, x1:x2],)if draw_predict:for x1, y1, x2, y2 in xyxy:x1 = max(0, int(x1))y1 = max(0, int(y1))x2 = min(w - 1, int(x2))y2 = min(h - 1, int(y2))orig_img = cv2.rectangle(orig_img,(x1, y1),(x2, y2),color=(0, 0, 255),lineType=cv2.LINE_AA,)if draw_gt:with open(os.path.join(gt_dir, filename + ".txt"), "r") as f:for line in f:line = line.strip()if not line:continue_, x, y, width, height = line.split(" ")x = float(x)y = float(y)width = float(width)height = float(height)orig_img = cv2.rectangle(orig_img,(int((x - width / 2) * w), int((y - height / 2) * h)),(int((x + width / 2) * w), int((y + height / 2) * h)),color=(0, 255, 0),lineType=cv2.LINE_AA,)cv2.imwrite(# os.path.join(save_dir, filename + ".jpg"),get_name_v2(path, save_dir, 0),orig_img,)

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

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

相关文章

word 设置目录中英文字母大写改为小写

选中目录右击“字体”,设置“小型大写字母”。

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

【LeetCode】从中序与后序遍历序列构造二叉树

目录 一、题目二、解法完整代码 一、题目 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], …

谷粒商城实战笔记-40-前端基础-Vue-计算属性、监听器、过滤器

文章目录 一,计算属性1,用途2,用法2.1 定义View2.2 声明计算属性 3,注意事项 二,监听器1. 使用 watch 监听属性的变化 三,过滤器1,定义局部过滤器2,定义全局过滤器3,使用…

Perl 基础语法

Perl 基础语法 Perl 是一种高级、解释型、动态编程语言,广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法,帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别…

C 语言实例 - 使用引用循环替换数值

a、b、c 三个变量&#xff0c;通过引用按顺序循环替换他们的值。 #include<stdio.h>void cyclicSwap(int *a,int *b,int *c);int main() {int a, b, c;printf("输入 a, b 和 c 的值: ");scanf("%d %d %d",&a,&b,&c);printf("交换前…

bs4模块使用(一)

1. 安装BS4 pip install beautifulsoup4 pip install lxml2. 对象种类 bs4将html文档解析成一个树形结构&#xff0c;每个节点都是python对象&#xff0c;大概可分为下面四种&#xff1a; 2.1 Tag 后面再详细介绍&#xff0c;先介绍最重要的两个属性 name soup Beautiful…

【mybatis 一级缓存】

前言 mybatis 默认开启一级缓存&#xff0c;为什么我们很少遇到缓存带来的问题呢&#xff1b;我工作6年也只遇到过一次&#xff0c;最近才遇到的&#xff0c;并且我还记录了&#xff1a;不懂myabits缓存引发的问题这篇文章主要是记录当时排查这个问题的过程。今天这篇文主要回…

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…

【java SE语法篇】1.运算符

目录 1. 运算符和表达式2. 算数运算符3. 隐式转换4. 强制转换5. 自增自减运算符6. 赋值运算符7. 扩展运算符8. 关系运算符9. 逻辑运算符9.1 & 和 | 的使用&#xff1a;9.2 ^&#xff08;异或&#xff09;的使用&#xff1a;9.3 !&#xff08;取反&#xff09;的使用&#x…

解决:事件监听器 addEventListener 被多次调用

背景&#xff1a; 给一个元素添加了事件监听&#xff0c;click 会触发 然而在实际场景中&#xff0c;点击一次&#xff0c;事件会被触发两次 阻止冒泡也没有用 解决&#xff1a; 使用API&#xff1a;event.stopImmediatePropagation() stopImmediatePropagation() 方法可防止…

【Spring Security】初识Spring Security

今天晚上因为一个项目问题&#xff0c;而正式开始学习Spring Security。 这个问题是“APP端的操作员应仅可查看管理后台的项目负责人分配给自己的计划”。 一、Spring Security的核心组件&#xff1a; Spring Security的核心组件包括&#xff1a;SecurityContextHolder、Auth…

02-用户画像-技术架构+业务划分

技术架构 python开发 es flume 流数据读取写入kafka文件 kafka 消息队列 sqoop 将数据导入数仓hive StructureStream 动态画像的处理 SparkSQL 静态画像的处理 &#xff0c;批数据处理 读取kafka获取用户行为数据 fineBI 数据展示 业务划分 离线业务 静态画像 …

Springboot开发之 Excel 处理工具(三) -- EasyPoi 简介

引言 Springboot开发之 Excel 处理工具&#xff08;一&#xff09; – Apache POISpringboot开发之 Excel 处理工具&#xff08;二&#xff09;-- Easyexcel EasyPoi是一款基于 Apache POI 的高效 Java 工具库&#xff0c;专为简化 Excel 和 Word 文档的操作而设计。以下是对…

监控易直播回放2407期:IT监控平台可视化运维

主播&#xff1a;监控易技术经理 刘美玲 大家好&#xff0c;现在是7月18号下午2点&#xff0c;欢迎大家来到本次的直播分享。今天&#xff0c;我们将深入探讨IT监控平台的可视化实现。在这个信息化时代&#xff0c;IT设备的稳定性对于业务的连续性起着至关重要的作用。而IT监控…

Unity入门——引擎窗口

主要内容 1.窗口布局 2.Hierarchy层级窗口 3.Scene场景窗口 窗口布局 右上角layout选项 层级和场景窗口 Scene和Hierarchy 场景窗口和层级窗口是息息相关的&#xff0c;层级窗口中看到的内容就是场景窗口中的显示对象。 Hierar层级窗口 我们可以在Hierarchy窗口中创建…

项目部署上线(跨域问题的处理)

前言: 项目想要上线&#xff0c;前提是肯定需要一台服务器 我下面使用的是腾讯服务器和宝塔Linux的管理工具来进行项目的部署上线 服务器配置&#xff08;初始化&#xff09;-CSDN博客 项目部署&#xff1a; 我原来那篇文章写了用nginx的原生部署&#xff0c;不过我觉得那…

Redis 性能测试

Redis 性能测试 引言 Redis作为一种高性能的键值存储数据库&#xff0c;被广泛应用于各种场景中&#xff0c;如缓存、消息队列、排行榜等。为了确保Redis在实际应用中的性能满足需求&#xff0c;进行性能测试是至关重要的。本文将介绍Redis性能测试的方法、工具以及一些最佳实…

MySQL——查询优化

在查询大量的数据和多表查询时&#xff0c;经常会遇到查询慢&#xff0c;效率低下的问题&#xff0c;这时候就需要去优化查询&#xff0c;提高查询速度。 查询慢的原因 怎么才知道这个语句查询慢&#xff1f; 可以在 select 语句前加上EXPLAIN关键字&#xff0c;就可以看到查…