编辑区 Markdown Cell,是Notebook中文本编辑单元,通过在Markdown Cell中输入Markdown格式的文本,可以编写文字教程说明.
命令/编辑模式
编辑Cell 支持插入公式、表格、图片、音乐、视频、网页等. 相关Markdown用法可以参考Markdown官网.
常用快捷键操作
模式 | 模式 | 快捷键(Windows) |
---|---|---|
命令模式 (Esc切换) | 运行块 | Shift-Enter |
命令模式 | 在下方插入块 | B |
命令模式 | 在上方插入块 | A |
命令模式 | 在上方插入块 | dd |
命令模式 | 切换到编辑模式 | Enter |
编辑模式 (Enter切换) | 运行块 | Shift-Enter |
编辑模式 | 缩进 | Ctrl-] |
编辑模式 | 取消缩进 | Ctrl-[ |
编辑模式 | 注释 | Ctrl-/ |
编辑模式 | 函数内省 | Tab |
Jupyter Notebook 有两种键盘输入模式。编辑模式,允许你往单元中键入代码或文本。命令模式,键盘输入运行程序命令。
Enter : 转入编辑模式
Shift-Enter : 运行本单元,选中下个单元
Ctrl-Enter : 运行本单元
Alt-Enter : 运行本单元,在其下插入新单元
Y : 单元转入代码状态
M :单元转入markdown状态
R : 单元转入raw状态
1 : 设定 1 级标题
2 : 设定 2 级标题
3 : 设定 3 级标题
4 : 设定 4 级标题
5 : 设定 5 级标题
6 : 设定 6 级标题
Up : 选中上方单元
K : 选中上方单元
Down : 选中下方单元
J : 选中下方单元
Shift-K : 扩大选中上方单元
Shift-J : 扩大选中下方单元
A : 在上方插入新单元
B : 在下方插入新单元
X : 剪切选中的单元
C : 复制选中的单元
Shift-V : 粘贴到上方单元
V : 粘贴到下方单元
Z : 恢复删除的最后一个单元
D,D : 删除选中的单元
Shift-M : 合并选中的单元
Ctrl-S : 文件存盘
S : 文件存盘
L : 转换行号
O : 转换输出
Shift-O : 转换输出滚动
Esc : 关闭页面
Q : 关闭页面
H : 显示快捷键帮助
I,I : 中断Notebook内核
0,0 : 重启Notebook内核
Shift : 忽略
Shift-Space : 向上滚动
Space : 向下滚动
编辑模式 ( Enter 键启动)
Tab : 代码补全或缩进
Shift-Tab : 提示
Ctrl-] : 缩进
Ctrl-[ : 解除缩进
Ctrl-A : 全选
Ctrl-Z : 复原
Ctrl-Shift-Z : 再做
Ctrl-Y : 再做
Ctrl-Home : 跳到单元开头
Ctrl-Up : 跳到单元开头
Ctrl-End : 跳到单元末尾
Ctrl-Down : 跳到单元末尾
Ctrl-Left : 跳到左边一个字首
Ctrl-Right : 跳到右边一个字首
Ctrl-Backspace : 删除前面一个字
Ctrl-Delete : 删除后面一个字
Esc : 进入命令模式
Ctrl-M : 进入命令模式
Shift-Enter : 运行本单元,选中下一单元
Ctrl-Enter : 运行本单元
Alt-Enter : 运行本单元,在下面插入一单元
Ctrl-Shift-- : 分割单元
Ctrl-Shift-Subtract : 分割单元
Ctrl-S : 文件存盘
Shift : 忽略
Up : 光标上移或转入上一单元
Down :光标下移或转入下一单元
终端:用户可以使用终端来进行一些操作, 与Notebook主界面并行, 例如查询GPU占用率. 或进行文本编辑.
输电通道隐患主要是指鸟巢、导线异物(气球、风筝、垃圾等),这些异物可能导致输电线路出现短路、接地等故障,导致线路停电,影响供电可靠性和稳定性。为解决大量无人机拍摄的输配电线路图片识别缺陷和隐患人力成本高、效率低的问题,人工智能技术在能源行业被大量运用。基于无人机拍摄的图像和深度学习技术,自动化查找隐患、准确定位、返回检测结果并进行可视化。
需要找到存在缺陷的图片,并准确定位缺陷位置、标明缺陷类型;
缺陷形式多样,对算法鲁棒性要求高,例如气球样式多、垃圾种类多;
异物与设备位置关系多样,例如部分风筝并未直接接触导线,而是通过风筝线与导线连接。
评价指标
精确率(Precision):即真正例(TP)占所有被分类为正例(TP+FP)的比例,公式为: Precision = TP / (TP + FP)
召回率(Recall):即真正例(TP)占所有真实正例(TP+FN)的比例,公式为: Recall = TP / (TP + FN)
F1-Score:综合Precision和Recall,公式为: F1-Score = (2 * Precision * Recall) / (Precision + Recall)
数据集来源多个渠道,使用高清摄像机、普通摄像机等多种设备拍摄。数据来自各类型输电线路设备,背景包括城市、乡村、山地、道路、农田等。 数据集包含1000张输电通道图像,大小约为3GB,由比赛选手自行拆分训练集和验证集。数据集中目标的种类包括鸟巢、风筝、气球、垃圾,图片为jpg格式,标注文件为xml格式。数据集中每个目标都被标注了专业准确的边界框和类别。 数据集的独特优势在于:数据来源广泛、数量庞大、种类清晰、边界框标注准确。这些特点使得该数据集适用于复杂场景下的隐患目标检测算法的开发和应用。同时,数据量足够大,可以有效提高算法的鲁棒性和泛化性能,从而达到更好的应用效果。 参赛者可以基于该数据集进行算法的训练和测试,并结合数据集的独特特点进行算法设计,以期达到更好的检测效果和性能第二届琶洲算法大赛南方电网baseline。
数据说明,具体格式说明如下:
文件名称说明: 数据集中的图像文件以“.jpg”为后缀,标注文件同名,只是后缀名为“.xml”。
文件编码说明: 标注文件采用UTF-8编码。
文件中的数据格式说明: 标注文件采用XML格式,格式如下:
<annotation>
<filename> 0000001.jpgfilename>
<size>
<width>1080width>
<height>1080height>
<depth>3depth>
size>
<object>
<name>balloonname>
<bndbox>
<xmin>100xmin>
<ymin>200ymin>
<xmax>300xmax>
<ymax>400ymax>
bndbox>
object>
<object>
<name>trashname>
<bndbox>
<xmin>700xmin>
<ymin>500ymin>
<xmax>800xmax>
<ymax>700ymax>
bndbox>
object>
annotation>
标注文件中各字段含义:
< filename > | 每张图像对应的文件名,格式为“xxx.jpg” |
---|---|
< size > | 存放图像尺寸信息,包括宽、高、通道数 |
< object > | 存放检测到的目标信息 |
< name > | 存放目标类别名称 |
< bndbox > | 存放目标的位置信息 |
< xmin > | 目标边界框左上角的横坐标 |
< ymin > | 目标边界框左上角的纵坐标 |
< xmax > | 目标边界框右下角的横坐标 |
< ymax > | 目标边界框右下角的纵坐标 |
训练环境准备,paddledet
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git -b develop
下载数据集(网盘后面给),并解压
!unzip -oq ~/data/train.zip -d ~/PaddleDetection/dataset/voc
!unzip -oq ~/data/val.zip -d ~/PaddleDetection/dataset/voc
将标注和图片分开
%cd ~/PaddleDetection/dataset/voc
!mkdir JPEGImages Annotations
!cp -r train/*.xml Annotations
!cp -r train/*.jpg JPEGImages
划分数据集
import random
import os
#生成trainval.txt和val.txt
random.seed(2020)
xml_dir = '/home/aistudio/PaddleDetection/dataset/voc/Annotations'#标签文件地址
img_dir = '/home/aistudio/PaddleDetection/dataset/voc/JPEGImages'#图像文件地址
path_list = list()
for img in os.listdir(img_dir):
img_path = os.path.join(img_dir,img)
xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))
path_list.append((img_path, xml_path))
random.shuffle(path_list)
ratio = 0.9
train_f = open('/home/aistudio/PaddleDetection/dataset/voc/trainval.txt','w') #生成训练文件
val_f = open('/home/aistudio/PaddleDetection/dataset/voc/val.txt' ,'w')#生成验证文件
for i ,content in enumerate(path_list):
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 = ['nest', 'kite', 'balloon', 'trash']#设置你想检测的类别
with open('/home/aistudio/PaddleDetection/dataset/voc/label_list.txt', 'w') as f:
for text in label:
f.write(text+'\n')
VOC2COCO,若需要COCO数据集格式,可以运行以下命令进行转换,将数据集的属性改动一下,符合提交要求
import os
import os.path
import xml.dom.minidom
path = r'/home/aistudio/PaddleDetection/dataset/voc/Annotations'
files = os.listdir(path) # 得到文件夹下所有文件名称
s = []
count = 0
for xmlFile in files: # 遍历文件夹
if not os.path.isdir(xmlFile): # 判断是否是文件夹,不是文件夹才打开
name1 = xmlFile.split('.')[0]
dom = xml.dom.minidom.parse(path + '/' + xmlFile)
root = dom.documentElement
newfolder = root.getElementsByTagName('folder')
newpath = root.getElementsByTagName('path')
newfilename = root.getElementsByTagName('filename')
newfilename[0].firstChild.data = name1 + '.jpg'
with open(os.path.join(path, xmlFile), 'w') as fh:
dom.writexml(fh)
print('写入成功')
count = count + 1
将训练集转化为coco格式
%cd ~/PaddleDetection
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir dataset/voc/Annotations/ \
--voc_anno_list dataset/voc/trainval.txt \
--voc_label_list dataset/voc/label_list.txt \
--voc_out_name dataset/voc/train.json
将验证集转化为coco格式
%cd ~/PaddleDetection
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir dataset/voc/Annotations/ \
--voc_anno_list dataset/voc/val.txt \
--voc_label_list dataset/voc/label_list.txt \
--voc_out_name dataset/voc/val.json
数据查看与分析,在切图前,我们首先需要统计所用数据集标注框的平均宽高占图片真实宽高的比例分布(百度ai智能云中台也有分析数据的功能):
–json_path :待统计数据集COCO 格式 annotation 的json文件路径
–out_img :输出的统计分布图路径
!pip install -U pycocotools
!python tools/box_distribution.py \
--json_path dataset/voc/train.json \
--out_img /home/aistudio/PaddleDetection/dataset/voc/box_distribution.jpg
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
100%|██████████████████████████████████████| 727/727 [00:00<00:00, 52393.67it/s]
Suggested reg_range[1] is 17
Mean of all img_w is 2833.7
Mean of all img_h is 2021.8319444444444
Median of ratio_w is 0.2755
Median of ratio_h is 0.3138888888888889
all_img with box: 720
all_ann: 727
Distribution saved as /home/aistudio/PaddleDetection/dataset/voc/box_distribution.jpg
Figure(640x480)
基于SAHI切图,针对需要切图的数据集,使用SAHI库进行切分:
–image_dir:原始数据集图片文件夹的路径
–json_path:原始数据集COCO格式的json标注文件的路径
–output_dir:切分后的子图及其json标注文件保存的路径
–slice_size:切分以后子图的边长尺度大小(默认切图后为正方形)
–overlap_ratio:切分时的子图之间的重叠率
以上述代码为例,切分后的子图文件夹与json标注文件共同保存在MyDataset/IMG_sliced文件夹下,比如训练集图片和标注就命名为train_images_640_025、train_images_640_025.json
!mkdir dataset/voc/IMG_sliced
!pip install -U scikit-image imagecodecs
对训练集标注进行切图
!python tools/slice_image.py \
--image_dir /home/aistudio/PaddleDetection/dataset/voc/JPEGImages \
--json_path /home/aistudio/PaddleDetection/dataset/voc/train.json \
--output_dir /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced \
--slice_size 640 \
--overlap_ratio 0.25
对验证集标注进行切图
!python tools/slice_image.py \
--image_dir /home/aistudio/PaddleDetection/dataset/voc/JPEGImages \
--json_path /home/aistudio/PaddleDetection/dataset/voc/val.json \
--output_dir /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced \
--slice_size 640 \
--overlap_ratio 0.25
模型训练,由于图像尺寸较大,且训练模型时,读取图像和预处理时耗时较长,因此我们选择拼图模型进行训练。
原图模型训练:PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比, 其精度速度可以在模型库中找到。
拼图模型选型,PaddleDetection团队提供的基于PP-YOLOE的检测模型,以及提供了一套使用SAHI(Slicing Aided Hyper Inference)工具切图和拼图的方案,其效果如下:
模型 | 数据集 | SLICE_SIZE | OVERLAP_RATIO | 类别数 | mAP 0.5:0.95 | AP 0.5 |
---|---|---|---|---|---|---|
PP-YOLOE-l | VisDrone-DET | 640 | 0.25 | 10 | 29.7 | 48.5 |
PP-YOLOE-l (Assembled) | VisDrone-DET | 640 | 0.25 | 10 | 37.2 | 59.4 |
Assembled表示自动切图和拼图后模型的表现,从中我们可以看出,mAP较原图预测有了非常显著的提升,因此,接下来就基于PP-YOLOE-l,看看自动切图和拼图后模型在这个比赛检测数据集上的表现。
切图后模型的训练是要基于切图数据集的,配置如下:
metric: COCO
num_classes: 4
TrainDataset:
!COCODataSet
image_dir: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced/train_images_640_025
anno_path: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced/train_640_025.json
dataset_dir: /home/aistudio/PaddleDetection/dataset/voc
data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
EvalDataset:
!COCODataSet
image_dir: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced/val_images_640_025
anno_path: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced/val_640_025.json
dataset_dir: /home/aistudio/PaddleDetection/dataset/voc
TestDataset:
!ImageFolder
anno_path: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced/val_640_025.json
dataset_dir: /home/aistudio/PaddleDetection/dataset/voc/IMG_sliced
执行训练
!python tools/train.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
--use_vdl=True \
--vdl_log_dir=./log --eval
模型评估,切图模型的效果进行一下评估。
对于子图评估和原图评估,差别仅仅在于验证集路径的配置:
子图评估:配置切图后的子图存放目录和子图验证集标注文件
%cd ~/PaddleDetection
!python tools/eval.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams
原图评估:配置原图存放目录和验证集标注文件
!python tools/eval.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams
子图拼图评估,执行命令时,需要关注下面这些参数的设置:
设置–combine_method表示子图结果重组去重的方式,默认是nms;
设置–match_threshold表示子图结果重组去重的阈值,默认是0.6;
设置–match_metric表示子图结果重组去重的度量标准,默认是ios表示交小比(两个框交集面积除以更小框的面积),也可以选择交并比iou(两个框交集面积除以并集面积),精度效果因数据集而而异,但选择ios预测速度会更快一点。在本项目中,我们把交小比和交并比两种方式都试验一番:
训练80个epoch后,子图拼图评估,交小比
!python tools/eval.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda_slice_infer.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams \
--slice_infer \
--combine_method=nms \
--match_threshold=0.6 \
--match_metric=ios
训练80个epoch后,子图拼图评估,交并比
!python tools/eval.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda_slice_infer.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams \
--slice_infer \
--combine_method=nms \
--match_threshold=0.6 \
--match_metric=iou
评估结论:将80个epoch后,切图训练子图评估、切图训练原图评估、切图训练子图拼图评估的效果进行了对比,结果如下:
训练评估方式 | SLICE_SIZE | OVERLAP_RATIO | mAP0.5:0.95 | AP0.5 |
---|---|---|---|---|
子图训练子图评估 | 640 | 0.25 | 78.0 | 94.8 |
子图训练原图评估 | 640 | 0.25 | 69.3 | 81.5 |
子图训练拼图评估-IoS | 640 | 0.25 | 47.6 | 66.8 |
子图训练拼图评估-IoU | 640 | 0.25 | 47.1 | 71.1 |
从上面的简单表格可以明显看出,相比原图直接训练,子图训练拼图评估精度提升明显。同时,子图结果重组去重的度量标准用交并比在该数据集上表现更好,猜测可能是因为,数据集的目标大小差异较大,对于中大型目标,去重标准如果用交小比,在评估效果上,会比较吃亏。
模型预测
挑一张测试集的图片展示预测效果
!python tools/infer.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams \
--infer_img=/home/aistudio/paddledetection/dataset/voc/val/i1wJLsAZbpvD3mNWeK8Hfl7xrPC9cMqT02So4YyF.jpg \
--draw_threshold=0.4 \
# --slice_infer \
# --slice_size 640 640 \
# --overlap_ratio 0.25 0.25 \
# --combine_method=nms \
# --match_threshold=0.6 \
# --match_metric=iou \
# --save_results=True
批量预测
!python tools/infer.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model.pdparams \
--infer_dir=/home/aistudio/paddledetection/dataset/voc/val \
--save_results=True
模型导出
%cd ~/PaddleDetection
!python tools/export_model.py \
-c eda/eda_model/ppyoloe_crn_l_80e_sliced_eda.yml \
--output_dir=./inference_model \
-o weights=output/ppyoloe_crn_l_80e_sliced_eda/best_model
结果文件生成,推理文件infer.py已做更新,可以直接运行以下代码,进行结果文件提交!
%cd ~/PaddleDetection
!rm -rf /home/aistudio/PaddleDetection/submit
!cp -r /home/aistudio/work/infer.py /home/aistudio/PaddleDetection/deploy/python/
!python deploy/python/infer.py \
--model_dir=inference_model/ppyoloe_crn_l_80e_sliced_eda \
--image_dir=/home/aistudio/PaddleDetection/dataset/voc/val \
--device=GPU \
--output_dir infer_output \
--save_results
!mkdir submit/
!mv infer_output/bbox.json submit/
提分技巧
针对本赛题的数据集特点,可以选用更不同尺度的图片切片大小,进行模型训练。
针对训练环境适当调整部分参数,以提升模型精度。
选择精度更高的目标检测模型或适当优化模型的部分结构。
notebook Magic关键字
Magic关键字是可以运行特殊的命令. Magic 命令的前面带有一个或两个百分号(% 或 %%), 分别代表行Magic命令
和Cell Magic命令
. 行Magic命令
仅应用于编写Magic命令时所在的行, 而Cell Magic命令
应用于整个Cell.
Magic关键字 | 含义 |
---|---|
%timeit | 测试单行语句的执行时间 |
%%timeit | 测试整个块中代码的执行时间 |
%matplotlib inline | 显示 matplotlib 包生成的图形 |
%run | 调用外部python脚本 |
%pdb | 调试程序 |
%pwd | 查看当前工作目录 |
%ls | 查看目录文件列表 |
%reset | 清除全部变量 |
%who | 查看所有全局变量的名称,若给定类型参数,只返回该类型的变量列表 |
%whos | 显示所有的全局变量名称、类型、值/信息 |
%xmode Plain | 设置为当异常发生时只展示简单的异常信息 |
%xmode Verbose | 设置为当异常发生时展示详细的异常信息 |
%debug | bug调试,输入quit退出调试 |
%bug | 调试,输入quit退出调试 |
%env | 列出全部环境变量 |