【Windows】深度学习环境部署

引言

1 Windows环境准备

1.1 VSCode

Visual Studio Code(简称 VSCode)是一款由微软开发的开源代码编辑器。它非常受开发者欢迎,因为它功能强大、扩展性好,并且支持多种编程语言。VSCode 尤其适合 Python 开发,特别是在结合 Anaconda 的虚拟环境时,可以极大地提升开发效率。
官网下载

  1. 配置Anaconda环境
第一步:在Vscode中安装Python插件
第二步:选择anconda中的环境
        在Vscode中使用CTRL+Shift+P的按钮打开搜索
        然后输入:> select interpreter
  1. 安装中文插件(汉化)
    参考链接🔗:Visual Studio Code安装中文插件

  2. python相对路径设置
    参考链接🔗:VScode 相对路径不能使用, 怎么办?

在这里插入图片描述

1.2 Anaconda安装(虚拟环境)

  1. 【Anaconda】windows安装Anaconda
  2. 【Ubuntu】安装Anaconda+vscode

1.3 安装CUDA+cudnn

【Windows】安装显卡驱动+cuda+cudnn

信息查看指令

  1. 显卡信息
nvcc -V

在这里插入图片描述
2. 驱动信息

nvidia-smi

在这里插入图片描述

2 目标检测——yolov5

  1. 环境安装教程: 【YOLO】YOLOv5-6.0环境搭建(不定时更新)
  2. yolov5官网源码:https://github.com/ultralytics/yolov5
  3. pytorc安装官网:https://pytorch.org/get-started/locally/

2.1 虚拟环境创建

conda create -n name python=3.9
conda activate name 

2.2 pytorch安装

CUDA 10.2
pip install torch==1.12.1+cu102 torchvision==0.13.1+cu102 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu102
CUDA 11.3
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

# 查看torch的版本
python -c 'import torch;print(torch.__version__)'
python -c 'import torch;print(torch.cuda.is_available())'

CUDA 10.2
conda install cudatoolkit=10.2.89 cudnn==7.6.5 -c http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
CUDA 11.3
conda install cudatoolkit=11.3.1 cudnn==8.2.1 -c http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main

2.3 源码下载及配置

pip install ultralytics
git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple  # install

2.4 模型训练和测试

  1. 目标检测训练 (COCO8 Dataset
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="coco8.yaml", epochs=10, imgsz=640)
  1. 语义分割训练(COCO8-Seg Dataset
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n-seg.pt")  # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="coco8-seg.yaml", epochs=100, imgsz=640)

2.5 自定义数据集训练

数据标注工具安装
【labelme】数据标注工具:https://blog.youkuaiyun.com/qq_44703886/article/details/108463900

pip install pyqt5 -i https://pypi.douban.com/simple
# labelme
pip install labelme -i https://pypi.douban.com/simple
# labelimg
pip install labelimg -i https://pypi.douban.com/simple

在这里插入图片描述

2.5.1 目标检测模型训练

训练自己的数据集:https://docs.ultralytics.com/yolov5/tutorials/train_custom_data/
参考链接:【YOLO】训练自己的数据集

cd /data3/205b/Alian/yolov5
python train.py --data D:\Alian_py\yolov5\data\my_coco128.yaml --cfg D:\Alian_py\yolov5\models\yolov5s.yaml --weights models/yolov56.pt --batch-size 4 --epochs 100 --img-size 640 

在这里插入图片描述

2.5.2 目标检测自定义模型测试

python detect.py --source test --weights logs/exp/weights/best.pt --project results

在这里插入图片描述

2.5.3 语义分割模型训练

参考链接:YOLOV8实例分割——详细记录环境配置、自定义数据处理到模型训练与部署
用labelme工具标注好的数据集结构如下:

images:原始图片
json_labels:标签文件
labels:数据转换后的文件

数据格式转换脚本json2txt.py

# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdm
import glob
import cv2
import numpy as np


def convert_label_json(json_dir, save_dir, classes):
    json_paths = os.listdir(json_dir)
    classes = classes.split(',')

    for json_path in tqdm(json_paths):
        # for json_path in json_paths:
        path = os.path.join(json_dir, json_path)
        # print(path)
        with open(path, 'r') as load_f:
            print(load_f)
            json_dict = json.load(load_f, )
        h, w = json_dict['imageHeight'], json_dict['imageWidth']

        # save txt path
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
        txt_file = open(txt_path, 'w')

        for shape_dict in json_dict['shapes']:
            label = shape_dict['label']
            label_index = classes.index(label)
            points = shape_dict['points']

            points_nor_list = []

            for point in points:
                points_nor_list.append(point[0] / w)
                points_nor_list.append(point[1] / h)

            points_nor_list = list(map(lambda x: str(x), points_nor_list))
            points_nor_str = ' '.join(points_nor_list)

            label_str = str(label_index) + ' ' + points_nor_str + '\n'
            txt_file.writelines(label_str)


def check_labels(txt_labels, images_dir):
    txt_files = glob.glob(txt_labels + "/*.txt")
    for txt_file in txt_files:
        filename = os.path.splitext(os.path.basename(txt_file))[0]
        pic_path = os.path.join(images_dir, filename + ".jpg")

        img = cv2.imread(pic_path)
        height, width, _ = img.shape

        file_handle = open(txt_file)
        cnt_info = file_handle.readlines()
        new_cnt_info = [line_str.replace("\n", "").split(" ") for line_str in cnt_info]

        color_map = {"0": (0, 255, 255)}
        for new_info in new_cnt_info:
            print(new_info)
            s = []
            for i in range(1, len(new_info), 2):
                b = [float(tmp) for tmp in new_info[i:i + 2]]
                s.append([int(b[0] * width), int(b[1] * height)])
            cv2.polylines(img, [np.array(s, np.int32)], True, color_map.get(new_info[0]))
        cv2.namedWindow('img2', 0)
        cv2.imshow('img2', img)
        cv2.waitKey()

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='json convert to txt params')
    parser.add_argument('--json-dir', type=str, default='dataset/json_labels', help='json path dir')
    parser.add_argument('--save-dir', type=str, default=r'D:\Alian_py\yolov5\datasets\coco8-seg-test\labels', help='txt save dir')
    parser.add_argument('--classes', type=str, default='surface', help='classes')
    parser.add_argument('--images-dir', type=str, default=r'D:\Alian_py\yolov5\datasets\coco8-seg-test\images', help='iamges path dir')
    args = parser.parse_args()
    json_dir = args.json_dir
    save_dir = args.save_dir
    classes = args.classes
    images_dir = args.images_dir
    # convert_label_json(json_dir, save_dir, classes)
    # 检查转换的标签是否正确
    # check_labels(save_dir, images_dir)

