提示:本文不要求必定要有python根底,可是假如想要在机器学习领域持续研究下去的话,主张把根底打好一步一步来。
前语
有许多刚入门机器学习的像我相同小白想要练习一个自己的方针检测模型,可是却不知从何下手,本文是我自己练习模型的一个悉数进程,能够说是能协助你少走许多弯路,也能够帮你节省许多查阅资料的时间,究竟这些都是我踩过的坑,我也是跟着这位大佬做的,在这儿表明万分感谢,那么废话不多说,咱们直接开端。本篇文章根据windows
我做的这个项目是根据yolov3的安全帽检测,项目源码我放在了GitHub上,有需求参阅的小伙伴能够在下面谈论或许给我私信,把你的github称号或许邮箱告知我(我需求增加一下才能正常翻开),稍后自取(详细在master这一分支之下,并没有在main主分支下,这一点需求留意)
==留意==:在这一整个进程傍边不免会遇到报错的状况,可是你要理解报错是告知你你哪里有问题,==报错的是信息并不是乱码==,不少小伙伴一看到报错就慌了,我只想说不要紧的,这其实是正常现象,你能够把报错的信息仿制到浏览器里进行查找,95%以上的问题都能够通过这一办法来处理。
一、装置Anaconda
直接去官网下载,留意自己的体系 Anaconda官网 下载之后装置即可,留意装置的时分装置的文件夹要是空的
二、程序下载
(1)yolov3下载
进入github查找 yolov3 1、在这儿咱们能够挑选不同的yolov3的版别
2、点击右边的【download】即可开端下载压缩包
3、下载完结之后依照自己的习气进行文件的解压缩(留意文件途径中不要呈现中文
)
4、用pycharm翻开yolov3的工程文件,成果如下图
(2)练习集文件夹的创立
1.在yolov3-9.5.0工程文件夹下,新建一个称号为VOCdevkit的文件夹 2.在VOCdevkit文件夹下,新建三个称号别离为images,labels,VOC2007的文件夹 3.在images和labels文件夹下别离新建两个名为train和val的文件夹 4.在VOC2007文件夹下新建三个称号别离为Annotations,JPEGImages,YOLOLabels的文件夹 (留意:也能够参阅其他博主创立文件的办法,我这样创立会与我之后的转标签格局和分配练习集、验证集的脚本文件中的途径对应) 成果如下图: Annotations:.json标签文件夹 JPEGImages:图片文件夹 YOLOLabels:txt标签文件夹(yolov练习需求txt格局的标签文件)
(3)预练习权重下载
咱们并不是完完全全从0开端练习一个模型,咱们会先借助预练习权重进行练习,这样能够必定程度上缩短模型的练习时间一同会提高模型练习的精度。预练习的权重越大,练习出来的精度就越高,相应其检测速度会受到影响。 1、下载yolov3权重 我这个使命比较小,所以我挑选了-tiny-的权重,在之后咱们要运用对应的yaml文件
2、将下载好的权重放到weights文件夹中
三、环境预备
(1)检查cuda版别
1.按下win+R,输入cmd并按下回车,翻开指令台,输入下面的指令来检查cuda版别
nvidia-smi
在这儿咱们能够看到显卡驱动版别为512.72,最高支撑的cuda版别为11.6,咱们之后会根据最高支撑的cuda版别装置pytorch 能够参阅下面这一表格(没有列举到的请自行查阅)
torch版别 | cuda版别 | 所需python版别 |
---|---|---|
1.13.1 | cu116 | 3.7、3.8、3.9、3.10 |
1.13.0 | cu116 | 3.7、3.8、3.9、3.10 |
1.12.1 | cu113 | 3.7、3.8、3.9、3.10 |
1.12.0 | cu113 | 3.7、3.8、3.9、3.10 |
1.11.0 | cu113 | 3.7、3.8、3.9、3.10 |
1.10.2 | cu113 | 3.6、3.7、3.8、3.9 |
1.10.1 | cu113 | 3.6、3.7、3.8、3.9 |
1.9.1 | cu111 | 3.6、3.7、3.8、3.9 |
1.9.0 | cu111 | 3.6、3.7、3.8、3.9 |
1.8.1 | cu111 | 3.6、3.7、3.8、3.9 |
1.8.0 | cu111 | 3.6、3.7、3.8、3.9 |
1.7.1 | cu110 | 3.6、3.7、3.8、3.9 |
1.7.0 | cu110 | 3.6、3.7、3.8 |
通过表格我确定我的torch版别挑选1.13.3,cuda版别为cu116,python版别为cp38
(2)装置pytorch
1、预备一个虚拟环境
翻开anaconda prompt 输入下面的指令,创立一个名为demo而且python版别为3.8的虚拟环境(称号和python的版别随意,可是要记住自己的python版别)
conda create -n demo python=3.8
输入 y 并按下回车 ,等呈现下图的信息 之后咱们输入下面的指令来激活虚拟环境
conda activate demo
当括号里由base变成demo阐明创立成功。
2、下载pytorch
下载pytorch有许多种办法,这儿我介绍一种尽管不是最简单但成功率几乎100%的办法 首要,咱们进入pytorch的官网 咱们能够看到官方供给的装置办法是仿制下图中的指令行,用这种办法可能会呈现下载太慢的状况,所以咱们不采用这种办法。留意看,这个指令其实告知咱们,下载的其实是后缀为.whl的文件,咱们暂时称它为“车轮文件”,所以咱们能够直接下载车轮文件到咱们的电脑上,之后再从电脑上装置下载好的车轮文件。 根据咱们在上面进程中确定的torch版别,点击这一项检查往届版别 找到咱们所需的torch版别,留意在这儿一会咱们要下载三个车轮文件,别离是 pytorch=1.13.0 torchvision=0.14.0 torchaudio=0.13.0,明确这一点之后咱们进入车轮网站(也是官方网站咱们定心下载)。 假如链接打不开,咱们略微往下一点找到这个 点击右键挑选转到即可
进入之后咱们要别离进入这三个链接别离下载pytorch=1.13.0 torchvision=0.14.0 torchaudio=0.13.0(再次留意这是我对应的版别,不要直接照搬) 这儿我拿torch举例,进入之后按ctrl+f进行查找,输入 torch-1.13.0+cuda116-cp38,就能够锁定两个,咱们点击win体系的下载即可,其他两个下载办法类似我就不赘述了,==这儿千万要留意版别对应下载好==
之后我拿下载好的torchaudio来做演示,其他两个咱们同理即可 下载好之后右键点击属性,将他的方位仿制下来
进入咱们之前创立好的虚拟环境中(conda activate demo)输入下列指令 (这儿每个人保存文件的途径都不相同,你只需求理解是途径加上文件名就行)
pip install C:\Users\*****\Downloads\torchaudio-0.13.0+cu116-cp38-cp38-win_amd64.whl
等待下载完结即可,三个文件都是这样的操作。
3、验证pytorch是否装置完结
进入虚拟环境中,输入python回车,再输入import torch回车,若装置失败会回来“No module named torch”,若成功则不会回来任何东西,咱们持续输入 torch.cuda.is_available(),回来true即为装置成功。
不用在意我的虚拟环境名字,这儿我偷了个懒用了我现已装备好的环境给咱们做演示(一同下文中所有的环境都会是zzz,咱们依照自己的来就能够)。
(3)向pycharm中导入pytorch
1、翻开pycharm,新建一个工程 2、顺次点击文件、设置、项目下的python解说器 在这儿挑选现已有的咱们之前创立好的虚拟环境的解说器 假如这儿没有的话,就挑选后边的【增加解说器】这一选项,挑选Conda环境–>运用现有环境–>挑选咱们之前创立的虚拟环境,然后点击确定
之后先点击应用,再点击确定
(4)验证pytorch装置完结
新建一个python文件,输入以下的代码并运转 代码如下(示例):
import torch
a = torch.cuda.is_available()
print(a)
ngpu= 1
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print(device)
print(torch.cuda.get_device_name(0))
print(torch.rand(3,3).cuda())
假如运转成果如下图,则阐明现已成功装置了pytorch
四、制作自己的数据集
(1)装置labelme
首要咱们在Anaconda Prompt 中激活咱们之前创立的虚拟环境,输入以下的指令来装置labelme这一标签标示东西(当然咱们也能够挑选其他的标示东西)
pip install labelme
(2)标示标签
之后运用的时分直接输入labelme即可。翻开东西如下图, 【Open】用来挑选所要标示的单个图片的方位 【Open Dir】用来挑选整个文件夹的方位 【file】–>【change output dir]能够更改保存标签的方位 另外比较好用的是file菜单下的save automatically,挑选这个之后便能够主动保存了。 下面给咱们作以演示,在edit菜单下挑选create rectangle会运用矩形框进行标示 输入标签类型,点击ok,即可完结标示 总体来说,这一进程非常简单,但也非常单调,咱们能够自行体会。
(3)进行标签类型转化
咱们运用labelme标示的标签格局是.json格局的,而yolo所接受的标签格局为.txt的(假如你的标签是.xml格局的就得麻烦你自己查阅一下转化代码了),一同咱们也会将里面的内容做必定的转化,这儿的原理就不在这儿赘述了,咱们感兴趣的话能够自行查阅。 下面是标签转化的程序,咱们新建一个python文件,千万留意:假如你是依照我上面说的办法创立了相应的练习集文件夹之后只需求修正标签类型即可运用了
import json
import cv2
from pathlib import Path
all_classes={'person':0,'hat':1} ##留意这儿修正为你自己的标签类型
savepath='yolov3-9.5.0\\VOCdevkit\\VOC2007\\YOLOLabels\\'
jsonpath='yolov3-9.5.0\\VOCdevkit\\VOC2007\\Annotations\\'
imgpath='yolov3-9.5.0\\VOCdevkit\\VOC2007\\JPEGImages\\'
path1=Path(jsonpath)
json_files=path1.iterdir()
for i in json_files:
infile=i
with open(infile,'r') as load_f:
load_dict = json.load(load_f)
path2=Path(savepath+load_dict['imagePath'][13:-4]+'.txt')
with path2.open('w',encoding='utf8') as outfile:
img_path=imgpath+load_dict['imagePath'][13:]
img=cv2.imread(img_path)
size=img.shape
high_size=size[0]
width_size=size[1]
for item in load_dict['shapes']:
label_int=all_classes[item['label']]
if not item['points']:
continue
x1,y1,x2,y2=item['points'][0][0],item['points'][0][1],item['points'][1][0],item['points'][1][1]
x_center=(x1+x2)/2/width_size
y_center=(y1+y2)/2/high_size
w=abs(x2-x1)/width_size
h=abs(y2-y1)/high_size
outfile.write(f'{label_int} {x_center} {y_center} {w} {h}\n')
(4)区分练习集和验证集
咱们能够根据2:8或许1:9的比例将咱们的数据集区分成验证集和练习集,区分代码如下:
from pathlib import Path
import random
import shutil
def moveimg(file_images_all,file_images_val,file_images_train):
path1=Path(file_images_all)
image_path=path1.iterdir()
image_list=list(image_path)
filenumber=len(image_list)
rate=0.1
picknumber=int(filenumber*rate+1) ##这儿咱们加上1,避免在数据量很小的时分报错,但这在正式项目中一般是不会存在的
sample=random.sample(image_list,picknumber)
for name in sample:
shutil.move(name,file_images_val)
for images in path1.rglob('*.jpg'):
shutil.move(images,file_images_train)
return
def movelabel(file_list,file_label_all,file_label_val,file_label_train):
for i in file_list:
if str(i).endswith('.jpg'):
filename=f'{file_label_all}\\{str(i)[-9:-3]}txt'
path3=Path(filename)
if path3.exists:
shutil.move(filename,file_label_val)
for i in Path(file_label_all).rglob('*.txt'):
shutil.move(i,file_label_train)
if __name__=='__main__':
file_images_all='yolov3-9.5.0\\VOCdevkit\\VOC2007\\JPEGImages\\'
file_iamges_val='yolov3-9.5.0\\VOCdevkit\\images\\val'
file_images_train='yolov3-9.5.0\\VOCdevkit\\images\\train'
moveimg(file_images_all,file_iamges_val,file_images_train)
path2=Path('yolov3-9.5.0\\VOCdevkit\\images\\val\\')
file_list=list(path2.iterdir())
file_label_all='yolov3-9.5.0\\VOCdevkit\\VOC2007\\YOLOLabels'
file_label_val='yolov3-9.5.0\\VOCdevkit\\labels\\val'
file_label_train='yolov3-9.5.0\\VOCdevkit\\labels\\train'
movelabel(file_list,file_label_all,file_label_val,file_label_train)
到此为止咱们所有的前期预备工作都现已做完了,下面咱们开端模型的练习
五、模型练习
(1)将pytorch应用到工程
用pycharm翻开咱们解压好的yolov3的文件,点击文件–>设置找到【Project Interpreter】将咱们之前创立的环境,点击应用,之后点击确定
(2)requirements中依赖包装置
这儿我说两种办法 榜首种是翻开requirements.txt文件 然后进入咱们的虚拟环境中依照文件中的要求一个一个去装置 这样尽管慢可是出错的概率很低,由于可能一些包由于版别原因现已不兼容了。 第二种是先找到并翻开requirements.txt文件 仿制文件中的指令行
之后点击终端
在终端中粘贴,并按回车运转指令行便能够开端装置依赖包了。
假如有报错,记住报错不是乱码
,自行百度查找处理问题
(3)修正数据装备文件
1、找到data目录下的voc.yaml文件,将这个文件仿制一份,并将仿制的文件重命名,这儿我改为hat.yaml(这儿由于我的项目与安全帽有关,所以我这样命名了) 2、进入hat.yaml文件中,咱们需求做一些修正: (1)将download语句注释掉 (2)修正train、val的途径,改成自己文件的途径,留意:在这儿主张写绝对途径会少出许多问题 (3)修正nc(number of classes)为自己数据会集的标签品种个数 (4)修正names为自己数据会集的标签品种
(4)修正模型装备文件
由于咱们之前下载的权重文件为yolov3-tiny.py,所以咱们现在需求找到与之相匹配的.yaml文件 1、在models目录中咱们挑选将yolov3-tiny.yaml文件仿制一份并重命名为自己项目的名字,这儿我改为yolov3-tiny_hat.yaml 2、进入yolov3-tiny_hat.yaml文件,将榜首行的 nc 修正为自己数据会集的标签品种的数量
(5)修正train.py主函数
咱们主要修正以下几个参数: ①. -weights: 初始化的权重文件的途径 ②. -cfg: 模型yaml文件的途径 ③. -data: 数据yaml文件的途径 ④. -epochs: 练习的次数 ⑤. -batch-size: 一轮练习的文件数(详细设置与电脑的gpu有关) ⑥. -workers: cpu线程(这儿我设置为0)
(6)运转 train.py
开端模型练习(这儿我截的是第87次练习的成果)
六、模型练习中遇到的问题
假如有报错,记住报错不是乱码
,自行百度查找处理问题
1、过错 OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. 这儿需求咱们进入到咱们对应建立的虚拟环境的文件夹中查找 ’libiomp5md‘可能会呈现两个,咱们删除一个即可(这儿主张做备份,以备之后找补)
2、RuntimeError: result type Float can’t be cast to the desired output type __int64 我参阅了这一篇文章 blog.csdn.net/Thebest_jac… 这儿咱们先进入【utils】文件下的【loss.py】 按ctel + f 翻开查找功用,输入【for i in range(self.nl)】找到下面的一行内容:
将下面的代码替换掉上图的红圈部分:
anchors, shape = self.anchors[i], p[i].shape
按【Ctrl】+【F】翻开查找功用,输入【indices.append】找到下面的一行内容
将下面的代码替换掉上图的红圈部分:
indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1))) # image, anchor, grid
3、模型练习在榜首个epoch卡死
处理办法便是上文中说到的将 workers 这个代表多线程的的参数改成0
这儿便是我遇到的一些问题,这儿再次提示咱们
假如有报错,记住报错不是乱码
,自行百度查找处理问题
七、测验练习成果
翻开detect.py文件找到这一行代码
(1)照片和视频
直接将【default】后改成要检测的图片或是视频的途径即可
(2)调用摄像头进行实时检测
先在【utils】文件中找到【datasets.py】文件,进入后将这两处改成str类型
之后再将【default】的参数改成0即可,如上图
总结
以上便是本篇文章的悉数内容,本文也是本人在练习模型进程中的一次项目日志,由于在这一整个进程中由于种种原因,我踩了不少坑,所以才会将这整个进程进行汇总,然后共享出来与咱们一同学习,再次感谢这位老师咱们能够多去看看他的文章真的巨强,本人也是机器学习的初学者,所以文章中不免会有疏忽的地方,假如有过错请咱们积极指出,非常感谢咱们的支撑,再次愿咱们都能够练习出自己的模型。最终再次提示咱们:假如有报错,记住报错不是乱码
,自行百度查找处理问题