天天看點

身份證圖檔識别demo通過百度AI開放平台實作

1、通過API文檔方式實作

1.1、接口描述

支援對二代居民身份證正反面所有8個字段進行結構化識别,包括姓名、性别、民族、出生日期、住址、身份證号、簽發機關、有效期限,識别準确率超過99%;同時支援身份證正面頭像檢測,并傳回頭像切片的base64編碼及位置資訊。

同時,支援對使用者上傳的身份證圖檔進行圖像風險和品質檢測,可識别圖檔是否為影印件或臨時身份證,是否被翻拍或編輯,是否存在正反颠倒、模糊、欠曝、過曝等品質問題。

1.2、增值功能

增值能力 詳情
裁剪能力 頭像檢測與切片:傳回頭像切片的base64編碼及位置資訊
品質檢測 身份證圖檔模糊檢測
身份證關鍵字段反光或過曝光
身份證圖檔較暗或欠曝光
風險檢測 身份證影印件告警
臨時身份證告警
身份證翻拍告警
身份證PS編輯告警
身份證證号不合法告警
身份證證号和姓名、出生日期、性别資訊不一緻告警

1.3.1、請求說明

HTTP 方法:

POST

請求URL: 

https://aip.baidubce.com/rest/2.0/ocr/v1/idcard      

請求參數:

①URL參數

參數
access_token 通過API Key和Secret Key擷取的access_token,參考“Access Token擷取”

②Header部分參數

參數
Content-Type application/x-www-form-urlencoded

③body部分參數

參數 是否必選 類型 可選值範圍 說明
image 和url二選一 string - 圖像資料,base64編碼後進行urlencode,要求base64編碼和urlencode後大小不超過4M,最短邊至少15px,最長邊最大4096px,支援jpg/jpeg/png/bmp格式
url 和image二選一 string -

圖檔完整URL,URL長度不超過1024位元組,URL對應的圖檔base64編碼後大小不超過4M,最短邊至少15px,最長邊最大4096px,支援jpg/jpeg/png/bmp格式,當image字段存在時url字段失效

請注意關閉URL防盜鍊

id_card_side string front/back

-front:身份證含照片的一面

-back:身份證帶國徽的一面

自動檢測身份證正反面,如果傳參指定方向與圖檔相反,支援正常識别,傳回參數image_status字段為"reversed_side"

detect_direction string - 此參數新版本無需傳,支援自動檢測圖像旋轉角度
detect_risk string true/false

是否開啟身份證風險類型(身份證影印件、臨時身份證、身份證翻拍、修改過的身份證)功能,預設不開啟,即:false。

-true:開啟,請檢視傳回參數risk_type;

-false:不開啟

detect_photo string true/false 是否檢測頭像内容,預設不檢測。可選值:true-檢測頭像并傳回頭像的 base64 編碼及位置資訊
detect_rectify string - 此參數新版本無需傳,支援自動校驗圖檔完整性,可識别完整和切片身份證

④請求代碼demo

package com.baidu.ai.aip;

import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;

import java.net.URLEncoder;

/**
* 身份證識别
*/
public class Idcard {

