基于windows10的pytorch环境部署及yolov8的安装及测试

news2024/11/17 10:42:06

第一章 pytorch环境部署留念

第一步:下载安装anaconda 官网地址
(也可以到清华大学开源软件镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/)
在这里插入图片描述
我安装的是下面这个,一通下一步就完事儿。
在这里插入图片描述
第二步:下载显卡驱动程序(大家一般都不需要,可以直接跳过)(cmd–nvidia-smi)
在这里插入图片描述
第三步:通过anaconda来安装pytorch
在这个base环境中先不要着急安装各种各样的python包,因为默认情况下在anaconda中创建的新的环境都是以base环境为模板的,也就是意味着新创建的环境会包含与base环境相同的Python版本和已安装的软件包列表,所以为了不必要的麻烦,我们新创建一个环境,创建环境的命令如下

conda create -n name python=3.8

-n是名字的意思,name自己取名,后面那个3.8是版本号。

在base环境中运行此命令可以进入我们创建的环境
第四步:激活环境

conda activate name (注:name是你自己创建的环境的名字)

第五步:在激活环境中下载安装pytorch
到官网去获取指令,官网链接:https://pytorch.org/,成功后的样子如图所示。
在这里插入图片描述
在这里插入图片描述
第六步:配置刚下载的环境作为pycharm中我们的python解释器
1.打开pycharm选择“文件”——设置
在这里插入图片描述
2.选择编辑器、添加解释器
在这里插入图片描述
3.选择conda环境,单击确定。
在这里插入图片描述
到这里就完事了。

第二章 YOLOV8的安装及测试

1.下载代码,到官网去找,或者其他人上传的都可以,主要下载两个内容:
第一个如下图的代码
在这里插入图片描述
第二个如下图的模型,上面的那个把网页下拉就看到了
在这里插入图片描述
2.将下载完的代码解压拷贝到D盘的文件夹中,如下图所示
在这里插入图片描述
3.将下载完的模型解压拷贝到如下图所示文件夹中
在这里插入图片描述
4.在Anaconda中执行下面的指令
在这里插入图片描述
5.安装依赖包
使用指令 pip install -r requirements.txt 安装的时候各种报错,更换源就好了。 更换源的方法就是在pip install的后面增加 -i +源名+安装包的形式,采用下面的指令进行安装即可

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

6.安装YOLO
出现下图表示成功,警告不用管。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ultralytics

在这里插入图片描述
7.测试
用yolov8s.pt来测试 :

yolo task=segment mode=predict model=wighte/yolov8s.pt source=ultralytics/assets/bus.jpg save=true

在这里插入图片描述
在程序文件夹中可以找到结果
在这里插入图片描述
结果如下图所示:
在这里插入图片描述
测试视频/摄像头/文件夹:(source=自己的绝对路径就行,照片也可以用绝对路径,刚才用的是相对路径),素材可以上网去找别人下载好的直接用就行,文件夹没有测试不知道是啥,前三个测试了效果挺好,尤其是摄像头,直接计算机上插一个摄像头就行。

conda activate yolov8
cd /d D:\ultralytics-main
#测试图片
yolo task=segment mode=predict model=wighte/yolov8s.pt source=ultralytics/assets/bus.jpg save=true
 
#测试视频
yolo task=segment mode=predict model=wighte/yolov8s.pt source=D:\car.mp4 show=true
 
#测试摄像头
yolo task=segment mode=predict model=wighte/yolov8s.pt source=0
 
#测试文件夹
yolo task=segment mode=predict model=wighte/yolov8s.pt source=D:\myimgs

第三章 制作自己的数据集

1.安装labelme,这里注意更换源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple labelme

在这里插入图片描述
出现下图表示安装成功
在这里插入图片描述
2.输入下图指令,打开labelme,结果如图所示
在这里插入图片描述
3.打开一张图片,进行标注。如果是目标检测就选择Create Rectangle框选图形即可,如果是图像分割就选择Create Plogons绘制边框,然后定义分类后保存成.json格式。
在这里插入图片描述
3.在网上找到的别人下载的标注好的图片库labelme-dogcat-test文件夹,里面是一些猫和狗的图片及标注文件,把他们拷贝到了D:\ultralytics-main\ultralytics\assets这个文件夹,如下图所示,在它的上一级目录中新建一个文件夹命名为yoloForm,用于存储转换后的文件。
在这里插入图片描述
4.把labelme格式转化成yolov8支持的数据集格式,需要下面的脚本,只需要改最后一行,就是数据源地址和目标地址( cm.start(r’源文件路径’, r’保存新位置路径’)),将其存储为JsonToYolo.py格式,执行即可,执行时,如果缺少东西就安装对应的库即可。

