1) 需求分析
1.水果数据处理:对水果(苹果,香蕉)数据集进行处理转化为标签和图像,并转化为one-hot码。
2.卷积模型搭建:采用keras搭建模型,卷积层、池化层、Dropout层、全连接层、输出层
3.模型训练把数据集在建立的模型上进行训练,并把最好的模型保存到h5文件中,便于直接对模型进行测试。
4.模型测试:打开摄像头,使用通用物体进行测试。测试结果将录制成视频展示。
2) 概要设计
1. 测试前代码:
from keras.applications.resnet50 import ResNet50 #//导入AI软件平台keras 里的AI模型 ResNet50
from keras.preprocessing import image#//导入图像处理库 image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
#//载入模型
model = ResNet50(weights='imagenet') #//使model指向ResNet50模型
img_path = '鸟.jpg' #//等待识别的图像(可用车,水果等),注:需把图片放该代码的同目录下
img = image.load_img(img_path, target_size=(224, 224)) #//载入图像
#//-图像的预处理
x = image.img_to_array(img) #//把图像转换为数组
x = np.expand_dims(x, axis=0) #//沿轴0(行)扩展 -> 多维数组
x = preprocess_input(x) #//做输入预处理
#//预测
preds = model.predict(x) #//运行模型进行预测
print('Predicted:', decode_predictions(preds, top=3)[0]) #//解码预测,输出结果
2. 主程序:
import cv2
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
img_path = 'capyure.jpg'
def capture_camera_pic():
cv2.namedWindow('capture_pic')
cp = cv2.VideoCapture(0) # //指定摄像头,默认0指向第一个
while cp.isOpened(): # //检测摄像头是否打开,如果摄像头能成功打开,则进行循环的视频拍照显示
ok, frame = cp.read() # 读取一帧数据
if not ok: # 如果拍照失败,退出
break
cv2.imwrite(img_path, frame) # 保存图像
# 翻译
# translator = Translator(to_lang='chinese')
# translation = translator.translate(jieguo())
cv2.putText(frame, jieguo(), (30, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 4)
cv2.imshow('capture_pic', frame) # 显示图像
c = cv2.waitKey(10)
if c & 0xff == ord('q'):
break
cp.release()
cv2.destroyAllWindows()
def jieguo():
model = ResNet50(weights='imagenet')
img_path = 'capyure.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)
return decode_predictions(preds, top=3)[0][0][1];
if __name__ == '__main__':
capture_camera_pic()
}
3)详细设计
改进为可以把文字由英文转中文的代码:
import cv2
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input,decode_predictions
import numpy as np
from translate import Translator
from PIL import Image, ImageDraw, ImageFont
#调用摄像头
img_path='capyure.jpg'
def capture_camera_pic():
cv2.namedWindow('capture_pic')
cp=cv2.VideoCapture(0) #//指定摄像头,默认0指向第一个
while cp.isOpened(): #//检测摄像头是否打开,如果摄像头能成功打开,则进行循环的视频拍照显示
ok,frame=cp.read() #读取一帧数据
if not ok: #如果拍照失败,退出
break
cv2.imwrite(img_path,frame) #保存图像
#cv2.putText(frame,jieguo(),(30,50),cv2.FONT_HERSHEY_COMPLEX,1,(255,0,0),4)
#cv2.putText(frame,jieguo(),(30,50), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,1,(255,0,0),4)
change()
# change_cv2_draw(frame, jieguo(), (0,0), 20, (255, 0, 0))
# cv2ImgAddText(frame, "封", 10, 65, (255, 0, 0), 20)
#//cv2.imshow('capture_pic',frame) #显示图像
c=cv2.waitKey(5)
if c & 0xff == ord('q'):
break
cp.release()
cv2.destroyAllWindows()
def jieguo():
model = ResNet50(weights='imagenet')
img_path = 'capyure.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)
translator = Translator(to_lang='chinese')
str =decode_predictions(preds, top=3)[0][0][1]
translation = translator.translate(str.replace('_', ' '))
return translation;
def change():
# 读取文件
pil_img = Image.open('capyure.jpg',)
# 读取cv2文件
#frame = Image.fromarray(cv2.cvtColor(img_path, cv2.COLOR_BGR2RGB))
# pil_img.show()
# 生成画笔
draw = ImageDraw.Draw(pil_img)
# 第一个参数是字体文件的路径,第二个是字体大小
font = ImageFont.truetype('msyh.ttc', 30, encoding='utf-8')
# 第一个参数是文字的起始坐标,第二个需要输出的文字,第三个是字体颜色,第四个是字体类型
draw.text((30,50), jieguo(), (0, 0, 0), font=font)
# PIL图片转cv2
img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
# 变得可以拉伸 winname 必须要一样,且设置可以拉伸在前面
cv2.namedWindow('capture_pic', cv2.WINDOW_NORMAL)
# 显示
cv2.imshow("capture_pic", img)
# 等待
cv2.waitKey(10)
if __name__=='__main__':
capture_camera_pic()