【代碼使用】YOLOv3以及Gaussian YOLOv3模型轉caffe的使用指南

  

目錄

1.yolov3的darknet使用

2. yolov3訓練自己的數據集

1)普通的訓練

2)將anchor換成自己數據集匹配的值:

3. yolov3的caffe使用

1)轉成caffe模型

2)使用caffe模型:

Gaussian yolov3使用

1).訓練自己數據集

2)caffe使用:

其他:


環境:Ubuntu16.04

              python2.7(caffe)

              cuda8.0/9.0(8.0和9.0都一樣)

              opencv3.3.0/3.4.0(這倆都一樣能成)

1.yolov3的darknet使用

  • clone darknet
git clone https://github.com/pjreddie/darknet.git
  • 修改darknet中的makefile文件(兩處):
1.前5行,選擇使用的配置,置1
    GPU=1
    CUDNN=1
    OPENCV=1
    OPENMP=0
    DEBUG=0
2.nvcc,第24行
    將:NVCC=nvcc
    改:NVCC=/usr/local/cuda-9.0/bin/nvcc[自己的nvcc地址]
  • make編譯一下:
cd darknet
make 
  • demo的使用:

下載:yolov3.weights

wget https://pjreddie.com/media/files/yolov3.weights

或者用百度雲,給個地址:https://pan.baidu.com/s/1kPxCb1baKOtkoKju-aJWeA 提取碼:mv2w

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

2. yolov3訓練自己的數據集

1)普通的訓練

  • 下載與訓練模型
wget https://pjreddie.com/media/files/darknet53.conv.74

或者用百度雲,給個地址:https://pan.baidu.com/s/1KvSmjrs2fMBNMvGtpwEb8A 提取碼:8vtz

  • 準備數據集

前提:數據集的標註方式與voc一樣是xml文件

1.下載voc_label.py

wget https://pjreddie.com/media/files/voc_label.py

2.修改voc_label.py文件:

sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
#刪除2012
classes = ["car","person","bicycle"]
#改自己的類別

3.修改./cfg/voc.data文件,剛剛我們得到生成文件:2007_test.txt,2007_train.txt,2007_val.txt,train.txt,train.all.txt;

classes= 3
train  = /home/ubuntu247/liliang/algorithms/darknet/VOCdevkit/VOC2007/train.txt
valid  = /home/ubuntu247/liliang/algorithms/darknet/VOCdevkit/VOC2007/2007_test.txt
names = data/voc.names
backup = backup

4.修改./cfg/yolov3-voc.cfg(4處):

第一處:修改batch和subdivisions

[net]
# Testing 測試的時候把這個參數打開
#batch=1
#subdivisions=1
# Training 現在是訓練的時候,打開這個部分
batch=64
subdivisions=16

第2-4處:修改類別:先查找文件中“yolo”出現的3處

舉其中一處爲例,剩下兩處都一樣
[convolutional]
size=1
stride=1
pad=1
filters=24 #改這裏 3*(類別數+5) 我的類別是3類,所以是24
activation=linear

[yolo]
mask = 6,7,8
anchors =   7, 15, 16, 18, 22, 32, 9, 40, 20, 71, 37, 39, 52, 65, 70, 110, 105, 208
classes=3#這裏類別數
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0

5.開始訓練:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

2)將anchor換成自己數據集匹配的值:

參考:https://blog.csdn.net/cgt19910923/article/details/82154401

  • clone anchor生成工具:
git clone https://github.com/lars76/kmeans-anchor-boxes
  • 修改一下example.py代碼:
import glob
import xml.etree.ElementTree as ET

import numpy as np

from kmeans import kmeans, avg_iou

ANNOTATIONS_PATH = "/home/ubuntu247/liliang/Data/INF_20191030/Annotations1107/"
CLUSTERS = 9

def load_dataset(path):
	dataset = []
	for xml_file in glob.glob("{}/*xml".format(path)):
		tree = ET.parse(xml_file)

		height = float(tree.findtext("./size/height"))
		width = float(tree.findtext("./size/width"))

		for obj in tree.iter("object"):
			xmin = float(obj.findtext("bndbox/xmin")) / width
			ymin = float(obj.findtext("bndbox/ymin")) / height
			xmax = float(obj.findtext("bndbox/xmax")) / width
			ymax = float(obj.findtext("bndbox/ymax")) / height

			dataset.append([xmax - xmin, ymax - ymin])

	return np.array(dataset)

if __name__ == '__main__':
    data = load_dataset(ANNOTATIONS_PATH)
    out = kmeans(data, k=CLUSTERS)
    print("Accuracy: {:.2f}%".format(avg_iou(data, out) * 100))
    print("Boxes:\n {}".format(out))

    ratios = np.around(out[:, 0] / out[:, 1], decimals=2).tolist()
    print("Ratios:\n {}".format(sorted(ratios)))
  • 運行代碼:
sudo python example.py

  • 將boxes乘以416(圖片resize後的大小),會得到9個box,再按照大小排列以後得到anchors
anchors =  7, 15, 16, 18, 22, 32, 9, 40, 20, 71, 37, 39, 52, 65, 70, 110, 105, 208
  • 更改./yolov3-voc.cfg文件:【之前提到的查找yolo存在的位置,更改3處】,每一處的anchors都替換成自己的值

以其中一處爲例子,剩餘兩處一樣的格式
[yolo]
mask = 0,1,2
anchors =   7, 15, 16, 18, 22, 32, 9, 40, 20, 71, 37, 39, 52, 65, 70, 110, 105, 208
classes=3
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
  • 重新開始訓練:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

3. yolov3的caffe使用

1)轉成caffe模型

