阿里云图像搜索Quick Start

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 因为导入到实例的图片实例本身并不存储原始图片,所以在使用查询功能的时候,并不能直接返回原始图片或者可以直接访问的图片URL,需要使用者根据查询反馈的picname等信息自行到自己的图库中反查原始图片,这样给使用带来了很大的不便。

概述

图像搜索服务(Image Search)是以深度学习和大规模机器学习技术为核心,通过图像识别和搜索功能,实现以图搜图的智能图像搜索产品。图像搜索服务在基于图像识别技术基础上,结合不同行业应用和业务场景,帮助用户实现相同或相似图片搜索。因为导入到实例的图片实例本身并不存储原始图片,所以在使用查询功能的时候,并不能直接返回原始图片或者可以直接访问的图片URL,需要使用者根据查询反馈的picname等信息自行到自己的图库中反查原始图片,这样给使用带来了很大的不便。

针对这种情况,提供一种解决办法,利用添加图片时候支持的属性:CustomContent,直接设置该值为添加图片可以公网访问的URL,这样在查询的时候就直接可以通过Response Auctions对象的CustomContent属性获取图片的URL,当然前提是本身加入的图片提供公网访问URL。

操作步骤

1、到图像搜索控制台创建实例

_

2、获取测试需要的相关参数

_

3、pom.xml

  <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-imagesearch</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>[4.3.2,5.0.0)</version>
        </dependency>
    </dependencies>

