TORCH03-08Darknet分类训练与使用

2020-05-04  本文已影响0人  杨强AT南京

  Darknet这种结构化的封装是一种学习启示,其中对图像数据的组织方式比较规律化,可以作为一种定式来学习。
  这个主题主要是用比较简单的分类训练来说明这种定式的数据组织方式,数据组织可能需要程式化的处理,这里写了了一些Python脚本程序来验证这一点。同时训练了两种网络AlexNet与VGG,再次证明少量的ImageNet数据在VGG收敛是个考验。
  除了程式化的训练数据预处理,可能标签工具的开发与应用也是一个方面,这个主题没有涉及。


DarkNet的下载与安装

下载

window安装下载页面

安装

  1. 解压
解压目录
  1. 使用CMake -gui配置
    • 基本上采用默认就行
使用CMake-GUI生成Visual Studio项目
  1. 使用Visual Studio打开工程
    • 记得使用管理员权限打开工程
darknet.sln
  1. 开始编译
    • 选择【ALL BUILD】,在生成菜单选择【重新生成ALL BUILD】
    • 选择【INSTALL】,在生成菜单选择【重新生成ALL BUILD】
开始编译
  1. 编译需要一定时间
完整成功后提示7个任务完成
  1. 把安装路径设置为PATH,就可以在任何人地方使用darknet了
设置PATH环境变量
  1. 记得设置几个PATH
    • 因为使用的是darknet提供的多线程库。
记得配置darknet安装包自带的线程库
  1. 使用darknet工具
    • 记得重启控制终端或者powershell。
    • 下面使用随便一个非法的-选项来执行。会输出cuda与opencv的信息。具体的选项可以阅读C的源代码。
测试命令是否可以运行

使用Darknet

darknet的执行选项 detect的调用代码 执行detect结果

使用python调用darknet

DLL库名根据自己的编译结果改变

使用Darknet训练定制数据集

训练图像分类

DarkNet预训练的网络

DarkNet预训练的图像分类网络

分类网络的模型选择

[net]
# Training
# batch=128
# subdivisions=4

# Testing
batch=1
subdivisions=1

height=256
width=256
channels=3
learning_rate=0.00001
momentum=0.9
decay=0.0005

[crop]
crop_height=224
crop_width=224
flip=1
exposure=1
saturation=1
angle=0

[convolutional]
filters=64
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=64
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=2
stride=2

[convolutional]
filters=128
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=128
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=2
stride=2

[convolutional]
filters=256
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=256
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=256
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=2
stride=2

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=2
stride=2

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=512
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=2
stride=2

[connected]
output=4096
activation=relu

[dropout]
probability=.5

[connected]
output=4096
activation=relu

[dropout]
probability=.5

[connected]
output=1000
activation=linear

[softmax]
groups=1



数据集准备与处理

训练的图像数据集 数据描述文件与数据集的对应关系
import os
import cv2

class_names = ["organ", "palace", "roll", "skirt"]
dataset_dir = "./imagenet2012"

# 1. 生成shortnames.list文件

# ------遍历每个目录 ------
# 创建两个文件
yolo_dir = "yolo_desc"   #描述文件的目录
train_filename = "train.list"
val_filename = "val.list"

labels_filename = "labels.list"
shortname_filename ="classnames.list"

# 判定目录是否存在,不存在就创建
if not os.path.exists(yolo_dir):
    os.makedirs(yolo_dir)
# 在目录下创建两个文件,并后面循环中写入数据
train_filename = os.path.join(yolo_dir, train_filename)
val_filename =  os.path.join(yolo_dir, val_filename)

fd_train = open(train_filename, 'w') 
fd_val = open(val_filename, 'w') 
# 2. 每个文件前的_name作为label.list的内容
# 3. 写图像清单到train.list与val.list(我们训练集作为验证集)
all_labels = []   # 保存内别标签
for sub in class_names:
    # 构建图像的路径
    sub_dir = os.path.join(dataset_dir, sub)
    if os.path.exists(sub_dir):
        # 列出文件(子目录不处理)
        all_files = os.listdir(sub_dir)
        for f in all_files:
            full_filename = os.path.join(sub_dir, f)
            # 保存文件名到描述文件
            fd_train.write(full_filename + "\n")
            fd_val.write(full_filename + "\n")
            if os.path.isfile(full_filename):
                # 解析文件名_前的标签
                label_name = f.split("_")[0]
                if not label_name in all_labels:
                    all_labels.append(label_name)

# 关闭清单文件
fd_train.close()
fd_val.close()
# 保存标签名与类别
labels_filename = os.path.join(yolo_dir, labels_filename)
shortname_filename =  os.path.join(yolo_dir, shortname_filename)
fd_labels = open(labels_filename, 'w') 
fd_shortnames = open(shortname_filename, 'w') 

for label in all_labels:
    fd_labels.write(label + "\n")
    
for short_name in class_names:
    fd_shortnames.write(short_name + "\n")
    
fd_labels.close()
fd_shortnames.close()

创建的描述文件
classes = 4
train  = yolo_desc/train.list
valid  = yolo_desc/val.list
backup = yolo_desc
labels = yolo_desc/labels.list
names  = yolo_desc/classnames.list
top=1

分类训练

修改最后输出为4 训练过程截图

使用分类训练集结果验证/分类

VGG预测结果很差,概率小

训练图像侦测


上一篇 下一篇

猜你喜欢

热点阅读