import base64
import random
import shutil
from tqdm import tqdm
import math
import json
import os
import numpy as np
import PIL.Image
import PIL.ImageDraw
import cv2


class ConvertManager(object):
    def __init__(self):
        pass

    def base64_to_numpy(self, img_bs64):
        img_bs64 = base64.b64decode(img_bs64)
        img_array = np.frombuffer(img_bs64, np.uint8)
        cv2_img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
        return cv2_img

    @classmethod
    def load_labels(cls, name_file):
        '''
        load names from file.one name one line
        :param name_file:
        :return:
        '''
        with open(name_file, 'r') as f:
            lines = f.read().rstrip('\n').split('\n')
        return lines

    def get_class_names_from_all_json(self, json_dir):
        classnames = []
        for file in os.listdir(json_dir):
            if not file.endswith('.json'):
                continue
            with open(os.path.join(json_dir, file), 'r', encoding='utf-8') as f:
                data_dict = json.load(f)
                for shape in data_dict['shapes']:
                    if not shape['label'] in classnames:
                        classnames.append(shape['label'])
        return classnames

    def create_save_dir(self, save_dir):
        images_dir = os.path.join(save_dir, 'images')
        labels_dir = os.path.join(save_dir, 'labels')
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
            os.mkdir(images_dir)
            os.mkdir(labels_dir)
        else:
            if not os.path.exists(images_dir):
                os.mkdir(images_dir)
            if not os.path.exists(labels_dir):
                os.mkdir(labels_dir)
        return images_dir + os.sep, labels_dir + os.sep

    def save_list(self, data_list, save_file):
        with open(save_file, 'w') as f:
            f.write('\n'.join(data_list))

    def __rectangle_points_to_polygon(self, points):
        xmin = 0
        ymin = 0
        xmax = 0
        ymax = 0
        if points[0][0] > points[1][0]:
            xmax = points[0][0]
            ymax = points[0][1]
            xmin = points[1][0]
            ymin = points[1][1]
        else:
            xmax = points[1][0]
            ymax = points[1][1]
            xmin = points[0][0]
            ymin = points[0][1]
        return [[xmin, ymin], [xmax, ymin], [xmax, ymax], [xmin, ymax]]

    def convert_dataset(self, json_dir, json_list, images_dir, labels_dir, names, save_mode='train'):
        images_dir = os.path.join(images_dir, save_mode) + os.sep
        labels_dir = os.path.join(labels_dir, save_mode) + os.sep
        if not os.path.exists(images_dir):
            os.mkdir(images_dir)
        if not os.path.exists(labels_dir):
            os.mkdir(labels_dir)
        for file in tqdm(json_list):
            with open(os.path.join(json_dir, file), 'r', encoding='utf-8') as f:
                data_dict = json.load(f)
            image_file = os.path.join(json_dir, os.path.basename(data_dict['imagePath']))
            if os.path.exists(image_file):
                shutil.copyfile(image_file, images_dir + os.path.basename(image_file))
            else:
                imageData = data_dict.get('imageData')
                if not imageData:
                    imageData = base64.b64encode(imageData).decode('utf-8')
                    img = self.img_b64_to_arr(imageData)
                    PIL.Image.fromarray(img).save(images_dir + file[:-4] + 'png')
            # convert to txt
            width = data_dict['imageWidth']
            height = data_dict['imageHeight']
            line_list = []
            for shape in data_dict['shapes']:
                data_list = []
                data_list.append(str(names.index(shape['label'])))
                if shape['shape_type'] == 'rectangle':
                    points = self.__rectangle_points_to_polygon(shape['points'])
                    for point in points:
                        data_list.append(str(point[0] / width))
                        data_list.append(str(point[1] / height))


                elif shape['shape_type'] == 'polygon':
                    points = shape['points']
                    for point in points:
                        data_list.append(str(point[0] / width))
                        data_list.append(str(point[1] / height))
                line_list.append(' '.join(data_list))

            self.save_list(line_list, labels_dir + file[:-4] + "txt")

    def split_train_val_test_dataset(self, file_list, train_ratio=0.9, trainval_ratio=0.9, need_test_dataset=False,
                                     shuffle_list=True):
        if shuffle_list:
            random.shuffle(file_list)
        total_file_count = len(file_list)
        train_list = []
        val_list = []
        test_list = []
        if need_test_dataset:
            trainval_count = int(total_file_count * trainval_ratio)
            trainval_list = file_list[:trainval_count]
            test_list = file_list[trainval_count:]
            train_count = int(train_ratio * len(trainval_list))
            train_list = trainval_list[:train_count]
            val_list = trainval_list[train_count:]
        else:
            train_count = int(train_ratio * total_file_count)
            train_list = file_list[:train_count]
            val_list = file_list[train_count:]
        return train_list, val_list, test_list

    def start(self, json_dir, save_dir, names=None, train_ratio=0.9):
        images_dir, labels_dir = self.create_save_dir(save_dir)
        if names is None or len(names) == 0:
            print('class names will load from all json file')
            names = self.get_class_names_from_all_json(json_dir)
        print('find {} class names :'.format(len(names)), names)
        if len(names) == 0:
            return

        self.save_list(names, os.path.join(save_dir, 'labels.txt'))
        print('start convert')
        all_json_list = []
        for file in os.listdir(json_dir):
            if not file.endswith('.json'):
                continue
            all_json_list.append(file)
        train_list, val_list, test_list = self.split_train_val_test_dataset(all_json_list, train_ratio)
        self.convert_dataset(json_dir, train_list, images_dir, labels_dir, names, 'train')
        self.convert_dataset(json_dir, val_list, images_dir, labels_dir, names, 'val')


