兴趣尝试,训练一下自己的数据集做图像识别人脸口罩。

darknet网络下载

下载地址:https://pjreddie.com/darknet/yolov2/
直接按照步骤,里面有不同yolo版本的基本配置文件,区别是使用什么样的预训练模型就用什么样的weight文件,下载好后直接放在darknet目录下。

尝试运行:

cd darknet./darknet detector test cfg/voc.data cfg/yolov2-tiny-voc.cfg yolov2-tiny-voc.weights data/dog.jpg

测试结果:

bicycle居然没识别出来。确实精度差点。

数据集处理

一、转换数据集格式

我是直接从网上下载的数据集,但jpg和xml是一一对应放在同一个文件夹下,而一般训练大多是按照VOC格式存储,所以要先转换数据集格式。

VOC数据集格式如下:

VOCdevkit
——VOC2020        #文件夹的年份可以自己取
————Annotations  #放入所有的xml文件
————ImageSets
——————Main       #放入train.txt,val.txt,test.txt,trainval.txt文件(不一定全要建)
————JPEGImages   #放入所有的图片文件Main中的文件分别表示test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集

二、数据增强:

数据增强

参考链接
博主用的os.walk(),获取路径,但是读取的文件路径是乱序(害苦我了),之后稍微改了一下。
在网上搜索发现,获取文件路径有两种方法:

  • os.listdir(path)只能获取当前目录下的所有文件或者文件夹的名称,而不能获取文件夹的绝对路径
  • os.walk(path) 返回包含(root,dirs,files)三种信息的生成器。
    os.walk(path)获得的并不是路径,所以需要将获得的三种信息进行链接才能得到路径
    root 所指的是当前正在遍历的这个文件夹的本身的地址
    dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

这里采用的是os.listdir(),再sort(),将文件排序后再依次读取并且重命名为000123.xml/.jpg格式的文件。

#author:gr
# -*- coding:utf-8 -*-import os
import shutilpath = '/Users/apple/train'   #数据集文件夹路径,下面包含每个类,改成你自己的
new_img_path = '/Users/apple/VOCdevkit/VOC2020/JPEGImages/'   #新的图片路径,改成你自己的
new_ann_path = '/Users/apple/VOCdevkit/VOC2020/Annotations/'    #新的xml路径,搞成你自己的
count_img = 1   #每提取一张图片,count+1,也能够按顺序给图片重命名
count_ann = 1   #每提取一个xml,count+1也能够按顺序给文件重命名
path_list = os.listdir(path) #获取文件名+后缀
path_list.sort()#我对数据集没有顺序要求,只需jpg和xml一一对应,所以最简单的排序
#print(path_list)
root = path
for files in path_list:'''循环path文件下每个每个文件夹,每个图片,按照以.jpg结尾和.xml结尾区分'''#print(files)if files[-3:] == 'jpg':file_path = root + '/' + filesshutil.copy(file_path, os.path.join(new_img_path, str(count_img).zfill(6)+'.jpg'))count_img = count_img + 1elif files[-3:] == 'xml':file_path = root + '/' + filesshutil.copy(file_path, os.path.join(new_ann_path, str(count_ann).zfill(6)+'.xml'))count_ann = count_ann + 1
print(count_img)
print(count_ann)

二、接着生成tain.txt

再将生成之后的文件VOCdevkit放到/darknet/scripts/目录下

#author:gr
# -*- coding:utf-8 -*-# 生成main.txt
import os
def main(src, dest):count = 0out_file = open(dest,'w')  #生成了在指定目录下的txt文件path_list = os.listdir(src)path_list.sort()with open(dest, 'w') as f:for name in path_list:base_name = os.path.basename(name)file_name = base_name.split('.')[0]f.write('%s\n' % file_name)count = count + 1print(count)if __name__ == '__main__':TrainDir = '/Users/apple/VOCdevkit/VOC2020/JPEGImages/'  #图片文件所在目录target = '/Users/apple/VOCdevkit/VOC2020/ImageSets/Main/train.txt'main(TrainDir, target)

三、修改voc_label.py.直接在vocdevkit文件里自动创建label文件夹包含每张照片对应的txt文件。
按照如下格式:

<object-class> <x> <y> <width> <height>

分别代表物体类别,
中心归一化横坐标(x)
中心归一化纵坐标(y)
归一化宽度(w)
归一化高度(h)

计算公式参考:
dw = 1 / width
dh = 1/ height
x = ( xmin + xmax ) / 2 * dw
y = ( ymin + yman ) / 2 * dh
w = ( xmax - xmin ) / 2 * dw
h = ( ymax - ymin ) / 2 * dh

