精华内容
下载资源
问答
  • 自动生成图片描述:NeuralTalk2 一、基本信息 NeuralTalk2是斯坦福计算机视觉人工智能实验室的一个项目,利用循环神经网络(RNN)和卷积神经网络(CNN)来描述图片内容,NeuralTalk2 比第一版训练速度更快(使用...

    自动生成图片描述:NeuralTalk2

    一、基本信息

    NeuralTalk2是斯坦福计算机视觉人工智能实验室的一个项目,利用循环神经网络(RNN)和卷积神经网络(CNN)来描述图片内容,NeuralTalk2 比第一版训练速度更快(使用了GPU),并且具有更好的性能表现。
    本篇博客注重该项目的源码实现部分,论文解读部分后续会上传。下面是该项目是一些资源连接

    官网
    http://cs.stanford.edu/people/karpathy/deepimagesent/
    论文
    Deep Visual-Semantic Alignments for Generating Image Descriptions
    Github源码
    https://github.com/karpathy/neuraltalk2

    二、源码实现

    1.环境及配置要求(建议)

    • Linux系统(我用的是Ubuntu 16.04-LTS)
    • GPU图形处理器(我的是GTX-980Ti,如果没有,也可以运行cpu版代码)
    • python(2或3都可以,我用的是3)
    • CUDA和cuDNN_v5.1(如果是其他版本的,可以看后文的cudnn多版本共存部分)
    • …(剩余环境依赖在后面需要用到的时候慢慢装)

    2.安装依赖和各种包

    由于测试代码部分由lua脚本语言写成,所以我们需要安装Torch,在Ubuntu下,利用如下指令完成Torch的安装

    $ curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
    $ git clone https://github.com/torch/distro.git ~/torch --recursive
    $ cd ~/torch; 
    $ ./install.sh      # and enter "yes" at the end to modify your bashrc
    $ source ~/.bashrc  #如果你用的是zsh,就输入source ~/.zshrc,ubuntu默认为bash

    想要了解有关Torch的跟多信息,可以点击http://torch.ch/查看相应安装文档。
    Torch安装好以后会自带LuaRocks,我们需要用它来安装一些必要的包:

    $ luarocks install nn
    $ luarocks install nngraph 
    $ luarocks install image 

    接着,因为我们要加载和保存json文件,所以我们还需要cjson库,安装方法如下

    $ git clone https://github.com/mpx/lua-cjson.git
    $ cd lua-cjson
    $ luarocks make

    其他安装方法可以查看官方安装文档:https://www.kyne.com.au/%7Emark/software/lua-cjson-manual.html

    由于NeuralTalk2默认是采用GPU实现的,所以必须确保你的系统上已经正确安装了对应GPU的NVIDIA驱动,以及CUDA开发者工具包和cuDNN(建议版本CUDA7.5或CUDA8、cuDNNv5.1,安装方法可以看这篇文章的CUDA安装部分http://blog.csdn.net/ksws0292756/article/details/79179286
    注意,如果你之前已经安装了NVIDIA和CUDA,但是你的cuDNN版本不是v5.1,而是更高版本时(我预装版本是v6.0),就需要再去下载cuDNNv5.1,下载地址是:https://developer.nvidia.com/rdp/cudnn-download#a-collapseTwo(下载需要登录nvidia帐号)
    下载好以后,有两种方法,一种是删掉原先的cuDNN版本,重新安装cuDNNv5.1版本,另一种是添加新的环境变量,使两种版本共存,操作如下:

    方法一:删除原来版本

    $ sudo rm -f /usr/local/cuda/lib64/libcudnn* #强制删除libcudnn相关文件
    $ sudo rm -f /usr/local/cuda/include/cudnn.h #/强制删除cudnn头文件
    #注意,上面的两处删除路径是cuda的默认路径,具体删除时根据你自己的路径来删除
    
    $ cd /Downloads/cuda #将下载的cuDNN解压,得到名为cuda的文件夹,进入
    #添加cudnn到cudn库
    $ sudo cp include/cudnn.h /usr/local/cuda/include/
    $ sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
    #修改添加到cuda库的cudnn权限
    $ sudo chmod a+r /usr/local/cuda/include/cudnn.h 
    $ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

    方法二:与原来版本共存

    #分别在lib64和include文件夹下面建立一个空文件夹,假设取名cudnn_v5.1
    $ cd /usr/local/cuda/lib64
    $ sudo mkdir cudnn_v5.1
    $ cd /usr/local/cuda/include
    $ sudo mkdir cudnn_v5.1
    
    #然后进入到cudnn_v5.1解压出的cuda文件夹内,将相关库文件拷贝至刚才创建的文件夹
    #添加cudnn到cudn库
    $ sudo cp include/cudnn.h /usr/local/cuda/include/cudnn_v5.1
    $ sudo cp lib64/libcudnn* /usr/local/cuda/lib64/cudnn_v5.1
    #修改添加到cuda库的cudnn权限
    $ sudo chmod a+r /usr/local/cuda/include/cudnn.h 
    $ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

    接着,打开bashrc文件,添加环境变量

    $ gedit ~/.bashrc # 如果你用的是zsh,就改成~/.zshrc

    在文件中加上下面一行

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64/cudnn_v5.1

    这里写图片描述

    安装完驱动和CUDA工具包等以后,再安装下面的cutorch包和cunn包

    $ luarocks install cutorch
    $ luarocks install cunn

    接着,安装cudnn.torch,在安装cudnn.torch之前,先确认你的电脑已经进行了如下配置

    • 安装了v5.1版本的cuDNN
    • 安装了7.0以上版本的CUDA
    • 将放到了环境变量所包含的路径当中($LD_LIBRARY_PATH) ,具体方法参见安装cuDNN的教程

    然后,输入下面的指令建立Torch链接:

    $ git clone https://github.com/soumith/cudnn.torch.git
    $ cd cudnn.torch
    $ luarocks make cudnn-scm-1.rockspec

    为了能够训练你自己的模型,你还需要安装loadcaffe

    $ sudo apt-get install libprotobuf-dev protobuf-compiler
    $ CC=gcc-5 CXX=g++-5 luarocks install loadcaffe 
    #如果你的系统不是Ubuntu16.04,则只需要luarocks install loadcaffe即可

    由于需要使用hdf5文件来存储预处理数据,所以还需要安装torch-hdf5 和 h5py,
    安装torch-hdf5

    $ sudo apt-get install libhdf5-serial-dev hdf5-tools
    $ git clone https://github.com/deepmind/torch-hdf5
    $ cd torch-hdf5
    $ luarocks make hdf5-0-0.rockspec LIBHDF5_LIBDIR="/usr/lib/x86_64-linux-gnu/"

    安装h5py
    对于Anaconda/MiniConda,可以使用

    $ conda install h5py
    

    对于Canopy,可以使用

    $ enpkg h5py

    也可以使用pip安装

    $ pip install h5py

    以上就安装完了所有的依赖,如果在上面的安装步骤中都没有出错的话,基本上就可以将代码成功的跑起来了(作者吐槽:依赖确实很多,但是这也是没办法的事情)

    3.测试运行

    为了能快速看到代码运行的结果,我们这里就直接使用作者已经训练好的模型(如果自己训练,大概需要2~3天的时间),点击下面的链接下载:cs.stanford.edu/people/karpathy/neuraltalk2/checkpoint_v1.zip
    下载好以后,解压到neuraltalk2项目文件夹里面(也可以解压到别处,只是解压到这里比较方便),然后,运行下面的指令:

    $ th eval.lua -model /path/to/model -image_folder /path/to/image/directory -num_images 10 

    这里-model后面的路径代表模型路径(可以是相对路径,也可以是绝对路径),-image_folder后面的路径是你想要测试的图片的文件夹路径,-image_folder后面的数字代表图片的数量,如果想要测试所有图片,就输入-1

    具体用法如下:

    $ cd ~/Works/NeuralTalk2/neuraltalk2 #进入到neuraltalk2项目文件夹,具体路径看你自己的存放位置
    $ th eval.lua -model model_id1-501-1448236541.t7 -image_folder ~/Works/NeuralTalk2/pics -num_images 4
    $ python -m http.server #如果你使用的是python2,则用`python -m SimpleHTTPServer`指令启动服务器

    最后,在你的浏览器中访问localhost:8000就可以看到程序的运行结果啦,下面是我的运行结果:
    这里写图片描述

    如果你想训练自己的神经网络模型,可以参考github源码上面的介绍,在这里就不多说明了。

    展开全文
  • 最近想爬一下图片,但是爬下来发现图片下面带着文字解释,这样看起来不太有美感,想着能不能将图片的文字解释,合成一张图,放在图片下面 先看图片格式 我想要这样的效果 下面的描述接在图片上面 参考大神的生成...

    最近想爬一下图片,但是爬下来发现图片下面带着文字解释,这样看起来不太有美感,想着能不能将图片的文字解释,合成一张图,放在图片下面
    先看图片格式
    在这里插入图片描述我想要这样的效果
    在这里插入图片描述
    下面的描述接在图片上面
    参考大神的生成图片写的
    直接上代码

    #文字生成图片,得有固定的宽度和文字字符串
    def make_text_image(width,text):
        #450对20号字体 
        fontsize = int(width*20/450)
        # 创建Font对象:
        font = ImageFont.truetype('C:\Windows\Fonts\微软雅黑\msyhl.ttc', fontsize)
        #20号字体
        txt = Image.new('RGB', (100, 100), (255, 255, 255))
        # 创建Draw对象:
        draw = ImageDraw.Draw(txt)
        # 所有文字的段落
        duanluo = ""
        # 宽度总和
        sum_width = 0
        # 几行 一开始设置俩行是因为这个有行间距的,我弄了一下午也没搞清楚行间距怎么算
        #求大神教教我
        line_count = 2
        # 行高
        line_height = 0
        #总长
        duanluoheight = 0
        for char in text:
        	#看下每个字的长和宽
            char_width, height = draw.textsize(char,font=font)
            sum_width += char_width
            if(height > line_height):
                #这个每个字符的高度不一样,找出那个最高的
                line_height = height
            #如果超过了规定的长度那就换行
            if sum_width > width-fontsize*2:
                line_count += 1
                sum_width = 0
                duanluo += '\n'
            #将生成一个带有换行的字符串
            duanluo += char
        #后面再加上一个换行
        if not duanluo.endswith('\n'):
            duanluo += '\n'
        #可以求出段落的高度
        duanluoheight = line_count*line_height
        #生成图片
        image = Image.new('RGB', (width, duanluoheight), (255, 255, 255))
        draw = ImageDraw.Draw(image)
        x, y = char_width/2, 0
        # 输出文字:
        draw.text((x, y), duanluo, font=font, fill=(0,0,0))
        # image.save('code.jpg', 'jpeg')
        return image,duanluoheight
    

    合成图片看了挺多,思路都是先造一个大的,再往里面加两个小的

    完整代码,得有个F盘,没有的话,改一下就好了

    import urllib.request
    import os
    import json
    import requests
    import time
    import re
    from PIL import Image, ImageFont, ImageDraw
    
    #今日囧图的编号,gif编号,视频编号
    jinristr = "138872" 
    
    #文字生成图片,得有固定的宽度和文字字符串
    def make_text_image(width,text):
        #450对20号字体 
        fontsize = int(width*20/450)
        # 创建Font对象:
        font = ImageFont.truetype('C:\Windows\Fonts\微软雅黑\msyhl.ttc', fontsize)
        #20号字体
        txt = Image.new('RGB', (100, 100), (255, 255, 255))
        # 创建Draw对象:
        draw = ImageDraw.Draw(txt)
        # 所有文字的段落
        duanluo = ""
        # 宽度总和
        sum_width = 0
        # 几行 一开始设置俩行是因为这个有行间距的,我弄了一下午也没搞清楚行间距怎么算
        #求大神教教我
        line_count = 2
        # 行高
        line_height = 0
        #总长
        duanluoheight = 0
        for char in text:
        	#看下每个字的长和宽
            char_width, height = draw.textsize(char,font=font)
            sum_width += char_width
            if(height > line_height):
                #这个每个字符的高度不一样,找出那个最高的
                line_height = height
            #如果超过了规定的长度那就换行
            if sum_width > width-fontsize*2:
                line_count += 1
                sum_width = 0
                duanluo += '\n'
            #将生成一个带有换行的字符串
            duanluo += char
        #后面再加上一个换行
        if not duanluo.endswith('\n'):
            duanluo += '\n'
        #可以求出段落的高度
        duanluoheight = line_count*line_height
        #生成图片
        image = Image.new('RGB', (width, duanluoheight), (255, 255, 255))
        draw = ImageDraw.Draw(image)
        x, y = char_width/2, 0
        # 输出文字:
        draw.text((x, y), duanluo, font=font, fill=(0,0,0))
        # image.save('code.jpg', 'jpeg')
        return image,duanluoheight
    
    #生成文件时要对文件名字做处理
    def validateTitle(title):
        rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
        new_title = re.sub(rstr, "_", title)  # 替换为下划线
        return new_title
    #接口
    url = "http://tu.duowan.com/index.php?r=show/getByGallery&gid="
    #生成有参数的接口
    url = url + jinristr + "&_=" + str(int(round(time.time() * 1000)))
    resp=requests.get(url)
    dataJson=json.loads(resp.content)
    listdaa=dataJson['picInfo']
    listdaa.sort(key = lambda x:(int)(x['ding']))
    str = ''
    #循环找到的数据
    for i in listdaa:
        print(i['ding'])
        print(i['add_intro'])
        str = str+i['add_intro']+"\n"
    #在电脑中定义存放图片的位置并新建
    path1='F:\\多玩爬取图片\\'+dataJson['gallery_title']
    if os.path.exists(path1):
        pass
    else:
        os.makedirs(path1)
    #定义文件的连接
    for i in listdaa:
    	#后面的文件名应该是随着类型的不同而变化的
        picpath = path1+'\\'+validateTitle(i['add_intro']+'.jpg')
        if not os.path.exists(picpath):
        	#下载
            urllib.request.urlretrieve(i['source'], picpath)
        
    #写一个文本文件,里面放着他们的文件名字,这个其实没用的
    txtpath = path1 + '\\1.txt'
    f = open(txtpath,'w')
    f.write(str)
    f.close()
    
    #将文件名字进行拼接
    for i in listdaa:
        picpath = path1+'\\'+validateTitle(i['add_intro']+'.jpg')
        im = Image.open(picpath)
        immg = make_text_image(im.size[0], i['add_intro'])
        zui = Image.new(im.mode, (im.size[0], im.size[1]+immg[1]))
        zui.paste(im, box=(0,0))
        zui.paste(immg[0],box=(0,im.size[1]))
        zui.save(picpath)
    
    
    
    
    展开全文
  • 特效描述:利用JS实现 多张图片合成 一张图片代码。利用JS实现多张图片合成一张图片代码代码结构1. HTML代码注:请在服务端运行才能看到效果 function hecheng(){draw(function(){document.getElementById('imgBox')...

    特效描述:利用JS实现 多张图片合成 一张图片代码。利用JS实现多张图片合成一张图片代码

    代码结构

    1. HTML代码

    注:请在服务端运行才能看到效果

    img1.png

    img2.png

    img3.png

    img4.png

    function hecheng(){

    draw(function(){

    document.getElementById('imgBox').innerHTML='

    合成图片成功!可以鼠标另存图片查看我是否是一张图片~~!

    '+base64%5B0%5D+'';

    })

    }

    var data=['img1.png','img2.png','img3.png','img4.png'],base64=[];

    function draw(fn){

    var c=document.createElement('canvas'),

    ctx=c.getContext('2d'),

    len=data.length;

    c.width=290;

    c.height=290;

    ctx.rect(0,0,c.width,c.height);

    ctx.fillStyle='#fff';

    ctx.fill();

    function drawing(n){

    if(n

    var img=new Image;

    //img.crossOrigin = 'Anonymous'; //解决跨域

    img.src=data[n];

    img.οnlοad=function(){

    ctx.drawImage(img,0,0,290,290);

    drawing(n+1);//递归

    }

    }else{

    //保存生成作品图片

    base64.push(c.toDataURL("image/jpeg",0.8));

    //alert(JSON.stringify(base64));

    fn();

    }

    }

    drawing(0);

    }

    展开全文
  • 问题描述:循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片,形成环,循环切换图片。 效果图如下: 具体代码如下: // ViewController.m ...

    问题描述:循环滚动scrollView---最后一张图片后面紧跟着第一张图片,第一张图片前面挨着最后一张图片,形成环,循环切换图片。

    效果图如下:

    具体代码如下:


    //  ViewController.m



    #import "ViewController.h"


    #define kW 375

    #define kH 500

    #define kCount 11


    @interface ViewController () <UIScrollViewDelegate>


    @end


    @implementation ViewController


    - (void)viewDidLoad {

        [super viewDidLoad];

        

        //加载滚动视图

        [self _loadScroll];

    }



    - (void) _loadScroll

    {

        

        UIScrollView * scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, kW, kH)];

        

        scrollView.delegate=self;

        

        for (int i=0; i<kCount+2; i++)

        {

            UIImageView * imageView=[[UIImageView alloc]initWithFrame:CGRectMake(i*kW, 0,kW ,kH )];

            

            //图片序号

            int imageIndex=i;

            

            //如果是第一张和最后一张需要特殊处理

            if (i==0)

            {

                imageIndex=kCount;

            }

            else if(i==kCount+1)

            {

                imageIndex=1;

            }

            

            //添加图片

            NSString * imgName=[NSString stringWithFormat:@"t%i.jpg",imageIndex];

            imageView.image=[UIImage imageNamed:imgName];

            

            [scrollView addSubview:imageView];

        }

        

        scrollView.contentSize=CGSizeMake((kCount+2)*kW, kH);   //滚动视图的总宽度

        scrollView.showsHorizontalScrollIndicator=NO//最下方的自带的进度条  NO--隐藏   YES---显示

        scrollView.pagingEnabled=YES;    //一下滑动一整个屏幕的宽度

      

        [self.view addSubview:scrollView];

    }



    #pragma mark - UIScrollView代理方法实现

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

    {

        if (scrollView.contentOffset.x/kW==kCount+1)

        {

            NSLog(@"=====");     //测试代码

            

            scrollView.contentOffset=CGPointMake(kW, 0);

        }

        else if(scrollView.contentOffset.x==0)

        {

            scrollView.contentOffset=CGPointMake(kW*kCount,0);

        }

        

    //    if (scrollView.contentOffset.x>(kCount+1)*kW)

    //    {

    //        scrollView.contentOffset=CGPointMake(kW, 0);

    //    }

    //    else if (scrollView.contentOffset.x/kW==0)

    //    {

    //        scrollView.contentOffset=CGPointMake(kW*kCount, 0);

    //    }

        

    }

    @end

    缺点:没有实现重复利用,耗费太多内存,优化的程序,等改好后继续上传,敬请期待。。。。。
    PS:
       有感而发:最近感觉越来越找不到方向了,但是还在继续坚持,希望能够走到最后,加油吧,小伙伴们!




    展开全文
  • 使用java将几张图片合成一张图片

    千次阅读 2020-04-23 10:54:38
    背景描述:最近在做app推送消息,在做管住人推送需要把有更新的关注人头像合成一张图片,展示示例如下: 花了一些时间来弄这个,之前没做过图片处理,所以记录一下,合成之后的样例如下: 下面是代码: /** * ...
  • 我们都知道background-position属性用来指定背景图片应该出现的位置,可以使用关键字、绝对值和相对值进行指定。下面我们来看一下css定位图片的方法。background-position ...属性值值描述top lefttop centertop r...
  • 问题描述:在h5 中 把一张图片切成多张图片,然后再页面中显示拼接成一张图片. 正常情况:图片 设置成这样,在正常手机上没有问题 ` width: 100%; display: block; ` 谷歌浏览器调试100% 没有问题 !...
  • 背景:开发要实现一个功能,类似做一个淘宝的合成图片,把一个图片放到另一个图片的部分区域,两个图片合成一张图片,在合成的图片上面,插入一段描述性的语句.实现步骤如下: 1两张图片合成一张,因为图片2比图片1还要大,...
  • 【背景】  以前,自己实现Loading的时候,一般采用的是,帧动画(就是用很多图片实现的动画)。...后来,自己有一天不小心接触到了,新的技术,发现,居然用一张图片就可以实现Loading。 【功能描述
  • OpenCV_加载一张图片

    千次阅读 2016-12-16 13:24:41
    今天更新一个小Demo,使用opencv,从本地读取一张图片。【先代码->演示结果->分析代码】 OpenCV 版本: opencv-3.1.0 关于环境的配置略过,大家可以搜索一下其他的教程说明。代码:#include "highgui.h" int main...
  • 需求描述:在做图片上传组件的时候 有时候需求回要求只能上传一张图片 bug:element-ui在上传完一张图片后上传按钮还会存在 虽然可以用自带的limt属性加以限制 但是上传按钮依然会存在 且存入数组的值依然会增加 ...
  • 加载的数据集中已自动生成X张图片 import matplotlib.pyplot as plt from scipy.io import loadmat mat = loadmat('data1.mat') # 假设文件中有32张图片 img= mat['img'] plt.figure() for i in range(1,X): # X为...
  • 本文主要描述了通过使用Photoshop软件让一张图片变深或变淡的过程。很多时候都要用变深或变淡的图片制作背景,本例中通过调整图像的明度,让图片发生改变。 工具/原料 一台计算机,...
  • 大概就是一张图片image一行描述lable?, 能直接绑定么

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,609
精华内容 39,843
关键字:

怎么描述一张图片