zoukankan      html  css  js  c++  java
  • 关于 tf.image.crop_and_resize的使用

    https://blog.csdn.net/m0_38024332/article/details/81779544

    关于 tf.image.crop_and_resize 的使用
      最近在学习fast-RCNN,在写ROI Pooling层看到说可以直接利用 tf.image.crop_and_resize 。但是如何使用这个函数成了很大的问题,查网上很多资料都是复制加翻译从官网api来的,受个人的英语能力又接受不了,最后发帖求助解决了这个问题,兴致盎然分享一遍。

    以下是相关的链接:

    官网API【www.tensorflow.cn】
    发帖求助链接【stackoverflow】
    先来个代码引用~
    tf.image.crop_and_resize(
        image,
        boxes,
        box_ind,
        crop_size,
        method='bilinear',
        extrapolation_value=0,
        name=None
    )
     
    上面是函数的相关参数,首先必须说明官网中有输入tensor的要求,但是我直接输入值也是可以的。这里进行相应的解释:

    boxes:指需要划分的区域,输入格式为 [[ymin,xmin,ymax,xmax]] (要注意!这是一个二维列表)。官网在这里讲了一大段,看着简直头晕,大概意思是分了两种情况,一种是超出1另一种就是不超出1的。先将输入值范围为0--1的情况,这里其实是这样:
          设crop的区域坐标为 [ y1,x1,y2,x2 ],那么想得到相应正确的crop图形就一定要归!一!化!,即图片长度为 [ W,H ],则实际输入的boxes为 [ y1/H,x1/W,y2/H,x2/W ]。
          那超出1的范围是个啥意思咧?程序将为你自动补齐的意思,我试了几次都是直接用空白补齐,不知道大家有没有不一样的结果,注意奥!你的范围要是全部超出1,那就稳稳当当是个黑色框了,因为超出1根据归一化截取不到图片任何内容啦!
     
    box_ind:box_ind 按我的理解,就是 boxes !index 嘛!那就是对应的关系啰。另外,按照官网的想法,投入的是tensor,那么肯定不止一张图片啦,这个参数就是为了索引用的。值得注意的(下方代码贴出来会更清楚。
     
    crop_size:这个参数就可想而知啦,本来这就是我用这个函数的原因,输入一个大小即可,可以忽视通道数量这些
     
    好啦,参数解释就这么多,但是如果有人按照上面的千辛万苦解决之后,使用 sess.run() 得到实际数据,开开心心 imshow() 一下。然后!得到的东西大概是这样----- ->->

    @#!??@#!^@!*&^&*!$JKH !当时心情就是这样

    辛亏帖子里的仁兄说明了这个问题,这里我就直接引用了

    As you're using float outside the [0,1] range, matplotlib is bounding your values to 1. That's why you get those colored pixels (either solid red, solid green or solid blue, or a mixing of these). Cast your array to uint_8 to get an image that make sense.

    大致是因为我使用的是matplotlib模块,而当数据为浮点数则应归一化否则应为整数型 。

    那么最后操作: 结果 % 255,或者类似 astype('uint8')

    大!功!告!成!
    噢噢噢噢噢噢噢噢,贴上真正的结果图(下图下方和右方黑框和白框就是程序自动填充的)

     
    最后贴上我的代码:
    import tensorflow as tf
    import matplotlib.pyplot as plt

    img = plt.imread(image_path)
    shape = img.shape
    img = img.reshape([1,shape[0], shape[1], shape[2]])
    a = tf.image.crop_and_resize(img,[[0.5,0.6,0.9,0.8],[0.2,0.6,1.3,0.9]],box_ind=[0,0],crop_size=(100,100))
    sess = tf.Session()
    b = a.eval(session = sess)
    plt.imshow(b[0]/255)
    plt.imshow(b[0].astype('uint8'))
    谢谢大家捧场!拱手!
    突然想写这个是有些无奈,有时候查一个函数查半天论坛里大部分都是直接引用官网内容,左上角还有个 原创字样 太扎眼。另外任何疑问或者可以改进的地方,希望大家伙都可以帮帮我。希望能在这里快快成长!

    2018.12.2

    忙着学英语好久没看论坛了,感慨一下。更新一下内容

    这里要注意,有人提出 box_ind 的参数解释不清楚,需要再次说明,我们应该把这个参数与 img 和 boxes 联动使用。

    假设 img = [img1, img2]

            boxes = [boxes1, boxes2]

             box_ind = [ 1 , 0 ]

    那么,将返回

    [使用boxes1 作用于 img2 后的图片 , 使用boxes2 作用于 img1后的图片]

    如上。

  • 相关阅读:
    Linux程序的执行
    Linux图形操作与命令行
    Linux网络配置
    Zip文件中文乱码问题解决方法(MAC->Windows)
    我只是一直很努力
    Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
    Android抓包方法(二)之Tcpdump命令+Wireshark
    Android抓包方法(一)之Fiddler代理
    Android反编译(二)之反编译XML资源文件
    Android反编译(一)之反编译JAVA源码
  • 原文地址:https://www.cnblogs.com/shuimuqingyang/p/10646023.html
Copyright © 2011-2022 走看看