win10 ;显卡型号:GeForce GTX 960 ;显存:2G
看了很多博客大部分博主都说显存至少4G才可以跑,我的是2G,目前也可以跑,可能是数据集比较少只有二十几张图片,而且需要改一些参数,后面会来介绍。
代码链接:https://github.com/ultralytics/yolov3
我的环境:
pytorch1.5.0 、pycocotools、vs2017(v140一定要勾上)等等
有一点还不太懂:
我自己电脑CUDA10.0版本,但是pytorch1.5.0对应的CUDA版本应该是10.1,在用conda install pytorch=1.5.0时,会自动下载一个cudatoolkit 10.1.243,然后也就可以用了,不用我自己再给电脑重新再装CUDA10.1
1.准备自己的数据集,用labelimg框图,这个可以自行百度,有很多介绍这个的,但是有一点需要注意的就是,框图之前先给数据集规范下名称代码如下:
import os
#使用python规范化图片名称
class BatchRename():
# 定义函数执行图片的路径
def __init__(self):
self.path = 'D:/image/1' # 修改为自己的图片路径
# 定义函数实现重命名操作
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 0
for item in filelist:
if item.endswith('.jpg'):
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(i).zfill(6) + '.jpg')
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
print('total %d to rename & converted %d jpgs' % (total_num, i))
# 主函数调用
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
2.我的数据集格式
创建自己的数据集参考这位博主的3.3–3.7步骤
3.修改cfg文件
由于我的显存比较小,所以用体量小的yolov3-tiny.cfg
,主要修改了两个yolo层附近的参数,一共六处地方(已经在下边的代码中标出来了)
我的只有一类person,所以classes=1,filters=18:即3*(classes+5),单类的话classes=1,GPU显存较小,可以设置将random=0,即关闭多尺度
yolov3-tiny.cfg 修改后如下,也可直接复制
[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=2
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1
[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=1
[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky
###########
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=18 #修改
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
classes=1 #修改
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=0 #修改
[route]
layers = -4
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[upsample]
stride=2
[route]
layers = -1, 8
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=18#修改
activation=linear
[yolo]
mask = 1,2,3
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
classes=1#修改
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=0#修改
4.配置预权重
训练用的是yolov3-tiny
模型,对应的就需要yolov3-tiny.conv.15
将yolov3-tiny.weights
和yolov3-tiny.conv.15
导入weights
目录下,官网没有提供yolov3-tiny.conv.15
,需要在谷歌云盘下载,我已经下载好了,提供给大家
链接:https://pan.baidu.com/s/1GdCFQ0q7Hiki179BeRDlIA 提取码:dq7w
使用pycharm中的Terminal,输入如下命令:
python train.py --data data/person.data --cfg cfg/yolov3-tiny.cfg --epoch 10 --batch-size 1 --weights weights/yolov3-tiny.conv.15
其中,–epochs 10指迭代了10次,batch-size 1指每次处理1张图片。
训练结束后在weights
文件夹下得到best.pt
和last.pt
两个文件
在Terminal下输入以下命令:
python detect.py --names data/person.names --cfg cfg/yolov3-tiny.cfg --weights weights/best.pt
注意:这里是--names data/person.names
这样的,好多博客都是用的person.data
文件,是不对的
检测的输出结果会在output
文件夹中,如下,我的数据集太少迭代的次数也少,所以精度并不好
如果检测的结果没有框,可以修改detect.py
文件夹下的这个位置
将--conf-thes
的默认值改小一点,我改成了0.1,就显示出来了
在Terminal下输入以下命令:
python test.py --data data/person.data --cfg cfg/yolov3-tiny.cfg --weights weights/last.pt
python -c "from utils import utils; utils.plot_results()"
同时,文件夹的主目录下会多出一个results.png
,显示了模型的可视化训练结果,由于我的数据集只有一类,所以cla没有数据。