专栏首页机器学习之旅python开发:基于SSD下的图像内容识别(一)1.首先,先看一下我们能达到什么样的效果:2.我们需要做哪些基本的步骤:

python开发:基于SSD下的图像内容识别(一)1.首先,先看一下我们能达到什么样的效果:2.我们需要做哪些基本的步骤:

鸽了将近有一个月的时间没有更新东西,真的不是因为我懒,主要在忙一些工作上的事情,然后就是被安装caffe环境折磨的死去活来。我本来用的上mba来搭caffe环境的,一直在报一个框架问题,索性一怒之下换了mbp,下面就将我在SSD学习过程中遇到的问题和大家一起分享一下。

1.首先,先看一下我们能达到什么样的效果:

比如,这样的:

再比如这样的:

甚至还可以这样: https://v.qq.com/x/page/a0567wd27jz.html https://v.qq.com/x/page/j05679xhryx.html 这边吐槽一下,简书makedown不支持上传视频,简直差评!

那问题来了,在真实的业务场景中,我们有哪些应用呢? 比如天猫的拍照购:

有货的相似推荐:

这些都是非常优秀的应用场景。

2.我们需要做哪些基本的步骤:

2.1抠出图片中关键的人或者物

如果只需要抠出图片中的核心信息的话,其实只需要加载python里面的selectivesearch包就可以(这里多说一句,建议都是使用conda安装所有包和库,不然你会后悔的)。 我们先来看下效果:

这个是怎么实现的呢?

import  cv2
import selectivesearch
import matplotlib.pyplot as  plt
import matplotlib.patches as  mpatches
import  numpy as  np
img = cv2.imread('/Users/slade/Documents/Yoho/picture_recognize/heshen.jpg')

#图片识别分割
img_lbl, regions =selectivesearch.selective_search(
    img, scale=500, sigma=0.9, min_size=20)

#这边的regions里面就有一个个划分出来的box
regions[0]
#Out[3]: {'labels': [0.0], 'rect': (0, 0, 619, 620), 'size': 177325},其中‘rect’定位了box的位置,‘size’确定了box的大小

# 接下来我们把窗口和图像打印出来,对它有个直观认识
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(img)

