planteamiento del problema
Este problema se encuentra al usar el conjunto de datos de coco creado por usted mismo en mmdetect y maskrcnn para la detección de objetivos. La razón principal es que los datos en la segmentación en su archivo json no cumplen con los requisitos. Normalmente, es similar a [x, y, x, y, x, y...x, y] es una secuencia de puntos dispuesta en orden, y el número de secuencias de puntos dentro es par, y el número de puntos debe ser al menos 2 (4 es el más estable ), es decir, a facetar. Y debido a que usé un rectángulo al etiquetar, solo hay dos puntos (superior izquierdo e inferior derecho), por lo que se confundirá con bbox. Baidu verificó y algunos dijeron que era un problema de versión. No lo probé porque era demasiado problemático, simplemente cambié el archivo json directamente y el resultado final fue normal.
Soluciones
Teniendo en cuenta que el rectángulo en sí tiene cuatro puntos, los dos puntos de las esquinas originales se cambian a cuatro, y las coordenadas horizontal y vertical dependen de los dos puntos de las esquinas originales. Luego, como no tengo muy claro si existe un requisito para shape_type en maskrcnn, cambié el triángulo por el polígono. Luego, por cierto, cambié la etiqueta, porque era demasiado perezoso cuando la marqué antes, y solo procesé el json, por lo que se hizo en un solo paso. el código se muestra a continuación:
# ------------ 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)
La prueba está bien.