基于OrangePi Zero 2实现垃圾分类智能垃圾桶项目(3)阿里云垃圾识别方案与调用阿里云Python接口

阿里云垃圾识别方案

1、接入阿里云

在垃圾分类的项目中,我们采用阿里云视觉智能开发平台的接口来做垃圾分类的识别方案,通过上传本地 的拍照下的垃圾图片,通过阿里提供的接口来识别出该垃圾是干垃圾、湿垃圾、回收垃圾还是有害垃圾。 对应官网地址如下:

https://vision.aliyun.com/

 然后在下面的输入框输入“垃圾分类”:

可以跳转到对应的垃圾分类的“免费开通"和”技术文档页面“:

https://vision.aliyun.com/experience/detail? spm=a2c4g.11186623.0.0.6f1b55e2n5cBbZ&tagName=imagerecog&children=ClassifyingRubbish

可以先选择"技术文档"查看下使用方法:

根据上面描述的指引,蓝色为可点进去的详细说明,完成注册及运行环境的搭建。

2、开通账号并登录:

1. 开通阿里云账号及图像识别服务,用自己支付宝即可开通

2. 创建并获取AccessKey ID和Secret

3. 在Linux或开发板上安装所需的SDK

4. 根据示例代码进行修改垃圾分类识别  

5. 选择免费开通,通过自己的支付宝或者账号登录即可。

6. 登录完成后,即可在产品控制台->点击获取Acce Token获取 对应的AccessKey ID和AccessKey Secret

当然,在第一次获取到AccessKey ID和AccessKey Secret,需要点击创建AccessKey, 然后最好把AccessKey.csv下载下来备份,不然会找不到AccessKey Secret就需要重新创建。

3、安装SDK

在ubuntu 22.04或者众志开发板(orangepi 3.0.6)上安装图像识别(imagerecog)SDK

sudo apt install python3-pip
pip3 install alibabacloud_imagerecog20190930 

 同时配置Linux环境,根据自己实际的ACCESS_KEY_ID和ACCESS_KEY_SECRET,下面的两行写入到家目录下 的.bashrc中:

export ALIBABA_CLOUD_ACCESS_KEY_ID=“你的ID” #根据自己实际的ID填写

export ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的SECRET" #根据自己实际的SECRET填写
vi ~/.bashrc 和 /etc/profile #然后在末尾输入上面两行后保存

 然后退出终端重新登录下,此时再执行export,能看到这两个Key的存在

pg@pg-Default-string:~$ export
declare -x ALIBABA_CLOUD_ACCESS_KEY_ID="你的阿里云Key ID"
declare -x ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的阿里云Key Secret"

4、测试SDK

抄袭”文件在本地或文件不在同一地域OSS“示例代码,命名为garbage.py。

 同时将场景二注释,场景一代码打开,并输入自己测试图片的路径,如下:

pg@pg-Default-string:~$ vi garbage.py
# -*- coding: utf-8 -*-
# 引入依赖包

# pip install alibabacloud_imagerecog20190930

import os
import io
from urllib.request import urlopen
from alibabacloud_imagerecog20190930.client import Client
from alibabacloud_imagerecog20190930.models import ClassifyingRubbishAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
config = Config(
 # 创建AccessKey ID和AccessKey Secret,请参考

https://help.aliyun.com/document_detail/175144.html。

 # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考

https://help.aliyun.com/document_detail/145025.html
 # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。

 access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
 access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
 # 访问的域名

 endpoint='imagerecog.cn-shanghai.aliyuncs.com',
 # 访问的域名对应的region
 region_id='cn-shanghai'
)
#场景一:文件在本地

img = open(r'/home/pg/test.jpg', 'rb')
#场景二:使用任意可访问的url
#url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi3.0domepic/imagerecog/ClassifyingRubbish/ClassifyingRubbish1.jpg'
#img
 = io.BytesIO(urlopen(url).read())
classifying_rubbish_request = ClassifyingRubbishAdvanceRequest()
classifying_rubbish_request.image_urlobject = img
runtime = RuntimeOptions()
try:
 # 初始化Client
 client = Client(config)
 response = client.classifying_rubbish_advance(classifying_rubbish_request, 
runtime)
 # 获取整体结果

 print(response.body)
except Exception as error:
 # 获取整体报错信息

 print(error)
 # 获取单个字段

 print(error.code)

其中“/home/pg/test.jpg”为本地测试用图片(根据在线文档要求:图像类型:JPEG、JPG、PNG,图像大
小:不大于3 MB,图像分辨率:不限制图像分辨率,但图像分辨率太高可能会导致API识别超时,超时时间为5秒)