实现代码:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join#sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]#classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]sets = [('2020','train')]  #训练的集合classes = ["face_mask","face"] #标注的类别def convert(size, box):dw = 1./(size[0])dh = 1./(size[1])x = (box[0] + box[1])/2.0 - 1y = (box[2] + box[3])/2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)def convert_annotation(year, image_id):in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')tree=ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult)==1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()for year, image_set in sets:if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):os.makedirs('VOCdevkit/VOC%s/labels/'%(year))image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()list_file = open('%s_%s.txt'%(year, image_set), 'w')for image_id in image_ids:list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))convert_annotation(year, image_id)list_file.close()#os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
#os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
os.system("cat 2020_train.txt 2020_val.txt  > train.txt")  

最后生成了label文件夹包含所有的图片对应的txt文件,生成2020_train.txt,2020_val.txt之类的文本文件列出了该年份的图像文件和图像集。 train.txt需要一个文本文件,其中包含要训练的所有图像。

不过我的数据集有一点不规范没有< size >标签,弄了好久。不过一般按照正常情况标注的应该不会发生,如果有出入相应修改代码就行了。这里就不详述啦

修改相应配置文件

四、修改cfg文件和names文件

在cfg文件夹下找到voc.data文件

  1 classes= 2  #classes训练类别数2 train  = <path-to-voc>/train.txt #训练集3 valid  = <path-to-voc>2020_test.txt#测试集4 names = data/voc.names5 backup = backup

< path-to-voc>就是你放数据集的位置

修改data文件夹下voc.name文件,换成你训练的类别:

mask
face
五、下载预训练模型
wget https://pjreddie.com/media/files/darknet19_448.conv.23
六、修改cfg/yolo-tiny-voc.cfg

1.修改了batch和subdivison

