基于目标检测的狗品种识别及图像检索

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33858719/article/details/93189972

前言

代码已经在Github开源:BshoterJ ,也可以查看我朋友唐博士的:INFINITSY

demo:
在这里插入图片描述

简介

项目介绍

这个项目来自本科实验课设,当初的选题是显著性检测下的图像检索,类似于淘宝的拍立得那种功能。我们在狗年结束之际打算做一个“搜狗”的脚本,识别品种并将与之最相近的若干张图库中的图输出。不过既然不是直接提特征检索,那么我们可以选目标较多比较难分的数据集了。

实验需要

实验平台:ubuntu14.06 + Python3.6 + Pytorch0.4 + keras
数据集:来自Stanford Dogs Dataset
我们选取其中较常见的18种狗,由于每种狗只提供150-200张左右,我们分了训练集2533张,验证集629张,图库18类*25张。
在这里插入图片描述

方案

不过显著性算法之前没有接触过,网上找的别人的传统算法和开源的深度学习算法看起来也并不是很靠谱,于是干脆就只用目标检测来做,其实用于搜索的特征提取是整个框架的核心部分,目标检测权当是做一次data augmentation。检索也采用了最暴力的欧氏距离比较排名,现在用的哈希算法当时看源码感觉也有点迷,而且我们这边数据集不大,就弃了。
以下是我们的整体框架:
在这里插入图片描述

目标检测

从RCNN到YOLO、SSD以及现在很多新的或者集成的网络中,我们要求是快速较为精准,对比来看当然是YOLOv3啦。
在这里插入图片描述
加上斯坦福的狗数据集正好也被纳入了ImageNet,我们只需下载YOLO官方预训练好的权重,基本上所有狗都能框出来。
在这里插入图片描述
不过较为麻烦的一点是crop之后很多噪声也加了进来,当时我们只能在里面一张张的筛选…不过YOLOv3性能还是很好的,要剔除的也不是很多.

特征提取

我们先后使用了AlexNet、VGG16、ResNet等网络,到VGG时其实已经发现单纯叠加CNN层已经没用了,训练集准确率上不去,基本徘徊在60多,就是网络性能不够了,不过也没想到ResNet50直接就飙升到90多,这里就不详说网络结构了,网上资料很多。当时验证集准确率卡在90出头,心想在加深其实也可以但没必要,而且我早就想对数据集下手验证一下我的想法:狗品种之间最大的区分点应该在脸和身体部位,依靠毛色有时很难区分,像金毛和拉布拉多,二哈和阿拉斯加,这种都可以用狗脸识别,于是我不嫌麻烦的又做了一次数据扩充,对crop后的训练集进行random_crop,而且狗脸很重要!这样一张图可以分出个两张左右,嘿嘿我们这也并不算使用额外数据集吧。最后验证集上有提升了5个点左右(数据本来就少)。
在这里插入图片描述
在这里插入图片描述

检索设计

我们采用了暴力检索,将最后一层全连接的输出特征进行欧氏距离计算排名,GUI采用了Python的thinker库,实现的初始界面效果如下:
在这里插入图片描述

因为赶时间算法写的可能容错率较低,每次初始化一定要保证16个框图中有原始图片,电脑分辨率最好是1920x1080。
最后演示效果如下:
在这里插入图片描述
在这里插入图片描述

基本上大多数狗品种识别没问题,检索效果有点一言难尽,耗时基本在10s左右,不过大多数还是挺像的。主要问题是我们无法收集一只狗的多个场景下的图片,不然可以做成行人重检测的那种更加醒目的效果。

总结

这个项目做得十分“暴力”,直观来说就是端到端的问题,YOLO和ResNet我们都用的不同平台,加载的时间就耗费了不少,个人感觉可以用YOLO直接训练18种狗,输出分类结果和bbox,一举两得,毕竟YOLOv3有53层,也包含残差网络,虽说ImageNet里面所有狗都算作一类不好评判,但就数据类别来看对于狗类别的分类效果应该不会太差。另外就是特征提取部分,ResNet虽说效果已经够不错了,实际也可以使用MobileNet进一步减少耗时,kaggle上那些用Inception系列以及模型融合的个人感觉对于这个实际项目不适用。
总的来说就是toy model拿来玩玩的实验,没有什么好的借鉴点子,不过对于初学者来说也算是学习到一些基本运用和掉包功夫了。

猜你喜欢

转载自blog.csdn.net/qq_33858719/article/details/93189972