8.对接阿里云识别垃圾分类
对接阿里云识别垃圾分类
版本支持:在ubuntu 22.04或者全志开发板(orangepi 3.0.6)上安装图像识别(imagerecog)SDK
1.访问阿里云官网
https://vision.aliyun.com/
搜索垃圾分类,选第一个

查看技术文档

2.查看接入指引
- 注册阿里云账号:打开阿里云官网,在阿里云官网右上角,单击立即注册,按照操作提示完成账号注册。
- 开通能力:请确保您已开通图像识别服务,若未开通服务请立即开通。
- 创建AccessKey:请确保您已创建AccessKey,如果您使用的是子账号AccessKey,您需要给子账号赋予AliyunVIAPIFullAccess权限,具体操作,请参见RAM授权。
- 在线调试(可选):您可以通过OpenAPI Explorer在线调试能力,查看完整的调用示例代码及SDK依赖信息,也可以下载完整的工程。
- 开发接入步骤:
- 在SDK总览中选择您要接入使用的SDK语言。
- 在对应语言的SDK文档中找到AI类目为图像识别(imagerecog)的SDK包进行安装。
- 参考文档中提供的示例代码进行适当修改后调用。
- 示例代码:该能力常用语言的示例代码,请参见垃圾分类识别示例代码。
- 客户端直接调用:该能力常用的客户端调用方式包括以下几种。
3.创建好的AccessKey保存下来
4.选择对应的sdk为图像识别
选择对应的语言

安装对应的依赖,这里选的是图像识别
- 生成专区:
pip install alibabacloud_aigen20240111 - 人脸人体:
pip install alibabacloud_facebody20191230 - 文字识别:
pip install alibabacloud_ocr20191230 - 商品理解:
pip install alibabacloud_goodstech20191230 - 内容审核:
pip install alibabacloud_imageaudit20191230 - 图像识别:
pip install alibabacloud_imagerecog20190930 - 图像生产:
pip install alibabacloud_imageenhan20190930 - 分割抠图:
pip install alibabacloud_imageseg20191230 - 目标检测:
pip install alibabacloud_objectdet20191230 - 图像分析处理:
pip install alibabacloud_imageprocess20200320 - 视觉搜索:
pip install alibabacloud_imgsearch20200320 - 视频理解:
pip install alibabacloud_videorecog20200320 - 视频生产:
pip install alibabacloud_videoenhan20200320 - 视频分割:
pip install alibabacloud_videoseg20200320 - 异步任务管理:
pip install alibabacloud_viapi20230117 - 人脸核身服务端20200910专用版本:
pip install alibabacloud_facebody20200910
执行:
cd ~
pip install alibabacloud_imagerecog20190930
配置环境变量,将之前下载的AccessKey配置到系统中
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
export查看是否配置上去
配置全局的:
vi ~/.bashrc 和 /etc/profile #然后在末尾输入上面两行后保存
5.写入实例代码

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'/tmp/ClassifyingRubbish1.jpg', 'rb')
#场景二:使用任意可访问的url
url = 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.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)
上传图片测试执行结果:
orangepi@orangepizero2:~$ python garbage.py
{'Data': {'Elements': [{'Category': '湿垃圾', 'CategoryScore': 0.9997, 'Rubbish': '橙子', 'RubbishScore': 0.9997}], 'Sensitive': False}, 'RequestId': '1315330C-EBDC-58D7-AD91-CFAFF506A01D'}
6.修改图像解析代码
查看ClassifyingRubbishResponseBody的数据类型
可以通过来搜索路径
find -name *site-packages
可以使用刚才安装的pip install alibabacloud_imagerecog20190930命令得到安装site-packages路径
/home/orangepi/.local/lib/python3.10/site-packages
cd /home/orangepi/.local/lib/python3.10/site-packages
grep -r ClassifyingRubbishResponseBody
得知:alibabacloud_imagerecog20190930/models.py包下面
cat alibabacloud_imagerecog20190930/models.py
7.c语言调用python
封装文件:
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'
)
def alibaba_garbage():
#场景一:文件在本地
img = open(r'/tmp/garbage.jpg', 'rb')
#场景二:使用任意可访问的url
#url = 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.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)
print(response.body.to_map()['Data']['Elements'][0]['Category'])
return response.body.to_map()['Data']['Elements'][0]['Category']
except Exception as error:
return "获取失败"
#if __name__ == "__main__":
# alibaba_garbage()
garbage.h
#ifndef __GARBAGE__H
#define __GARBAGE__H
void garbage_init(void);
void garbage_final(void);
char *garbage_category(char *category);
#endif
garbage.c
#include <Python.h>
#include <string.h>
#include "garbage.h"
void garbage_init(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,"alibaba_garbage");
if(!pFunc)
{
PyErr_Print();
printf("Error:failed to load funny\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_VALUE;
}
printf("result:%s\n",result);
category = (char *)malloc(sizeof(char)* (strlen(result)+1));
memset(category,0,strlen(result)+1);
strcpy(category,result);
FAILED_VALUE:
Py_DECREF(pValue);
FAILED_FUNC:
Py_DECREF(pFunc);
FAILED_MODULE:
Py_DECREF(pModule);
return category;
}
测试功能:
garbageTest.c
#include <stdio.h>
#include <stdlib.h>
#include "garbage.h"
int main(int argc, char *argv[])
{
char *category = NULL;
garbage_init();
category = garbage_category(category);
printf("category: %s",category);
garbage_final();
if(category)
free(category);
return 0;
}
编译执行:
gcc garbageTest.c -o garbageTest garbage.h garbage.c -I /usr/include/python3.10 -l python3.10
./garbageTe

浙公网安备 33010602011771号