测试图片如下:

然后用python3 garbage.py命令测试运行:

pg@pg-Default-string:~$ python3 garbage.py
{'Data': {'Elements': [{'Category': '干垃圾', 'CategoryScore': 0.8855999999999999, 
'Rubbish': '', 'RubbishScore': 0.0}], 'Sensitive': False}, 'RequestId': '541130FA92DE-5BCA-8BD4-14154F08BBF0'}

 如上,测试成功,说明阿里云垃圾分类方案对接成功。

C语言调用阿里云Python接口

一、改造下garbage.py里面的代码,封装成一个函数,供后C程序调用 :

# -*- coding: utf-8 -*-
# 引入依赖包

# garbage.py
# pip install alibabacloud_imagerecog20190930
import os
import io
import json
from urllib.request import urlopen
from alibabacloud_imagerecog20190930.client import Client
from alibabacloud_imagerecog20190930.models import ClassifyingRubbishAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
config = Config(
 # 创建AccessKey ID和AccessKey Secret,请参考

https://help.aliyun.com/document_detail/175144.html。

 # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考

https://help.aliyun.com/document_detail/145025.html
 # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。

 access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
 access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
 # 访问的域名

 endpoint='imagerecog.cn-shanghai.aliyuncs.com',
 # 访问的域名对应的region
 region_id='cn-shanghai'
参照5.3.3节有参python函数的做法, 实封装并现以下代码(garbage.c):

)
def alibabacloud_garbage():
   #场景一:文件在本地

   img = open(r'/tmp/garbage.jpg', 'rb')
   #场景二:使用任意可访问的url
   #url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi3.0domepic/imagerecog/ClassifyingRubbish/ClassifyingRubbish1.jpg'

  #img = io.BytesIO(urlopen(url).read())
   classifying_rubbish_request = ClassifyingRubbishAdvanceRequest()
   classifying_rubbish_request.image_urlobject = img
   runtime = RuntimeOptions()
   try:
     # 初始化Client
     client = Client(config)
     response = client.classifying_rubbish_advance(classifying_rubbish_request, 
runtime)
     print(response.body)
     return response.body.to_map()['Data']['Elements'][0]['Category']
   except Exception as error:
     print(type('获取失败'))
     return '获取失败'

二、实封装并现以下代码(garbage.c):

void garbage_initialize(void)
{
   Py_Initialize();
   PyObject *sys = PyImport_ImportModule("sys");
   PyObject *path = PyObject_GetAttrString(sys, "path");
   PyList_Append(path, PyUnicode_FromString("."));
}
void garbage_final(void)
{
   Py_Finalize();
}
char *garbage_category(char *category)
{
   PyObject *pModule = PyImport_ImportModule("garbage");
   if (!pModule)
   {
       PyErr_Print();
       printf("Error: failed to load garbage.py\n");
       goto FAILED_MODULE;
   }
   PyObject *pFunc = PyObject_GetAttrString(pModule, "alibabacloud_garbage");

   if (!pFunc)
   {
       PyErr_Print();
       printf("Error: failed to load alibabacloud_garbage\n");
       goto FAILED_FUNC;
   }
    
   PyObject *pValue = PyObject_CallObject(pFunc, NULL);
   if (!pValue)
   {
       PyErr_Print();
       printf("Error: function call failed\n");
       goto FAILED_VALUE;
   }
    
   char *result = NULL;
   if (!PyArg_Parse(pValue, "s", &result))
   {
       PyErr_Print();
       printf("Error: parse failed");
       goto FAILED_RESULT;
   }
   category = (char *)malloc(sizeof(char) * (strlen(result) + 1) );
   memset(category, 0, (strlen(result) + 1));
   strncpy(category, result, (strlen(result) + 1));
FAILED_RESULT:
   Py_DECREF(pValue);
FAILED_VALUE:
   Py_DECREF(pFunc);
FAILED_FUNC:
   Py_DECREF(pModule);
FAILED_MODULE:
   return category;
}

三、头文件(garbage.h)如下:

#ifndef __GARBAGE__H
#define __GARBAGE__H
void garbage_init(void);
void garbage_final(void);
char *garbage_category(char *category);
#endif

四、测试代码(garbagetest.c)如下:

#include <stdio.h>
#include <stdlib.h>
#include "garbage.h"
int main()
{
   char *category = NULL;
   garbage_init();
   category = garbage_category(category);
   printf("category=%s\n", category);
   garbage_final();
   free(category);
   return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值