pytorch基础
加载数据
1 | #从torch这个大工具箱里的常用的工具区中关于数据的data区 |
transforms图片类型转换
1 | from torch.utils.tensorboard import SummaryWriter |
transforms应用1
1 | from PIL import Image |
Dataloader使用
1 | import torchvision |
神经网络基本骨架-nn.Module
1 | import torch |
卷积
1 | #卷积的作用是提取特征 |
卷积层
1 | import torch |
最大池化
1 | #最大池化的目的是保留输入特征同时减少数据量 |
非线性激活
1 | #引入非线性特质 |
线性层
1 | import torch |
实战Sequential
1 | import torch |
损失函数与反向传播
1 | #损失函数 --预测值与真实值的偏差 |
优化器
1 | import torch |
网络模型的使用和修改
1 | import torchvision |
模型的保存与加载
1 | #下载模型 |
完整的模型训练
1 | import torch |
GPU训练方式一
1 | #输入可以是网络模型 ,数据(输入,标注),损失函数,然后调用.cuda() |
GPU训练方式二
1 | #输入可以是网络模型 ,数据(输入,标注),损失函数, |
完整的模型验证
1 | import torch |
model.py
1 | #搭建神经网络 |
配置环境
- 下载源码并解压 https://github.com/ultralytics/yolov5/tree/v5.0
- pycharm打开后命令终端输入
1
pip install -r requirements.txt
detect.py解读
- 输入图片在data/images 输出在runs\detect\exp
- 没有出现标注 修改参数device一行为cpu如下图
- 参数解读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32if __name__ == '__main__':
parser = argparse.ArgumentParser()
#默认权重模型为yolov5s.pt
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
#输入的资源在data/images文件夹中 可以是图片或者视频
parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam
#修改输入资源的尺寸为适合神经网络的尺寸
parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
#置信度 --概率大于某值后再显示
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
#非最大抑制 -- IOU=交集区域/并集区域 多个框相交时满足条件则选择最优框 不满足则保留所有框
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
#运行方式 cuda或者cpu
parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
#显示结果 默认不显示 命令行带上参数view-img时则显示 比如 python detect.py --view-img
#用处2 实时显示输出结果 --点击pycharm右上角detect.py文件 点击编辑配置 在参数一行输入--view-img
parser.add_argument('--view-img', action='store_true', help='display results')
#把结果保存为txt形式 命令行带上参数save-txt时则保存 数据为 类别 x y height width
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
#只显示某类别的显示 例如 参数--classes 0 这里0是人类别
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
#增强检测功能
parser.add_argument('--augment', action='store_true', help='augmented inference')
parser.add_argument('--update', action='store_true', help='update all models')
#项目保存结果的位置project/name
parser.add_argument('--project', default='runs/detect', help='save results to project/name')
parser.add_argument('--name', default='exp', help='save results to project/name')
#覆盖原来的项目结果
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
云端GPU训练yolov5神经网络
- https://colab.research.google.com/
- 笔记本修改为GPU
- 点击文件夹上传打包的项目压缩包
- %是用户权限 !是root权限
- 命令行解压缩
1
!unzip /content/yolov5-5.0.zip -d /content/yolov5
- 进入项目文件夹里
1
%cd /content/yolov5/yolov5-5.0
- 安装需要的环境
1
!pip install -r requirements.txt
- 添加tensorboard插件
1
%load_ext tensorboard
- 启动tensorboard
1
%tensorboard --logdir=runs/train
- 启动训练文件
1
!python train.py --rect
自制数据集和训练数据集
- 工具网址:https://www.makesense.ai/
- 工具网址:https://cvat.org/
Get started->object detection
从文件中加载标签—新建txt 每一行写一个类别名字
- action->edit labels 添加类别
- 右边点击rect进行矩形标注
- action->load AI model使用模型帮助标注
- action->export rect annotation导出标注的数据集
- pycharm建立数据集 建立data文件夹 下面建立一个images文件夹和labels文件夹 images文件夹->test train labels文件夹->test train
- 建立yaml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#训练数据集的路径
train: ../coco/train2017.txt # 118287 images
#验证数据集的路径
val: ../coco/val2017.txt # 5000 images
#测试数据集的路径
test: ../coco/test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
# 类别的数量
nc: 80
# 类别的名字
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
'hair drier', 'toothbrush' ]
# Print classes
# with open('data/coco.yaml') as f:
# d = yaml.load(f, Loader=yaml.FullLoader) # dict
# for i, x in enumerate(d['names']):
# print(i, x) - 在train.py中主函数中修改数据集yaml为自己新建立的
1
2
3
4
5if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')
VOC数据集
- 官网 http://host.robots.ox.ac.uk/pascal/VOC
- 2007数据集:http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
- Annotations 文件夹是一些标注信息 ,xml是该图片的各种描述信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78<annotation>
<!-- 所在文件夹的名字 -->
<folder>VOC2007</folder>
<!-- 描述的是哪张图片 -->
<filename>000032.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>311023000</flickrid>
</source>
<owner>
<flickrid>-hi-no-to-ri-mo-rt-al-</flickrid>
<name>?</name>
</owner>
<!-- 图片尺寸 -->
<size>
<width>500</width>
<height>281</height>
<depth>3</depth>
</size>
<segmented>1</segmented>
<!-- 包含的物体 -->
<object>
<!-- 第一个物体是飞机 -->
<name>aeroplane</name>
<!-- 飞机拍摄的角度是前向 -->
<pose>Frontal</pose>
<!-- 图片是完整的 -->
<truncated>0</truncated>
<!-- 识别不困难 -->
<difficult>0</difficult>
<!-- 该物体的边框位置 -->
<bndbox>
<xmin>104</xmin>
<ymin>78</ymin>
<xmax>375</xmax>
<ymax>183</ymax>
</bndbox>
</object>
<object>
<name>aeroplane</name>
<pose>Left</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>133</xmin>
<ymin>88</ymin>
<xmax>197</xmax>
<ymax>123</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Rear</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>195</xmin>
<ymin>180</ymin>
<xmax>213</xmax>
<ymax>229</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Rear</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>26</xmin>
<ymin>189</ymin>
<xmax>44</xmax>
<ymax>238</ymax>
</bndbox>
</object>
</annotation> - ImageSets 图片集合 其中Main文件夹是分类和目标检测 Layout文件夹是预测布局 Segmentation文件夹是语义分割
Main文件夹中txt文件名字为类别名,txt存储了两列 ,第一列为图片编号,第二列为是否有该类别的判断值 1代表有 -1代表没有 - JPEGImages 图片
- SegmentationClass 按不同类别分割后的图片
- SegmentationObject 按不同对象分割后的图片
COCO数据集
- 官网 https://cocodataset.org/
- 2017数据集:http://images.cocodataset.org/zips/val2017.zip
- 2017数据集描述信息:http://images.cocodataset.org/annotations/annotations_trainval2017.zip
- 读取COCO数据集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import torchvision
from PIL import ImageDraw
#参数为 root数据集的文件夹-照片 annFile标注信息的json文件
coco_dataset = torchvision.CocoDetection(root="../val2017",
annFile="../annotations/instances_val2017.json")
print(coco_dataset[0])
#获取图片
image,info = coco_dataset[0]
#展示图片
image.show()
#获取图片句柄方便对图片操作
image_handler = ImageDraw.ImageDraw(image)
#取出info中的所有信息
for annotation in info:
#标注框信息 -列表形式
x_min,y_min,width,height = annotation['bbox']
print(x_min)
#把标注框画到图片上 传入一个标注框坐标的列表
image_handler.rectangle(((x_min),(y_min),(x_min+width),(y_min+height)))
#展示图片
image.show()
视频:【Python深度学习:安装Anaconda、PyTorch(GPU版)库与PyCharm】 https://www.bilibili.com/video/BV1cD4y1H7Tk/?share_source=copy_web&vd_source=3a4f02434e353296deced7b70d6b1042