All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.sdk.fse.FeatureSeSpringController Maven / Gradle / Ivy

There is a newer version: 4.2.1
Show newest version
// ______________________________________________________
// Generated by codegen - https://gitee.com/l0km/codegen 
// template: decorator/spring.controller.class.vm
// ______________________________________________________
/**
 * decorator pattern 装饰者模式代理{@link FeatureSe}接口
* 将{@link FeatureSe}实例封装为一个spring controler
* 计算机生成代码(generated by automated tools DecoratorGenerator @author guyadong)
* @author guyadong * */ package net.gdface.sdk.fse; import java.util.ServiceLoader; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Iterator; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.*; /** * 特征码内存搜索引擎(feature search engine)接口
* 提供高速的人脸特征相似度比对搜索/排序,支持多线程并行搜索,适用于百万级以上人脸库的快速搜索。
* 1.使用 {@link #addFeature(byte[], byte[], String)}方法将特征添加到搜索引擎
* 2.使用 {@link #searchCode(byte[], double, int)}在内存中搜索与指定特征相似的的特征返回搜索结果 * @author guyadong */ @RestController @Api(value="FeatureSe",tags={"FeatureSe Controller"}) public class FeatureSeSpringController { private static final Logger logger = LoggerFactory.getLogger(FeatureSeSpringController.class); private static InstanceSupplier instanceSupplier = getInstanceSupplier(); private final ResponseFactory responseFactory = loadResponseFactory(); /** * SPI(Service Provider Interface)机制加载 {@link InstanceSupplier}实例,没有找到则返回{@code null}, * 返回{@link InstanceSupplier}提供的{@link FeatureSe}实例 * @return 返回{@link FeatureSe}实例 */ private static final InstanceSupplier getInstanceSupplier() { /* SPI(Service Provider Interface)机制加载 {@link InstanceSupplier}实例,没有找到则抛出异常 */ ServiceLoader providers = ServiceLoader.load(InstanceSupplier.class); Iterator itor = providers.iterator(); return itor.hasNext() ? itor.next() : null; } /** * @param instanceSupplier 要设置的 instanceSupplier */ public static void setInstanceSupplier(InstanceSupplier instanceSupplier) { FeatureSeSpringController.instanceSupplier = instanceSupplier; } /** * SPI(Service Provider Interface)加载{@link ResponseFactory}接口实例, * 没有找到则返回{@link DefaultResponseFactory}实例 * @return 返回{@link ResponseFactory}实例 */ private static final ResponseFactory loadResponseFactory() { ServiceLoader providers = ServiceLoader.load(ResponseFactory.class); Iterator itor = providers.iterator(); return itor.hasNext() ? itor.next() : new DefaultResponseFactory(); } public FeatureSeSpringController() { } /** * @return 返回被装饰的{@link FeatureSe}实例 */ protected FeatureSe delegate() { return Objects.requireNonNull( instanceSupplier == null ? null : instanceSupplier.instanceOfFeatureSe(), "FeatureSe instance is null" ); } // port-1 /** * 添加一条特征码到内存表
* @param featureId 特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID * @param feature 特征码字节数组,为{@code null}时返回false * @param imgMD5 特征所属图的MD5(32字节HEX字符串),可为null * @return 添加成功返回true, 否则返回false */ @ResponseBody @RequestMapping(value = "/FeatureSe/addFeatureToFse", method = RequestMethod.POST) @ApiOperation(value = "添加一条特征码到内存表
", notes = "添加一条特征码到内存表
",httpMethod="POST") public Response addFeature( @RequestBody AddFeatureToFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().addFeature(args.featureId,args.feature,args.imgMD5)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-2 /** * 添加一条特征码到内存表
* @param featureId 特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID * @param feature 特征码字节数组,为{@code null}时返回false * @param appid 应用id,由调用者定义,可为null * @return 添加成功返回true, 否则返回false */ @ResponseBody @RequestMapping(value = "/FeatureSe/addFeatureToFseWithAppId", method = RequestMethod.POST) @ApiOperation(value = "添加一条特征码到内存表
", notes = "添加一条特征码到内存表
",httpMethod="POST") public Response addFeature( @RequestBody AddFeatureToFseWithAppIdArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().addFeature(args.featureId,args.feature,args.appid)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-3 /** * 删除内存表中所有特征数据 */ @ResponseBody @RequestMapping(value = "/FeatureSe/clearAllOfFse", method = RequestMethod.POST) @ApiOperation(value = "删除内存表中所有特征数据", notes = "删除内存表中所有特征数据",httpMethod="POST") public Response clearAll() { Response response = responseFactory.newFeatureSeResponse(); try{ delegate().clearAll(); response.onComplete(); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-4 /** * 根据特征码ID在表中查找指定的记录 * @param featureId 特征码ID,MD5校验码(16 bytes) * @return 返回指定的特征记录,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null} */ @ResponseBody @RequestMapping(value = "/FeatureSe/getFeatureFromFse", method = RequestMethod.POST) @ApiOperation(value = "根据特征码ID在表中查找指定的记录", notes = "根据特征码ID在表中查找指定的记录",httpMethod="POST") public Response getFeature( @RequestBody GetFeatureFromFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().getFeature(args.featureId)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-5 /** * 根据特征码ID在表中查找指定的记录 * @param featureId 特征码ID,MD5校验码(32字节HEX字符串) * @return 返回指定的特征记录,没有找到则返回{@code null},{@code featureId}为{@code null}或空返回{@code null} */ @ResponseBody @RequestMapping(value = "/FeatureSe/getFeatureByHexFromFse", method = RequestMethod.POST) @ApiOperation(value = "根据特征码ID在表中查找指定的记录", notes = "根据特征码ID在表中查找指定的记录",httpMethod="POST") public Response getFeatureByHex( @RequestBody GetFeatureByHexFromFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().getFeatureByHex(args.featureId)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-6 /** * 根据特征码ID中表中删除指定的记录 * @param featureId 特征码ID,MD5校验码(16 bytes) * @return 成功删除则返回true,否则返回false */ @ResponseBody @RequestMapping(value = "/FeatureSe/removeFeatureFromFse", method = RequestMethod.POST) @ApiOperation(value = "根据特征码ID中表中删除指定的记录", notes = "根据特征码ID中表中删除指定的记录",httpMethod="POST") public Response removeFeature( @RequestBody RemoveFeatureFromFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().removeFeature(args.featureId)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-7 /** * 根据特征码ID中表中删除指定的记录 * @param featureId 特征码ID,MD5校验码(32字节HEX字符串) * @return 成功删除则返回true,否则返回false */ @ResponseBody @RequestMapping(value = "/FeatureSe/removeFeatureByHexFromFse", method = RequestMethod.POST) @ApiOperation(value = "根据特征码ID中表中删除指定的记录", notes = "根据特征码ID中表中删除指定的记录",httpMethod="POST") public Response removeFeatureByHex( @RequestBody RemoveFeatureByHexFromFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().removeFeatureByHex(args.featureId)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-8 /** * 在内存表中根据比对相似度进行特征码搜索 * @param code 要比对的特征码 * @param sim 相似度阀值 * @param rows 最大返回的记录数 * @return 返回包含相似度(降序)的结果数组,如果没有查到匹配的记录则返回空数组 */ @ResponseBody @RequestMapping(value = "/FeatureSe/searchCodeFromFse", method = RequestMethod.POST) @ApiOperation(value = "在内存表中根据比对相似度进行特征码搜索", notes = "在内存表中根据比对相似度进行特征码搜索",httpMethod="POST") public Response searchCode( @RequestBody SearchCodeFromFseArgs args) { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().searchCode(args.code,args.sim,args.rows)); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } // port-9 /** * @return 内存表中元素个数 */ @ResponseBody @RequestMapping(value = "/FeatureSe/sizeOfFse", method = RequestMethod.POST) @ApiOperation(value = "", notes = "",httpMethod="POST") public Response size() { Response response = responseFactory.newFeatureSeResponse(); try{ response.onComplete(delegate().size()); } catch(Exception e){ logger.error(e.getMessage(),e); response.onError(e); } return response; } /** * argClass-1
* wrap arguments for method {@link #addFeature(AddFeatureToFseArgs)} */ public static class AddFeatureToFseArgs{ @ApiModelProperty(value ="特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID" ,required=true ,dataType="byte[]") public byte[] featureId; @ApiModelProperty(value ="特征码字节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]") public byte[] feature; @ApiModelProperty(value ="特征所属图的MD5(32字节HEX字符串),可为null" ,required=true ,dataType="String") public String imgMD5; } /** * argClass-2
* wrap arguments for method {@link #addFeature(AddFeatureToFseWithAppIdArgs)} */ public static class AddFeatureToFseWithAppIdArgs{ @ApiModelProperty(value ="特征码ID(MD5校验码),为null时,native library会自动计算MD5作为特征码ID" ,required=true ,dataType="byte[]") public byte[] featureId; @ApiModelProperty(value ="特征码字节数组,为{@code null}时返回false" ,required=true ,dataType="byte[]") public byte[] feature; @ApiModelProperty(value ="应用id,由调用者定义,可为null" ,required=true ,dataType="long") public long appid; } /** * argClass-4
* wrap arguments for method {@link #getFeature(GetFeatureFromFseArgs)} */ public static class GetFeatureFromFseArgs{ @ApiModelProperty(value ="特征码ID,MD5校验码(16 bytes)" ,required=true ,dataType="byte[]") public byte[] featureId; } /** * argClass-5
* wrap arguments for method {@link #getFeatureByHex(GetFeatureByHexFromFseArgs)} */ public static class GetFeatureByHexFromFseArgs{ @ApiModelProperty(value ="特征码ID,MD5校验码(32字节HEX字符串)" ,required=true ,dataType="String") public String featureId; } /** * argClass-6
* wrap arguments for method {@link #removeFeature(RemoveFeatureFromFseArgs)} */ public static class RemoveFeatureFromFseArgs{ @ApiModelProperty(value ="特征码ID,MD5校验码(16 bytes)" ,required=true ,dataType="byte[]") public byte[] featureId; } /** * argClass-7
* wrap arguments for method {@link #removeFeatureByHex(RemoveFeatureByHexFromFseArgs)} */ public static class RemoveFeatureByHexFromFseArgs{ @ApiModelProperty(value ="特征码ID,MD5校验码(32字节HEX字符串)" ,required=true ,dataType="String") public String featureId; } /** * argClass-8
* wrap arguments for method {@link #searchCode(SearchCodeFromFseArgs)} */ public static class SearchCodeFromFseArgs{ @ApiModelProperty(value ="要比对的特征码" ,required=true ,dataType="byte[]") public byte[] code; @ApiModelProperty(value ="相似度阀值" ,required=true ,dataType="double") public double sim; @ApiModelProperty(value ="最大返回的记录数" ,required=true ,dataType="int") public int rows; } /** * 获取{@link FeatureSe}实例的接口, * 用于应用层SPI方式提供{@link FeatureSe}实例 * @author guyadong * */ public static interface InstanceSupplier{ FeatureSe instanceOfFeatureSe(); } /** * web响应数据接口 * @author guyadong * */ public static interface Response{ /** * 接口方法调用成功 * @param result 调用返回值 */ void onComplete(Object result); /** * 接口方法调用成功,调用方法返回类型为void */ void onComplete(); /** * 接口方法调用抛出异常 * @param e 异常 */ void onError(Exception e); } /** * 获取{@link Response}接口实例的工厂类接口 * @author guyadong * */ public static interface ResponseFactory{ /** * @return 返回新的{@link Response}接口实例 */ Response newFeatureSeResponse(); } /** * {@link Response}默认实现 * @author guyadong * */ public static class DefaultResponse implements Response{ private static boolean outStrackTrace = false; private boolean success; /** RPC调用的返回值 */ private Object result; /** 异常信息 */ private String errorMessage; /** 异常堆栈信息 */ private String stackTrace; @Override public void onComplete(Object result) { this.success = true; this.result = result; } @Override public void onComplete() { onComplete(null); } @Override public void onError(Exception e) { success = false; errorMessage = e.getMessage(); if(errorMessage == null){ errorMessage = e.getClass().getSimpleName(); } if(outStrackTrace){ StringWriter writer = new StringWriter(); e.printStackTrace(new PrintWriter(writer)); stackTrace = writer.toString(); } } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } public String getStackTrace() { return stackTrace; } public void setStackTrace(String stackTrace) { this.stackTrace = stackTrace; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("DefaultResponse [success="); builder.append(success); builder.append(", "); if (result != null) { builder.append("result="); builder.append(result); builder.append(", "); } if (errorMessage != null) { builder.append("errorMessage="); builder.append(errorMessage); builder.append(", "); } if (stackTrace != null) { builder.append("stackTrace="); builder.append(stackTrace); } builder.append("]"); return builder.toString(); } /** * 开启输出堆栈信息(默认为不开启)
* 开发时为了调试需要获取详细的异常堆栈信息可以开启 * @param outStrackTrace 要设置的 outStrackTrace */ public static void enableStrackTrace() { outStrackTrace = true; } } /** * {@link ResponseFactory}接口默认实现 * @author guyadong * */ public static class DefaultResponseFactory implements ResponseFactory{ @Override public Response newFeatureSeResponse() { return new DefaultResponse(); } } public static String DESCRIPTION = "特征码内存搜索引擎(feature search engine)接口
\n" +" 提供高速的人脸特征相似度比对搜索/排序,支持多线程并行搜索,适用于百万级以上人脸库的快速搜索。
\n" +" 1.使用 {@link #addFeature(byte[], byte[], String)}方法将特征添加到搜索引擎
\n" +" 2.使用 {@link #searchCode(byte[], double, int)}在内存中搜索与指定特征相似的的特征返回搜索结果"; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy