0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在APT-Pi上实现图像识别功能

RTThread物联网操作系统 ? 来源:RTThread物联网操作系统 ? 作者:Papalymo ? 2021-10-09 15:46 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

不用自己训练模型,也能进行 AI 图像识别;借助百度云平台,我们可以在 APT-Pi 上实现图像识别功能。

创建图像识别应用

1、打开链接 百度智能云, 申请账号;2、打开控制台

3、打开图像识别

4、创建应用

5、获取 AK 和 SK

通用图像识别

该请求用于通用物体及场景识别,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的多个物体及场景标签

1、打开 image_classify.c 文件, 修改 access_token, 填入应用的 AK 和 SK;

2、在 SD 卡中放入要识别的图片;

3、编译下载;

4、在终端输入命令: baidu_ai cat.jpg

5、加入百度百科,使能宏定义:#define BD_AI_BAIKE,编译下载:

返回说明

返回参数

707e862a-21dd-11ec-82a8-dac502259ad0.png

菜品识别

该请求用于菜品识别。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的菜品名称、卡路里信息、置信度。

1、修改 URL 为菜品识别:

1 index = strlen(BAIDU_AI_API[1]);

2 post_uri_size = index;

3 post_uri = rt_malloc(256);

45 rt_memcpy(post_uri, BAIDU_AI_API[1], post_uri_size);

2、编译下载;

3、识别结果:

71395fd6-21dd-11ec-82a8-dac502259ad0.png

返回说明

返回参数

724d175a-21dd-11ec-82a8-dac502259ad0.png

监控报表

在百度服务端,可以查看 API 调用成功和失败的次数:

图像格式

图像格式转换流程:

736ea7f2-21dd-11ec-82a8-dac502259ad0.png

1、百度 AI 支持的图像格式有:PNG、JPG、JPEG、BMP

2、原始的图片数据需要转换为 base64 编码

3、base64 编码的图片数据进行百分比编码

Base64 编码

请求图片需经过base64编码:图片的base64编码指将一副图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

百分比编码

百分比编码 是一种拥有8位字符编码的编码机制,这些编码在URL的上下文中具有特定的含义。它有时被称为URL编码。编码由英文字母替换组成:“%” 后跟替换字符的ASCII的十六进制表示。

需要编码的特殊字符有:‘:’,‘/’,‘?’,‘#’,‘[’,‘]’,‘@’,‘!’,‘$’,‘&’,“‘”,’(‘,’)‘,’*‘,’+‘,’,‘,’;‘,’=‘,以及,’%‘` 本身。其他的字符虽然可以进行编码但是不需要。

’:‘ ’/‘ ’?‘ ’#‘ ’[‘ ’]‘ ’@‘ ’!‘ ’$‘ ’&‘ “’” ‘(’ ‘)’ ‘*’ ‘+’ ‘,’ ‘;’ ‘=’ ‘%’ ‘ ’

%3A %2F %3F %23 %5B %5D %40 %21 %24 %26 %27 %28 %29 %2A %2B %2C %3B %3D %25 %20 或 +

根据上下文, 空白符 ’ ’ 将会转换为 ‘+’ (必须在HTTP的POST方法中使定义 application/x-www-form-urlencoded 传输方式), 或者将会转换为 ‘%20’ 的 URL。

图像识别流程

获取 token

1 /* get token */ 2int get_ai_token(const char *uri, unsigned char *token)

3{

4 char *request = RT_NULL;

5 int token_len = 0, index = 0;

6 7 cJSON* cjson_parse = RT_NULL;

8 cJSON* cjson_token = RT_NULL;

910 if (webclient_request(uri, RT_NULL, RT_NULL, (unsigned char **)&request) 《 0)

11 {

12 rt_kprintf(“webclient send get request failed.”);

13 return -RT_ERROR;

14 }

1516 rt_kprintf(“webclient send get request by simplify request interface.

”);

17 rt_kprintf(“webclient get response data:

”);

1819 for (index = 0; index 《 rt_strlen(request); index++)

20 {

21 rt_kprintf(“%c”, request[index]);

22 }

23 rt_kprintf(“

”);

2425 cjson_parse = cJSON_Parse(request);

26 if(cjson_parse == RT_NULL)

27 {

28 LOG_E(“parse fail.

”);

29 goto __exit;

30 }

3132 cjson_token = cJSON_GetObjectItem(cjson_parse, “access_token”);

33 if (cjson_token == RT_NULL)

34 {

35 LOG_E(“get onject ‘access_token’ item fail.

”);

36 goto __exit;

37 }

3839 LOG_D(“get_token: %s

”, cjson_token-》valuestring);

40 token_len = rt_strlen(cjson_token-》valuestring);

41 rt_memcpy(token, cjson_token-》valuestring, token_len);

4243__exit:

4445 if (cjson_parse)

46 {

47 cJSON_Delete(cjson_parse);

48 cjson_parse = RT_NULL;

49 cjson_token = RT_NULL;

50 }

5152 if (request)

53 {

54 web_free(request);

55 }

5657 return token_len;

58}