前提:剛剛訓練得到了相應的weights,準備好yolo需要的layer--upsample_layer.cpp,upsample_layer.cu,upsample_layer.h

參考:https://blog.csdn.net/watermelon1123/article/details/82083522

將新的layer添加進去,完成caffe的準備工作。然後還要安裝好pytorch。

  • clone 轉換工具:
git clone https://github.com/marvis/pytorch-caffe-darknet-convert
  • 開始轉換:最後會得到 yolov3.prototxt yolov3.caffemodel
python2.7 darknet2caffe.py cfg/yolov3-voc.cfg yolov3-voc.weights yolov3.prototxt yolov3.caffemodel


將yolov3-voc.weights放在文件夾下

然後將yolov3-voc.cfg放在./cfg文件夾下面

yolov3.prototxt yolov3.caffemodel是要生成的caffe模型和pro文件命名

2)使用caffe模型:

  • clone使用工具:
git clone https://github.com/ChenYingpeng/caffe-yolov3

cd caffe-yolov3
  • 將生成的caffemodel和prototxt放在./caffemodel和./prototxt文件下【沒有就建一個】
  • 修改cmakelist.txt
"""全部都要改成自己的caffe路徑"""
# build C/C++ interface
include_directories(${PROJECT_INCLUDE_DIR} ${GIE_PATH}/include)
include_directories(${PROJECT_INCLUDE_DIR} 
	/home/ubuntu247/liliang/caffe-ssd/include 
	/home/ubuntu247/liliang/caffe-ssd/build/include 
)


file(GLOB inferenceSources *.cpp *.cu )
file(GLOB inferenceIncludes *.h )

cuda_add_library(yolov3-plugin SHARED ${inferenceSources})
target_link_libraries(yolov3-plugin 
	/home/ubuntu247/liliang/caffe-ssd/build/lib/libcaffe.so  
	/usr/lib/x86_64-linux-gnu/libglog.so  
	/usr/lib/x86_64-linux-gnu/libgflags.so.2
    	/usr/lib/x86_64-linux-gnu/libboost_system.so  
	/usr/lib/x86_64-linux-gnu/libGLEW.so.1.13  
)
  • 如果你在訓練中使用的是自己的anchors值,要修改anchors的值(yolo.cpp中),再進行編譯;還有yolo.h中的classes數
/*
 * Company:	Synthesis
 * Author: 	Chen
 * Date:	2018/06/04
 */

#include "yolo_layer.h"
#include "blas.h"
#include "cuda.h"
#include "activations.h"
#include "box.h"
#include <stdio.h>
#include <math.h>

//yolov3
//float biases[18] = {10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326};
float biases[18] = {7, 15, 16, 18, 22, 32, 9, 40, 20, 71, 37, 39, 52, 65, 70, 110, 105, 208};
/*
 * Company:	Synthesis
 * Author: 	Chen
 * Date:	2018/06/04	
 */

#ifndef __YOLO_LAYER_H_
#define __YOLO_LAYER_H_
#include <caffe/caffe.hpp>
#include <string>
#include <vector>

using namespace caffe;


const int classes = 3;
const float thresh = 0.5;
const float hier_thresh = 0.5;
const float nms_thresh = 0.5;
const int num_bboxes = 3;
const int relative = 1;
  • 編譯
mkdir build
cd build
cmake ..
make -j12
  • 運行:
 ./x86_64/bin/detectnet ../prototxt/yolov3.prototxt ../caffemodel/yolov3.caffemodel ../images/dog.jpg

Gaussian yolov3使用

1).訓練自己數據集

整體與yolov3的步驟一樣,數據準備與yolov3一致。準備好數據以後:

  • 將yolov3中的./cfg/voc.data,./data/voc.names,./cfg/yolov3-voc.cfg,分別複製到對應文件夾下面
  • 對./cfg/yolov3-voc.cfg進行修改,將它重命名爲./cfg/gaussian-yolov3-voc.cfg,查找yolo的位置,修改內容【3處】
還是以其中一處爲例
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=36 # 3*(類別數+5+4) 我的類別是3類,所以是36
activation=linear

[Gaussian_yolo]
mask = 6,7,8
anchors = 7, 15, 16, 18, 22, 32, 9, 40, 20, 71, 37, 39, 52, 65, 70, 110, 105, 208
classes=3
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
  • 開始訓練:
./darknet detector train cfg/voc.data cfg/gaussian-yolov3-voc.cfg darknet53.conv.74

2)caffe使用:

  • 轉caffe的環境剛剛在yolov3中已經配置好了,所以一樣的轉模型就可以
python2.7 darknet2caffe.py cfg/gaussian-yolov3-voc.cfg gaussian-yolov3-voc.weights gaussian-yolov3.prototxt gaussian-yolov3.caffemodel
  • 將caffe-yolov3中的yolo.cpp和yolo.h替換成gaussian_yolo_layer.h和gaussian_yolo_layer.cpp,重新編譯
cd caffe-yolov3
rm -rf build
mkdir build
cd build
cmake ..
make -j12
  • 一樣的放好模型以後,開始檢測
 ./x86_64/bin/detectnet ../prototxt/gaussian-yolov3.prototxt ../caffemodel/gaussian-yolov3.caffemodel ../images/dog.jpg

其他:

1.檢測一個文件夾下面的多張圖片(有txt標註),並計算map,修改caffe-yolov3中./detectnet/detectnet.cpp文件就可以了。

2.我自己修改的一些代碼存放地址:

https://github.com/hualuluu/gaussian-yolov3-detection-caffe

【代碼修改參考:https://github.com/ChenYingpeng/caffe-yolov3 yolo.cpp和yolo.h文件還有yolov3的源碼】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章