cnn 实现图片识别

在入门之后需要对机器学习的一些思维和方法体验下2333

一个github上的一些源码变式,体验一下现在深度学习识别图片的速度之快,准确度之好。

使用了Tensorflow里的高级神经网络库,使用其keras.applications模块获取在ILSVRC竞赛中获胜的多个卷积网络模型,可识别物体量从10类增加到1001类,可为:狗熊 椅子 汽车 键盘 箱子 婴儿床 旗杆iPod播放器 轮船 面包车 项链 降落伞 桌子 钱包 球拍 步枪等等
接着导入ResNet50网络模型进行处理,主要图像数据处理函数如下:


image.img_to_array:将PIL格式的图像转换为numpy数组。


np.expand_dims:将我们的(3,224,224)大小的图像转换为(1,3,224,224)。因为model.predict函数需要4维数组作为输入,其中第4维为每批预测图像的数量。这也就是说,我们可以一次性分类多个图像。


preprocess_input:使用训练数据集中的平均通道值对图像数据进行零值处理,即使得图像所有点的和为0。这是非常重要的步骤,如果跳过,将大大影响实际预测效果。这个步骤称为数据归一化。


model.predict:对我们的数据分批处理并返回预测值。


decode_predictions:采用与model.predict函数相同的编码标签,并从ImageNet ILSVRC集返回可读的标签。
然后通过调用官方api,得到了这个classfier,可以读取同目录下images文件夹里的指定命名的图片,这个分类器在我的笔记本tensorflow中训练差不多需要两个小时的时间,训练好之后实际识别的速率快达1~2分钟一张图,准确率高达90%以上

代码:

GUI:(PyQt5)

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5 import QtCore, QtGui
import classify
class MyWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.setObjectName("widget")
        self.resize(490, 506)
        self.setMinimumSize(QtCore.QSize(100, 100))
        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.gridLayoutWidget = QtWidgets.QWidget(self)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(60, 120, 381, 301))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self)
        self.label.setGeometry(QtCore.QRect(70, 50, 54, 12))
        self.label.setObjectName("label")
        self.textEdit = QtWidgets.QTextEdit(self)
        self.textEdit.setGeometry(QtCore.QRect(120, 45, 261, 25))
        self.textEdit.setObjectName("textEdit")
        self.toolButton = QtWidgets.QToolButton(self)
        self.toolButton.setGeometry(QtCore.QRect(379, 43, 50, 28))
        self.toolButton.setObjectName("toolButton")
        self.toolButton.clicked.connect(self.msg)
        self.pushButton = QtWidgets.QPushButton(self)
        self.pushButton.setGeometry(QtCore.QRect(200, 80, 81, 31))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.sbing)
        #  放图片的label
        self.label2 = QtWidgets.QLabel(self)
        self.label2.setGeometry(QtCore.QRect(72, 150, 360, 300))
        #  参数分别是左上点距左边框宽度,距顶高度,长度,高度
        self.label2.setObjectName("label2")

        self.retranslateUi(self)
        QtCore.QMetaObject.connectSlotsByName(self)
    def retranslateUi(self, widget):
        _translate = QtCore.QCoreApplication.translate
        widget.setWindowTitle(_translate("widget", "图片识别器"))
        self.label.setText(_translate("widget", "目标图片"))
        self.toolButton.setText(_translate("widget", "浏览"))
        self.pushButton.setText(_translate("widget", "开始识别"))
    def msg(self):
        '''directory1 = QFileDialog.getExistingDirectory(self,
                                                      "选取文件夹",
                                                      "C:/")  # 起始路径
        print(directory1)'''

        fileName1, filetype = QFileDialog.getOpenFileName(self,
                                                          "选取文件",
                                                          "C:/",
                                                          "All Files (*);;Text Files (*.txt)")  # 设置文件扩展名过滤,注意用双分号间隔
        #  print(fileName1, filetype)
        #  print(fileName1)
        '''files, ok1 = QFileDialog.getOpenFileNames(self,
                                                  "多文件选择",
                                                  "C:/",
                                                  "All Files (*);;Text Files (*.txt)")
        print(files, ok1)

        fileName2, ok2 = QFileDialog.getSaveFileName(self,
                                                     "文件保存",
                                                     "C:/",
                                                     "All Files (*);;Text Files (*.txt)")
        '''
        png = QtGui.QPixmap(fileName1).scaled(self.label2.width(), self.label2.height())
        self.label2.setPixmap(png)
        self.textEdit.setText(fileName1)
        classify.imgf=fileName1
    def sbing(self):
        self.pushButton.setText("识别中")
        classify.sjsy()
        self.pushButton.setText("开始识别")
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    myshow = MyWindow()
    myshow.show()
    sys.exit(app.exec_())
    exit()