图片数据编码

Base 64

1static const char base64_chars[] = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;

2 3/* encode image */ 4int base64_encode(unsigned char * bytes_to_encode, unsigned char *encode, int bytes_len)

5{

6 int i = 0, j = 0, encode_size = 0;

7 unsigned char char_array_3[3];

8 unsigned char char_array_4[4];

910 while (bytes_len--)

11 {

12 char_array_3[i++] = *(bytes_to_encode++);

1314 if (i == 3)

15 {

16 char_array_4[0] = (char_array_3[0] & 0xfc) 》》 2;

17 char_array_4[1] = ((char_array_3[0] & 0x03) 《《 4) + ((char_array_3[1] & 0xf0) 》》 4);

18 char_array_4[2] = ((char_array_3[1] & 0x0f) 《《 2) + ((char_array_3[2] & 0xc0) 》》 6);

19 char_array_4[3] = char_array_3[2] & 0x3f;

2021 for(i = 0; i 《 4; i++)

22 {

23 encode[encode_size++] = base64_chars[char_array_4[i]];

24 }

25 i = 0;

26 }

27 }

2829 if (i)

30 {

31 for (j = i; j 《 3; j++)

32 {

33 char_array_3[j] = ‘’;

34 }

3536 char_array_4[0] = (char_array_3[0] & 0xfc) 》》 2;

37 char_array_4[1] = ((char_array_3[0] & 0x03) 《《 4) + ((char_array_3[1] & 0xf0) 》》 4);

38 char_array_4[2] = ((char_array_3[1] & 0x0f) 《《 2) + ((char_array_3[2] & 0xc0) 》》 6);

39 char_array_4[3] = char_array_3[2] & 0x3f;

4041 for(j = 0; (j 《 i + 1); j++)

42 {

43 encode[encode_size++] = base64_chars[char_array_4[j]];

44 }

4546 while ((i++ 《 3))

47 {

48 encode[encode_size++] = ‘=’;

49 }

50 }

5152 return encode_size;

53}

百分比编码

1int http_percentage_coding(unsigned char *org_data, unsigned char *new_data, int len)

2{

3 int i = 0;

4 unsigned char org_char = 0;

5 6 while (len--)

7 {

8 org_char = *(org_data++);

9 switch (org_char)

10 {

11 case ‘:’ :

12 new_data[i++] = ‘%’;

13 new_data[i++] = ‘3’;

14 new_data[i++] = ‘A’;

15 break;

16 17 case ‘/’ :

18 new_data[i++] = ‘%’;

19 new_data[i++] = ‘2’;

20 new_data[i++] = ‘F’;

21 break;

22 23 case ‘?’ :

24 new_data[i++] = ‘%’;

25 new_data[i++] = ‘3’;

26 new_data[i++] = ‘F’;

27 break;

28 29 case ‘#’ :

30 new_data[i++] = ‘%’;

31 new_data[i++] = ‘2’;

32 new_data[i++] = ‘3’;

33 break;

34 35 case ‘[’ :

36 new_data[i++] = ‘%’;

37 new_data[i++] = ‘5’;

38 new_data[i++] = ‘B’;

39 break;

40 41 case ‘]’ :

42 new_data[i++] = ‘%’;

43 new_data[i++] = ‘5’;

44 new_data[i++] = ‘D’;

45 break;

46 47 case ‘@’ :

48 new_data[i++] = ‘%’;

49 new_data[i++] = ‘4’;

50 new_data[i++] = ‘0’;

51 break;

52 53 case ‘!’ :

54 new_data[i++] = ‘%’;

55 new_data[i++] = ‘2’;

56 new_data[i++] = ‘1’;

57 break;

58 59 case ‘$’ :

60 new_data[i++] = ‘%’;

61 new_data[i++] = ‘2’;

62 new_data[i++] = ‘4’;

63 break;

64 65 case ‘&’ :

66 new_data[i++] = ‘%’;

67 new_data[i++] = ‘2’;

68 new_data[i++] = ‘6’;

69 break;

70 71 case ‘’‘ :

72 new_data[i++] = ’%‘;

73 new_data[i++] = ’2‘;

74 new_data[i++] = ’7‘;

75 break;

76 77 case ’(‘ :

78 new_data[i++] = ’%‘;

79 new_data[i++] = ’2‘;

80 new_data[i++] = ’8‘;

81 break;

82 83 case ’)‘ :

84 new_data[i++] = ’%‘;

85 new_data[i++] = ’2‘;

86 new_data[i++] = ’9‘;

87 break;

88 89 case ’*‘ :

90 new_data[i++] = ’%‘;

91 new_data[i++] = ’2‘;

92 new_data[i++] = ’A‘;

93 break;

94 95 case ’+‘ :

96 new_data[i++] = ’%‘;

97 new_data[i++] = ’2‘;

98 new_data[i++] = ’B‘;

99 break;

100101 case ’,‘ :

102 new_data[i++] = ’%‘;

103 new_data[i++] = ’2‘;

104 new_data[i++] = ’C‘;

105 break;

106107 case ’;‘ :

108 new_data[i++] = ’%‘;

109 new_data[i++] = ’3‘;

110 new_data[i++] = ’B‘;

111 break;

112113 case ’=‘ :

114 new_data[i++] = ’%‘;

115 new_data[i++] = ’3‘;

116 new_data[i++] = ’D‘;

117 break;

118119 case ’%‘ :

120 new_data[i++] = ’%‘;

121 new_data[i++] = ’2‘;

122 new_data[i++] = ’5‘;

123 break;

124125 case ’ ‘ :

126 new_data[i++] = ’%‘;

127 new_data[i++] = ’2‘;

128 new_data[i++] = ’0‘;

129 break;

130131 default:

132 new_data[i++] = org_char;

133 break;

134 }

135 }

136 return i;

137}

