【阿里云】图像识别

一、阿里云官网资料及配置本地
二、配置环境变量
三、C语言调用阿里云Python接口

一、阿里云官网资料及配置本地

阿里云官网
垃圾识别分类

sudo apt install python3-pip
pip3 install alibabacloud_imagerecog20190930

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可能出现的网络问题

二、配置环境变量

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。

  • Linux和macOS系统配置方法

    • 在IntelliJ IDEA中打开终端Terminal。

    • 执行以下命令,配置环境变量。

<access_key_id>需替换为您RAM用户的AccessKey ID,<access_key_secret>替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限。

export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>

vi ~/.bashrc/etc/profile #然后在末尾输入上面两行后保存
在这里插入图片描述
在这里插入图片描述
然后退出终端重新登录下,此时再执行export,能看到这两个Key的存在

export
declare -x ALIBABA_CLOUD_ACCESS_KEY_ID="你的阿里云Key ID"
declare -x ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的阿里云Key Secret"

在这里插入图片描述

  • Windows系统配置方法
    新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。

    • 打开文件资源管理器,在此电脑上右键单击属性。

    • 在右侧导航栏,单击高级系统配置。

    • 在系统属性对话框的高级页签下,单击环境变量。

    • 在环境变量对话框中,单击新建(W)。
      在这里插入图片描述

    • 在弹出的新建系统变量对话框中,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    • 重启Windows系统,使配置生效。

示例代码

文件在本地或文件不在同一地域OSS

# -*- 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 = 'https://viapi-test-bj.oss-cn-beijing.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)

场景一是从本地读取文件
场景二是从网址上访问读取文件
将场景二注释,场景一代码打开,并修改输入自己测试图片的路径,如下:
在这里插入图片描述
其中“/home/orangepi/Image_recognition/test.png”为本地测试用图片路径(根据在线文档要求:图像类型:JPEG、JPG、PNG,图像大小:不大于3 MB,图像分辨率:不限制图像分辨率,但图像分辨率太高可能会导致API识别超时,超时时间为5秒)
在这里插入图片描述
如上,测试成功,说明阿里云垃圾分类方案对接成功。

三、C语言调用阿里云Python接口

在这里插入图片描述

调用前先测试下

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

# 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'/home/orangepi/Image_recognition/test.png', 'rb')
  # 场景二:使用任意可访问的url
  # url = 'https://viapi-test-bj.oss-cn-beijing.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:
    # 获取整体报错信息
    # print(error)
    print(type('获取失败'))
    return '获取失败'
    # 获取单个字段
    # print(error.code)

if __name__ == "__main__":
  alibaba_garbage()

garbage.c

#if 1
#include <Python.h>

int main() {
    // 初始化Python解释器
    Py_Initialize();

    // 获取sys.path对象
    PyObject* sysPath = PySys_GetObject("path");

    // 将当前路径添加到sys.path中
    PyList_Append(sysPath, PyUnicode_DecodeFSDefault(".")); // PyUnicode_FromString将c字符串转换成Python字符串

    // 导入Python模块
    PyObject* pModule = PyImport_ImportModule("garbage");

    if (pModule != NULL) {
        // 获取Python函数对象
        PyObject* pFunction = PyObject_GetAttrString(pModule, "alibaba_garbage");

        if (pFunction != NULL && PyCallable_Check(pFunction)) {
            // 调用Python函数,这里是无参数调用
            PyObject* pArgs = PyTuple_New(0);  // 传递空参数元组
            PyObject* pResult = PyObject_CallObject(pFunction, pArgs);

            if (pResult != NULL) {
              // 将返回值转换为C类型
              char *result = NULL;
  
              if (!PyArg_Parse(pResult, "s", &result)) {
                PyErr_Print();
                printf("Error: parse failed\n");
              }
  
              // 打印返回值
                printf("pResult = %s\n", result);
                Py_DECREF(pResult);
            } else {
                PyErr_Print(); // 打印Python错误信息
            }

            Py_DECREF(pFunction);
            Py_DECREF(pArgs);
        } else {
            PyErr_Print();
        }

        Py_DECREF(pModule);
    } else {
        PyErr_Print();
    }

    // 关闭Python解释器
    Py_Finalize();

    return 0;
}
#endif

在这里插入图片描述

c调用python代码garbage.py里函数, 封装并实现以下代码

garbage.h

#ifndef __GARBAGE__H
#define __GARBAGE__H

void garbage_init();
void garbage_final();
char *garbage_category(char *category);

#endif

garbage.c

#if 1
#include <Python.h>
#include "garbage.h"

