TypeError: Argument ‘bb’ has incorrect type (expected numpy.ndarray, got list)

问题说明

这个问题是在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)

测试正常。

猜你喜欢

转载自blog.csdn.net/onepunch_k/article/details/123736907
今日推荐