数据分割脚本seg_spilit.py

# -*- coding:utf-8 -*
import os
import random
import os
import shutil


def data_split(full_list, ratio):

    n_total = len(full_list)
    offset = int(n_total * ratio)
    if n_total == 0 or offset < 1:
        return [], full_list
    random.shuffle(full_list)
    sublist_1 = full_list[:offset]
    sublist_2 = full_list[offset:]
    return sublist_1, sublist_2

#数据集路径
images_dir=r"D:\Alian_py\yolov5\datasets\coco8-seg-test\images"
labels_dir=r"D:\Alian_py\yolov5\datasets\coco8-seg-test\labels"
#划分数据集,设置数据集数量占比
proportion_ = 0.9 #训练集占比
train_p=os.path.join(os.path.dirname(images_dir),"train")
val_p=os.path.join(os.path.dirname(images_dir),"val")
imgs_p="images"
labels_p="labels"

#创建训练集
if not os.path.exists(train_p):#指定要创建的目录
    os.mkdir(train_p)
tp1=os.path.join(train_p,imgs_p)
tp2=os.path.join(train_p,labels_p)
print(tp1,tp2)
if not os.path.exists(tp1):#指定要创建的目录
    os.mkdir(tp1)
if not os.path.exists(tp2):  # 指定要创建的目录
    os.mkdir(tp2)

#创建测试集文件夹
if not os.path.exists(val_p):#指定要创建的目录
    os.mkdir(val_p)
vp1=os.path.join(val_p,imgs_p)
vp2=os.path.join(val_p,labels_p)
print(vp1,vp2)
if not os.path.exists(vp1):#指定要创建的目录
    os.mkdir(vp1)
if not os.path.exists(vp2):  # 指定要创建的目录
    os.mkdir(vp2)

total_file = os.listdir(images_dir)

num = len(total_file)  # 统计所有的标注文件
list_=[]
for i in range(0,num):
    list_.append(i)

list1,list2=data_split(list_,proportion_)

for i in range(0,num):
    file=total_file[i]
    print(i,' - ',total_file[i])
    name=file.split('.')[0]
    if i in list1:
        jpg_1 = os.path.join(images_dir, file)
        jpg_2 = os.path.join(train_p, imgs_p, file)
        txt_1 = os.path.join(labels_dir, name + '.txt')
        txt_2 = os.path.join(train_p, labels_p, name + '.txt')
        if os.path.exists(txt_1) and os.path.exists(jpg_1):
            shutil.copyfile(jpg_1, jpg_2)
            shutil.copyfile(txt_1, txt_2)
        elif os.path.exists(txt_1):
            print(txt_1)
        else:
            print(jpg_1)

    elif i in list2:
        jpg_1 = os.path.join(images_dir, file)
        jpg_2 = os.path.join(val_p, imgs_p, file)
        txt_1 = os.path.join(labels_dir, name + '.txt')
        txt_2 = os.path.join(val_p, labels_p, name + '.txt')
        shutil.copyfile(jpg_1, jpg_2)
        shutil.copyfile(txt_1, txt_2)

print("数据集划分完成: 总数量:",num," 训练集数量:",len(list1)," 验证集数量:",len(list2))

在这里插入图片描述

3 语义分割

官网源码:https://github.com/open-mmlab/mmsegmentation
中文教程:https://github.com/open-mmlab/mmsegmentation/blob/main/README_zh-CN.md

3.1 环境准备

  1. PyTorch安装
  2. 安装和运行 MMSeg

3.2 数据集准备

  1. 教程2:准备数据集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值