前言
之前通過百度AI介面實作了影像識別,目標做影像識別再進行垃圾分類提示,于是乎我在網上查詢各垃圾分類的資料集,很多資料集收費的各大網站讓我很反感,接下來放兩個比較nice的開源站:(開源讓技術進步!)
- 百度AI社區 | 上傳者:Thomas-yanxin,快速鏈接: 垃圾分類資料集ImageNet格式,用于訓練效果是很不錯的
- 知乎 | 作者:謝偉通過go語言實作了后端查詢垃圾分類,其中包含垃圾分類資料集csv格式,
ps.后文使用到的資料集為csv格式,供學習使用,
正文
1.資料集
資料集包含2534條資料,大致分為4類,根據go語言4類分類,重新處理了一下資料集:

參考如下:

2.表格匹配規則
讀取表格B列存盤的名稱和識別的名稱對比,對比規則:
字串相等 sort:1
不相等,但包含字符: 字串相等的位元組占總位元組的比例 sort = len(name)/len(cell.value)
import openpyxl
from openpyxl import Workbook
def excel(excel_file, name):
# 定義串列result存盤所有讀取資料
result = {"id":0,"name":"test","imageUrl":"","sortId":"可回收垃圾","result":"","sort":0}
wb = openpyxl.load_workbook(excel_file) # 讀取excel檔案
sheet = wb.worksheets[0]#讀取第一個表
col = sheet["B"]#讀取B列
for index,cell in enumerate(col):
if cell.value == name:
result["sort"] = 1
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,1)
else:
if name in cell.value:
sort = len(name)/len(cell.value)
print(cell.value,sort)
if sort > result["sort"]:
result["sort"] = sort
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,sort)
if result["sort"] == 0:
print("未識別到是什么垃圾")
else:
print("====識別結果=======")
print(result)
print(result["name"],"的識別結果是:",result["result"],"是",result["sortId"],"可信度為:",result["sort"])
excel(r'/Users/wangyu/Desktop/waste.xlsx',
r'花生') # 呼叫函式,傳入引數

3.影像識別+垃圾分類
參考上一篇文章影像識別

# coding=utf-8
import requests
import json
import base64
# 防止https證書校驗不正確
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
"""
獲取token
"""
def getToken(AccessKey,SecretKey):
# client_id 為官網獲取的AK, client_secret 為官網獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+AccessKey+'&client_secret='+SecretKey
headers = {
'Content-Type': 'application/json;charset=UTF-8',
'grant_type': 'client_credentials',
}
access_token = ''
response = requests.get(url=host, headers=headers)
if response:
res = response.json()
access_token = res['access_token']
return access_token
def getResult(url,access_token):
# 植物
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant"
# 動物
# request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"
# 二進制方式打開圖片檔案
f = open(url, 'rb')
img = base64.b64encode(f.read())
params = {"image":img,"top_num":1,"baike_num":1}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
result = response.json()
if result:
print (json.dumps(result,indent=1,ensure_ascii=False))
# 列印圖片結果
for data in result["result"]:
print(u" 菜品名稱: " + data["name"])
return data["name"]
else:
return "未識別該圖片"
def getWaste(name):
waste = '未識別到該垃圾的分類'
# 定義串列result存盤所有讀取資料
result = {"id":0,"name":"test","imageUrl":"","sortId":"可回收垃圾","result":"","sort":0}
excel_file = "/Users/wangyu/Desktop/waste.xlsx"
wb = openpyxl.load_workbook(excel_file) # 讀取excel檔案
sheet = wb.worksheets[0]#讀取第一個表
col = sheet["B"]#讀取B列
for index,cell in enumerate(col):
if cell.value == name:
result["sort"] = 1
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,1)
else:
if name in cell.value:
sort = len(name)/len(cell.value)
print(cell.value,sort)
if sort > result["sort"]:
result["sort"] = sort
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,sort)
if result["sort"] == 0:
print("未識別到是什么垃圾")
return waste
else:
print("====識別結果=======")
print(result["name"],"的識別結果是:",result["result"],"是",result["sortId"],"可信度為:",result["sort"])
return result
if __name__ == '__main__':
# 識別的圖片
# url = '/Users/wangyu/Desktop/shicai.jpg'
# url = '/Users/wangyu/Desktop/fish.jpg'
url = '/Users/wangyu/Desktop/hongzao.jpg'
# 百度賬號資訊
AccessKey = ''
SecretKey = ''
# 獲取小票識別結果
access_token = getToken(AccessKey,SecretKey)
img_result = getResult(url,access_token)
waste_result = getWaste(img_result)
4.整合顯示
通過標識將主要內容輸出顯示于圖片上:

