YOLO在mac上的安装和使用

农民  金牌会员 | 2024-12-23 18:41:33 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

提示:文章写完后,目录可以自动生成,怎样生成可参考右边的帮助文档
  
  

提示:以下是本篇文章正文内容,下面案例可供参考
一、YOLO的安装

1.在GitHub上下载源码:

https://github.com/ultralytics/yolov5/tree/v6.1

2.设置环境:

1.将下载好的压缩包保存至一个没有中文的路径下,点击打开PyCharm,点击open按钮,在路径中找到刚刚的源码保存路径,即可在PyCharm中打开项目。

⚠此时大概会跳出一个框,让你设置环境,先直接关掉。(我们后面再设置环境)
2.打开Anaconda,在左侧选择environments,点击下方create,我创建了一个新环境,定名为yolo5_test。(建议选择python3.9与yolov5适配)

3.打开Pycharm设置Preference

新建Python表明器的环境

4.系列库的安装
(1).打开终端,输入命令进入创建的Anaconda环境
  1. conda activate yolov5_test
复制代码
(yolov5_test是我创建的环境名,需换成你的)
(2).设置torch和torchvision
  1. pip install torch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1
复制代码
(输入后会自动提示得当你的版本,根据提示更改版本号安装即可)
(3).对照requirements.txt 设置其他所需安装包
  1. pip install -r requirements.txt
复制代码
这里我失败了,于是分别安装
  1. pip install numpy
  2. pip install opencv-python
  3. pip install matplotlib
  4. pip install pillow
  5. pip install PyYAM
  6. pip install scipy
  7. pip install tqdm
  8. pip install requests
复制代码
5.运行程序
基本测试需要运行detect.py
(这里我运行时出现了bug,发现还有一些包未安装,根据提示又安装了缺少的包)
终极在pycharm中运行结果如下

打开exp查看结果

二、用YOLO测试视频

1.测试下载视频

将视频放入yolov5-6.1/data/images/中,在pycharm中运行detect.py

打开yolov5-6.1/runs/detect/exp查看结果代码如下(示例):

2.用电脑自带摄像头实时监测

在detect文件末了找到此行代码

改为:
  1. cd_argument('--source', type=str, default='0', help='source')  # file/folder, 0 for webcam
复制代码
同样打开yolov5-6.1/runs/detect/exp查看结果
三、训练自己的数据集

1.创建环境
创建一个新的anaconda环境
  1. conda create -n tf python=3.9.18
复制代码
(改成自己的python版本)
切换到tf环境(重新打开终端时要记得切到这个环境)
  1. conda activate tf
复制代码
(前面有(tf)则是转换成功)
2.安装macos版本的TensorFlow
  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tensorflow==2.6
复制代码
3.pyqt5安装
法一
  1. pip install pyqt5
复制代码
(这里我失败了)
法二 安装homebrew
  1. /usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码
通过homebrew安装pyqt5
  1. brew install pyqt5
复制代码
4.安装torch和torchvision
  1. pip install torch==1.7.1 torchvision==0.8.2 -f https://download.pytorch.org/whl/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple/torch
复制代码
5.安装labelimg
法一
  1. pip install labelimg
复制代码
这里我失败了
法二 进入labelimg的github地点https://github.com/HumanSignal/labelImg

打开终端输入cd 将labeling-master文件夹拖入
  1. brew install qt
  2. brew install libxml2
  3. conda install lxml
  4. make qt5py3
  5. python labelImg.py
复制代码
就可以用labelimg标注文件啦

在yolov5目录下新建一个名为VOCData的文件夹,在VOCData文件夹下创建 Annotations 和 images 文件夹。
images文件夹放要训练的图片
打开目录为images文件夹
更改存放目录为Annotions文件夹
标记图片快捷键:w:标记   a:上一张图片   d:下一张图片
标注的时间尽大概贴近物体表面
6.分别数据集以及设置文件修改
(1)分别训练集、验证集、测试集
在终端中打开images文件夹(根据自己路径找)
  1. cd /Users/zhuoxiaohua/Documents/yolov5-6.1/VOCData/images
  2. Is -a
  3. rm .DS_Store