if __name__ == '__main__':
    cm = ConvertManager()
    cm.start(r'D:\ultralytics-main\ultralytics\assets\labelme-dogcat-test', r'D:\ultralytics-main\ultralytics\assets\yoloForm')

5.在Pycharm中执行上面的脚本,执行完成后,刚刚新建的文件夹就会有转换后的数据了,如下图所示。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【原创】RockyLinux设置网络/网卡唤醒/NetworkManager设置网络唤醒

前言 由于我的5600G无法安装CentOS系统,因此选择安装了RockyLinux,但是RockyLinux用的是NetworkManager,网上说的都是之前CentOS的方法,因此完全无效,这里来介绍一下RockyLinux如何设置网络唤醒。 修改BIOS设置 我的…

通义大模型使用指南之通义听悟

一、注册 我们可以打开以下网站,用手机号注册一个账号即可。 https://tongyi.aliyun.com/ 二、使用介绍 如图,我们可以看到有三个大项功能,通义千问、通义万相、通义听悟。下来我们体验一下通义听悟的功能。 1、通义听悟 1、1基本功能 当我们…

Java枚举(Enum)的使用

目录 一、枚举类型的定义 二、枚举类型的使用 (一)、枚举类型的常用方法 (二)、枚举的简单使用 (1)、和switch的搭配使用 (2)、枚举类型的values方法 (3&#xff…

JAVA毕业设计103—基于Java+Springboot+vue的药店管理系统(源码+数据库)

基于JavaSpringbootvue的药店管理系统(源码数据库) 一、系统介绍 本系统前后端分离 -功能: 登录、药库药品管理、统计查询、药房管理、物资管理、挂号管理、账号管理、角色管理、权限管理、登录日志管理、药品管理、药品类型管理、客人类型管理 二、所用技术 后端技术栈&a…

PCL 透视投影变换(OpenGL)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在现实生活中,我们总会注意到离我们越远的东西看起来更小。这个神奇的效果被称之为透视(Perspective)。透视的效果在我们看一条无限长的高速公路或铁路时尤其明显,正如下面图片显示的这样: 由于透视的原因,平行线…

优雅草蜻蜓z系统暗影版前台崩溃,后台提示:系统接口异常502,java项目管理yyc-admin后台管理系统服务无法启动的解决方案

蜻蜓z系统暗影版提示系统接口异常502 蜻蜓z系统系统接口异常502,java项目管理yyc-admin后台管理系统服务无法启动,解决方案 系统稳定运行一些时间后突然由于问题造成无法启动,提示接口异常: 原因过程分析: 现象&am…

【Docker】Docker Swarm介绍与环境搭建

为什么不建议在生产环境中使用Docker Compose 多机器如何管理?如何跨机器做scale横向扩展?容器失败退出时如何新建容器确保服务正常运行?如何确保零宕机时间?如何管理密码,Key等敏感数据? Docker Swarm介…

计算机视觉中的数据预处理与模型训练技巧总结

计算机视觉主要问题有图像分类、目标检测和图像分割等。针对图像分类任务,提升准确率的方法路线有两条,一个是模型的修改,另一个是各种数据处理和训练的技巧(tricks)。图像分类中的各种技巧对于目标检测、图像分割等任务也有很好的作用&#…

制造业中的微小缺陷检测——应用场景分析与算法选择(YoloV8/CANet)

一、缺陷检测任务 缺陷检测的任务通常可以分为三个主要阶段,包括缺陷分类、缺陷定位和缺陷分割。 1.缺陷分类 缺陷分类是检测过程的第一步,目的是将检测到的缺陷区域分类为不同的类别,通常是根据缺陷的性质或类型进行分类。分类的类别包括…

深度学习使用Keras进行迁移学习提升网络性能

上一篇文章我们用自己定义的模型来解决了二分类问题,在20个回合的训练之后得到了大约74%的准确率,一方面是我们的epoch太小的原因,另外一方面也是由于模型太简单,结构简单,故而不能做太复杂的事情,那么怎么提升预测的准确率了?一个有效的方法就是迁移学习。 迁移学习其…

C#反射的应用及相关代码示例

在C#编程中,反射是一种强大的工具,它允许程序在运行时动态地获取类型信息、访问和操作类成员。反射为开发人员提供了更大的灵活性和扩展性,使得我们可以编写更加通用和动态的代码。本文将探讨C#反射的应用,并提供一些相关的代码示…

程序员加油!最新最全Java面试题及解答(上百道题,近5w字,包括Redis、MySQL、框架、微服务、消息中间件、集合、jvm,多线程、常见技术场景)

刚看完黑马教程的新版Java面试专题视频教程,java八股文面试全套真题深度详解(含大厂高频面试真题),对面试题分专题整理,方便面试突击 Redis相关面试题 Redis相关面试题 面试官:什么是缓存穿透 ? 怎么解决…

软考系列(系统架构师)- 2016年系统架构师软考案例分析考点

试题一 软件架构(质量属性、架构风格对比、根据描述填空) 试题二 系统开发(用例图参与者、用例关系、类图关系) 学生、教师、管理员、时间、打印机【问题2】(7分) 用例是对系统行为的动态描述,用…

【强连通+背包】CF1763E

Problem - E - Codeforces 题意 思路 首先,先考虑第一个条件,要保证是p个节点互相到达且节点数最少,一定是个强连通,图的形态一定就是和强连通相关的。 然后,因为在这个前提上,要让单向节点数尽可能多&a…

归并排序与计数排序(含代码)

目录 目录: 1:归并排序递归 2:归并排序的非递归 3:计数排序的思想 1:归并排序递归 思路:归并排序是采用分治算法的一种排序,将两个有序的子数组合并到一个数组中去使得数组完全有序,所以我们先使子数组有序…

CAN测量模块总线负载率,你关注了吗?

一 背景 随着新能源汽车的飞速发展,整车系统日趋复杂,整车性能的可靠性也变得愈发重要。在车辆测试过程中,为应对更加多样的试验需求,传感器的种类和数量会随着测量种类而增加,数据量也会因此变得越发庞大&#xff0c…

docker部署prometheus+grafana服务器监控(一)

docker-compose 部署prometheusgrafana Prometheus Prometheus 是有 SoundCloud 开发的开源监控系统和时序数据库,基于 Go 语言开发。通过基于 HTTP 的 pull 方式采集时序数据,通过服务发现或静态配置去获取要采集的目标服务器,支持多节点工…

Kubernetes 部署 kubeflow1.7.0

KubeFlow 是一个开源的项目,旨在为 Kubernetes 提供可组合、便携式、可扩展的机器学习技术栈。它最初是为了解决在 Kubernetes 上运行分布式机器学习任务所带来的挑战而创建的。Kubernetes 本身是一个容器平台,但在近年来,越来越多的公司开始…

【Html】交通灯问题

效果 实现方式 计时器:setTimeout或setInterval来计时。setInterval和 setTimeout 在某些情况下可能会出现计时不准确的情况。这通常是由于JavaScript的事件循环机制和其他代码执行所需的时间造成的。 问询:通过getCurrentLight将每个状态的持续时间设置…

解密分布式事务:CAP理论、BASE理论、两阶段提交(2PC)、三阶段提交(3PC)、补偿事务(TCC)、MQ事务消息、最大努力通知

文章目录 🍊 CAP理论🍊 BASE理论🍊 两阶段提交(2PC)🎉 XA事务 🍊 三阶段提交(3PC)🍊 补偿事务(TCC)🍊 MQ事务消息&#x1…