1.Two-Stage: Faster R-CNN
1)通过专门模块去生成候选框(RPN),寻找前景以及调整边界框(基于anchors)
2)基于之前生成的候选框进行进一步分类以及调整边界框(基于proposals)
2.One-Stage: SSD,YOLO
基于anchors直接进行分类以及调整边界框
One-Stage,Two-Stage对比: One-Stage检测速度更快,Two-Stage检测准确度更高
up视频详见https://www.bilibili.com/video/BV1KE411E7Ch?spm_id_from=333.999.0.0
在使用时有Object80类和stuff91类,Object80类是stuff91类的子集,一般目标检测只需要用到Object80类,具体看使用场景。
相对于PASCAL VOC 预训练效果更好,但耗时更多。
Coco数据集官网:http://cocodataset.org/
网盘地址:链接:https://pan.baidu.com/s/1_kQBJxB019cXpzfqNz7ANA 提取码:m6s5
bilibili up讲解视频:https://www.bilibili.com/video/BV1TK4y1o78H?spm_id_from=333.999.0.0
推荐博文链接: https://blog.csdn.net/qq_37541097/article/details/112248194
github链接:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
更多详解可看官网文档:http://cocodataset.org/#format-data
Ps:自己的数据划分测试集是没有意义的,因为数据分布基本一致
import json
# 查看json文件的数据结构
json_path = "G:/coco2017/annotations/instances_val2017.json"
json_labels = json.load(open(json_path,"r"))
print(json_labels)
# >>>json_label
# |-info:描述文件信息
# |-licenses:无影响信息
# |-image:5000个元素对应5000张图片,包含图片信息
# |-annotations:3w+元素对应3w+目标
# | |-segmentation:分割信息
# | |-area:面积
# | |-iscrowed:是否重叠,一般只选为0的训练
# | |-image_id:图片id
# | |-bbox:标记框信息(左上坐标,长宽)
# | |_category_id:类别名称
# |_categories:80个元素对应80个类
# PS:categories中id不连续,训练时需注意。
# 关于coco官方的工具pycocotools的安装
# liunx:pip install pycocotools
# windows:pip install pycocotools-windows
import os
from pycocotools.coco import COCO
from PIL import Image,ImageDraw
import matplotlib.pyplot as plt
json_path = "G:/coco2017/annotations/instances_val2017.json"
img_path = "G:/coco2017/val2017"
# 导入coco数据
coco = COCO(annotation_file=json_path)
# 得到所有图片的索引
ids = list(sorted(coco.imgs.keys()))
print("number of image:%d"%len(ids))
# 得到所有的coco分类标签
coco_classes = dict([(v["id"], v["name"]) for k,v in coco.cats.items()])
# 遍历前三张图片
for img_id in ids[:3]:
# 获取对应图像id的所有annotations ids信息
ann_ids = coco.getAnnIds(img_id)
# 根据annotations idx信息获取所有标注信息
targets = coco.loadAnns(ann_ids)
# 获取图像文件的名称
path = coco.loadImgs(img_id)[0]["file_name"]
# 根据路径读取图片,转换为RGB格式
img = Image.open(os.path.join(img_path,path)).convert('RGB')
# 绘制图片
draw = ImageDraw.Draw(img)
# 绘制目标框
for target in targets:
x,y,w,h = target["bbox"] # 提取目标框信息
x1,y1,x2,y2 = x,y,int(x+w),int(y+h) # 计算坐标
draw.rectangle((x1,y1,x2,y2)) # 绘制目标框
draw.text((x1,y1),coco_classes[target["category_id"]]) # 绘制类名称
# 显示图片
plt.imshow(img)
plt.show()
# coco中目标检测结果的文件形式
'''
[{
"image_id" :int, # 记录该目标所属图像的id
"category_id" :int, # 记录预测该目标的类别索引
"bbox" :[x,y,w,h] # 记录预测该目标的边界框信息
"score" :float # 记录预测该目标的概率
}]
'''
# 训练的结果输出保存为json形式,与验证集上的结果进行比较
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
# 载入验证集的标注文件
coco_ture = COCO(annotation_file="./val_2017.json")
# 载入网络在coco2017验证集上的预测结果
coco_pre = coco_ture.loadRes('./predict_results.json')
# 输出预测的效果,指标mAP,具体看第5小节
coco_evaluator = COCOeval(cocoGt=coco_ture, cocoDt=coco_pre, iouType="bbox")
coco_evaluator.evaluate()
coco_evaluator.accumulate()
coco_evaluator.summarize()
LabelImg生成的有xml文件与VOC2012一致
Labelme不只是能够标注目标检测的样本,也可进行语义分割等其他样本标注。
pip install labelImg
labelImg
打开软件TP(True Positive):IOU>0.5的检测框的数量(同一Ground Truth只计算一次)。
FP(Flase Positive):IOU<=0.5的检测框(或是检测到同一Ground Truth的多余检测框)的数量。
FN(False Negative):没有检测到的Ground Truth的数量。
Precision(查准率):TP/(TP+FP) 模型预测的所有目标中,预测正确的比例。
Recall(查全率):TP/(TP+FN) 所有真实目标中,模型预测正确的目标比例。
AP(Average Precision): P-R(Precision-Recall)曲线下面积。
mAP(mean Average Precision):即各类别AP的平均值