8.对接阿里云识别垃圾分类

对接阿里云识别垃圾分类

版本支持:在ubuntu 22.04或者全志开发板(orangepi 3.0.6)上安装图像识别(imagerecog)SDK

1.访问阿里云官网

https://vision.aliyun.com/

搜索垃圾分类,选第一个

查看技术文档

2.查看接入指引

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

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
posted @ 2025-05-29 11:20  站着说话不腰疼  阅读(77)  评论(0)    收藏  举报