4、Code Sample

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.imagesearch.model.v20190325.AddImageRequest;
import com.aliyuncs.imagesearch.model.v20190325.AddImageResponse;
import com.aliyuncs.imagesearch.model.v20190325.SearchImageRequest;
import com.aliyuncs.imagesearch.model.v20190325.SearchImageResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.apache.commons.codec.binary.Base64;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class AddAndSearchDemo {

    public static void main(String[] args) throws IOException, InterruptedException {

        String accessKeyId = "LTAIOZZgYX******";
        String accessSecret = "v7CjUJCMk7j9aKduMAQLjyCm******";
        String regionId = "cn-shanghai";
        String instanceName = "demop******";
        String productId = "shirt";
        String picName1 = "shirt_1";
        String picName2 = "shirt_2";
        String picURL1 = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577090672111&di=ecb316794a7d0eeb8dc9dd76d4ca78d0&imgtype=0&src=http%3A%2F%2Fimg12.360buyimg.com%2Fn0%2Fjfs%2Ft208%2F202%2F990939258%2F101503%2Fe8b76d70%2F53a13d75N1456d2d6.jpg";
        String picURL2 = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577090672122&di=539afa0415b469da9bb57daf94eff8e7&imgtype=0&src=http%3A%2F%2Fimg12.360buyimg.com%2Fn1%2Fjfs%2Ft877%2F18%2F399371448%2F100857%2Fd906afbb%2F551d5285Nd29ae9aa.jpg";
        String picPath = "C:\\******\\main\\resources\\test.jpg"; // 待查询图片的路径

        DefaultProfile.addEndpoint( regionId, "ImageSearch", "imagesearch.cn-shanghai.aliyuncs.com");
        IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessSecret);

        IAcsClient client = new DefaultAcsClient(profile);

        // 添加图片到实例
        addPic(client,instanceName,productId,picName1,picURL1);
        Thread.sleep(1000);// 防止出现flow control
        addPic(client,instanceName,productId,picName2,picURL2);

        // 查询图片
        searchPic(client, instanceName, picPath);
        System.out.println("测试结束");
    }

    /**
     * 添加图片到实例
     * @param client 实例对象
     * @param instanceName 实例名称
     * @param productId 商品Id
     * @param picName 图片名称
     * @param picURL 图片URL
     * @throws IOException
     */
    public static void addPic(IAcsClient client, String instanceName, String productId, String picName, String picURL) throws IOException {
        // 增加图片
        AddImageRequest addImageRequest = new AddImageRequest();
        // 必填,图像搜索实例名称。
        addImageRequest.setInstanceName(instanceName);
        // 必填,商品id,最多支持 512个字符。
        // 一个商品可有多张图片。
        addImageRequest.setProductId(productId);
        // 必填,图片名称,最多支持 512个字符。
        // 1. ProductId + PicName唯一确定一张图片。
        // 2. 如果多次添加图片具有相同的ProductId + PicName,以最后一次添加为准,前面添加的的图片将被覆盖。
        addImageRequest.setPicName(picName);
        // request.setStrAttr("");// 测试
        // 选填,图片类目。
        // 1. 对于商品搜索:若设置类目,则以设置的为准;若不设置类目,将由系统进行类目预测,预测的类目结果可在Response中获取 。
        // 2. 对于布料、商标、通用搜索:不论是否设置类目,系统会将类目设置为88888888。
        addImageRequest.setCategoryId(1);
        Base64 base64 = new Base64();
        String encodePicContent = base64.encodeToString(getFileFromUrl(picURL));
        // 必填,图片内容,Base64编码。
        // 最多支持 2MB大小图片以及5s的传输等待时间。当前仅支持jpg和png格式图片;
        // 对于商品、商标、通用图片搜索,图片长和宽的像素必须都大于等于200,并且小于等于1024;
        // 对于布料搜索,图片长和宽的像素必须都大于等于448,并且小于等于1024;
        // 图像中不能带有旋转信息。
        addImageRequest.setPicContent(encodePicContent);
        // 选填,是否需要进行主体识别,默认为true。
        // 1.为true时,由系统进行主体识别,以识别的主体进行搜索,主体识别结果可在Response中获取。
        // 2. 为false时,则不进行主体识别,以整张图进行搜索。
        // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
        addImageRequest.setCrop(true);
        // 选填,图片的主体区域,格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点,x2,y2是右下角的点。
        // 若用户设置了Region,则不论Crop参数为何值,都将以用户输入Region进行搜索。
        // 对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
//        request.setRegion("280,486,232,351");
        // 选填,整数类型属性,可用于查询时过滤,查询时会返回该字段。
        //  例如不同的站点的图片/不同用户的图片,可以设置不同的IntAttr,查询时通过过滤来达到隔离的目的
        addImageRequest.setIntAttr(0);
        // 选填,字符串类型属性,最多支持 128个字符。可用于查询时过滤,查询时会返回该字段。
        addImageRequest.setStrAttr("demo");
        // 选填,用户自定义的内容,最多支持 4096个字符。
        // 查询时会返回该字段。例如可添加图片的描述等文本。
        // 这里设置为图片的公网地址URL,方便从查询结果中直接获取数据
        addImageRequest.setCustomContent(picURL);
        try {
            AddImageResponse addImageResponse = client.getAcsResponse(addImageRequest);
            System.out.println("Add Picture Result: " + addImageResponse.getSuccess());
        } catch (ClientException e) {
            // 抛出异常,例如参数无效,或者实例不可用等情况
            e.printStackTrace();
        }
    }

    /**
     * 使用本地图片到图片库中查询
     * @param client 实例对象
     * @param instanceName 实例名称
     * @param picPath 本地图片的路径
     */
    public static void searchPic(IAcsClient client, String instanceName, String picPath)
    {
        SearchImageRequest searchImageRequest = new SearchImageRequest();
        // 必填,图像搜索实例名称。
        searchImageRequest.setInstanceName(instanceName);
        // 选填,搜索类型,取值范围:
        // 1. SearchByPic(默认):根据图片搜索相似图片。
        // 2. SearchByName,根据已添加的图片搜索相似图片。
        // request.setType("SearchByPic");
        byte[] bytes2_search = getBytesFromPath(picPath);
        Base64 base64 = new Base64();
        String encodePicContent_seacrch = base64.encodeToString(bytes2_search);
        // 图片内容,Base64编码。最多支持 2MB大小图片以及5s的传输等待时间。当前仅支持jpg和png格式图片;
        // 对于商品、商标、通用图片搜索,图片长和宽的像素必须都大于等于200,并且小于等于1024;
        // 对于布料搜索,图片长和宽的像素必须都大于等于448,并且小于等于1024;
        // 图像中不能带有旋转信息。
        // 1. Type=SearchByPic时,必填
        // 2. Type=SearchByName时,无需填写。
        searchImageRequest.setPicContent(encodePicContent_seacrch);
        // 选填,商品类目。
        // 1. 对于商品搜索:若设置类目,则以设置的为准;若不设置类目,将由系统进行类目预测,预测的类目结果可在Response中获取 。
        // 2. 对于布料、商标、通用搜索:不论是否设置类目,系统会将类目设置为88888888。
        searchImageRequest.setCategoryId(1);
        // 选填,是否需要进行主体识别,默认为true。
        // 1.为true时,由系统进行主体识别,以识别的主体进行搜索,主体识别结果可在Response中获取。
        // 2. 为false时,则不进行主体识别,以整张图进行搜索。
        // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
        searchImageRequest.setCrop(false);
        // 选填,图片的主体区域,格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点,x2,y2是右下角的点。
        // 若用户设置了Region,则不论Crop参数为何值,都将以用户输入Region进行搜索。
        // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
        // searchImageRequest.setRegion("280,486,232,351");
        // 选填,返回结果的数目。取值范围:1-100。默认值:10。
        searchImageRequest.setNum(2);
        // 选填,返回结果的起始位置。取值范围:0-499。默认值:0。
        // searchImageRequest.setStart(1);
        // 选填,过滤条件
        // int_attr支持的操作符有>、>=、<、<=、=,str_attr支持的操作符有=和!=,多个条件之支持AND和OR进行连接。
        // 示例:
        //  1. 根据IntAttr过滤结果,int_attr>=100
        //  2. 根据StrAttr过滤结果,str_attr!="value1"
        //  3. 根据IntAttr和StrAttr联合过滤结果,int_attr=1000 AND str_attr="value1"
        //   searchImageRequest.setFilter("int_attr=1");
        try {
            SearchImageResponse searchImageResponse = client.getAcsResponse(searchImageRequest);
            System.out.println("getCustomContent: " + searchImageResponse.getAuctions().get(0).getCustomContent());
            System.out.println("getCustomContent: " + searchImageResponse.getAuctions().get(1).getCustomContent());
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通过oss 中的URL的读取图片到Byte[]
     * @param url 公网可以访问的图片URL
     * @return byte[]
     * @throws IOException
     */
    private static byte[] getFileFromUrl(String url) throws IOException{
        URL urlConet = new URL(url);
        HttpURLConnection con = (HttpURLConnection)urlConet.openConnection();
        con.setRequestMethod("GET");
        con.setConnectTimeout(4 * 1000);
        InputStream inStream = con .getInputStream();//通过输入流获取图片数据
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[2048];
        int len = 0;
        while( (len=inStream.read(buffer)) != -1 ){
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        byte[] data =  outStream.toByteArray();
        return data;
    }

    /**
     * 从本地读取图片到byte[]
     * @param filePath 本地图片的路径
     * @return byte[]
     */
    private static byte[] getBytesFromPath(String filePath) {
        byte[] buffer = null;
        try {
            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            // picture max size is 2MB
            ByteArrayOutputStream bos = new ByteArrayOutputStream(2000 * 1024);
            byte[] b = new byte[1000];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }
}

备注:待查询图片下载地址

5、测试结果

Add Picture Result: true
Add Picture Result: true
getCustomContent: https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577090672111&di=ecb316794a7d0eeb8dc9dd76d4ca78d0&imgtype=0&src=http%3A%2F%2Fimg12.360buyimg.com%2Fn0%2Fjfs%2Ft208%2F202%2F990939258%2F101503%2Fe8b76d70%2F53a13d75N1456d2d6.jpg
getCustomContent: https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577090672122&di=539afa0415b469da9bb57daf94eff8e7&imgtype=0&src=http%3A%2F%2Fimg12.360buyimg.com%2Fn1%2Fjfs%2Ft877%2F18%2F399371448%2F100857%2Fd906afbb%2F551d5285Nd29ae9aa.jpg
测试结束

更多参考

Java SDK
新增图片 API
查询图片 API

相关文章
|
4月前
|
搜索推荐 API 对象存储
|
4月前
|
分布式计算 搜索推荐 API
|
机器学习/深度学习 存储 算法
阿里云国际站:拍立淘-以图搜图中的图像搜索算法是怎么样的?
@luotuoemo飞机@TG 阿里云国际站:拍立淘-以图搜图中的图像搜索算法是怎么样的?图像搜索在现代搜索系统中扮演了重要角色,尤其在电子商务网站如阿里巴巴等,它更是一个必不可少的功能。拍立淘是阿里云国际站的一个以图搜图功能,它使用了复杂的图像搜索算法进行图片匹配和识别。以下是对该算法的简单描述。
|
机器学习/深度学习 人工智能 开发者
关于阿里云的图像搜索的创建和使用
关于阿里云的图像搜索的创建和使用
关于阿里云的图像搜索的创建和使用
|
存储 前端开发 Serverless
阿里云视觉智能平台提供了人脸识别和图像搜索的API接口
阿里云视觉智能平台提供了人脸识别和图像搜索的API接口
1655 0
|
SQL 搜索推荐 TensorFlow
【最佳实践】阿里云 Elasticsearch 向量检索4步搭建“以图搜图”搜索引擎
“图片搜索”是作为导购类网站,比较常见的一种功能,其实现的方式也有多种。但如何做到快速、精准、简单等特性,本文给你答案。
11567 1
【最佳实践】阿里云 Elasticsearch 向量检索4步搭建“以图搜图”搜索引擎
|
算法
阿里云图像搜索技术创新-工业五金图片搜索
阿里云图像搜索产品3月17日正式发布工业五金搜索模型,通过大规模算法模型训练,可在海量五金图片素材中快速定位到图片中五金件的同款或相似款商品原图,识别过程中可有效避免图片方位变化、光照变化、背景场景变化等情况对搜索结果的影响。以此帮助工业五金电商商城、仓库等快速找到同款、相似款。通过输入工业五金类图片,可以在海量商品库中找到同款、相似款配件,并返回对应的配件信息,提升五金类产品购物效率,帮忙更多工业五金制造和零售等企业轻松上云。
512 57
阿里云图像搜索技术创新-工业五金图片搜索
|
人工智能
阿里云产品体系分为6大分类——人工智能——分为10种模块——图像搜索
阿里云产品体系分为6大分类——人工智能——分为10种模块——图像搜索自制脑图
174 0
|
算法
阿里云图像搜索应用篇-家具家居图片搜索
阿里云图像搜索产品于2022年3月17日正式发布家具家居图像搜索模型,通过大规模算法模型训练,可在海量图片素材中快速定位到与原图中的同款或相似款家居或家具图片,识别过程中可有效避免图片翻转、局部、颜色变换、款式微调、花纹变换等情况对搜索结果的影响,针对床上用品、家具、室内设计图等多个场景可快速找到相似图片或商品。可广泛应用于室内设计图片素材网站、 家纺类电商网站、家具家居类电商网站以及各种内容导购网站等。
595 0
阿里云图像搜索应用篇-家具家居图片搜索
|
机器学习/深度学习 存储 搜索推荐
阿里云图像搜索批量操作Quick Start
图像搜索(Image Search)以深度学习和机器视觉技术为核心,提取图片内容特征、建立图像搜索引擎,是一款用于图片间相似性检索的平台型产品。用户输入图片,可以快速在图片库中检索到与输入图片相似的图片集合。结合不同的行业和业务场景,图像搜索可广泛的应用于拍照购物、商品推荐、版权保护、图片相似推荐等场景。图像搜索可以通过批量操作功能批量导入阿里云OSS中的图片,或批量删除已经入库的图片,适用于较大规模的离线图片数据操作,稳定性高、速度快、操作方便。本文以商品图片搜索演示图片批量新增以供参考。
6847 0
阿里云图像搜索批量操作Quick Start