    /**
    * 重要提示代碼中所需工具類
    * FileUtil,Base64Util,HttpUtil,GsonUtils請從
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下載下傳
    */
    public static String idcard() {
        // 請求url
        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
        try {
            // 本地檔案路徑
            String filePath = "[本地檔案路徑]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "id_card_side=" + "front" + "&image=" + imgParam;

            // 注意這裡僅為了簡化編碼每一次請求都去擷取access_token,線上環境access_token有過期時間, 用戶端可自行緩存,過期後重新擷取。
            String accessToken = "[調用鑒權接口擷取的token]";

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Idcard.idcard();
    }
}      

⑤傳回參數說明

字段 是否必選 類型 說明
direction int32

圖像方向,當圖像旋轉時,傳回該參數。

- -1:未定義,

- 0:正向,

- 1: 逆時針90度,

- 2:逆時針180度,

- 3:逆時針270度

image_status string

normal-識别正常

reversed_side-身份證正反面颠倒

non_idcard-上傳的圖檔中不包含身份證

blurred-身份證模糊

other_type_card-其他類型證照

over_exposure-身份證關鍵字段反光或過曝

over_dark-身份證欠曝(亮度過低)

unknown-未知狀态

risk_type string 輸入參數 detect_risk = true 時,則傳回該字段識别身份證類型: normal-正常身份證;copy-影印件;temporary-臨時身份證;screen-翻拍;unknown-其他未知情況
edit_tool string 如果參數 detect_risk = true 時,則傳回此字段。如果檢測身份證被編輯過,該字段指定編輯軟體名稱,如:Adobe Photoshop CC 2014 (Macintosh),如果沒有被編輯過則傳回值無此參數
log_id uint64 唯一的log id,用于問題定位
photo string 當請求參數 detect_photo = true時傳回,頭像切圖的 base64 編碼(無編碼頭,需自行處理)
photo_location array() 當請求參數 detect_photo = true時傳回,頭像的位置資訊(坐标0點為左上角)
idcard_number_type string

用于校驗身份證号碼、性别、出生是否一緻,輸出結果及其對應關系如下:

-1: 身份證正面所有字段全為空

0: 身份證證号不合法,此情況下不傳回身份證證号

1: 身份證證号和性别、出生資訊一緻

2: 身份證證号和性别、出生資訊都不一緻

3: 身份證證号和出生資訊不一緻

4: 身份證證号和性别資訊不一緻

words_result array() 定位和識别結果數組
words_result_num uint32 識别結果數,表示words_result的元素個數
+location array() 位置數組(坐标0點為左上角)
++left uint32 表示定位位置的長方形左上頂點的水準坐标
++top uint32 表示定位位置的長方形左上頂點的垂直坐标
++width uint32 表示定位位置的長方形的寬度
++height uint32 表示定位位置的長方形的高度
+words string 識别結果字元串

⑥傳回結果demo

{
	"words_result": {
		"姓名": {
			"words": "張三",
			"location": {
				"top": 447,
				"left": 235,
				"width": 135,
				"height": 46
			}
		},
		"民族": {
			"words": "漢",
			"location": {
				"top": 529,
				"left": 434,
				"width": 28,
				"height": 39
			}
		},
		"住址": {
			"words": "甘肅省甘谷縣XXXXX",
			"location": {
				"top": 676,
				"left": 235,
				"width": 383,
				"height": 88
			}
		},
		"公民身份号碼": {
			"words": "6205XXXXXXXXXXXXXXX",
			"location": {
				"top": 860,
				"left": 382,
				"width": 503,
				"height": 48
			}
		},
		"出生": {
			"words": "199XXXX",
			"location": {
				"top": 600,
				"left": 232,
				"width": 309,
				"height": 39
			}
		},
		"性别": {
			"words": "男",
			"location": {
				"top": 527,
				"left": 235,
				"width": 33,
				"height": 41
			}
		}
	},
	"log_id": 1362745221229576598,
	"words_result_num": 6,
	"idcard_number_type": 1,
	"image_status": "normal"
}
      

1.3.2、請求代碼

①代碼結構

身份證圖檔識别demo通過百度AI開放平台實作

②需要下載下傳的幾個工具類

FileUtil,Base64Util,HttpUtil,GsonUtils
https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3        

③需要導入的包

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>
    </dependencies>       

④主方法class

package com.baidu.ai.aip;

import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;

import java.net.URLEncoder;

/**
* 身份證識别
*/
public class Idcard {

    /**
    * 重要提示代碼中所需工具類
    * FileUtil,Base64Util,HttpUtil,GsonUtils請從
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下載下傳
    */
    public static String idcard() {
        // 請求url
        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
        try {
            // 本地檔案路徑
            String filePath = "[本地檔案路徑]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "id_card_side=" + "front" + "&image=" + imgParam;

            // 注意這裡僅為了簡化編碼每一次請求都去擷取access_token,線上環境access_token有過期時間, 用戶端可自行緩存,過期後重新擷取。
            String accessToken = "[調用鑒權接口擷取的token]";

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Idcard.idcard();
    }
}
      

