Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享

这篇具有很好参考价值的文章主要介绍了Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Milvus向量库工具类

Milvus的Maven依赖:

        <dependency>
            <groupId>io.milvus</groupId>
            <artifactId>milvus-sdk-java</artifactId>
            <version>2.1.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>log4j-slf4j-impl</artifactId>
                    <groupId>org.apache.logging.log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

向量库的配置类:

@Data
@Component
@ConfigurationProperties(MilvusConfiguration.PREFIX)
public class MilvusConfiguration {
    public static final String PREFIX = "milvus-config";

    public String host;
    public int port;
    public String collectionName;

}

工具类主类:

@Slf4j
@Component
public class MilvusUtil {

    @Resource
    private MilvusConfiguration milvusConfiguration;

    private MilvusServiceClient milvusServiceClient;

    @PostConstruct
    private void connectToServer() {
        milvusServiceClient = new MilvusServiceClient(
                ConnectParam.newBuilder()
                        .withHost(milvusConfiguration.host)
                        .withPort(milvusConfiguration.port)
                        .build());
        // 加载数据
        LoadCollectionParam faceSearchNewLoad = LoadCollectionParam.newBuilder()
                .withCollectionName(milvusConfiguration.collectionName).build();
        R<RpcStatus> rpcStatusR = milvusServiceClient.loadCollection(faceSearchNewLoad);
        log.info("Milvus LoadCollection [{}]", rpcStatusR.getStatus() == 0 ? "Successful!" : "Failed!");
    }
}

主类里的数据入库方法:

    public int insertDataToMilvus(String id, String path, float[] feature) {
        List<InsertParam.Field> fields = new ArrayList<>();
        List<Float> featureList = new ArrayList<>(feature.length);
        for (float v : feature) {
            featureList.add(v);
        }
        fields.add(new InsertParam.Field("id", Collections.singletonList(id)));
        fields.add(new InsertParam.Field("image_path", Collections.singletonList(path)));
        fields.add(new InsertParam.Field("image_feature", Collections.singletonList(featureList)));
        InsertParam insertParam = InsertParam.newBuilder()
                .withCollectionName(milvusConfiguration.collectionName)
                //.withPartitionName("novel")
                .withFields(fields)
                .build();
        R<MutationResult> insert = milvusServiceClient.insert(insertParam);
        return insert.getStatus();
    }

主类类的数据查询方法:

  • 这里的topK没有进行参数化。
    public List<MilvusRes> searchImageByFeatureVector(float[] feature) {
        List<Float> featureList = new ArrayList<>(feature.length);
        for (float v : feature) {
            featureList.add(v);
        }
        List<String> queryOutputFields = Arrays.asList("image_path");

        SearchParam faceSearch = SearchParam.newBuilder()
                .withCollectionName(milvusConfiguration.collectionName)
                .withMetricType(MetricType.IP)
                .withVectorFieldName("image_feature")
                .withVectors(Collections.singletonList(featureList))
                .withOutFields(queryOutputFields)
                .withRoundDecimal(3)
                .withTopK(10).build();
        // 执行搜索
        long l = System.currentTimeMillis();
        R<SearchResults> respSearch = milvusServiceClient.search(faceSearch);
        log.info("MilvusServiceClient.search cost [{}]", System.currentTimeMillis() - l);
        // 解析结果数据
        SearchResultData results = respSearch.getData().getResults();
        int scoresCount = results.getScoresCount();
        SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(results);
        List<MilvusRes> milvusResList = new ArrayList<>();
        for (int i = 0; i < scoresCount; i++) {
            float score = wrapperSearch.getIDScore(0).get(i).getScore();
            Object imagePath = wrapperSearch.getFieldData("image_path", 0).get(i);
            MilvusRes milvusRes = MilvusRes.builder().score(score).imagePath(imagePath.toString()).build();
            milvusResList.add(milvusRes);
        }
        return milvusResList;
    }

2.SeetaSDK工具类

SeetaSDK的Maven依赖:

        <dependency>
            <groupId>com.seeta</groupId>
            <artifactId>sdk</artifactId>
            <version>1.2.1</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/seeta-sdk-platform-1.2.1.jar</systemPath>
        </dependency>
       		<!--注意-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>       

jar是从官网下的源码进行的打包:

Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享,... .. . Java . .. ...,java,milvus,python
工具类主类:

@Slf4j
@Component
public class FaceUtil {

    static {
        // 加载本地方法
        LoadNativeCore.LOAD_NATIVE(SeetaDevice.SEETA_DEVICE_AUTO);
    }

    @Resource
    private SeetaModelConfiguration seetaModelConfiguration;

