day2-day4
续上一篇:采用了opencv自己的多层链接分类器做了简单的检测后,发现根本达不到我所需的要求,于是某宝买了opencv+yolo+pytorch的网课,逐渐有了更深的理解,分类器已经是很过时的技术了,之前对深度学习和神经网络并没有了解,但是赶鸭子上架,应用重要,原理后续再学吧,在初步了解了CV的基本概念后,动手跟着做带神经网络和深度学习的目标检测
day5
动手吧!
首先下载YOLOV5,yolo2,3,4都是以论文的形式呈现的,而yoloV5更像是一个项目,有着成熟的代码,开箱即用的那种
1.先在D盘建了个文件夹YOLO,下载这个项目,然后解压到YOLO里
地址:https://github.com/ultralytics/yolov5
2.打开pycharm,把包导入:如果你的环境<py3.6,建议升级一下,如果符合,会导的就打开项目,不会导的就把yolov5-master文件复制到已经打开的项目下边
打开文件就能看到这个
里边是运行起来所需加的一些包
按着命令下载就行
tips:我用的是CPU版本,因为笔记本没显卡,这样就有一个很重要的问题,就是pytorch的安装,建议先到pytorch官网去看下,因为如果直接pip装很容易出现torch和torchvison不匹配的情况,巨麻烦
2.这里安装就不展开讲了,运行这个
缺的就会提示你,这里说一下wandb的问题,我之前没接触过wandb,所以报错后就pip装了wandb,然后注册号拿到验证码,验证码不知道为什么pycharm复制不上去,只能手打,安装后,打开终端输入wandb login,登录上去,就可以用了
3.到这里,yolov5的配置就算完成了,接下来说说数据集制作的问题,我用了最土的办法就是使用labelme,也就是自己标注需要训练的图片
要装的东西
pip install pyqt
pip install pillow
pip install labelme
装完终端输入lebelme就会弹出来标注窗口
在yolov5-master下创建一个文件夹 train,在train下创建三个文件夹img、json、labels
左边菜单open是开一张图,open dir就是打开目录(图片目录),开了图片后右键菜单,第一个是点连框,第二个是选区域框,我对精度要求并不高也没有姿态的需求,所以都采用了区域框,框完后保存,将生成的json文件存入之前创建的train中的json里
标注方法,我要的是猪,所以我就把图片里的猪框出来
4.到这一步,假设你已经完成了图片标注,也就是图片存在img里,标注文件存在json中,那么下一步,就是把json转化为txt
json转化txt代码
import json
import os
name2id = {'hero':0,'sodier':1,'填你标注的标签':2}
def convert(img_size, box):
dw = 1. / (img_size[0])#自己改
dh = 1. / (img_size[1])
x = (box[0] + box[2]) / 2.0 - 1
y = (box[1] + box[3]) / 2.0 - 1
w = box[2] - box[0]
h = box[3] - box[1]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def decode_json(json_floder_path, json_name):
txt_name = '填train下的labels文件夹' + json_name[0:-5] + '.txt'
#存放txt的绝对路径
txt_file = open(txt_name, 'w')
json_path = os.path.join(json_floder_path, json_name)
data = json.load(open(json_path, 'r', encoding='gb2312',errors='ignore'))
img_w = data['imageWidth']
img_h = data['imageHeight']
for i in data['shapes']:
label_name = i['label']
if (i['shape_type'] == 'rectangle'):
x1 = int(i['points'][0][0])
y1 = int(i['points'][0][1])
x2 = int(i['points'][1][0])
y2 = int(i['points'][1][1])
bb = (x1, y1, x2, y2)
bbox = convert((img_w, img_h), bb)
txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
if __name__ == "__main__":
json_floder_path = '填train下的json文件夹'
json_names = os.listdir(json_floder_path)
for json_name in json_names:
decode_json(json_floder_path, json_name)
5.到此,json文件夹就可以删了,剩下img文件夹和labels文件夹,这就是我们需要拿来训练的数据集
训练截图
时间关系,本篇作为记录匆匆赶出来的,细节不到位,接下来我要去尝试用百度的paddlepaddle啦!