  圖檔路徑、front/back為身份證的正反面,token的擷取需要在别的一個工具類中擷取

AuthService中擷取,調用AuthService中的

getAuth傳回token      

⑤AuthService類

package com.baidu.ai.aip.auth;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * 擷取token類
 */
public class AuthService {

    /**
     * 擷取權限token
     * @return 傳回示例:
     * {
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * }
     */
    public static String getAuth() {
        // 官網擷取的 API Key 更新為你注冊的
        String clientId = "百度雲應用的AK";
        // 官網擷取的 Secret Key 更新為你注冊的
        String clientSecret = "百度雲應用的SK";
        return getAuth(clientId, clientSecret);
    }

    /**
     * 擷取API通路token
     * 該token有一定的有效期,需要自行管理,當失效時需重新擷取.
     * @param ak - 百度雲官網擷取的 API Key
     * @param sk - 百度雲官網擷取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
        // 擷取token位址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type為固定參數
                + "grant_type=client_credentials"
                // 2. 官網擷取的 API Key
                + "&client_id=" + ak
                // 3. 官網擷取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打開和URL之間的連接配接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 擷取所有響應頭字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 周遊所有的響應頭字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定義 BufferedReader輸入流來讀取URL的響應
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 傳回結果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = new JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("擷取token失敗!");
            e.printStackTrace(System.err);
        }
        return null;
    }

}      
AK和SK在百度AI開放平台中  文字識别--應用清單--建立應用  就可以看得到

        
身份證圖檔識别demo通過百度AI開放平台實作

⑥demo

連結:https://pan.baidu.com/s/13n7_SPaQLfSsK-uDhS3CBw 
提取碼:vs9g       
(個人              Api Key、              Secret Key,僅供友善參考着使用,請勿用于其他用途                )      

2、通過SDK文檔方式實作

 2.1、OCR Java SDK目錄結構

com.baidu.aip
       ├── auth                                //簽名相關類
       ├── http                                //Http通信相關類
       ├── client                              //公用類
       ├── exception                           //exception類
       ├── ocr
       │       └── AipOcr           //AipOcr類
       └── util                                //工具類
           

2.2、依賴的包

<dependency>
    <groupId>com.baidu.aip</groupId>
    <artifactId>java-sdk</artifactId>
    <version>${version}</version>
</dependency>
      

2.3、測試demo

public class Sample {
    //設定APPID/AK/SK
    public static final String APP_ID = "你的 App ID";
    public static final String API_KEY = "你的 Api Key";
    public static final String SECRET_KEY = "你的 Secret Key";

    public static void main(String[] args) {
        // 初始化一個AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

        // 可選:設定網絡連接配接參數
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可選:設定代理伺服器位址, http和socket二選一,或者均不設定
        client.setHttpProxy("proxy_host", proxy_port);  // 設定http代理
        client.setSocketProxy("proxy_host", proxy_port);  // 設定socket代理

        // 可選:設定log4j日志輸出格式,若不設定,則使用預設配置
        // 也可以直接通過jvm啟動參數設定此環境變量
        System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");

        // 調用接口
        String path = "test.jpg";
        JSONObject res = client.basicGeneral(path, new HashMap<String, String>());
        System.out.println(res.toString(2));
    }
}
      

  這幾個參數在百度AI開放平台直接複制即可

身份證圖檔識别demo通過百度AI開放平台實作

2.4、測試代碼

連結:https://pan.baidu.com/s/1iYy4MIDEWel2w6yG5Dhq7g 
提取碼:0e7e 
(個人          App ID、              Api Key、              Secret Key,僅供友善參考着使用,請勿用于其他用途                )      

後期完善參數資訊