entrenamiento de modelo de punto clave de posición central

centerpose pertenece al algoritmo up-down, primero detecta el marco y luego detecta el punto.

1. Anotación de datos

Para el etiquetado central, puede elegir un cuadro de etiqueta de forma de polígono, o puede elegir puntos de puntos de etiqueta de forma.

etiquetame->create_points/create_polygon

2. Limpieza y aumento de datos y conversión de formato de datos

2.1 Limpie la imagen correspondiente según json.

2.2 Hay errores en las etiquetas en los datos para el tamizaje. Es posible que algunas etiquetas estén mal escritas. Intente hacer un poco de limpieza y tamizaje.

2.3 Gire el conjunto de datos expandido, gire la imagen original y el archivo json de coordenadas, gire 180 grados, 90 grados en el sentido de las agujas del reloj y 90 grados en el sentido contrario a las agujas del reloj.

2.4 Resuma los datos ampliados y convierta la etiqueta de formato json etiquetada por labelme en txt. Este proceso de conversión se puede convertir de acuerdo con las necesidades reales. El txt generado en este proceso se puede usar para entrenar el algoritmo de la serie yolo.

2.5 Convierta los datos en formato txt al formato json de coco, y divida los datos de muestra positivos y negativos. Cabe señalar que la detección de posición central generalmente genera 6 ramas, y las primeras cuatro ramas están relacionadas con el sujeto objetivo. Es decir digamos, el cuadro bbox debe existir.Si usa labelme2coco, el bbox en este paso se puede generar directamente, pero si lo convierte manualmente a txt, necesita llenar el bbox, solo llénelo con los cuatro puntos detectados.

2.6 Visualización de datos, utilizando pycocotools para analizar y visualizar datos, analizar puntos clave y diagramas de máscara correspondientes.

3. entrenamiento del modelo de posición central

El núcleo es el modelo de red central y la estructura del código incluye dos partes: red y utilidades.

3.1 configuración de parámetros opt

opt.task=ctdet/ddd/multi_pose/exdet,(ExtremeNet detection,目标检测)
opt.dataset= 这个参数配置没有太大意义

# 3head都是false
opt.reg_offset=false
opt.hm_hp=false
opt.reg_hp_offset=false

opt=opts().update_dataset_info_and_set_heads(opt,KEY_POINTS)

La tarea aquí se puede configurar por sí misma en opt, y la configuración del conjunto de datos parece no tener sentido, y básicamente se cambia en utils/dataset.

3.2 red estructura de red

1. compilación dcn

1.1 dcnv2:https://github.com/CharlesShang/DCNv2,torch==1.7.0 cu92,gcc5.4

ImportError: /home/imcs/.local/lib/python3.6/site-packages/DCNv2-0.1-py3.6-linux-x86_64.egg/_ext.cpython-36m-x86_64-linux-gnu.so: símbolo indefinido : TPHVariableClass?

1.2 dcnv2_latest: https://github.com/jinfagang/DCNv2_latest,torch==1.7.0 cu92,gcc5.4

RuntimeError: Backward no es reentrante, es decir, ejecutar hacia atrás con la misma entrada y grad_output varias veces da valores diferentes, aunque el gradiente analítico coincide con el gradiente numérico. La tolerancia para el no determinismo fue 0.0.?

1.3 dcnv2_pytorch_19: https://github.com/lbin/DCNv2,torch==1.7.0 cu92,gcc5.4

1,4 mmcv:

DCNv2+pytorch1.7 y versión superior solución de error de compilación - saber casi

2. Estructura de red backbone+cuello+cabeza

2.1 columna vertebral

2,2 cuello

2.3 head, centerpose tiene 6 ramas de salida, centernet tiene 3 ramas de salida, esta última es hm, offset y wh,

6 cabezas, aquí hay un ejemplo de 17 puntos clave del esqueleto humano: [1, 2, 34, 2, 17, 2], correspondiente a hm, wh, hps, reg, hm_hp, hp_offset

hm: mapa de calor de punto clave de categoría, aquí hay 1,

wh: ancho y alto del objetivo, que es 2,

reg: el desplazamiento del objetivo, el desplazamiento proviene del error de precisión generado después de convertir float a int,

hps: el desplazamiento de los puntos clave de los huesos humanos, en relación con el punto central de los seres humanos, aquí es 34, es decir, 17 puntos, cada punto x, y desplazamiento,

hm_hp: mapa de calor de puntos clave del esqueleto humano,

hp_offset: el desplazamiento de los puntos clave de los huesos humanos, en relación con los puntos clave de los huesos humanos

