处理管线#
如上图所示,整个处理管线就是这样了,下面是每个步骤的详细描述
- 根据爬取到的sqlite数据库,对日榜图片进行过滤。这里主要是为了过滤掉大多数的黑白漫画,这类型漫画的一个明显特征就是同一id下的投稿图片会很多。所以,这一阶段可以根据一些Tag来进行粗略的过滤,如带有
x000user
字样的Tag就代表了该作品的收藏数大概有多少。这里的话,找到有0000user
字样的Tag(收藏至少为1万),就允许最多5张投稿,否则会被过滤掉。同理,若找到5000user
字样的Tag,则允许3张投稿,若有000user
(大于1000),则允许2张投稿,否则只允许1张投稿。其实也就几条sql语句和if语句的事情。 - 将剩下的图片从RGB转成HSV格式,对任何H、S、V通道下均值低于20的图片都进行过滤。这里是为了过滤掉混在其中的一些对比度太低,或者是单色的漫画图片。
- 将过滤后的图片扔去Faster R-CNN和CascadeClassifier进行bbox检测,得到两份识别结果,然后都把结果处理成统一的格式即可。我是直接用一个Dictionary存的,key是文件名,value是bbox的list。因为CascadeClassifier相比于Faster R-CNN而言是一个识别瓶颈,所以就顺势加上个限制条件——把宽高小于64的bbox过滤掉,避免裁剪缩放到128像素时太难看;并且将多于5个bbox的图片也过滤掉,避免一些表情包之类的图片出现在里面,造成同一张脸重复或相似地多次出现。
- 对两个结果求交集,即求文件名的交集。这一步就只留下了两边都检测到bbox的文件名和对应的两个识别结果下的bbox了
- 对两个结果的bbox求重叠的IoU比,然后将那些明显不重叠的bbox去掉,这里取的IoU比是0.7,比值高的话要求重叠部分面积占比更大。由于CascadeClassifier的结果是瓶颈,所以直接过滤CascadeClassifier的结果就好了,不必对Faster R-CNN的结果再做修改。
- 最后,根据上一步的IoU比进行Faster R-CNN和CascadeClassifier的结果之间的一对一映射,这是一个典型的稳定匹配问题,简单来说就是OJ算法题中的稳定婚姻问题了。这一步可以将潜在的重复bbox给过滤掉,不这么做的话,其实也可以将CascadeClassifier的bbox求两两间的IoU比,把明显有重叠的bbox过滤也是可行的。
- 最后,按照剩下的幸存bbox,进行裁剪缩放然后再次进行2.中的HSV过滤,没被过滤掉就保存。
结果就是上篇中的最后图片了,得到的大部分都是高质量的插画图片了。
相关代码#
OpenCV的GPU CascadeClassifier识别代码,多线程版本#
代码见此(c++)
使用VS编译,OpenCV兼容3.4.x,不兼容4.x(因为4.x移除了GPU部分代码),记得修改项目相关的OpenCV路径就好了。要求运行的OpenCV库编译时有选中WITH_CUDA
。
默认把lbpcascade_animeface.xml放在D:\
下,可以自己更改。
Faster R-CNN识别代码#
代码见此(python,tensorflow GPU框架)
处理管线的代码#
代码见此(python)
改main下的两个load_xxxx_result
的路径,以及裁剪输出里面的out_dir
和imread
里面的前置路径。