复制代码
在macos下,文件夹内会生成.Ds_store隐藏文件要先删除
在VOCData目录下创建程序 split_train_val.py 并运行以下代码(代码可以不做任何修改)
  1. #coding:utf-8
  2. import os
  3. import random
  4. import argparse
  5. parser = argparse.ArgumentParser()
  6. #xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
  7. parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
  8. #数据集的划分,地址选择自己数据下的ImageSets/Main
  9. parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
  10. opt = parser.parse_args()
  11. trainval_percent = 1.0  # 训练集和验证集所占比例。 这里没有划分测试集
  12. train_percent = 0.9     # 训练集所占比例,可自己进行调整
  13. xmlfilepath = opt.xml_path
  14. txtsavepath = opt.txt_path
  15. total_xml = os.listdir(xmlfilepath)
  16. if not os.path.exists(txtsavepath):
  17.     os.makedirs(txtsavepath)
  18. num = len(total_xml)
  19. list_index = range(num)
  20. tv = int(num * trainval_percent)
  21. tr = int(tv * train_percent)
  22. trainval = random.sample(list_index, tv)
  23. train = random.sample(trainval, tr)
  24. file_trainval = open(txtsavepath + '/trainval.txt', 'w')
  25. file_test = open(txtsavepath + '/test.txt', 'w')
  26. file_train = open(txtsavepath + '/train.txt', 'w')
  27. file_val = open(txtsavepath + '/val.txt', 'w')
  28. for i in list_index:
  29.     name = total_xml[i][:-4] + '\n'
  30.     if i in trainval:
  31.         file_trainval.write(name)
  32.         if i in train:
  33.             file_train.write(name)
  34.         else:
  35.             file_val.write(name)
  36.     else:
  37.         file_test.write(name)
  38. file_trainval.close()
  39. file_train.close()
  40. file_val.close()
  41. file_test.close()            
复制代码
运行结束后会在生成一个名为 ImageSets 的文件夹
[说明]:在第14,15行代码中
训练集是用来训练模型的,通过实验差别的方法和思路使用训练集来训练差别的模型;
验证集使用交叉验证来挑选最优的模型,通过不断的迭代来改善模型在验证集上的性能;
测试集用来评估模型的性能。
(2)XML格式转yolo_txt格式
在VOCData目录下创建程序 xml_to_yolo.py 并运行以下代码
注意:将classes改为自己标注时设置的类名(我这里叫"code"),将各个绝对路径修改为自己的
  1. #-*- coding: utf-8 -*-
  2. import xml.etree.ElementTree as ET
  3. import os
  4. from os import getcwd
  5. sets = ['train', 'val', 'test']
  6. classes = ["code"]  # 改成自己的类别
  7. abs_path = os.getcwd()
  8. print(abs_path)
  9. def convert(size, box):
  10.     dw = 1. / (size[0])
  11.     dh = 1. / (size[1])
  12.     x = (box[0] + box[1]) / 2.0 - 1
  13.     y = (box[2] + box[3]) / 2.0 - 1
  14.     w = box[1] - box[0]
  15.     h = box[3] - box[2]
  16.     x = x * dw
  17.     w = w * dw
  18.     y = y * dh
  19.     h = h * dh
  20.     return x, y, w, h
  21. def convert_annotation(image):
  22.     in_file = open('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/Annotations/%s.xml' % image, encoding='utf-8')
  23.     out_file = open('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/labels/%s.txt' % image, 'w')
  24.     tree = ET.parse(in_file)
  25.     root = tree.getroot()
  26.     size = root.find('size')
  27.     w = int(size.find('width').text)
  28.     h = int(size.find('height').text)
  29.     for obj in root.iter('object'):
  30.         difficult = obj.find('difficult').text
  31.         # difficult = obj.find('Difficult').text
  32.         cls = obj.find('name').text
  33.         if cls not in classes or int(difficult) == 1:
  34.             continue
  35.         cls_id = classes.index(cls)
  36.         xmlbox = obj.find('bndbox')
  37.         b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  38.              float(xmlbox.find('ymax').text))
  39.         b1, b2, b3, b4 = b
  40.         # 标注越界修正
  41.         if b2 > w:
  42.             b2 = w
  43.         if b4 > h:
  44.             b4 = h
  45.         b = (b1, b2, b3, b4)
  46.         bb = convert((w, h), b)
  47.         out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  48. wd = getcwd()
  49. for image_set in sets:
  50.     if not os.path.exists('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/labels/'):
  51.         os.makedirs('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/labels/')
  52.     image_ids = open(
  53.         '/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/ImageSets/Main/%s.txt' % image_set).read().strip().split()
  54.     if not os.path.exists('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/dataSet_path/'):
  55.         os.makedirs('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/dataSet_path/')
  56.     list_file = open('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/dataSet_path/%s.txt' % image_set, 'w')
  57.     for image_id in image_ids:
  58.         list_file.write('/Users/zhuoxiaohua/Downloads/yolov5-6.1/VOCData/images/%s.jpeg\n' % image_id)
  59.         convert_annotation(image_id)
  60.     list_file.close()
复制代码
运行后会生成dataSet_path 和 labels 文件夹。dataSet_path下会有三个数据集的txt文件,labels下存放各个图像的标注文件。
(3)设置文件
在 yolov5 的 data 文件夹下创建一个名为 myvoc.yaml,模板如下,改成自己的路径,根据自己现实情况填写:
(【

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表