课后感慨
课程是越来越难了,有点难跟上了。但得益于群里大佬以及飞桨平台的各种文档,解决了很多困难
作业完成记录
制作数据集
之前制作的数据集太小了,训练出来的效果很差,所以我又重新制作了一个数据集。最近在看《小林家的龙女仆》,想做一个相关的数据集,于是截了100张图片完成数据集。
数据集的制作可以参考我的第二篇笔记
训练模型
参考案例
一开始我不知道应该怎么开始,于是在飞桨平台查找教程,我找到的是这个:
使用自定义数据集实现吸烟识别预测
代码解读
下面将详细解释上面的参考案例中的代码
unzip
!unzip -oq data/data94796/pp_smoke.zip -d work/
unzip是一个解压命令,后面的“-oq”以及“-d”是命令的参数例如,-d的意思是解压到某个地方,上面的代码中后接work/就是解压到work文件夹,其他参数可以参考这里:
参数解释
git
! git clone https://gitee.com/paddlepaddle/PaddleDetection.git
git是一个从网上下载东西的命令。
如果网速慢可以直接将PaddleDetection下载到自己的电脑,需要用的时候再上传到项目中。
安装代码:
!unzip -oq /home/aistudio/PaddleDetection-release-2.1.zip
!pip install -r /home/aistudio/PaddleDetection-release-2.1/requirements.txt
PaddleDetection里有很多工具,很方便
数据集划分解读
import random
import os
#生成train.txt和val.txt
#train.txt和val.txt是对数据集的划分,看到下面的ratio=0.9,意为按9:1划分为训练集和验证集
random.seed(2020)
xml_dir = '/home/aistudio/work/Annotations'#标签文件地址
#xml后缀文件是标签文件,打开Annotations文件夹,可以看见里面的文件是xml后缀的
img_dir = '/home/aistudio/work/images'#图像文件地址
#该文件地址是存放图片的,跟上面的文件是对应的
path_list = list()
for img in os.listdir(img_dir):
#os.listdir会返回指定路径下的文件
img_path = os.path.join(img_dir,img)
#os.path.join是将两个或多个拼起来
xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))
path_list.append((img_path, xml_path))#将标签与图片对应
#可能还是有些同学不是很清楚是什么意思,举个例子可能好理解些
#已知img_dir='/home/aistudio/work/images'路径下都是图片
#假设这些图片是为1~20为名字的jpg
#那么os.listdir(img_dir)返回的是1.jpg,2.jpg……20.jpg
#for img in os.listdir(img_dir)就是上面的每一个jpg
#img_path = os.path.join(img_dir,img)拼接出来的就是这样:
#/home/aistudio/work/images/1.jpg
#/home/aistudio/work/images/2.jpg
#……
#xml_path 得到的就是/home/aistudio/work/images/2.xml
#两者的区别只是将最后面的jpg换成xml
#path_list就是把上面img_path和xml_path连起来
random.shuffle(path_list)#shuffle意为洗牌,意思是将数据集打乱
ratio = 0.9
train_f = open('/home/aistudio/work/train.txt','w') #生成训练文件
#open就是打开,后面的'w'是写入命令,即write
val_f = open('/home/aistudio/work/val.txt' ,'w')#生成验证文件
for i ,content in enumerate(path_list):
#enumerate(path_list)是一个枚举
#i,content分别是索引和值
#可以这样理解:path_list是一个C语言里的数组
#i为数组的序号,意思是第i个;content则为第i个的内容
img, xml = content
text = img + ' ' + xml + '\n'
if i < len(path_list) * ratio:
train_f.write(text)#写入
else:
val_f.write(text)
train_f.close()
val_f.close()
#生成标签文档
label = ['smoke']#设置你想检测的类别
with open('/home/aistudio/work/label_list.txt', 'w') as f:
for text in label:
f.write(text+'\n')
文件选择
案例中使用的是PaddleDetection-release-2.1/configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml,也可以选择其他的
打开PaddleDetection-release-2.1/configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml路径的文件,会看到:
上图红圈部分是应该注意的,修改第一个voc.yml文件即可使用了,但为了更好地使用,也可以修改其他参数
上面的路径分别是train.txt、val.txt和label_list.txt文件所在路径
修改好参数就可以训练了,应该基本没什么问题了
问题解决
- 报错ValueError:The device should not be ‘gpu’,since PaddlePaddle is not compiled with CUDA,换到高级版或至尊版即可
- 如果解压数据集一直在运行可能是有的图片有问题,删掉即可