[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=8
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

2.修改最后一层的卷积核和类别

filter =5*(5+2)

[convolutional]
size=1
stride=1
pad=1
filters=35//
activation=linear
[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
bias_match=1
classes=2//
coords=4
num=5
softmax=1
jitter=.2
rescore=1object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1absolute=1
thresh = .6
random=1
五、Makefile文件
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
cd darkentmake

数据集终于弄好了,下一步准备上服务器了,嘿嘿嘿。

训练

cd darknet目录下执行

./darknet detector train cfg/voc.data cfg/yolov2-tiny-voc.cfg darknet19_448.conv.23

测试

cd darknet./darknet detector test cfg/voc.data cfg/yolov2-tiny-voc.cfg backup/yolov2-tiny-voc_final.weights

输入图片名进行测试

Enter Image Path: data/1.jpg
data/1.jpg: Predicted in 1.202904 seconds.
face: 56%
mask: 91%

(一般放在darknet/data下)

./darknet detector test cfg/voc.data cfg/yolov2-tiny-voc.cfg backup/yolov2-tiny-voc_final.weights data/1.jpg

点开prediction.jpg,效果还行,就不放出来了。

计算map值

由于yolov2版本比较低,无法直接计算出map,所以先生成检测结果文件(以下保存在mask.txt中)

./darknet detector valid cfg/voc.data cfg/yolov2-tiny-voc.cfg backup/yolov2-tiny-voc_final.weights -out mask.txt -gpu 0 -thresh .5

其他

训练暂停:ctrl+z
恢复训练:fg
训练终止:ctrl+c

训练中遇到的一些问题

一、Couldn’t open file

Couldn't open file: /darknet/scripts/2020_train.txt

solution:

修改cfg/voc.data,要用绝对路径不要用相对路径

train = /home/你的用户名/darknet/scripts/2020_train.txt
valid = /home/你的用户名/darknet/scripts/2020_val.txt

二、Cannot load image

Cannot load image "/darknet/scripts/VOCdevkit/VOC2020/JPEGImages/002846.jpg"
STB Reason: can't fopen

solution:

重要的事情说三遍
绝对路径!绝对路径!绝对路径!

ps:这个如果用之前的文件生成的文件的确是绝对路径,由于我个人原因修改了一下路径,变成了相对路径,所以我的问题不一定都会遇到。

其他学习

服务器上传,下载文件参考:
https://blog.csdn.net/resilient/article/details/85334594

上传文件:scp -P(大写) 端口号。。。。。

yolov2 - tiny模型训练识别相关推荐

  1. 【K210】K210学习笔记六——MaixHub在线模型训练识别数字

    [K210]K210学习笔记六--MaixHub在线模型训练识别数字 前言 K210准备工作 数据的获取 MaixHub如何在线训练模型 训练模型在K210上的测试 小结 前言 本人大四学生,电赛生涯 ...

  2. K210 Mx-yolov3模型训练和物体识别

    一.简介 (1)硬件准备: K210开发板:拥有1TOPS算力,可以运行神经网络模型,同时其提供在线模型训练平台(maixhub),支持物体分类和物体识别. (2)软件环境 Mx-yolov3:(用于 ...

  3. NLP命名实体识别NER数据准备及模型训练实例

    NLP命名实体识别NER数据准备及模型训练实例 目录 NLP命名实体识别NER数据准备及模型训练实例 ​ 方案一

  4. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  5. Qt5.7+Opencv2.4.9人脸识别(四)模型训练

    [注意]本博文的档次适合OpenCV初学者,和要做本科生毕业设计这类档次. 源码的下载地址和原理理论部分请走下面连接 http://blog.csdn.net/qq78442761/article/d ...

  6. 药盒识别/垃圾分类—高精度AI模型训练及边缘部署分享

    这是AI应用的时代. 工厂:高速照相机拍下传送带上的零部件,机器识别出有缺陷的零件剔除: 农场:拍摄虫体照片,识别害虫名称和数量并能防控虫害,减少农药使用量,发展绿色农业 小区:智能垃圾箱可以基于图像 ...

  7. PaddlePaddle飞桨OCR文本检测——识别模型训练(三)

    上一篇检测模型训练https://blog.csdn.net/weixin_42845306/article/details/112689152 飞桨的OCR模型分为检测.识别和分类,今天讨论识别. ...

  8. 用深度学习做命名实体识别(四)——模型训练

    通过本文你将了解如何训练一个人名.地址.组织.公司.产品.时间,共6个实体的命名实体识别模型. 准备训练样本 下面的链接中提供了已经用brat标注好的数据文件以及brat的配置文件,因为标注内容较多放 ...

  9. 构建 Darknet 分类器 (Tiny Darknet) 训练数据集 (color recognition 颜色识别/color classification 颜色分类)

    构建 Darknet 分类器 (Tiny Darknet) 训练数据集 (color recognition 颜色识别/color classification 颜色分类) 1. CompCars_C ...

  10. 基于opencv的SVM车牌号码识别模型训练(C++)QT

    条件:opencv-4.5,QT 一.准备数据集 下载车牌相关字符样本用于训练和测试,本文使用14个汉字样本和34个数字跟字母样本,每个字符样本数为40,样本尺寸为28*28. 二.计算样本HOG特征 ...

最新文章

  1. 排序算法总结之堆排序
  2. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
  3. python3 str() repr() 区别
  4. python开发工具管理系统_Python之软件管理
  5. php如何导入数据,““php中如何将execl的数据导入到数据库中
  6. DDD领域模型自动生成?
  7. 不重复的两两比较(洛谷P5728题题解,Java语言描述)
  8. catia如何测量毛料尺寸_我有“一帘幽梦”之如何测量窗帘尺寸及窗帘的挂法
  9. centos7安装python3及pip3更新_CentOS7下安装Python3及Pip3并保留Python2
  10. 21个GIF动图让你了解各种数学概念
  11. 决策支持系统和专家系统有什么不同
  12. html表格 超链接无效,excel表格超链接失效怎么处理
  13. 自走棋突然显示服务器无法定位,刀塔自走棋服务器无法定位游戏会话_刀塔自走棋服务器无法定位游戏会话怎么回事_玩游戏网...
  14. 基于组件开发——应用软件开发的革命
  15. python模拟实现QQ邮箱登录
  16. web调用钉钉待办审批
  17. android e.printStackTrace()异常处理
  18. windows server2012 管理配置chrome
  19. Android OPPO推送服务集成
  20. 循环结构简单题之分硬币

热门文章

  1. 餐厅收费服务器密码修改,餐厅消费管理系统-会所一卡通管理系统
  2. 哪个说了算?漫谈网吧网络的稳定和安全(转)
  3. 笔记本样机的识别(加测硬盘通电时间软件HDTune)
  4. 三年建模师告诉你3DMAX有没有前途
  5. win11 恢复win10开始菜单及任务栏
  6. win10企业版如何改为专业版?
  7. 处理文件的fseek函数
  8. 风险模型—VaR模型2
  9. Tomcat 发布时war解压
  10. 7教程统计意义_极少人知道的SPSS数据拆分技巧——「杏花开生物医药统计」