void garbage_init()
{
    // 初始化Python解释器
    Py_Initialize();

    // 获取sys.path对象
    PyObject* sysPath = PySys_GetObject("path");

    // 将当前路径添加到sys.path中
    PyList_Append(sysPath, PyUnicode_DecodeFSDefault(".")); // PyUnicode_FromString将c字符串转换成Python字符串
}

void garbage_final()
{
    // 关闭Python解释器
    Py_Finalize();
}

char *garbage_category(char *category) 
{
    // 导入Python模块
    PyObject* pModule = PyImport_ImportModule("garbage");

    if (pModule != NULL) {
        // 获取Python函数对象
        PyObject* pFunction = PyObject_GetAttrString(pModule, "alibaba_garbage");

        if (pFunction != NULL && PyCallable_Check(pFunction)) {
            // 调用Python函数,这里是无参数调用
            PyObject* pArgs = PyTuple_New(0);  // 传递空参数元组
            PyObject* pResult = PyObject_CallObject(pFunction, pArgs);

            if (pResult != NULL) {
              // 将返回值转换为C类型
              char *result = NULL;
  
              if (!PyArg_Parse(pResult, "s", &result)) {
                PyErr_Print();
                printf("Error: parse failed\n");
              }
  
                // 打印返回值
                printf("pResult = %s\n", result);
                
                // 为垃圾分类信息分配内存,复制返回值
                category = (char *)malloc(sizeof(char) * (strlen(result) + 1));
                memset(category, 0, (strlen(result) + 1));
                strncpy(category, result, (strlen(result) + 1));
                 
                Py_DECREF(pResult);
            } else {
                PyErr_Print(); // 打印Python错误信息
            }

            Py_DECREF(pFunction);
            Py_DECREF(pArgs);
        } else {
            PyErr_Print();
        }

        Py_DECREF(pModule);
    } else {
        PyErr_Print();
    }
    return category;
}
#endif

garbage_test.c

//garbage_test.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\n", category);
	garbage_final();
  
  if (category) {
	  free(category);
  }
     
	return 0;
}

编译和运行这个程序,可以使用以下命令(假设使用的是gcc编译器和Python 3.10版本):

gcc -o garbage_test garbage.h garbage.c garbage_test.c -I /usr/include/python3.10/ -l python3.10
./garbage_test

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
阿里云图像识别API支持多种功能,其中包括检测服装品类和颜色。下面是使用方法的简要步骤: 1. 注册阿里云账号并开通图像识别API服务。 2. 创建应用并获取Access Key ID和Access Key Secret。 3. 下载并安装Open API SDK,选择相应的编程语言进行开发。 4. 调用API接口进行图像识别,传入待识别的图像,API会返回识别结果,包括服装品类和颜色。 以下是一个使用Python SDK调用API的例子: ```python import urllib.request import urllib.parse import time import uuid import hmac import base64 import json # 阿里云Access Key access_key_id = 'your_access_key_id' access_key_secret = 'your_access_key_secret' # API地址 url = 'https://dtplus-cn-shanghai.data.aliyuncs.com/image/tag' # 请求参数 params = { 'type': 'LABEL_DETECTION', 'image_url': 'http://example.com/image.jpg' } # 签名 timestamp = str(int(time.time() * 1000)) nonce = str(uuid.uuid4()) params['timestamp'] = timestamp params['nonce'] = nonce params['access_key_id'] = access_key_id params['signature_method'] = 'HMAC-SHA1' params['signature_version'] = '1.0' params['format'] = 'JSON' params['signature'] = base64.b64encode(hmac.new( bytes(access_key_secret + '&', 'utf-8'), bytes(urllib.parse.urlencode(sorted(params.items())), 'utf-8'), digestmod='sha1' ).digest()).decode('utf-8') # 发送请求 req = urllib.request.Request(url, method='POST') req.add_header('Content-Type', 'application/x-www-form-urlencoded') req.add_header('Accept', 'application/json') req.add_data(urllib.parse.urlencode(params).encode('utf-8')) response = urllib.request.urlopen(req) result = json.loads(response.read().decode('utf-8')) # 获取识别结果 if 'tags' in result: for tag in result['tags']: if tag['value'] == 'clothing': print(tag['value'], tag['confidence']) elif tag['value'] == 'color': print(tag['value'], tag['color_name'], tag['confidence']) ``` 在上面的代码中,我们调用了阿里云图像识别API的标签检测功能,传入了待识别的图像URL,并获取了识别结果。如果识别结果中包含了服装品类或颜色标签,则将其输出。 需要注意的是,这只是一个简单的例子,实际使用时还需要考虑API的调用频率、错误处理等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖喱年糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值