问题说明
这个问题是在mmdetect中使用使用自己做的coco数据集用maskrcnn做目标检测时遇到的,主要原因是你的json文件里面的segmentation中的数据不符合要求,正常来说这里面是类似于[x,y,x,y,x,y…x,y]按顺序排列的点序列,并且这里面的点序列个数是偶数,同时点的个数至少要超过2个(4个最稳),也就是要构面。而由于我在标注的时候使用的是矩形,仅有两个点(左上右下),因此会被误认为是bbox。百度查了一下有的说是版本问题。嫌太麻烦就没去试,索性直接对json文件进行更改,最终结果正常。
解决思路
考虑到矩形其实本身就是四个点,那么就在原有两个角点的基础上改为四个,横纵坐标就取决于原本的两个角点。而后由于我也不是很清楚maskrcnn中对shape_type有没有要求,我是吧triangle改成了polygon。然后顺便改了下标签,因为之前标注的时候太懒了,刚好对json进行处理,索性一步到位。代码如下:
# ------------ Kevin ------------#
import os
import json
def read_jsonfile(path):
with open(path, "r", encoding='utf-8') as f:
return json.load(f)
def save_coco_json(instance, save_path):
json.dump(instance, open(save_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
# 修正shapes参数
def revise_shapes(obj):
# 读取shapes
old_shapes = obj['shapes']
new_shapes = []
# 对shapes进行修改
for i in range(len(old_shapes)):
shape = old_shapes[i]
# 获取每个shape
# 更改标签
if shape['label'] == '1':
shape['label'] = 'L_4'
if shape['label'] == '2':
shape['label'] = 'L_3'
if shape['label'] == '3':
shape['label'] = 'L_2'
if shape['label'] == '4':
shape['label'] = 'L_1'
if shape['label'] == '5':
shape['label'] = 'WZ'
# 更改shape_type
shape['shape_type'] = 'polygon'
### 修改mask区域的点坐标
# 获取旧的点坐标
points = shape['points']
point1 = points[0]
point2 = points[1]
# 将2点变为4点
point_1 = [point1[0], point1[1]]
point_2 = [point2[0], point1[1]]
point_3 = [point2[0], point2[1]]
point_4 = [point1[0], point2[1]]
## 针对线改4点,考虑到标注的如果是线的话,也是两个点,所以就一起写了
# point_1 = [point1[0], point1[1]]
# point_2 = [point1[0] + 1, point1[1]]
# point_3 = [point1[0] + 2, point1[1]]
# point_4 = [point2[0], point2[1]]
# 将新的点坐标填入points
shape['points'] = [point_1, point_2, point_3, point_4]
new_shapes.append(shape)
# 用新的shapes代替
obj['shapes'] = new_shapes
return obj
if __name__ == '__main__':
# 待修改的json文件目录
json_dir = r'F:\mywork\Semantic-Segmentation-master\tools\test_data'
# 修改后文件的保存路径
new_dir = r'F:\mywork\Semantic-Segmentation-master\tools\new_data'
# 如果没有则新建一个
if not os.path.exists(new_dir):
os.makedirs(new_dir)
# 读取json目录里的文件
json_files = os.listdir(json_dir)
for file in json_files:
# 获取json文件路径
json_path = os.path.join(json_dir, file)
# 读取json文件
obj = read_jsonfile(json_path)
# 修改json文件,将矩形的2点表达形式变为4点表达形式
new_obj = revise_shapes(obj)
# 新的json文件路径
new_json = os.path.join(new_dir, file)
# 保存新的json文件
save_coco_json(new_obj,new_json)
测试正常。