一、loss修复
具体原因我还没搞清楚,反正这个问题在自定义关键点时容易显现出来:左眼和左耳的预测点要么预测不到,要么偏到天上去。查阅资料发现很多人都遇到过这样的问题。如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/47c67d860f3a07f49f10828961ec1456.png)
综合了一些解决方案,修改了loss.py 的computeloss类的__call__函数中的内容:
kpt_loss_factor = (torch.sum(kpt_mask != 0) + torch.sum(kpt_mask == 0)) / (torch.sum(kpt_mask != 0) + 0.01) # v0.1
# kpt_loss_factor = (torch.sum(kpt_mask != 0) + torch.sum(kpt_mask == 0)) / torch.sum(kpt_mask != 0) 尝试修复关键点飘的问题 v0.0
lkpt += kpt_loss_factor * (((1 - torch.exp(-d / (2 * (s * sigmas) ** 2 + 1e-9))) + 0.05 * d) * kpt_mask).mean() # v0.1
# lkpt += kpt_loss_factor * ((1 - torch.exp(-d / (s * (4 * sigmas ** 2) + 1e-9))) * kpt_mask).mean() 尝试修复关键点飘的问题 v0.0
修改前后的loss对比:
![](https://i-blog.csdnimg.cn/blog_migrate/63cdb5823b3b35e4122fe2ece5ca6dc0.png)
总体loss也得到了明显下降:
![](https://i-blog.csdnimg.cn/blog_migrate/386d8080db6940011f9b4a6f8d0cea53.png)
二、半自动标注自定义数据集
关键点标注相对目标检测标注工作量大得多。我先尝试了labelme,发现并不好用:每个人的边界框与关键点信息并没有直接的关联;每标一个关键点就要选择一次标签名,效率极低。
查阅资料后发现coco-annotator可以直接标注coco格式的标签。可以为类person分别标注边界框和关键点,这就把每个人及其关键点捆绑到了一起。虽然官方说支持半监督标注,但并没有给出demo,也没有明确给出前端需要接收的json格式。最难受的是官方代码是用docker运行的,没办法调试。
于是我又查询了大量资料,也研究了下前端源码,终于实现了用yolopose实现半监督标注功能。详细文档在我的github上,欢迎各位使用,也希望各位能给个star,毕竟这个我搞了一天。
master686/Semi-supervised-keypoint-annotation-server-for-COCO-Annotator-with-YOLOPose- (github.com)