天天看點

阿裡雲圖像搜尋Quick Start

概述

圖像搜尋服務(Image Search)是以深度學習和大規模機器學習技術為核心,通過圖像識别和搜尋功能,實作以圖搜圖的智能圖像搜尋産品。圖像搜尋服務在基于圖像識别技術基礎上,結合不同行業應用和業務場景,幫助使用者實作相同或相似圖檔搜尋。因為導入到執行個體的圖檔執行個體本身并不存儲原始圖檔,是以在使用查詢功能的時候,并不能直接傳回原始圖檔或者可以直接通路的圖檔URL,需要使用者根據查詢回報的picname等資訊自行到自己的圖庫中反查原始圖檔,這樣給使用帶來了很大的不便。

針對這種情況,提供一種解決辦法,利用添加圖檔時候支援的屬性:CustomContent,直接設定該值為添加圖檔可以公網通路的URL,這樣在查詢的時候就直接可以通過Response Auctions對象的CustomContent屬性擷取圖檔的URL,當然前提是本身加入的圖檔提供公網通路URL。

操作步驟

1、到

圖像搜尋控制台

建立執行個體

阿裡雲圖像搜尋Quick Start

2、擷取測試需要的相關參數

阿裡雲圖像搜尋Quick Start

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