获取识别结果

1int get_ai_result(const char *uri, const char *post_data, int post_data_size)

2{

3 struct webclient_session* session = RT_NULL; 4 unsigned char *buffer = RT_NULL;

5 int index, result = 0, resp_status, bytes_read;

6 7 buffer = (unsigned char *)web_malloc(POST_RESP_BUFSZ);

8 if (buffer == RT_NULL)

9 {

10 rt_kprintf(“no memory for receive response buffer.

”);

11 result = -RT_ENOMEM;

12 goto __exit;

13 }

1415 /* create webclient session and set header response size */16 session = webclient_session_create(POST_HEADER_BUFSZ);

17 if (session == RT_NULL)

18 {

19 result = -RT_ENOMEM;

20 goto __exit;

21 }

2223 /* add http header */24 webclient_header_fields_add(session, “Content-Length: %d

”, post_data_size);

25 webclient_header_fields_add(session, “Content-Type: application/x-www-form-urlencoded

”);

2627 /* send POST request by default header */28 if ((resp_status = webclient_post(session, uri, (const char *)post_data)) != 200)

29 {

30 LOG_E(“webclient POST request failed, response(%d) error.

”, resp_status);

31 result = -RT_ERROR;

32 goto __exit;

33 }

3435 rt_kprintf(“webclient post response data:

”);

36 do37 {

38 bytes_read = webclient_read(session, buffer, POST_RESP_BUFSZ);

39 if (bytes_read 《= 0)

40 {

41 break;

42 }

43 for (index = 0; index 《 bytes_read; index++)

44 {

45 rt_kprintf(“%c”, buffer[index]);

46 }

4748 } while (1);

4950 rt_kprintf(“

”);

5152__exit:

53 if (session)

54 {

55 webclient_close(session);

56 }

5758 if (buffer)

59 {

60 web_free(buffer);

61 }

6263 return result;

64}

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PI
    PI
    +关注

    关注

    12

    文章

    225

    浏览量

    113304
  • 图像识别
    +关注

    关注

    9

    文章

    527

    浏览量

    39208
  • AI
    AI
    +关注

    关注

    88

    文章

    35506

    浏览量

    281400