De hecho, el diseño anterior es redundante. Primero, los primeros 4 parámetros predicen 17 puntos y el desplazamiento de 17 puntos en relación con el punto central. El parámetro 5/6 es equivalente a predecir otra ola de 17 puntos, pero esto es redundante. El diseño es significativo. En primer lugar, la quinta rama predice directamente puntos con mayor confianza, pero no se puede asociar con una persona. Esta asociación depende de la rama 4, porque las ramas 1, 2 y 3 definen Después de seleccionar una persona, la rama 4 puede estimar 17 puntos, y estos 17 puntos se pueden asociar con las ramas 5 y 6 de acuerdo con la distancia. De manera similar, para los puntos que no son predichos por las ramas 5 y 6, la rama 4 también se puede utilizar para la salida.

Por supuesto, como se muestra arriba, la predicción de puntos también se puede simplificar para predecir solo la estructura de 3 cabezas, como hm, wh, hps, [1, 2, 2, 34].

Serie de detección de objetos (trece) CenterNet: sin anclaje, sin NMS - Tencent Cloud Developer Community - Tencent Cloud

Notas de la red central | Kolo

2.4 obtener_modelo

get_model se configura a través de config, sin configuración, directamente escrito juntos

3 Carga de datos

La función de carga de datos está en utils/dataset, donde se configuran los parámetros ruta de datos y num_joints

4 Pruebas de modelo

model=dla_34_6head()->
img=cv2.imread()->
images,meta=pre_process(img,scale,opt_input_h=512,opt_input_w=512) 最长边等比放缩,
用透视变换来做->
= trans_input=get_affine_transform(c,s,0,[inp_with,inp_height])->
= resized_image=cv2.resize(image,(new_width,new_height))->
= inp_image=cv2.warpAffine(resized_image,trans_input,(inp_width,inp_height),
flags=cv2.INTER_LINEAR)->
= inp_image=((inp_image/255.-mean)/std).astype(np.float32)->
= images=inp_image.transpose(2,0,1).reshape(1,3,inp_height,inp_width)->
output,dets=process(model,images,top_k=5)->
= outputs=model(images)
= hm,wh,hps,reg,hm_hp,hp_offset=outputs->
= dets=multi_pose_decode(output['hm'](heat),output['wh'],output['hps'],
reg=reg,hm_hp=hm_hp,hp_offset=hp_offset,K=top_k)->
== num_joints=kps.shape[1]//2->
== heat=_nms(heat)->
=== pad=(kernel-1)//2->
=== hmax=nn.functional.max_pool2d(heat,(kernel,kernel),stride=1,padding=pad)->
=== keep=(hmax==heat).float() 只保存局部峰值 ->
=== heat*keep
== scores,inds,clses,ys,xs=_topk(heat,K)->
=== topk_scores,topk_inds=torch.topk(scores.view(batch,cat,-1),k)->
=== topk_inds/topk_xs/topk_ys=_gather_feat()->
== _tranpose_and_gather_feat(kps,inds)->
== kps=kps.view(batch,K,num_joints*2)->
== kps[...,::2]+=xs.view(batch,K,1).expand(batch,K,num_joints)->
== kps[...,1::2]+=ys.view(batch,K,1).expand(batch,K,num_joints)->
== reg=_tranpose_and_gather_feat(reg,inds)->
== reg=reg.view(batch,K,2)->
== wh=_transpose_and_gather_feat(wh,inds)->
== wh=wh.view(batch,K,2)->
== clses=clses.view(batch,K,1)->
== scores=scores.view(batch,K,1)->
== bbox=torch.cat([])->
== hm_hp=_nms(hm_hp)->
== kps=kps.view(batch,K,num_joints,2).permute(0,2,1,3).contiguous()->
== hm_score,hm_inds,hm_ys,hm_xs=_topk_channel(hm_hp,K)->
== ...->
== detections=torch.cat([bboxes,scores,kps,clses],dim=2)->
dets=post_process(dets,meta,scale)->
= dets=multi_pose_post_process(dets,[meta['c']],[meta['s']],
meta['out_height'],meta['out_width'])->
== bbox=transform_preds(dets[i,:,:4].reshape(-1,2),c[i],s[i],(w,h))->
== pts=transform_preds(dets[i,:,5:13].reshape(-1,2),c[i],s[i],(w,h))->
= dets->
results=merge_outputs(dets,opt_nms)->
vis_thresh=0.3->
draw_img=draw_image(img,bbox,class_names)->
warped=four_point_transform(img,pts)

Supongo que te gusta

Origin blog.csdn.net/u012193416/article/details/129922646
Recomendado
Clasificación