# coding=utf-8
# 網路資料請求
import requests
import json
import base64
import numpy as np
# 表格處理
import openpyxl
from openpyxl import Workbook
# 影像處理
import cv2
from matplotlib import pyplot as plt
from urllib import request
from PIL import Image, ImageDraw, ImageFont
# 防止https證書校驗不正確
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
"""
獲取token
"""
def getToken(AccessKey,SecretKey):
# client_id 為官網獲取的AK, client_secret 為官網獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+AccessKey+'&client_secret='+SecretKey
headers = {
'Content-Type': 'application/json;charset=UTF-8',
'grant_type': 'client_credentials',
}
access_token = ''
response = requests.get(url=host, headers=headers)
if response:
res = response.json()
access_token = res['access_token']
return access_token
"""
影像識別結果
輸入:本地圖片地址,token
輸出:識別結果,識別分數
"""
def getResult(url,access_token):
img = cv2.imread(url)
plt.figure(figsize=(5,5))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))#BGR轉RGB
plt.xlabel(u'img')
plt.show()
# 植物
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant"
# 動物
# request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"
# 二進制方式打開圖片檔案
f = open(url, 'rb')
img = base64.b64encode(f.read())
params = {"image":img,"top_num":1,"baike_num":1}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
result = response.json()
if result:
print (json.dumps(result,indent=1,ensure_ascii=False))
# 列印圖片結果
for data in result["result"]:
print(u" 菜品名稱: " + data["name"])
if data["baike_info"]["image_url"]:
print(u" 圖片為" + data["baike_info"]["image_url"])
plt.figure(figsize=(5,5))
response = requests.get(data["baike_info"]["image_url"])
resp = request.urlopen(data["baike_info"]["image_url"])
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))#BGR轉RGB
plt.xlabel("score is"+str(data["score"]))
plt.show()
return data["name"],data["score"]
else:
return "未識別該圖片",0
"""
垃圾分類識別
輸入:物體名稱
輸出:垃圾分類結果,分數
"""
def getWaste(name):
waste = '未識別到該垃圾的分類'
# 定義串列result存盤所有讀取資料
result = {"id":0,"name":"test","imageUrl":"","sortId":"可回收垃圾","result":"","sort":0}
excel_file = "/Users/wangyu/Desktop/waste.xlsx"
wb = openpyxl.load_workbook(excel_file) # 讀取excel檔案
sheet = wb.worksheets[0]#讀取第一個表
col = sheet["B"]#讀取B列
for index,cell in enumerate(col):
if cell.value == name:
result["sort"] = 1
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,1)
else:
if name in cell.value:
sort = len(name)/len(cell.value)
print(cell.value,sort)
if sort > result["sort"]:
result["sort"] = sort
result["name"] = name
result["result"] = cell.value
result["id"] = sheet.cell(index,1).value
result["sortId"] = sheet.cell(index,4).value
print(cell.value,sort)
if result["sort"] == 0:
print("未識別到是什么垃圾")
return waste,0
else:
print("====識別結果=======")
print(result["name"],"的識別結果是:",result["result"],"是",result["sortId"],"可信度為:",result["sort"])
return result["sortId"],result["sort"]
"""
在影像上標記中文
輸入:圖片(cv2格式),文字,寫到圖片上的位置(x,y),文字顏色,文字大小
輸出:圖片
"""
def cv2AddChineseText(img, text, position=(0,0), textColor=(0, 255, 0), textSize=30):
if (isinstance(img, np.ndarray)): # 判斷是否OpenCV圖片型別
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 創建一個可以在給定影像上繪圖的物件
draw = ImageDraw.Draw(img)
# 字體的格式,需要下載
fontStyle = ImageFont.truetype(
"simsun/simsun.ttc", textSize, encoding="utf-8")
# 繪制文本
draw.text(position, text, textColor, font=fontStyle)
# 轉換回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
if __name__ == '__main__':
# 識別的圖片
# url = '/Users/wangyu/Desktop/shicai.jpg'
# url = '/Users/wangyu/Desktop/fish.jpg'
url = '/Users/wangyu/Desktop/hongzao.jpg'
img = cv2.imread(url)
# 百度賬號資訊
AccessKey = ''
SecretKey = ''
# 獲取小票識別結果
access_token = getToken(AccessKey,SecretKey)
img_result,score = getResult(url,access_token)
if img_result != "未識別該圖片":
waste_result,sort = getWaste(img_result)
image = cv2AddChineseText(image, "圖片識別:"+img_result, (30, 50), (255,0,0), 50)
image = cv2AddChineseText(image, "score: {:.2f}".format(score), (500, 50), (255,0,255), 30)
image = cv2AddChineseText(image, "垃圾分類:"+waste_result, (30, 120), (255,0,0), 50)
image = cv2AddChineseText(image, "sort: {:.2f}".format(sort), (500, 120), (255,0,255), 30)
plt.figure(figsize=(5,5))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))#BGR轉RGB
plt.xlabel(u'image')
plt.show()
總結
通過百度API影像介面實作了單物種的影像識別,取識別率最高的一個結果;通過excel匹配,實作垃圾分類提示,垃圾分類匹配規格達2k+,
影像識別目前僅用了一個類別的識別,百度組合API的識別試了一下,暫時不ok,報400的錯誤,傳參這里還有問題,思考中,
不限于API識別影像,也可以使用其他方案識別影像,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295286.html
標籤:其他
上一篇:影像處理中的微分算子原理與實作
下一篇:Nginx+Tomcat負載均衡,動靜分離(看,前面漆黑一片,什么都看不到;也不是,天亮后也會很美的,加油!!)