原文标题:基于ART-Pi实现的AI图像识别

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FPGA的数字识别系统设计

    、数字识别、HDMI显示四个主要模块,成功识别到纯底色的一位数字,并在显示屏的数字表中选中该数字,基本实现了本次设计的
    的头像 发表于 07-16 14:28 ?607次阅读
    基于FPGA的数字<b class='flag-5'>识别</b>系统设计

    火车车号图像识别系统如何应对不同光照条件下的识别问题?

    在铁路运输管理中,准确识别火车车号是实现自动化车辆管理的关键环节。然而,实际应用场景中复杂多变的光照条件给车号识别带来了巨大挑战。现代火车车号图像识别系统通过多项技术创新,有效解决了这
    的头像 发表于 07-15 11:37 ?169次阅读
    火车车号<b class='flag-5'>图像识别</b>系统如何应对不同光照条件下的<b class='flag-5'>识别</b>问题?

    想用K230放在无人机上做图像识别,加装一个4G模块把识别结果和画面同时传输的地面站或者手机上,怎么操作?

    我想用K230放在无人机上做图像识别,然后想加装一个4G模块把识别结果和画面同时传输的地面站或者手机上,这个目前可以如何处理? 你好,目前底层是支持4G模块得驱动,参考https
    发表于 06-16 07:08

    基于RV1126开发板实现驾驶员行为检测方案

    在RV1126实现驾驶员行为检测:通过图像识别出这几种行为:打电话、抽烟、疲劳驾驶。
    的头像 发表于 04-21 11:07 ?500次阅读
    基于RV1126开发板<b class='flag-5'>实现</b>驾驶员行为检测方案

    基于RV1126开发板实现驾驶员行为检测方案

    在RV1126开发板实现驾驶员行为检测:通过图像识别出这几种行为:打电话、抽烟、疲劳驾驶。
    的头像 发表于 04-18 17:47 ?354次阅读
    基于RV1126开发板<b class='flag-5'>实现</b>驾驶员行为检测方案

    手持终端集装箱识别系统的图像识别技术

    行业提供了更灵活、精准的管理工具。 一、技术核心:OCR+AI深度融合 现代手持终端系统采用多模态图像识别技术,结合深度学习算法,可快速捕捉并解析集装箱号码。其技术优势体现在: 1. 复杂环境适应性:通过动态曝光补偿和图像增强算
    的头像 发表于 04-03 10:49 ?323次阅读

    岸桥箱号识别系统如何工作?揭秘AI图像识别技术!

    在港口自动化升级的浪潮中,AI岸桥识别系统凭借前沿的图像识别技术,成为提升码头作业效率的“智慧之眼”。那么,这套系统如何实现集装箱信息的精准捕捉?又是如何通过AI技术替代传统人工理货?让我们一探
    的头像 发表于 04-02 09:45 ?287次阅读

    惊了!这个“神器”让树莓派秒变智能管家,图像识别+无线投屏,太秀了!

    和BalenaCloud,让树莓派实现图像识别到智能生活的华丽转身!图像分类项目:用树莓派和BalenaOS实现智能识别1.项目背景:让树
    的头像 发表于 03-25 09:23 ?691次阅读
    惊了!这个“神器”让树莓派秒变智能管家,<b class='flag-5'>图像识别</b>+无线投屏,太秀了!

    【幸狐Omni3576边缘计算套件试用体验】RKNN 推理测试与图像识别

    【幸狐 Omni3576 边缘计算套件测评】RKNN 推理测试与图像识别 本文介绍了幸狐 Omni3576 边缘计算套件实现 RKNN 推理和图像物体识别的测试流程,包括 RKNN 介
    发表于 03-20 16:14

    BP神经网络在图像识别中的应用

    BP神经网络在图像识别中发挥着重要作用,其多层结构使得网络能够学习到复杂的特征表达,适用于处理非线性问题。以下是对BP神经网络在图像识别中应用的分析: 一、BP神经网络基本原理 BP神经网络,即反向
    的头像 发表于 02-12 15:12 ?729次阅读

    高帧频图像识别反无人机 慧视有办法!

    的基础加装AI高性能图像处理板,在算法的作用下,就具备无人机识别功能,为无人机对抗创造条件。由于无人机飞行速度极快,因此针对于这样环境下的AI
    的头像 发表于 12-04 01:06 ?645次阅读
    高帧频<b class='flag-5'>图像识别</b>反无人机   慧视有办法!

    AI图像识别摄像机

    ?AI图像识别摄像机是一种集成了先进算法和深度学习模型的智能监控设备。这些摄像机不仅能够捕捉视频画面,还能实时分析和处理所拍摄的内容,从而实现对特定对象、场景或行
    的头像 发表于 11-08 10:38 ?928次阅读
    AI<b class='flag-5'>图像识别</b>摄像机

    AI大模型在图像识别中的优势

    AI大模型在图像识别中展现出了显著的优势,这些优势主要源于其强大的计算能力、深度学习算法以及大规模的数据处理能力。以下是对AI大模型在图像识别中优势的介绍: 一、高效性与准确性 处理速度 :AI
    的头像 发表于 10-23 15:01 ?2510次阅读

    【飞凌嵌入式OK3576-C开发板体验】RKNPU图像识别测试

    和突触的处理器,特别擅长处理人工智能任务,能够大大降低CPU和GPU的负担。 功能 :RKNPU负责处理需要高计算性能的人工智能任务,如图像识别、语音识别、自然语言处理等,从而提升设备的智能化水平
    发表于 10-10 09:27

    何在DRA821U使用Linux实现快速引导

    电子发烧友网站提供《如何在DRA821U使用Linux实现快速引导.pdf》资料免费下载
    发表于 09-03 10:11 ?0次下载
    如<b class='flag-5'>何在</b>DRA821U<b class='flag-5'>上</b>使用Linux<b class='flag-5'>实现</b>快速引导