我的AI之路(53)--超高清图像识别

38 篇文章 13 订阅

       首先这里说的超高清图像的识别问题不是超分辨率(super-resolution)问题,超分辨率这个领域问题是指使用插值等手段把相对模糊的小图放大成高清大图且保持细节基本真实自然的问题,超高清图像的识别问题是指对本身是高清大图的图片做目标分类、检测、分割(下面我说到识别默认只指分类或检测,不含分割)等处理这类问题。

       顺带说一句,以便更好界定识别需求问题的范围:一般将分辨率为720p(1280x720像素)、1080p(1920×1080像素)叫高清(High Definition),而4K分辨率(3840×2160 像素)或以上的分辨率的叫超高清(Ultra High Definition)。

      对于大图,如果项目部署条件允许,当然尽量选择支持比较大的输入的模型,选择比较大的网络模型,比如efficientdet d7(或以上),最大支持1536x1536的输入(当然在嵌入式环境下,由于内存和GPU内存都非常有限,这么大的网络是跑不起来的,需要在服务器环境里跑),对于4K以下的图,只要不是目标太小,输入后缩放到1536x1536后仍然能较好地识别不会漏检也较少误检。对于再大的图片,一味的缩小后识别,效果肯定就不好了,分辨率越大就表现越差。 

      像卫星图像、医疗诊断图像、无人机高空拍的图像和一些专业摄像机拍的全景之类的图片一般可能都是至少4K以上的分辨率,对这些高清大图做目标检测,如果目标里有部分是小目标的话,直接输入模型,哪怕是选用efficientdet d7/d8这样的大网络模型,识别效果也会不好,图片分辨率越大漏检误检越多。所以,对这种超高清图片的识别,一般都采用切图识别,也就是说先把大图按一定的大小切成多张小图(切图时子图与子图之间保持一定的overlap),把各张小图分别让模型识别,然后把这些识别结果都做对应还原到原始大图上并使用NMS等手段对切图衔接处附近因切图带来的可能的多余的重叠的识别结果进行合并处理,基本上就是这样的思路来处理高清大图的识别。但是我们知道无论是NMS还是改良过的soft NMS,这些都是不完全可靠的过滤合并算法(例如,大小目标存在包含式重叠的小目标时nms就可能错误地把小目标过滤掉,另外soft-nms在过滤时只考虑了类别和分值之类的因素,却没有考虑bbox大小这样的特殊项目需要考虑的因素),最终得到的结果可能总是存在corner-case问题,需要自己想办法处理。

      前些时间,我负责某个项目的图像识别,就是特别大的超高清图片,最大的达到10K级别了,这么大的图片显然只能采取上面说的切图分片来识别然后合并识别结果,但是使用soft-nms过滤/合并bbox后得出的效果总是存在少量问题,例如有多个密集目标时,切图时恰好对这块区域做了切割后分别识别然后合并,在合并时就可以发生某些目标的bbox被错误地过滤掉了而导致漏检,或者一个大目标恰好被分切后,多个识别结果合并时,大的bbox反而被过滤掉了小的bbox反而被保留下来作为最终结果,这显然对识别效果大打折扣了,如何解决nms合并切分图片后不同切分子图的识别结果合并时存在的这些问题呢?有些头疼,一些已知算法都是不那么可靠的,改成其他算法也不能完全避免这些问题,首先想到把切分线经过的区域重新切分一定大小的区域再做识别,但是重新切分又会带来新的切分重叠区域的识别结果的合并不可靠的问题,做二次识别时怎么切分区域合适呢?

      近期我恰好开始弄一个机器学习方面的项目,把机器学习方面的算法又重新理了一下(说实话,那些各种算法看过后不经常应用的话容易忘记的,我觉得,平时搞深度学习这块的活的话,对机器学习的那些常用算法即使仔细琢磨细节到代码实现了,当时是明白了,如果项目中不常用,时间一久又交回给书了),K-Means聚类算法的思路让我眼前一亮,借鉴K-Means聚类的思路不就比较好嘛,也就是说,把第一遍切图后识别出来的结果的所有的bbox采用K-Means聚类算法将他们按其中心的欧氏距离(后来考虑了一下,考虑到目标检测的bbox都是横竖规整的矩形,输入图片也是矩形,那么改良一下,像计算中心之间的曼哈顿距离那样只计算x和y方向的距离和)的远近进行划分,以所选用的模型的网络支持的输入大小input_size的1倍或2倍或最大3倍为距离标准,最终划分为一个或多个cluster,然后以cluster为单位进行切图,切图的大小为同属一个cluster的bbox的外接矩形,这样解决了进行二次识别时的合理切分的问题。采用这样的处理后,最终的识别结果在精度和召回上自然比原来只做nms处理好,目前还没有发现新的corner-case问题。

     具体的代码由于是商业机密不便贴出来,简单总结一下处理思路:

    1.对高清大图按一定的尺寸和重叠比例进行切图,分割成多张子图,子图的大小与你选择的模型的输入尺寸相差不大,我的经验是,一般地,相差不要超过3倍。

    2.循环对每张子图调用模型进行识别,对结果做映射还原处理,也就是识别结果的bbox的坐标适配回原来的高清大图上,并记录全部结果。

    3.借鉴K-Means聚类算法思路,对全部bbox按一定的距离做分组划分。

    4.循环对每个分组做识别处理:以每个分组的所有bbox的外接包络矩形作为切分子图的大小进行切图,调用模型对切出的子图进行识别,记录识别结果。

    5.最后采用soft-NMS对上一步获得的全部bbox进行过滤合并,结果即原始高清大图的最终识别结果。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值