YoloV8训练自己的模型 Pycharm Remote Development

news2025/1/21 12:13:29

参考视频:https://www.youtube.com/watch?v=m9fH9OWn8YM

YOLO官方网站:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

在本地的pycharm上面建立一个项目

使用scp把代码传递到远程服务器

scp -r /Users/xxx/PycharmProjects/Yolov8-second/* xxx@xxx:/home/ps/Code/Python/YoloV8

有个问题是:如果我们直接这样传过去,那我们这个地方是空的

 如果不是空的,我们直接给原来的删掉,这个时候,pycharm会自动提示让你添加一个python解释题,然后添加即可。

如果不这样做的话,好多package都会报红

使用romote development进行远程开发

什么是远程开发?就是把远程服务器上面的项目,给直接拿到本地的pycharm上面进行开发,这样可以使用pycharm的debug等各种方便。

输入一下服务器的账号密码,选中要远程开发的项目文件夹 

安装Yolov8

如果需要不修改Yolov8的源代码,直接pip install安装即可,参考官方网站安装即可

在main.py中写入如下代码

from ultralytics import YOLO

# Create a new YOLO model from scratch
# model = YOLO('yolov8n.yaml')
# Load a pretrained YOLO model (recommended for training)
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
results = model.train(data="config.yaml", epochs=500)  # train the model

model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)

这个是我们直接使用一个yolo官方训练好的模型,在此基础上继续训练,这样效果会比较好

results = model.train(data="config.yaml", epochs=500)  # train the model

 这个是用我们自己的config.yaml,里面有数据集,自己训练一个模型,这个模型,可以按照自己的想法,只识别指定的几种物体,用一定量的数据集

path: /Users/roy/PycharmProjects/YoloV8/clean_data
train: images/train
val: images/val
names:
  0: Person
  1: CoffeeCup
  2: Book
  3: ComputerMouse

path必须使用绝对路径,train和val也必须使用我上面的格式,names也必须按照上面的格式,一个空格都不能错位,names就是我只识别这四个物体,这个地方的Person,CoffeeCup,Book,这些单词都是我们下载的数据集中的数据

下载数据集

先在项目根目录下面创建一个datasets文件夹,创建一个raw_data文件夹,然后再根目录下来再创建一个download_raw_dataset.py

import fiftyone.zoo

classes = ["Coffee cup", "Book", "Computer mouse", "Person"]
for i in range(len(classes)):
    item = classes[i]
    print(item)
    dataset = fiftyone.zoo.load_zoo_dataset(
        "open-images-v7",
        splits=["train", "val", "test"],
        label_types=["detections"],
        classes=[item],
        max_samples=1000,
        dataset_dir="./datasets/raw_data",
    )
for i in range(len(classes)):
    item = classes[i]
    print(item)
    dataset = fiftyone.zoo.load_zoo_dataset(
        "open-images-v7",
        splits=["val"],
        label_types=["detections"],
        classes=[item],
        max_samples=100,
        dataset_dir="./datasets/raw_data",
    )

这是下载完成之后的数据集的结构

_path结尾的变量,可以直接使用鼠标定位到文件夹的位置

数据清洗

在datasets文件下面,创建一个clean_data文件夹,里面存储清洗后,可以让Yolov8使用的数据

detections.csv不是干净的数据,我们需要在创建一个clean.csv文件

在根目录下面创建一个clean.py

import csv
from tqdm import tqdm
import os

# csv_file_path = os.path.join('.', 'datasets', 'raw_data', 'train', 'labels', 'detections.csv')
csv_file_path = './datasets/raw_data/train/labels/detections.csv'
# 图像文件夹路径
# images_file_path = os.path.join('.', 'train', "data")
images_file_path = './datasets/raw_data/train/data'
images_name = os.listdir(images_file_path)
images_name = [x.split(".")[0] for x in images_name]
# 类别
LabelName = ['/m/01g317', '/m/02p5f1q', '/m/0bt_c3', '/m/020lf']
# 保存标注文件路径
# data_annotation_csv = os.path.join('.', 'train', 'labels', 'clean.csv')
data_annotation_csv_path = './datasets/raw_data/train/labels/clean.csv'
with open(csv_file_path, 'r', encoding='utf-8') as f:
    with open(data_annotation_csv_path, "w", encoding='utf-8') as ff:
        csv_f = csv.reader(f)
        bar = tqdm(csv_f)
        for row in bar:
            if row[0] in images_name and row[2] in LabelName:
                for index in range(len(row)):
                    ff.write(row[index])
                    if (index != (len(row) - 1)):
                        ff.write(",")
                ff.write("\n")

现在clean.csv就是干净的数据,我们还需要再进行一步操作,创建Yolo需要的格式

在根目录下面创建文件create_dataset_yolo_format.py

import os
import shutil

DATA_OUT_DIR = os.path.abspath(os.path.join('datasets/clean_data'))

for set_ in ['train', 'val', 'test']:
    for dir_ in [os.path.join(DATA_OUT_DIR, set_),
                 os.path.join(DATA_OUT_DIR, set_, 'imgs'),
                 os.path.join(DATA_OUT_DIR, set_, 'labels')]:
        if os.path.exists(dir_):
            shutil.rmtree(dir_)
        os.makedirs(dir_, exist_ok=True)

LabelName = ['/m/01g317', '/m/02p5f1q', '/m/0bt_c3', '/m/020lf']

# 使用enumerate函数创建键值对,键是元素,值是索引
alpaca_id_dict = {alpaca_id: index for index, alpaca_id in enumerate(LabelName)}

print(alpaca_id_dict)

train_bboxes_filename = os.path.join('datasets/raw_data/train/labels', 'clean.csv')
# validation_bboxes_filename = os.path.join('datasets/raw_data/validation/labels', 'clean.csv')
# test_bboxes_filename = os.path.join('datasets/raw_data/test/labels', 'clean.csv')

# for j, filename in enumerate([train_bboxes_filename, validation_bboxes_filename, test_bboxes_filename]):
for j, filename in enumerate([train_bboxes_filename]):
    set_ = ['train', 'val', 'test'][j]
    print(filename)
    with open(filename, 'r') as f:
        line = f.readline()
        while len(line) != 0:
            id, _, class_name, _, x1, x2, y1, y2, _, _, _, _, _ = line.split(',')[:13]
            if class_name in LabelName:
                if not os.path.exists(os.path.join(DATA_OUT_DIR, set_, 'imgs', '{}.jpg'.format(id))):
                    shutil.copy(os.path.join("datasets/raw_data", set_, "data", '{}.jpg'.format(id)),
                                os.path.join(DATA_OUT_DIR, set_, 'imgs', '{}.jpg'.format(id)))
                with open(os.path.join(DATA_OUT_DIR, set_, 'labels', '{}.txt'.format(id)), 'a') as f_ann:
                    # class_id, xc, yx, w, h
                    x1, x2, y1, y2 = [float(j) for j in [x1, x2, y1, y2]]
                    xc = (x1 + x2) / 2
                    yc = (y1 + y2) / 2
                    w = x2 - x1
                    h = y2 - y1

                    f_ann.write('{} {} {} {} {}\n'.format(alpaca_id_dict[class_name], xc, yc, w, h))
                    print(alpaca_id_dict[class_name])
                    f_ann.close()

            line = f.readline()

执行之后,数据清洗工作就完成了

下来就是开始训练了,执行main方法,训练500轮(epoch),然后模型会保存在根目录下面的runs

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

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

相关文章

星球作业(第十一期)Android中Binder简述

Binder 什么是binder?简述下它的工作过程和使用场景。 什么是Binder? Binder是Android中的一个类,实现了IBinder接口; 从IPC的角度来说,Binder是Android中的一种通讯方式; 从Android Framework角度来说&a…

一文搞清楚Java中常见的IO模型

什么是IO 首先,我们要清楚什么是IO,根据冯诺依曼结构,计算机结构分为5部分:运算器、控制器、存储器、输入设备和输出设备。 输入设备和输出设备都属于外设,网卡、硬盘这种既可以属于输入设备也可以属于输出设备。 输入…

深度学习-卷积神经网络-ResNET

文章目录 前言1.resnet2.作者3.精度(TOP-5)4.论文一览5.竞赛排名6.网络退化7.残差8.残差 1.作者 前言 本文来自B站: ResNet深度残差网络 1.resnet 2.作者 3.精度(TOP-5) 4.论文一览 5.竞赛排名 6.网络退化 ResNet解…

拆解常见的6类爆款标题写作技巧!

究竟是先写好文章再拟标题还是先确定标题再写文章呢?很多写稿小白都会有这样的疑惑。 在“人人皆可新媒体”的时代,公众号推文类型琳琅满目,每个人都可以建立自己的公众号,写出自己想写的文章。 但怎样起标题、起什么样的标题&a…

MyCat安装文档

JDK安装 JDK具体安装步骤如下: 1. 上传安装包 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 由于上述在进行文件上传时,选择的上传目录为根目录 /,上传完毕后,我们执行指令 cd / 切换到根目录下,查…

STM32 10个工程篇:1.IAP远程升级(六)

在IAP远程升级的最后一篇博客里,笔者想概括性地梳理总结IAP程序设计中值得注意的问题,诚然市面上或者工作后存在不同版本的IAP下位机和上位机软件,也存在不同定义的报文格式,甚至对于相似的知识点不同教程又有着完全不同的解读&am…

You Know What is C++嵌套类

C嵌套类 一、嵌套类1.嵌套类和访问权限2.作用域3.访问控制 一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类,或者嵌套类型。引入嵌套类,因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现&…

黑马JVM总结(二十七)

(1)synchronized代码块 synchronized代码块的底层原理,它是给一个对象进行一个加锁操作,它是如何保证如果你出现了synchronized代码块中出现了问题,它需要给这个对象有一个正确的解锁操作呢,加锁解锁是成对…

为什么网络安全明明缺口很大,却看起来招聘很少呢?

2023 年我国网络空间安全人才数量缺口超过了 140 万,就业人数却只有 10 多万,缺口高达了 93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&…

10、【Qlib】【主要组件】高频交易嵌套决策执行框架

10、【Qlib】【主要组件】高频交易嵌套决策执行框架 简介简介 日间交易(例如,投资组合管理)和当日交易(例如,订单执行)是量化投资中的两个热门话题,并且通常会分别进行研究。 为了获得日间和当日交易的联合交易绩效,它们必须相互作用,并共同进行回测。为了支持多级的…

7.Tensors For Beginneers - Convector Components

介绍协向量时,曾说过它们有点像 行向量, 行向量确实以某种方式代表了协向量, 这里说明一下: 协向量是不变的; 协向量组件是可变的。 协向量不依赖坐标系,协向量的组件取决于坐标系。 当我们说协向量具有组…

基于SSM的旅游攻略网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

【SpringCloud】微服务技术栈入门3 - Gateway快速上手

目录 GatewayWebFlux网关基本配置过滤器与断言工厂全局过滤器跨域处理 CORS Gateway WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架,用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式,并提供了一种响应式的方…

Java中阻塞队列原理、特点、适用场景

文章目录 阻塞队列对比、总览阻塞队列本质思想主要队列讲解ArrayBlockingQueueLinkedBlockingQueueSynchronousQueueLinkedTransferQueuePriorityBlockingQueueDelayQueueLinkedBlockingDeque 阻塞队列对比、总览 阻塞队列本质思想 阻塞队列都是线程安全的队列. 其最主要的功能…

3分钟基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来,各大公司在大模型方面持续发力,行业大模型也如雨后春笋一般发展迅速,日常工作中比较多的应用场景还是问答模式,作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT,…

python通过socket 搭建极简web服务器

环境:win11、python 3.9.2 背景:python的web框架众多,常见的如django、flask、tornado等,其底层是什么还是有些许的疑问,所以查找相关资料,实现浏览器访问,并返回相关信息 时间:20…

期权定价模型系列【8】:选择者期权(chooser option)定价模型

期权定价模型系列第8篇文章 1.前言 抉择型期权又称为随心所欲期权,是一种与时间相关的期权。这种期权的持有 人有权在到期日之前的某一段时期,决定该选择权为买权或卖权。因此,在决定的时间点,抉择型期权的价值应该为:…

命令解释器-Shell

目录 1. 概述 1.1. 概念 1.2. 分类: 1.3. type 命令 1.4.命令执行原理 2. Linux 中的特殊符号 3. 命令别名 3.1. 查看设置的别名 3.2. 常用的别名 3.3. 删除别名 3.6. 注意(alias永久化): 4. history 命令历史 例&a…

已解决:win的资源管理器右键菜单被折叠无法显示全内容?教你解决

win11在样式上整挺好的,那种圆润感是win10没法比拟的,但是有一个很严重的诟病,就是右键菜单的折叠,这个东西是资源管理器新增的一个功能,如果之前是win右键的重度用户,那么对于这种需要多点一步展开的操作&…