1.baseline选择
因为刚接触two-stage表示方法以及实例分割算法,而且正好ODAI项目是个目标检测任务,所以就使用maskRCNN作为baseline。初步思路是将DOTA数据集转化为coco数据集的格式,扔入MaskRCNN中训练,感觉是一个很简单的过程,但是实际上在实践中就遇到了很多问题。
2.数据集格式转化问题
第一步是要把DOTA数据集的格式转化为MaskRCNN能识别的coco数据集格式。下面先看DOTA数据集里的格式示例
主要分为5种类型的数据:
1.imagesource 图片来源
2.gsd 相当于比例尺
3.8个坐标值 表示boundingbox(不使用x,y,w,h表示的原因是这个数据集里的bbox可能是斜的)
4.category 16个分类中的一个
5.Difficulty 是否难以识别
转数据集格式:
{
# coco数据集格式
"info": info, # 可省略
"licenses": [license], # 可省略
"images": [image], # 有前三个就够了,后面置空字符串
#image列表,每个image有file_name,height,width,license,coco_url,date_captured,flickr_urlid
"annotations": [annotation], # 都需要转换
#annotation列表,每个annotation有id,image id,category id,segmentation,area,bbox,iscrowd
"categories": [category] # supercategory可以置空字符串
#categories列表,每个category有id,name,supercategory
}
- 因为ODAI中只有bbox(还是倾斜的),并没有segmentation的概念,所以我干脆将DOTA-bbox扩展为coco-bbox和coco-segmentation两个概念,想法很简单,就是将原始的DOTA-bbox直接看作coco-segmentation,用一个横平竖直的框套住DOTA-bbox作为coco-bbox。category就用一个字典。键值是它的标号,作为coco-category id
- coco-segmentation有两种格式,我搞了半天才弄懂。
[polygen] iscrowd为0时的格式,每个点用xy坐标表示,相当于用好多点把一个segmentation从图上划分出来了
[RLE] iscrowd为1时的格式,相当于把图片看作一副同样大小的,用0/1表示的坐标矩阵,为1时就是此处有segmentation,就是在图上作掩码。把这个01矩阵展开成一维,按计数的方法表示为RLE格式
eg: [0,0,0,1,0,0,1,1]->[3个0,1个1,2个0,2个1]->[3,0,1,1,2,0,2,1](好像是这样,我最终没采用这个方法测试) - iscrowd有两种格式,我也搞了半天才弄懂
iscrowd=1 表示这个segmentation里面有不止一个目标物体 但是分不开(俩人如胶似漆的抱在一起)
iscrowd=0 表示这个segmentation里面就一个目标物体(一只单身狗)
(好像就这么简单。。我咋看了那么久才理解呢。。。)
文末贴出转格式的代码,结构混乱。。求轻喷。。
3.把数据集扔到MaskRCNN里训练
我记得只需要改几个小地方就能运行了:
- 自己的数据集目录