一、前言
- 建議使用低版本 SDK : Baidu_Face_Offline_SDK_Windows_Java_6.1.3
- 目前已知8.x版本對(duì)服務(wù)端不兼容,存在運(yùn)行過程中,第一次調(diào)用sdk能夠正常執(zhí)行,第二次時(shí)出現(xiàn)JVM異常。
- SDK不支持多線程,一般都用于設(shè)備端,如人臉閘機(jī)上的面板機(jī)設(shè)備。
- 自定義庫文件路徑,與項(xiàng)目分離。
- 整合springBoot項(xiàng)目,實(shí)現(xiàn)啟動(dòng)初始化SDK,按需調(diào)用。
二、SDK 引入并配置
- 解壓程序,查看對(duì)應(yīng)操作系統(tǒng)的文件夾,將src目錄下的文件移動(dòng)到我們的項(xiàng)目中。請(qǐng)不要修改此目錄結(jié)構(gòu)。
- 給Face.java類添加注解,實(shí)現(xiàn)條件實(shí)例化。
@Slf4j
@Component
@Conditional(FaceSdkEnableCondition.class)
public class Face {
// *******以下為人臉sdk api接口*********
- 修改Face.java類加載庫的方式,以及初始化。
- 新增 Environment 類動(dòng)態(tài)獲取庫路徑。
- 更換 System.load() 加載庫文件。
- 使用
@PostConstruct
注解,當(dāng)類對(duì)象被創(chuàng)建時(shí),自動(dòng)完成初始化工作。 - 使用
@PreDestroy
注解,當(dāng)類對(duì)象被銷毀時(shí),自動(dòng)完成釋放內(nèi)存工作。
// ********* 以下為系統(tǒng)加載庫文件及opencv **********
private static String libPath;
public Face(){ }
@Autowired
public Face(Environment env) {
// 初始化libPath
libPath = env.getProperty("face-sdk.libPath",String.class);
// 加載dll文件
System.load(libPath + "BaiduFaceApi.dll");
System.load(libPath + "opencv_java320.dll");
}
Face api = null;
/* sdk初始化 */
@PostConstruct
public void init() {
log.info("離線SDK開始初始化");
log.info("SDK路徑:{}",libPath);
api = new Face();
int res = api.sdkInit(libPath);
if (res != 0) {
log.info("sdk init fail and error = {}\n", res);
return;
}
log.info("離線SDK初始化完成");
}
/* sdk釋放內(nèi)存 */
@PreDestroy
private void destroy() {
if(api != null){
api.sdkDestroy();
}
log.info("離線SDK銷毀");
}
- 配置條件啟動(dòng)類相關(guān)
package cn.dyina.config;
public class FaceSdkEnableCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
// 根據(jù)face-sdk.enable屬性來決定是否創(chuàng)建 Face bean
return "true".equals(env.getProperty("face-sdk.enable"));
}
}
-
配置路徑存放庫文件
face-sdk: enable: true # 路徑請(qǐng)務(wù)必使用雙斜桿 libPath: D:\\FaceLib\\ imagesPath: D:\\FaceImages\\
- 請(qǐng)將SDK文件的所有.dll文件拷貝到
libPath
目錄下。 - 請(qǐng)將SDK文件下的opencv-jar、models、license文件夾拷貝到
libPath
目錄下。 - 請(qǐng)登錄 百度智能云 控制中心,注冊(cè)并獲取離線識(shí)別SDK序列號(hào),替換license\license.key內(nèi)的序列號(hào)。
- 請(qǐng)將SDK文件的所有.dll文件拷貝到
-
安裝maven依賴,以解決打包異常
- 請(qǐng)修改并在項(xiàng)目終端執(zhí)行以下的命令,將opencv-jar下的opencv-320.jar依賴安裝到maven倉庫。
mvn install:install-file -DgroupId=cn.dyina(jar包的groupId) -DartifactId=opencv-jar(jar包的artifactId) -Dversion=1.0(jar的版本號(hào)) -Dpackaging=jar -Dfile=D:\FaceLib\opencv-jar\opencv-320.jar(jar包的具體路徑)
- 添加maven依賴
<!-- 本地依賴 opencv-jar--> <dependency> <groupId>cn.dyina</groupId> <artifactId>opencv-jar</artifactId> <version>1.0</version> </dependency>
三、項(xiàng)目使用
- 在SpringBoot啟動(dòng)類上,添加包掃描。
@SpringBootApplication(scanBasePackages = {"cn.dyina","com.jni"})
public class SpringBootBaiDuFaceSdkApplication {
//...
}
- 編寫service、controller。(以下示例代碼僅提供參考,請(qǐng)根據(jù)自己的業(yè)務(wù)需求進(jìn)行編寫。)
@Slf4j
@Service
public class FaceService {
@Value("${face-sdk.imagesPath}")
String imagesPath;
public String registerFace(String fileName, String nickName) {
// 注冊(cè)人臉圖片
String ip_nickName = fileName.replaceFirst("[.][^.]+$", "");
// 獲取人臉特征值
Mat mat = Imgcodecs.imread(imagesPath + fileName);
long matAddr = mat.getNativeObjAddr();
// 填充人臉信息 后期將從數(shù)據(jù)庫獲取
String userInfo = nickName;
String userId = ip_nickName.replace(".","");
String groupId = "Face";
// 用人臉特征值注冊(cè)
JSONObject res = JSONObject.parseObject(Face.userAddByMat(matAddr, userId, groupId, userInfo));
log.info("user add result is:{}", res);
return res.getString("msg");
}
public String identifyFace(String fileName) {
// 調(diào)用人臉sdkAPI
Face.loadDbFace();
Mat mat1 = Imgcodecs.imread(imagesPath + fileName);
long mat1Addr = mat1.getNativeObjAddr();
int type = 0;
// 和人臉庫里面的人臉特征值比較(人臉識(shí)別)
JSONObject res = JSONObject.parseObject(Face.identifyWithAllByMat(mat1Addr, type));
log.info("identify res is:{}", res);
if (!res.getString("errno").equals("0")) {
return res.getString("msg");
}
// 獲取人臉識(shí)別信息
double score = res.getJSONObject("data")
.getJSONArray("result")
.getJSONObject(0)
.getDouble("score");
String userId = res.getJSONObject("data")
.getJSONArray("result")
.getJSONObject(0)
.getString("user_id");
if (score > 80) {
String nickName = userId.split("_")[1];
return nickName;
} else {
log.info("根據(jù)圖片獲取人員信息失敗");
return "Match score is low";
}
}
}
/**
* 人臉識(shí)別 頁面相關(guān)接口
*/
@Slf4j
@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
public class FaceController {
@Autowired
private FaceService faceService;
@Value("${face-sdk.imagesPath}")
String imagesPath;
/**
* 人臉注冊(cè)
* @param file
* @param ip
* @param nickName
* @return
* @throws IOException
*/
@PostMapping("/faceRegister")
public R<String> faceRegister(@RequestParam("photo") MultipartFile file,
@RequestParam("ip") String ip,
@RequestParam("nickName") String nickName) throws IOException {
String photo = Base64.getEncoder().encodeToString(file.getBytes());
String fileName = ip + "_" + nickName + ".jpg";
Base64ToImage.saveImage(imagesPath, fileName, photo);
// 人臉注冊(cè)
String res = faceService.registerFace(fileName, nickName);
if(!res.equals("success")){
return R.error(res,null);
}
return R.success(null);
}
/**
* 檢測人臉
* @param photo
* @param ip
* @return
*/
@PostMapping("/faceDetection")
public R<String> faceDetection(@RequestParam("photo") String photo, @RequestParam("ip") String ip) {
String fileName = ip +".jpg"; // 臨時(shí)存儲(chǔ),用于檢測
Base64ToImage.saveImage(imagesPath, fileName, photo);
String res = faceService.identifyFace(fileName);
return R.success(res);
}
/**
* 查詢用戶組人臉
* @param groupId
* @return
*/
@GetMapping("/getAllFace")
public R<List> getAllFace(@RequestParam("groupId") String groupId){
log.info("====>> getAllFace");
List<String> userIdList = faceService.getAllFace(groupId);
return R.success(userIdList);
}
}
后記
-
com.jni.face
包下,除了Face.java類,其他都是示例程序,可以視情況刪除。 -
models 文件夾里的模型可以按情況刪除,詳細(xì)可以查看文檔。
-
項(xiàng)目啟動(dòng)后,你的控制臺(tái)應(yīng)該會(huì)收到SDK初始化的信息。并且你的
libPath
目錄下應(yīng)該生成db文件夾,人臉數(shù)據(jù)將存儲(chǔ)在這里。(db文件夾將生成在庫文件所在目錄。刪除face.db后,初始化SDK時(shí)會(huì)自動(dòng)生成,不需要額外操作。) -
請(qǐng)不要使用熱部署插件,會(huì)導(dǎo)致依賴報(bào)錯(cuò)。文章來源:http://www.zghlxwxcb.cn/news/detail-476984.html
-
有生產(chǎn)需求的,但設(shè)備量不多,可以咸魚買序列號(hào)。(官網(wǎng)最低100個(gè)起購)文章來源地址http://www.zghlxwxcb.cn/news/detail-476984.html
到了這里,關(guān)于百度人臉識(shí)別_SpringBoot整合離線SDK的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!