zoukankan      html  css  js  c++  java
  • 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一、百度云AI服务

      最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云、腾讯云和百度云。其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度云提供了每日10000次入库和500次检索的免费次数,使得我可以更快地试用,且没有任何花费。更为重要的是,百度云提供了兼容.NET Core 2.0的C# SDK,这是更加让我选择试用的原因。

      

      这里抛开BAT各个AI服务提供的算法的精准度不说,百度的AI服务的友好度还是蛮高的。废话不多说,这里我主要试用百度AI的两个服务:

      (1)图像识别  

      图像识别服务是百度基于深度学习及大规模图像训练,准确识别图片中的物体类别、位置、置信度等综合信息。它的主要应用场合在于:图片内容检索及相册分类或智能美图这种场景。

      

      (2)图像搜索  

      图像搜索是指以图搜图,在指定图库中搜索出相同或相似的图片。这里我主要Focus在了试用相似图片搜索这个子功能,即从一堆图片里(这堆图片是我自己建立的一个图像库)找到跟我指定的一张图片最相似的一些其他图片。

      

      关于百度云AI C# SDK

      百度云AI C# SDK在2018年中旬开始支持了.NET Core 2.0,我们可以通过Nuget安装它:

      

      接下来要做的就是,根据文档的示例完成Demo。

    二、图片内容识别

    2.1 内容识别实现

      代码很简单,直接调用SDK提供的API即可实现图片识别:

        public class Program
        {
            private static ImageClassify aipClassifyClient;
    
            static Program()
            {
                aipClassifyClient = new ImageClassify(BaiduAipSimSettings.ApiKey, BaiduAipSimSettings.SecretKey);
            }
    
            public static void Main(string[] args)
            {
                var filePath = @"Imagesk.jpg";
    
                // 图片识别Demo
                ImageClassifyDemo(filePath);
    
                Console.ReadKey();
            }
    
            private static void ImageClassifyDemo(string filePath)
            {
                var image = File.ReadAllBytes(filePath);
    
                try
                {
                    var result = aipClassifyClient.AdvancedGeneral(image);
                    Console.WriteLine("Api Response :");
                    Console.WriteLine(result);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

      其中,ApiKey和SecretKey是我们在百度云平台申请的账号,可以在管理中心找到:

      

    2.2 内容识别测试

      (1)人物:贝克汉姆

      

      从分析结果中看出,前三个结果是最接近的Topic。

      (2)静物:室内客厅

      接下来来一个复杂一点的客厅照片,看看结果如何:

      

      可以看到,识别结果的自我评分都不太高,我想要的是“客厅”,但是只识别出来了“装修效果图”,还需要多多学习。

    三、获取相似图片

    3.1 准备图片库

      首先,我们需要准备一个图片库,在百度云管理中心创建这个图片库,然后通过Web管理界面或者SDK上传上去:

      

      这里我只上传了100多张图片,实际中应该根据自己的业务场景上传尽可能多的图片。需要说的是,在上传时可以为每个图片添加Tags,这个Tags只能是两个整数(API要求),也就是你本地数据库中的一些ID,比如分类ID。另外就是,对于Brief属性,我们一般可以传递一个JSON字符串进去,可以包含ID、Name以及Url,这样当你获取结果之后可以直接使用这个Brief属性进行反序列化,拿到URL等信息。

    3.2 获取相似图片实现

      代码仍然很简单,如下:

        public class Program
        {
            private static ImageSearch aipSearchClient;
    
            static Program()
            {
                aipSearchClient = new ImageSearch(BaiduAipSimSettings.ApiKey, BaiduAipSimSettings.SecretKey);
            }
    
            public static void Main(string[] args)
            {
                var filePath = @"Images卧室.jpg";
    
                // 相似图片Demo
                SimilarImageDemo(filePath);
    
                Console.ReadKey();
            }
    
            private static void SimilarImageDemo(string filePath)
            {// 检索
                var searchOptions = new Dictionary<string, object>{
                        {"tags", "100,1"},
                        {"tag_logic", "0"},
                        {"pn", "0"},
                        {"rn", "10"}
                    };
                SimilarSearchFromLib(filePath, searchOptions);
            }
    
            /// <summary>
            /// 单张图片入库
            /// </summary>
            private static void ImportToLib(string filePath, Dictionary<string, object> options = null)
            {
                var image = File.ReadAllBytes(filePath);
                
                try
                {
                    var result = aipSearchClient.SimilarAdd(image, options);
                    Console.WriteLine("Api Response :");
                    Console.WriteLine(result);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    
            /// <summary>
            /// 相似图检索
            /// </summary>
            private static void SimilarSearchFromLib(string filePath, Dictionary<string, object> options = null)
            {
                var image = File.ReadAllBytes(filePath);
    
                try
                {
                    var response = aipSearchClient.SimilarSearch(image, options).ToObject<SearchResponse>();
    
                    var result = response.Result.Take(5);
                    Console.WriteLine("Similarity Result :");
                    foreach (var item in result)
                    {
                        Console.WriteLine("{0}:{1}", item.Brief, item.Score);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

      直接参考API文档示例即可。

    3.3 获取结果测试

      测试图片:简约沙发

      

      测试效果如下图所示:

      

      可以看到,它将最相似的图片(全是沙发,当然我的图库里可是沙发、床、椅子、灯具啊啥的都有)都分析出来了:这里我只取了Brief属性,实际中它应该是一个JSON字符串,反序列化后就可以得到URL去获取真正的图片了。

      

    四、小结

      本文是一个简单的百度云AI服务SDK的使用,没有过多关注算法和其他方面,只是一个简单的笔记说明,也希望我们.NET程序员能够多多借助云平台提供的AI服务实现自己的业务智能化实践。后续我会学习学习ML.NET,来玩玩机器学习。

    参考资料

    百度云,《C# SDK技术文档

  • 相关阅读:
    zabbix基于docker安装
    配置Windows实例NTP服务
    linux 上使用yum 安装openjdk1.8
    【Spring Boot-技巧】API返回值去除为NULL的字段
    【微服务】之七:轻松搞定SpringCloud微服务-API权限控制
    【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
    【DevOps】团队敏捷开发系列--开山篇
    【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
    【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon
    【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心
  • 原文地址:https://www.cnblogs.com/edisonchou/p/edc_machine_learning_use_baiduyun_ai_image_service.html
Copyright © 2011-2022 走看看