for reg in regions:
    x, y, w, h = reg['rect']
    rect = mpatches.Rectangle(
        (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
    ax.add_patch(rect)
plt.show()

搜索完成后展示图:

很明显,这里面的方框太多了,所以我们需要把一些过小的,过大的,不规则的全部去掉:

candidates = []
for r in regions:
    # 重复的不要
    if r['rect'] in candidates:
        continue
    # 太小和太大的不要
    if r['size'] < 200 or r['size']>20000:
        continue

    x, y, w, h = r['rect']
    # 太不方的不要
    if w / h > 1.8 or h / w > 1.8:
        continue
    candidates.append((x,y,w,h))

#剔除大box内的小box
candidates_sec = []
for  i  in  candidates:
    if len(candidates_sec)==0:
        candidates_sec.append(i)
    else:
        Flag=False
        replace=-1
        index=0
        for j  in candidates_sec:
            ##新box在小圈 则删除
            if i[0]>=j[0] and i[0]+i[2]<=j[0]+j[2]  and i[1]>=j[1] and i[1]+i[3]<=j[1]+j[3]: 
                Flag=True
                break
            ##新box不在小圈 而在老box外部 替换老box
            elif i[0]<=j[0] and i[0]+i[2]>=j[0]+j[2] and i[1]<=j[1] and i[1]+i[3]>=j[1]+j[3]: 
                replace=index
                break
            index+=1

        if not Flag:
            if replace>=0:
                candidates_sec[replace]=i
            else:
                candidates_sec.append(i)

然后我们看看更新完后的图片效果:

fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(img)
for x, y, w, h in candidates_sec:
    rect = mpatches.Rectangle(
        (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
    ax.add_patch(rect)
plt.show()

在根据重复优化一下,就可以得到最初的那张图片,基本上来说,就可以完成抠图这个事情了。

2.2相关理论概述:

上面这样的识别从数学角度上是怎么样实现的呢? 这边先引入一篇文章:2014年CVPR上的经典paper:《Rich feature hierarchies for Accurate Object Detection and Segmentation》,这篇文章的算法思想又被称之为:R-CNN(Regions with Convolutional Neural Network Features),是物体检测领域曾经获得state-of-art精度的经典文献。 论文较为复杂冗长,我这边主要先看一下我们关系的抠图模块:

2.2.1 抠若干个box过程:

先切分图片到若干子区域的集合S 1.在计算集合S中找出相似性最大的区域max_similarity{ri,rj} 2.合并S_new=ri∪rj 3.从S集合中,移走所有与ri,rj的子集 4.将新集合S_new与相邻区域的相似度 5.repeat step2 直到S集合为空 这边相似度的计算考虑了三个方面:颜色相似,纹理相似,空间交错相似,分别解释如下: 颜色相似:

其中对每个区域,我们都可以得到一个一维的颜色分布直方图:

假设两个直方图波峰和波谷高度重合,那么计算下来的值比较大;反之如果波峰和波谷错开的,那么累加的值一定比较小。

纹理相似: 这边会用到SIFI算法,也是一个比较经典的算法。 selectivesearch论文采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。(这个我也没有仔细去看,只是skip learn了一下)

空间相似: 这个最简单,代码呈现了:

def sim_fill(r1, r2, imsize):
    """
        calculate the fill_similarity over the image
    """
    bbsize = (
        (max(r1["max_x"], r2["max_x"]) - min(r1["min_x"], r2["min_x"]))
        * (max(r1["max_y"], r2["max_y"]) - min(r1["min_y"], r2["min_y"]))
    )
    return 1.0 - (bbsize - r1["size"] - r2["size"]) / imsize

2.2.2 若干个box筛选的过程:

首先,我们定义:IOU为两个bounding box的重叠度,如下图所示:

矩形框A、B的一个重合度IOU计算公式为: IOU=(A∩B)/(A∪B) 就是矩形框A、B的重叠面积占A、B并集的面积比例: IOU=SI/(SA+SB-SI)

再引入非极大值抑制(NMS)概念:抑制不是极大值的元素,搜索局部的极大值。 翻译一下就是:比如之前看的这张图片:

很明显还是很多box是相互inner的,虽然没有被相互包含进去,我们可以先选择最大的box,看其他box与这个最大的box的IOU值,删除IOU值大于预先设定的阈值的box,重复这个过程就是一个方框删除的过程。真实的NMS还会涉及到canny detection等等的细节问题,这边只是让大家快速入门使用起来,如需详细了解,请自行百度。

2.2.3 若干个box内容对应:

我们虽然识别出了方框内存在物体,但是我们仍需要将物体与标签对应起来,这边的方法就是很多了,RCNN里面的方法:SVM,还有现在非常热门的CNN都可以对识别出来的子图片进行识别分类:VOC物体检测任务是一个非常入门的分类问题。你可以通过任何一种你觉得可以的分类方法进行识别训练。

简单的流程化的识别拆分讲解这边就结束了,主要讲了candidates_boxs的产生,candidates_boxs通过基本属性的初筛,candidates_boxs根据IOU原则下的NMS进行复选,再将复选出来的box根据你已经训练好的分类模型确定到底是啥? 可以用下面这个图概述一下:

我们还有很多没讲完的,后面会持续更新: 主要包括: 1.如何配置一个快速训练的环境? 2.如何实现(输入图片,产出结果)整套识别流程? 3.如何自己训练一个图片分类器? 4.如何做快速迁移一个自己需要的及时图片识别流?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 理论:因子分析原理剖析

    F1,F2,F3...为前m个因子包含数据总量(累计贡献率)不低于80%。可取前m各因子来反映原评价

    sladesal
  • 关于'Deep Neural Networks for YouTube Recommendations'的一些思考和实现

    论文 Deep Neural Networks for YouTube Recommendations 来自google的YouTube团队,发表在16年9月的...

    sladesal
  • YoutubeNet的数据答疑

    实在是太忙了,抽空给大家解析一下之前写的YoutubeNet的数据是怎么构造的,协助大家可以自行构造一下。

    sladesal
  • 设计师必须了解的美术基础

    任何分类的设计师都需要有一定的美术基础,甚至也要有一定的手绘能力。我们在用电脑设计图形的时候其实也在潜移默化地在使用我们储存在大脑中的美术知识和审美,即使再先进...

    宇相
  • scala打包jar并在Linux下运行

    切记这里还有一个位置是存放打包完成后的 jar 存放位置 Output Directory :

    机器学习和大数据挖掘
  • 【许晓笛】49行代码就能发币?而且EOS连例子都给你了

    Daniel Larimer 在他的博客介绍了EOS新的智能合约架构(EOS团队的开发速度实在是太吓人,根本追不上)。他给出了最简单的一个新币种的智能合约代码,...

    圆方圆学院
  • 【许晓笛】49行代码就能发币?而且EOS连例子都给你了

    Daniel Larimer 在他的博客介绍了EOS新的智能合约架构(EOS团队的开发速度实在是太吓人,根本追不上)。他给出了最简单的一个新币种的智能合约代码,...

    圆方圆学院
  • 美翻你的朋友圈,Python生成蒙太奇马赛克图片

    我们有时候会听到这么一个词--“蒙太奇”,但却不知道这个词是什么意思。蒙太奇原为建筑学术语,意为构成、装配。而后又延伸为一种剪辑理论:当不同镜头拼接在一起时,往...

    ZackSock
  • 澳大利亚基于人工智能的众包快递公司Go People获300万美元融资

    【数据猿导读】 近日,澳大利亚悉尼按需众包快递公司Go People宣布已获得新一轮300万美元融资,因为电子商务巨头亚马逊(Amazon)在澳大利亚的扩张极大...

    数据猿
  • Struts2+Spring+Hibernate学习总结——XML才是王道

           前面几篇分别总结了Struts、Hibernate、Spring的学习(见《Struts2学习总结以及细枝末节》、《Hibernate学习总结》、...

    the5fire

扫码关注云+社区

领取腾讯云代金券