Yolov3 训练自己的数据集

一、下载源码

git clone https://github.com/ultralytics/yolov3.git
cd yolov3
git checkout cf7a4d31d37788023a9186a1a143a2dab0275ead

最新版本需要pytorch1.7,由于我是实验yolov3转tensorrt,
https://github.com/wang-xinyu/tensorrtx/tree/master/yolov3
这里需要checkout到指定版本。搭pytorch1.5,cuda10.0的环境就可以。

二、数据准备

2.1 voc格式转yolo格式
用的这个仓库:
https://github.com/ssaru/convert2Yolo
运行脚本:

python3 example.py --datasets VOC --img_path /data_2/project_2021/yolo/mydata/val/img/ --label /data_2/project_2021/yolo/mydata/val/xml/ --convert_output_path ./out/ --img_type ".jpg" --manipast_path ./ --cls_list_file /data_1/everyday/0127/convert2Yolo-master/voc.names

--img_path是图片文件夹路径
--label 是xml路径
--convert_output_path 是生成的路径 需要自己新建文件夹
--cls_list_file 是类别名字,一个类别名字一行
例如voc.names里面内容如下:

aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor

其中,生成的格式如下:(class,center_x,center_y,w,h)
3 0.221 0.667 0.427 0.666
14 0.292 0.563 0.051 0.066

2.2 yolov3目录下新建文件夹mydata,数据按照如下格式存放

├── list_train.txt
├── list_val.txt
├── mydata.names
├── train
│   ├── images
│   │   ├── 000005.jpg
│   │   ├── 2012_004328.jpg
│   └── labels
│       ├── 000005.txt
│       └── 2012_004328.txt
└── val
    ├── images
    │   ├── 000038.jpg
    │   ├── 000039.jpg
    └── labels
        ├── 000038.txt
        └── 000039.txt

list_train.txt和list_val.txt里面存放的是文件夹images下面图片的绝对路径。
Labels是2.1生成的txt。

2.3在data目录下面新建mydata.data

里面内容如下:

classes=20
train=./mydata/list_train.txt
valid=./mydata/list_val.txt
names=./mydata/mydata.names

Classes就是自己数据集类别数量,不包括背景类。

三、网络配置文件修改yolov3/cfg/yolov3.cfg,修改类别数量

首先复制拷贝一份yolov3/cfg/yolov3.cfg,再修改yolov3.cfg里面内容

3.1修改每个yolo层的classes为自己的类别数,不包含背景类。

3.2修改每个yolo层上面filters为3*(classes+5)

每一个[region/yolo]层前的最后一个卷积层中的 filters=预测框的个数(mask对应的个数,比如mask=0,1,2, 代表使用了anchors中的前三对,这里预测框个数就应该是3*(classes+5) ,5的意义是4个坐标+1个置信度代表这个格子含有目标的概率,也就是论文中的tx,ty,tw,th,po

[convolutional]
size=1
stride=1
pad=1
filters=255 ##改为75
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80  ##改为20
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

四、下载所需要的预训练模型,需要Google上网

https://drive.google.com/drive/folders/1LezFG5g3BCW6iYaV89B2i64cqEUZD7e0

下载yolov3.pt存放在yolov3/weights/下面

五、代码修改

Train.py

Line6:注释
#from torch.utils.tensorboard import SummaryWriter
Line415:注释
#tb_writer = SummaryWriter(comment=opt.name)

Train.py的main函数修改如下:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--epochs', type=int, default=300)  # 500200 batches at bs 16, 117263 COCO images = 273 epochs
    parser.add_argument('--batch-size', type=int, default=3)  # effective bs = batch_size * accumulate = 16 * 4 = 64 ##modify##################
    parser.add_argument('--cfg', type=str, default='cfg/yolov3.cfg', help='*.cfg path')  ##modify##################
    parser.add_argument('--data', type=str, default='data/mydata.data', help='*.data path')##modify##################
    parser.add_argument('--multi-scale', action='store_true', help='adjust (67%% - 150%%) img_size every 10 batches')
    parser.add_argument('--img-size', nargs='+', type=int, default=[320, 640], help='[min_train, max-train, test]')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', action='store_true', help='resume training from last.pt')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--notest', action='store_true', help='only test final epoch')
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
    parser.add_argument('--weights', type=str, default='weights/yolov3.pt', help='initial weights path')  ##modify##################
    parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied')
    parser.add_argument('--device', default='', help='device id (i.e. 0 or 0,1 or cpu)')
    parser.add_argument('--adam', action='store_true', help='use adam optimizer')
    parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')
    opt = parser.parse_args()

六、运行训练

Python train.py
显示如下就说明可以训练了:

七、测试看效果

detect.py修改如下:
其中最下面的main修改如下:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--cfg', type=str, default='cfg/yolov3.cfg', help='*.cfg path')##modify##################
    parser.add_argument('--names', type=str, default='mydata/mydata.names', help='*.names path')##modify##################
    parser.add_argument('--weights', type=str, default='weights/best.pt', help='weights path')##modify##################
    parser.add_argument('--source', type=str, default='data/samples', help='source')  # input file/folder, 0 for webcam
    parser.add_argument('--output', type=str, default='output', help='output folder')  # output folder
    parser.add_argument('--img-size', type=int, default=512, help='inference size (pixels)')
    parser.add_argument('--conf-thres', type=float, default=0.3, help='object confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.6, help='IOU threshold for NMS')
    parser.add_argument('--fourcc', type=str, default='mp4v', help='output video codec (verify ffmpeg support)')
    parser.add_argument('--half', action='store_true', help='half precision FP16 inference')
    parser.add_argument('--device', default='', help='device id (i.e. 0 or 0,1) or cpu')
    parser.add_argument('--view-img', action='store_true', help='display results')
    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class')
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    opt = parser.parse_args()
    opt.cfg = list(glob.iglob('./**/' + opt.cfg, recursive=True))[0]  # find file
    opt.names = list(glob.iglob('./**/' + opt.names, recursive=True))[0]  # find file
    print(opt)

    with torch.no_grad():
        detect()

Data/sample放需要检测的图片,然后结果都保存在yolov3/output文件夹下。

注:voc没有领带这类

posted @ 2021-01-27 16:15  无左无右  阅读(1035)  评论(0编辑  收藏  举报