一、下載源碼
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沒有領帶這類