    private FaceDetectorProxy faceDetectorProxy;
    private FaceLandmarkerProxy faceLandmarkerProxy;
    private FaceRecognizerProxy faceRecognizerProxy;
    private AgePredictorProxy agePredictorProxy;
    private GenderPredictorProxy genderPredictorProxy;
    private MaskDetectorProxy maskDetectorProxy;
    private EyeStateDetectorProxy eyeStateDetectorProxy;

}

主类里的初始方法:

    @PostConstruct
    private void inti() {
        String basePath = seetaModelConfiguration.basePath;
        try {
            // 人脸识别检测器对象池配置
            SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(0, new String[]{basePath + seetaModelConfiguration.faceDetectorModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            faceDetectorProxy = new FaceDetectorProxy(detectorPoolSetting);
            // 关键点定位器【默认使用5点可通过配置切换为68点】
            SeetaConfSetting faceLandmarkerPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(1, new String[]{basePath + seetaModelConfiguration.faceLandmarkerModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            faceLandmarkerProxy = new FaceLandmarkerProxy(faceLandmarkerPoolSetting);
            // 人脸向量特征提取和对比器
            SeetaConfSetting faceRecognizerPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(2, new String[]{basePath + seetaModelConfiguration.faceRecognizerModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            faceRecognizerProxy = new FaceRecognizerProxy(faceRecognizerPoolSetting);
            // 年龄评估器
            SeetaConfSetting agePredictorPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(3, new String[]{basePath + seetaModelConfiguration.agePredictorModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            agePredictorProxy = new AgePredictorProxy(agePredictorPoolSetting);
            // 性别识别器
            SeetaConfSetting genderPredictorPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(4, new String[]{basePath + seetaModelConfiguration.genderPredictorModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            genderPredictorProxy = new GenderPredictorProxy(genderPredictorPoolSetting);
            // 口罩检测器
            SeetaConfSetting maskDetectorPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(5, new String[]{basePath + seetaModelConfiguration.maskDetectorModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            maskDetectorProxy = new MaskDetectorProxy(maskDetectorPoolSetting);
            // 眼睛状态检测
            SeetaConfSetting eyeStaterPoolSetting = new SeetaConfSetting(
                    new SeetaModelSetting(5, new String[]{basePath + seetaModelConfiguration.eyeStateModelFileName},
                            SeetaDevice.SEETA_DEVICE_AUTO));
            eyeStateDetectorProxy = new EyeStateDetectorProxy(eyeStaterPoolSetting);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

主类里的根据图片路径获取脸部特征向量方法:

    /**
     * 根据图片路径获取脸部特征向量
     *
     * @param imagePath 图片路径
     * @return 脸部特征向量
     */
    public float[] getFaceFeaturesByPath(String imagePath) {
        try {
            // 照片人脸识别
            SeetaImageData image = SeetafaceUtil.toSeetaImageData(imagePath);
            SeetaRect[] detects = faceDetectorProxy.detect(image);
            // 人脸关键点定位【主驾或副驾仅有一个人脸,多个人脸仅取第一个】
            if (detects.length > 0) {
                SeetaPointF[] pointFace = faceLandmarkerProxy.mark(image, detects[0]);
                // 人脸向量特征提取features
                return faceRecognizerProxy.extract(image, pointFace);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

主类里的根据人像图片的路径获取其属性【年龄、性别、是否戴口罩、眼睛状态】方法:文章来源地址https://www.toymoban.com/news/detail-539048.html

    /**
     * 根据人像图片的路径获取其属性【年龄、性别、是否戴口罩、眼睛状态】
     *
     * @param imagePath 图片路径
     * @return 图片属性 MAP 对象
     */
    public Map<String, Object> getAttributeByPath(String imagePath) {
        long l = System.currentTimeMillis();
        Map<String, Object> attributeMap = new HashMap<>(4);
        try {
            // 监测人脸
            SeetaImageData image = SeetafaceUtil.toSeetaImageData(imagePath);
            SeetaRect[] detects = faceDetectorProxy.detect(image);
            if (detects.length > 0) {
                SeetaPointF[] pointFace = faceLandmarkerProxy.mark(image, detects[0]);
                // 获取年龄
                int age = agePredictorProxy.predictAgeWithCrop(image, pointFace);
                attributeMap.put("age", age);
                // 性别
                GenderPredictor.GENDER gender = genderPredictorProxy.predictGenderWithCrop(image, pointFace).getGender();
                attributeMap.put("gender", gender);
                // 口罩
                boolean mask = maskDetectorProxy.detect(image, detects[0]).getMask();
                attributeMap.put("mask", mask);
                // 眼睛
                EyeStateDetector.EYE_STATE[] eyeStates = eyeStateDetectorProxy.detect(image, pointFace);
                attributeMap.put("eye", Arrays.toString(eyeStates));
                log.info("getAttributeByPath [{}] cost [{}]", imagePath, System.currentTimeMillis() - l);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return attributeMap;
        }
        return attributeMap;
    }

到了这里,关于Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《向量数据库指南》——宏观解读向量数据库Milvus Cloud

    宏观解读向量数据库 如今,强大的机器学习模型配合 Milvus 等向量数据库的模式已经为电子商务、推荐系统、语义检索、计算机安全、制药等领域和应用场景带来变革。而对于用户而言,除了足够多的应用场景,向量数据库还需要具备更多重要的特性,包括: 可灵活扩展、支

    2024年02月07日
    浏览(33)
  • 《向量数据库指南》——Milvus 中的向量索引概览和平面索引

    目录 Milvus 中的向量索引 索引概览 平面索引 在之前的教程中,我们简单介绍了单词 Embedding 示例,了解了 Embedding 的强大,以及如何在向量数据库中进行向量存储和索引。此外,我们也简单介绍了最近邻搜索算法,这个问题涉及根据所选距离度量找到距离查询向量最接近的向

    2024年02月13日
    浏览(38)
  • docker 安装向量数据库 Milvus

    官网为 www.milvus.io/ Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据(图片 / 视频 / 语音 / 文本)检索。单节点 Milvus 可以在秒内完成十亿级的向量搜索(请参考:在线教程),分布式架构亦能满足用户的水平扩展需求。 Milvus 向量数据库的应用场景包括:互联网娱乐

    2024年02月13日
    浏览(77)
  • 向量数据库Annoy和Milvus

    Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。 Annoy(Approximate Nearest Neighbors Oh Yeah): Annoy 是一种近似最近邻搜索算法,它通过构建一个树状结构来加速最近邻搜索。 Annoy 支持支持欧氏距离,曼哈顿距离,余弦距离,汉明距

    2024年02月09日
    浏览(30)
  • Docker Compose安装milvus向量数据库单机版-milvus基本操作

    以管理员身份运行powershell Ubuntu 22.04 LTS可以不装,wsl必须更新。。。 如果 操作超时 ,可以试试开代理。 重启电脑。。。 设置用户名、密码 https://hub.docker.com/ 重启电脑。。。 power shell输入以下命令,下载yaml文件到指定目录,并重命名为docker-compose.yml 或者 点击一下链接直接

    2024年01月19日
    浏览(46)
  • 《向量数据库》——向量数据库Milvus Cloud 和Dify比较

    Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈,在此前已支持丰富多元的大型语言模型的接入,除了 OpenAI、Anthropic、Azure OpenAI、Hugging face、Replicate 等全球顶尖模型及模型托管平台,也完成了国内主流的各大模型支持(如文心一言、智谱 AI 等)。 而 Zilliz Cloud  和 Milvus 则是

    2024年02月08日
    浏览(46)
  • 【milvus】向量数据库,用来做以图搜图+人脸识别的特征向量

    ref:https://milvus.io/docs 第一次装东西,要把遇到的问题和成功经验都记录下来。 1.Download the YAML file 看一下下载下来的是什么东西 Start Milvus In the same directory as the docker-compose.yml file, start up Milvus by running: 报错则需要安装docker-compose了 下载最新版的docker-compose 文件 添加可执行权限

    2024年02月16日
    浏览(29)
  • 使用docker搭建Milvus向量数据库

    官网是这样说的: Milvus创建于2019年,目标单一:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。 作为一个专门用于处理输入向量查询的数据库,它能够对万亿规模的向量进行索引。与现有的关系数据库不同,Milvus主要按照预定义的模式处

    2024年02月09日
    浏览(27)
  • 《向量数据库指南》——开源框架NVIDIA Merlin & 向量数据库Milvus

    推荐系统 pipeline 中至关重要的一环便是为用户检索并找到最相关的商品。为了实现这一目标,通常会使用低维向量(embedding)表示商品,使用数据库存储及索引数据,最终对数据库中数据进行近似最近邻(ANN)搜索。这些向量表示是通过深度学习模型获取的,而这些深度学习

    2024年02月05日
    浏览(48)
  • 向量检索库Milvus架构及数据处理流程

    搜索或推荐场景,需要将非结构化的物料(媒资)结构化,也即提取特征,然后将特征存储向量数据库,从而实现海量数据快速检索功能。 当前,开源市场比较火的搜索引擎有Faiss,但Faiss更类似于es的lucene,需要上层解决分布式水平扩容、数据一致性、高可用等问题。所以对

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包