Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Calabaza amarga
yolo3-pytorch
提交
fbfce974
Y
yolo3-pytorch
项目概览
Calabaza amarga
/
yolo3-pytorch
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
yolo3-pytorch
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
fbfce974
编写于
6月 04, 2020
作者:
B
Bubbliiiing
提交者:
GitHub
6月 04, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update train.py
上级
e0ee93eb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
71 addition
and
23 deletion
+71
-23
train.py
train.py
+71
-23
未找到文件。
train.py
浏览文件 @
fbfce974
...
...
@@ -10,9 +10,26 @@ import torch.nn as nn
import
torch.optim
as
optim
import
torch.nn.functional
as
F
import
torch.backends.cudnn
as
cudnn
from
utils.config
import
Config
from
nets.yolo_training
import
YOLOLoss
,
Generator
from
nets.yolo3
import
YoloBody
from
nets.yolo4
import
YoloBody
#---------------------------------------------------#
# 获得类和先验框
#---------------------------------------------------#
def
get_classes
(
classes_path
):
'''loads the classes'''
with
open
(
classes_path
)
as
f
:
class_names
=
f
.
readlines
()
class_names
=
[
c
.
strip
()
for
c
in
class_names
]
return
class_names
def
get_anchors
(
anchors_path
):
'''loads the anchors from a file'''
with
open
(
anchors_path
)
as
f
:
anchors
=
f
.
readline
()
anchors
=
[
float
(
x
)
for
x
in
anchors
.
split
(
','
)]
return
np
.
array
(
anchors
).
reshape
([
-
1
,
3
,
2
])[::
-
1
,:,:]
def
fit_ont_epoch
(
net
,
yolo_losses
,
epoch
,
epoch_size
,
epoch_size_val
,
gen
,
genval
,
Epoch
,
cuda
):
total_loss
=
0
...
...
@@ -72,16 +89,42 @@ def fit_ont_epoch(net,yolo_losses,epoch,epoch_size,epoch_size_val,gen,genval,Epo
print
(
'Saving state, iter:'
,
str
(
epoch
+
1
))
torch
.
save
(
model
.
state_dict
(),
'logs/Epoch%d-Total_Loss%.4f-Val_Loss%.4f.pth'
%
((
epoch
+
1
),
total_loss
/
(
epoch_size
+
1
),
val_loss
/
(
epoch_size_val
+
1
)))
if
__name__
==
"__main__"
:
# 参数初始化
annotation_path
=
'2007_train.txt'
model
=
YoloBody
(
Config
)
#-------------------------------#
# 输入的shape大小
# 显存比较小可以使用416x416
# 显存比较大可以使用608x608
#-------------------------------#
input_shape
=
(
416
,
416
)
#-------------------------------#
# tricks的使用设置
#-------------------------------#
Cosine_lr
=
False
mosaic
=
True
# 用于设定是否使用cuda
Cuda
=
True
smoooth_label
=
0
annotation_path
=
'2007_train.txt'
#-------------------------------#
# 获得先验框和类
#-------------------------------#
anchors_path
=
'model_data/yolo_anchors.txt'
classes_path
=
'model_data/voc_classes.txt'
class_names
=
get_classes
(
classes_path
)
anchors
=
get_anchors
(
anchors_path
)
num_classes
=
len
(
class_names
)
# 创建模型
model
=
YoloBody
(
len
(
anchors
[
0
]),
num_classes
)
model_path
=
"model_data/yolo4_weights.pth"
# 加快模型训练的效率
print
(
'Loading weights into state dict...'
)
device
=
torch
.
device
(
'cuda'
if
torch
.
cuda
.
is_available
()
else
'cpu'
)
model_dict
=
model
.
state_dict
()
pretrained_dict
=
torch
.
load
(
"model_data/yolo_weights.pth"
,
map_location
=
device
)
pretrained_dict
=
torch
.
load
(
model_path
,
map_location
=
device
)
pretrained_dict
=
{
k
:
v
for
k
,
v
in
pretrained_dict
.
items
()
if
np
.
shape
(
model_dict
[
k
])
==
np
.
shape
(
v
)}
model_dict
.
update
(
pretrained_dict
)
model
.
load_state_dict
(
model_dict
)
...
...
@@ -97,8 +140,8 @@ if __name__ == "__main__":
# 建立loss函数
yolo_losses
=
[]
for
i
in
range
(
3
):
yolo_losses
.
append
(
YOLOLoss
(
np
.
reshape
(
Config
[
"yolo"
][
"anchors"
],[
-
1
,
2
]),
Config
[
"yolo"
][
"classes"
],
(
Config
[
"img_w"
],
Config
[
"img_h"
])
,
Cuda
))
yolo_losses
.
append
(
YOLOLoss
(
np
.
reshape
(
anchors
,[
-
1
,
2
]),
num_classes
,
\
(
input_shape
[
1
],
input_shape
[
0
]),
smoooth_label
,
Cuda
))
# 0.1用于验证,0.9用于训练
val_split
=
0.1
...
...
@@ -110,23 +153,24 @@ if __name__ == "__main__":
num_val
=
int
(
len
(
lines
)
*
val_split
)
num_train
=
len
(
lines
)
-
num_val
if
True
:
# 最开始使用1e-3的学习率可以收敛的更快
lr
=
1e-3
Batch_size
=
8
Batch_size
=
4
Init_Epoch
=
0
Freeze_Epoch
=
25
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
)
lr_scheduler
=
optim
.
lr_scheduler
.
StepLR
(
optimizer
,
step_size
=
1
,
gamma
=
0.95
)
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
,
weight_decay
=
5e-4
)
if
Cosine_lr
:
lr_scheduler
=
optim
.
lr_scheduler
.
CosineAnnealingLR
(
optimizer
,
T_max
=
5
,
eta_min
=
1e-5
)
else
:
lr_scheduler
=
optim
.
lr_scheduler
.
StepLR
(
optimizer
,
step_size
=
1
,
gamma
=
0.9
)
gen
=
Generator
(
Batch_size
,
lines
[:
num_train
],
(
Config
[
"img_h"
],
Config
[
"img_w"
])).
generate
(
)
(
input_shape
[
0
],
input_shape
[
1
])).
generate
(
mosaic
=
mosaic
)
gen_val
=
Generator
(
Batch_size
,
lines
[
num_train
:],
(
Config
[
"img_h"
],
Config
[
"img_w"
])).
generate
(
)
(
input_shape
[
0
],
input_shape
[
1
])).
generate
(
mosaic
=
False
)
epoch_size
=
num_train
//
Batch_size
epoch_size
=
max
(
1
,
num_train
//
Batch_size
)
epoch_size_val
=
num_val
//
Batch_size
#------------------------------------#
# 冻结一定部分训练
...
...
@@ -137,21 +181,25 @@ if __name__ == "__main__":
for
epoch
in
range
(
Init_Epoch
,
Freeze_Epoch
):
fit_ont_epoch
(
net
,
yolo_losses
,
epoch
,
epoch_size
,
epoch_size_val
,
gen
,
gen_val
,
Freeze_Epoch
,
Cuda
)
lr_scheduler
.
step
()
if
True
:
lr
=
1e-4
Batch_size
=
4
Batch_size
=
2
Freeze_Epoch
=
25
Unfreeze_Epoch
=
50
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
)
lr_scheduler
=
optim
.
lr_scheduler
.
StepLR
(
optimizer
,
step_size
=
1
,
gamma
=
0.95
)
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
,
weight_decay
=
5e-4
)
if
Cosine_lr
:
lr_scheduler
=
optim
.
lr_scheduler
.
CosineAnnealingLR
(
optimizer
,
T_max
=
5
,
eta_min
=
1e-5
)
else
:
lr_scheduler
=
optim
.
lr_scheduler
.
StepLR
(
optimizer
,
step_size
=
1
,
gamma
=
0.9
)
gen
=
Generator
(
Batch_size
,
lines
[:
num_train
],
(
Config
[
"img_h"
],
Config
[
"img_w"
])).
generate
(
)
(
input_shape
[
0
],
input_shape
[
1
])).
generate
(
mosaic
=
mosaic
)
gen_val
=
Generator
(
Batch_size
,
lines
[
num_train
:],
(
Config
[
"img_h"
],
Config
[
"img_w"
])).
generate
(
)
(
input_shape
[
0
],
input_shape
[
1
])).
generate
(
mosaic
=
False
)
epoch_size
=
num_train
//
Batch_size
epoch_size
=
max
(
1
,
num_train
//
Batch_size
)
epoch_size_val
=
num_val
//
Batch_size
#------------------------------------#
# 解冻后训练
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录