classify

import sys
import argparse
import numpy as np
from PIL import Image
import requests
from io import BytesIO
import matplotlib.pyplot as plt

from keras.preprocessing import image
from keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions

model = ResNet50(weights='imagenet')
target_size = (224, 224)
imgf = ""

def predict(model, img, target_size, top_n=3):
    """Run model prediction on image
  Args:
    model: keras model
    img: PIL format image
    target_size: (w,h) tuple
    top_n: # of top predictions to return
  Returns:
    list of predicted labels and their probabilities
  """
    if img.size != target_size:
        img = img.resize(target_size)

    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=top_n)[0]


def plot_preds(image, preds):
    """Displays image and the top-n predicted probabilities in a bar graph
  Args:
    image: PIL image
    preds: list of predicted labels and their probabilities
  """
    plt.imshow(image)
    plt.axis('off')

    plt.figure()
    order = list(reversed(range(len(preds))))
    bar_preds = [pr[2] for pr in preds]
    labels = (pr[1] for pr in preds)
    plt.barh(order, bar_preds, alpha=0.5)
    plt.yticks(order, labels)
    plt.xlabel('Probability')
    plt.xlim(0, 1.01)
    plt.tight_layout()
    plt.show()


def sjsy():
    print(imgf)
    img = Image.open(imgf)
    preds = predict(model, img, target_size)
    plot_preds(img, preds)


'''if __name__=="__main__":
  img = Image.open("images/3.jpg")
  preds = predict(model, img, target_size)
  plot_preds(img, preds)
  a = argparse.ArgumentParser()
  a.add_argument("--image", help="path to image")
  a.add_argument("--image_url", help="url to image")
  args = a.parse_args()

  if args.image is None and args.image_url is None:
    a.print_help()
    sys.exit(1)

  if args.image is not None:
    img = Image.open(args.image)
    preds = predict(model, img, target_size)
    plot_preds(img, preds)

  if args.image_url is not None:
    response = requests.get(args.image_url)
    img = Image.open(BytesIO(response.content))
    preds = predict(model, img, target_size)
    plot_preds(img, preds)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RStudio是一个集成开发环境(IDE),用于R语言编程。CNN(Convolutional Neural Network)是一种用于图像识别深度学习模型。下面是一个使用RStudio来实现CNN图像识别的实战代码示例。 首先,需要安装相应的R包。可以使用以下代码安装'CNTK'和'devtools'包: ```R install.packages('Caret') devtools::install_github('Microsoft/CNTK', subdir='bindings/R') ``` 接下来,载入所需的库: ```R library(keras) library(Caret) library(CNTK) ``` 然后,将图像数据进行预处理,将其转换为适用于CNN模型的格式。可以使用以下代码进行示例数据的预处理: ```R load("~/path/to/data.RData") # 载入数据 x_train <- x_train / 255 # 归一化处理 x_test <- x_test / 255 x_train <- array_reshape(x_train, c(dim(x_train)[1], 28, 28, 1)) # 转换成CNN所需的维度 x_test <- array_reshape(x_test, c(dim(x_test)[1], 28, 28, 1)) y_train <- to_categorical(y_train) # 将标签进行独热编码处理 y_test <- to_categorical(y_test) ``` 然后,创建CNN模型并进行训练。以下是一个简单的CNN模型示例: ```R model <- keras_model_sequential() # 创建一个序贯模型 model %>% layer_conv_2d(filters = 32, kernel_size = c(3, 3), activation = 'relu', input_shape = c(28, 28, 1)) %>% # 添加卷积层 layer_max_pooling_2d(pool_size = c(2, 2)) %>% # 添加池化层 layer_flatten() %>% # 展开为一维向量 layer_dense(units = 10, activation = 'softmax') # 全连接层 model %>% compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = c('accuracy')) # 编译模型 model %>% fit(x_train, y_train, epochs = 10, batch_size = 32) # 训练模型 ``` 最后,使用测试数据评估模型性能: ```R evaluation <- model %>% evaluate(x_test, y_test) print(evaluation) ``` 这就是一个简单的RStudio CNN图片识别的实战代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苦茶子12138

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

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

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

打赏作者

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

抵扣说明:

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

余额充值