opencv 图像分类举例

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的工具和函数,用于处理和分析图像和视频数据。在图像分类任务中,OpenCV可以结合深度学习框架(如TensorFlow、PyTorch等)或利用预训练的模型进行图像识别。

以下是一个使用OpenCV进行图像分类的基本示例步骤:

  1. 加载预训练的模型:首先,你需要加载一个已经训练好的图像分类模型。这个模型可以是你自己训练的,也可以是从网络上下载的预训练模型。OpenCV支持多种深度学习框架的模型格式,如Caffe、TensorFlow等。

import cv2
# 加载预训练的模型(以Caffe为例)
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')
  1. 加载标签名:如果你的模型是用于多类别分类的,你需要加载一个标签文件,该文件包含了每个类别对应的标签名。

with open('labels.txt', 'r') as f:
labels = [line.strip() for line in f.readlines()]
  1. 加载图像并进行预处理:接下来,你需要加载要进行分类的图像,并进行必要的预处理,如调整图像大小、归一化等。

# 加载图像
image = cv2.imread('test.jpg')
# 对图像进行预处理(这里假设输入图像需要缩放到224x224大小)
blob = cv2.dnn.blobFromImage(image, 1.0, (224, 224), (104.0, 117.0, 123.0))
  1. 设置输入并前向传播:将预处理后的图像设置为模型的输入,并进行前向传播,得到模型的输出。

# 设置输入
net.setInput(blob)
# 前向传播
outs = net.forward()
  1. 解析输出并获取分类结果:最后,你需要解析模型的输出,获取图像的分类结果。通常,模型的输出是一个概率分布,表示图像属于每个类别的概率。你可以通过查找概率最大的类别来获取最终的分类结果。

# 解析输出并获取分类结果
class_id = np.argmax(outs)
confidence = outs[0][class_id]
label = labels[class_id]
print(f'Class: {label}, Confidence: {confidence}')

请注意,上述示例中的代码片段是一个简化的示例,用于说明使用OpenCV进行图像分类的基本步骤。在实际应用中,你可能需要根据具体的模型和任务进行相应的调整和优化。此外,OpenCV本身并不直接提供深度学习模型的训练功能,通常你需要使用其他深度学习框架(如TensorFlow、PyTorch等)来训练模型,并将训练好的模型转换为OpenCV支持的格式。

open预训练模型 

"Open"预训练模型通常指的是那些开放源代码、可供公众访问和使用的预训练模型。这些模型在大型数据集上进行了预先训练,可以用于各种下游任务,如文本分类、命名实体识别、情感分析、问答系统等。

以下是一些著名的开放预训练模型及其相关信息:

  1. BERT (Bidirectional Encoder Representations from Transformers):
    • 由Google AI团队开发。
    • 在大量文本数据上进行双向训练,使其能够理解文本的上下文。
    • 提供了多种预训练模型,适用于不同语言和任务。
  2. GPT (Generative Pre-trained Transformer):
    • OpenAI的标志性模型系列,包括GPT-1、GPT-2和GPT-3。
    • 主要用于生成文本,如故事创作、代码生成等。
    • GPT-3特别强大,能够处理更复杂的任务和指令。
  3. RoBERTa (Robustly Optimized BERT Pretraining Approach):
    • 由Facebook AI团队开发,是对BERT的进一步优化。
    • 在更大的数据集和更长的训练时间上进行了训练,实现了性能的提升。
  4. T5 (Text-to-Text Transfer Transformer):
    • 由Google Research提出。
    • 将所有自然语言处理问题转换为文本到文本的任务,简化了模型的使用。
  5. ELECTRA:
    • 由斯坦福大学和艾伦人工智能研究所共同开发。
    • 采用了新的预训练策略,即替换检测(Replaced Token Detection),以提高效率。
  6. ALBERT (A Lite BERT):
    • 由Google Research提出,旨在减少BERT模型的参数数量,同时保持性能。
    • 通过参数共享和跨层参数共享等技术实现了模型的轻量化。
  7. XLNet:
    • 由CMU和谷歌联合开发。
    • 结合了自回归和自编码的预训练方法,实现了对双向上下文的更好利用。

这些预训练模型通常通过深度学习框架(如TensorFlow或PyTorch)提供,并附有详细的文档和示例代码,以便开发者能够轻松地使用和微调这些模型以适应特定任务。此外,许多研究者和机构还会在GitHub等平台上分享他们基于这些预训练模型的改进和扩展,进一步推动了自然语言处理技术的发展。

opencv图像分类的预训练模型

 

在OpenCV中,直接提及的预训练模型并不像在一些深度学习框架(如TensorFlow或PyTorch)中那样普遍。OpenCV作为一个开源的计算机视觉库,更侧重于提供图像处理、视频分析、物体检测等功能,而不直接提供大量的预训练模型。然而,OpenCV确实支持使用预训练的深度学习模型进行图像分类等任务,这通常是通过其dnn(深度神经网络)模块实现的。

对于图像分类的预训练模型,OpenCV用户可以利用dnn模块加载在其他深度学习框架(如Caffe、TensorFlow、PyTorch等)中预训练的模型。这些模型通常是在大型图像数据集(如ImageNet)上训练的,能够识别数千种不同的物体和场景。

使用OpenCV加载预训练模型进行图像分类的一般步骤如下:

  1. 准备模型文件:首先需要获取预训练模型的权重文件和配置文件(对于某些框架,这些文件可能合并为一个文件)。这些文件通常可以从模型的原始发布页面或其他资源网站下载。

  2. 加载模型:使用OpenCV的dnn模块中的函数(如cv2.dnn.readNetFromCaffecv2.dnn.readNetFromTensorFlow等)加载预训练模型。这些函数允许用户指定模型的权重文件和配置文件(如果适用)。

  3. 预处理输入图像:在将图像输入模型之前,通常需要对其进行预处理,如调整大小、归一化等。这些步骤取决于所使用的预训练模型和框架的要求。

  4. 执行分类:使用加载的模型对预处理后的图像执行前向传播,获取分类结果。这通常涉及调用模型的forward方法。

  5. 解析分类结果:根据模型的输出解析分类结果。这可能需要将输出分数映射到类别标签,或者根据分数选择最可能的类别。

需要注意的是,虽然OpenCV不直接提供大量的预训练模型,但它通过dnn模块为用户提供了一个强大的接口,使他们能够利用在其他深度学习框架中训练的模型。此外,随着OpenCV的不断发展和更新,未来可能会有更多预训练模型的支持被添加到库中。

在实际应用中,用户可以根据需要选择合适的预训练模型和框架,并利用OpenCV的dnn模块将其集成到自己的项目中。这样不仅可以利用预训练模型的强大能力,还可以享受OpenCV在图像处理、视频分析等方面的便捷性。

OpenCV支持多种深度学习框架的模型格式,如Caffe、TensorFlow等

 

OpenCV确实支持多种深度学习框架的模型格式,这主要得益于其dnn(深度神经网络)模块。自OpenCV 3.3版本开始,dnn模块就加入了对深度学习推理的支持,允许开发者在OpenCV环境中加载和运行各种深度学习模型。以下是一些OpenCV支持的深度学习框架及其模型格式:

  1. Caffe
    • 模型权重文件:.caffemodel
    • 模型配置文件:.prototxt
    • OpenCV提供了cv2.dnn.readNetFromCaffe函数来加载Caffe模型。
  2. TensorFlow
    • 冻结的图文件:.pb(Protocol Buffers)
    • 文本图文件:.pbtxt(可选,用于描述图的结构)
    • OpenCV可以通过cv2.dnn.readNetFromTensorflow函数加载TensorFlow模型,但更常见的是直接使用cv2.dnn.readNet函数并指定模型文件为.pb格式。
  3. Torch/PyTorch
    • Torch7模型:.t7
    • 对于PyTorch模型,虽然OpenCV不直接支持.pth(PyTorch的模型保存格式),但PyTorch模型可以通过转换为ONNX格式后再由OpenCV加载。OpenCV提供了cv2.dnn.readNetFromONNX函数来加载ONNX格式的模型。
  4. Darknet
    • 配置文件:.cfg
    • 权重文件:.weights
    • OpenCV通过cv2.dnn.readNet函数加载Darknet模型时,需要同时指定配置文件和权重文件。
  5. ONNX
    • ONNX(Open Neural Network Exchange)模型文件:.onnx
    • ONNX是一种开放格式,用于表示深度学习模型。许多深度学习框架都支持将模型导出为ONNX格式,OpenCV通过cv2.dnn.readNetFromONNX函数加载这些模型。

除了上述框架外,OpenCV的dnn模块还可能支持其他框架的模型格式,这取决于OpenCV的版本和更新情况。在使用时,建议查阅最新的OpenCV文档以获取最准确的信息。

需要注意的是,虽然OpenCV支持加载多种格式的深度学习模型,但它本身并不提供模型训练功能。模型的训练通常需要在相应的深度学习框架中进行,训练完成后再将模型转换为OpenCV支持的格式进行加载和使用。

此外,OpenCV的dnn模块还提供了丰富的功能,如图像预处理、后处理、硬件加速(如CPU、GPU加速)等,使得开发者能够轻松地将深度学习模型集成到计算机视觉应用中。

Caffe详解 

Caffe(Convolutional Architecture for Fast Feature Embedding)是一个兼具表达性、速度和思维模块化的深度学习框架,由伯克利人工智能研究小组和伯克利视觉和学习中心开发。以下是对Caffe的详细解析:

一、概述

  • 全称:Convolutional Architecture for Fast Feature Embedding(用于快速特征嵌入的卷积结构)。
  • 开发背景:由加州大学伯克利分校的贾扬清在攻读博士期间创建,最初开发于该大学。
  • 开源许可:在BSD许可下开源。
  • 语言支持:虽然其内核是用C++编写的,但Caffe提供了Python和Matlab接口,方便用户选择熟悉的语言进行调用和部署。

二、主要功能与特点

  1. 支持多种深度学习模型:包括卷积神经网络(CNN)、循环神经网络(RNN)、LSTM和全连接神经网络等。
  2. 灵活性和可扩展性:用户可以很容易地添加新的层和模块,定制自己的模型。
  3. 高效性:使用C++实现,并且支持基于GPU和CPU的加速计算内核库,如NVIDIA cuDNN和Intel MKL,使得训练和推理速度非常快。
  4. 易用性:提供了简洁的Python接口,使得用户可以方便地构建、训练和测试模型。
  5. 社区支持:Caffe拥有一个庞大的用户社区,用户可以在社区中分享模型、代码和经验,并且得到及时的技术支持。
  6. 丰富的功能:支持图像分类、目标检测、图像分割等多种任务,以及各种优化算法和工具,可以满足各种深度学习应用的需求。

三、模型格式与文件

Caffe模型格式通常包括两个主要文件:

  • .prototxt文件:这是Caffe模型的网络结构描述文件,以文本形式定义了神经网络的层次结构、层类型、参数设置等信息。通过该文件,用户可以清晰地了解神经网络的结构和参数设置。
  • .caffemodel文件:包含了经过训练的神经网络模型的权重参数,以二进制形式存储。该文件保存了神经网络中每个层次的权重和偏置等参数,是模型训练得到的实际参数数值。

四、安装与使用

安装Caffe通常需要确保系统上已经安装了一些依赖项,如CMake、Boost、OpenCV和CUDA等。用户可以从官方GitHub仓库下载最新的源代码,并按照提供的编译指南进行编译和安装。

使用Caffe框架时,用户需要在代码中引入Caffe的头文件,并创建一个Caffe的Net对象,该对象包含了网络的结构和参数。用户可以通过加载.prototxt文件和.caffemodel文件来构建和初始化网络,并进行前向计算或反向传播等操作。

五、发展历史

  • Caffe最初于加州大学伯克利分校开发,并托管于GitHub。
  • 2017年4月,Facebook发布了Caffe2,加入了递归神经网络等新功能。
  • 2018年3月底,Caffe2并入PyTorch,成为PyTorch生态系统的一部分。

综上所述,Caffe是一个功能强大、灵活易用的深度学习框架,广泛应用于学术研究、初创原型以及大规模工业应用中。

Caffe有哪些优点和缺点 

Caffe框架作为一种深度学习工具,具有其独特的优点和缺点。以下是对其优点和缺点的详细分析:

优点

  1. 高效性能
    • Caffe使用C++编写,具有高度优化的底层代码,支持多线程和并行计算,这使得它在训练和推理模型时具有非常高的效率。此外,Caffe还利用CUDA进行GPU加速,进一步提升了计算性能。
  2. 易用性
    • Caffe提供了简洁的Python接口,使得用户可以快速上手,无需深入了解复杂的底层实现。同时,Caffe还拥有丰富的文档和示例代码,方便用户学习和使用。
  3. 灵活性和可扩展性
    • Caffe支持多种深度学习模型,包括卷积神经网络(CNN)、循环神经网络(RNN)等,用户可以根据需要自定义网络结构。此外,Caffe还允许用户通过编写C++代码来添加新的层和模块,从而扩展模型的功能。
  4. 大型社区支持
    • Caffe拥有一个庞大的用户社区,用户可以在社区中分享模型、代码和经验,并且得到及时的技术支持。这为使用者提供了更多的便利和资源。
  5. 丰富的应用场景
    • Caffe广泛应用于图像处理、语音识别、自然语言处理等领域,并在多个比赛和任务中取得了优异的成绩。这证明了Caffe框架在解决实际问题中的有效性和可靠性。
  6. 可移植性
    • Caffe框架可以在不同的硬件平台上运行,支持CPU和GPU加速,并且可以方便地在不同的操作系统中部署。这使得Caffe具有很高的灵活性和适应性。

缺点

  1. 学习曲线陡峭
    • Caffe的配置和使用需要一定的深度学习知识和经验,对于初学者来说可能需要花费更多的时间和精力来学习和上手。
  2. 缺乏灵活性
    • 尽管Caffe支持多种深度学习模型,但相对于其他框架如TensorFlow和PyTorch来说,它在模型结构和任务支持上可能显得不够全面和灵活。特别是对于一些特殊需求和定制化的操作,Caffe可能无法直接满足。
  3. 文档和教程相对不完善
    • 与其他深度学习框架相比,Caffe的文档和教程相对不够完善,有时候用户可能需要自己去阅读源代码或者从社区中获取信息。这对于新手来说可能会增加学习和使用的难度。
  4. 资源占用较高
    • Caffe对硬件资源的要求较高,特别是在训练大规模模型时可能需要更多的GPU和内存资源。这可能会限制在一些资源受限的环境下使用Caffe。
  5. 社区支持相对有限
    • 虽然Caffe拥有一个庞大的用户社区,但相对于其他热门框架如TensorFlow和PyTorch来说,其社区支持可能显得相对有限。特别是在一些新兴领域和前沿技术方面,Caffe的社区贡献和更新可能不如其他框架活跃。

综上所述,Caffe框架在深度学习领域具有其独特的优势和不足。用户在使用时需要根据自己的需求和资源情况来选择合适的框架。

 OpenCV使用Caffe进行图像分类举例

使用OpenCV和Caffe进行图像分类涉及几个步骤,包括加载Caffe模型、预处理输入图像、执行前向传播以获取分类结果,以及后处理这些结果。以下是一个简单的例子,演示如何使用OpenCV的dnn模块和Caffe模型进行图像分类:

首先,确保你已经安装了OpenCV和Caffe,并且Caffe的Python接口在你的系统路径中。然后,你需要Caffe模型的.prototxt配置文件和.caffemodel权重文件。

假设我们有一个名为mobilenet.prototxt的Caffe模型配置文件和一个名为mobilenet.caffemodel的权重文件,我们将使用这些文件对图像进行分类。

以下是代码示例:

 
import cv2  
import numpy as np  
  
# 加载Caffe模型  
model_path = 'mobilenet.caffemodel'  
config_path = 'mobilenet.prototxt'  
net = cv2.dnn.readNetFromCaffe(config_path, model_path)  
  
# 加载要分类的图像  
image_path = 'example.jpg'  
image = cv2.imread(image_path)  
  
# 预处理图像  
# 假设模型接受224x224大小的输入图像  
blob = cv2.dnn.blobFromImage(image, 1.0, (224, 224), (104, 117, 123))  
  
# 设置blob作为网络的输入  
net.setInput(blob)  
  
# 执行前向传播  
outputs = net.forward()  
  
# 后处理结果  
# 假设输出层是一个Softmax层,输出的是每个类别的概率  
# 我们取概率最大的类别作为预测结果  
prediction = outputs.argmax()  
  
# 打印预测结果  
# 这里你需要有一个类别标签的列表,以便将索引转换为实际的类别名称  
# 假设我们有一个名为`labels`的列表,其中包含了类别的名称  
labels = ['class1', 'class2', 'class3', ...]  # 请根据实际情况填写类别名称  
print(f'Predicted class: {labels[prediction]}')  
  
# 可选:显示图像和预测结果  
cv2.putText(image, f'{labels[prediction]}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)  
cv2.imshow('Image Classification', image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

在这个例子中,我们首先使用cv2.dnn.readNetFromCaffe函数加载Caffe模型。然后,我们加载要分类的图像,并使用cv2.dnn.blobFromImage函数对图像进行预处理,以符合模型的输入要求。接下来,我们将预处理后的图像设置为网络的输入,并执行前向传播来获取输出。最后,我们后处理输出,找到概率最大的类别,并将其打印出来。

请注意,你需要根据你的Caffe模型和数据集来调整代码。特别是,你需要提供一个包含类别名称的列表,以便将预测结果的索引转换为实际的类别名称。此外,如果模型的输入大小或预处理方式与示例不同,你也需要相应地修改代码。

 OpenCV使用TensorFlow进行图像分类举例

使用OpenCV和TensorFlow进行图像分类是一个常见的深度学习应用。以下是一个简单的例子,演示如何使用OpenCV加载和预处理图像,然后使用TensorFlow加载预训练的模型进行图像分类。

首先,确保你已经安装了OpenCV和TensorFlow。你可以使用pip来安装它们:

pip install opencv-python tensorflow

接下来,我们将使用TensorFlow的tf.kerasAPI来加载一个预训练的模型,比如MobileNetV2,并使用OpenCV来加载和预处理图像。

以下是代码示例:

import cv2  
import numpy as np  
import tensorflow as tf  
from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input, decode_predictions  
  
# 加载预训练的MobileNetV2模型  
model = MobileNetV2(weights='imagenet')  
  
# 加载要分类的图像  
image_path = 'example.jpg'  
image = cv2.imread(image_path)  
  
# 预处理图像  
# MobileNetV2接受224x224大小的输入图像,并且需要进行归一化和色彩空间转换  
image_resized = cv2.resize(image, (224, 224))  
image_preprocessed = preprocess_input(image_resized)  
image_batch = np.expand_dims(image_preprocessed, axis=0)  # 添加一个批次维度  
  
# 使用模型进行预测  
predictions = model.predict(image_batch)  
  
# 后处理结果  
# decode_predictions函数将预测结果转换为类别名称和概率  
decoded_predictions = decode_predictions(predictions, top=3)[0]  
  
# 打印前3个最可能的类别和它们的概率  
for i, (imagenet_id, label, score) in enumerate(decoded_predictions):  
    print(f'{i + 1}: {label} ({score * 100:.2f}%)')  
  
# 可选:显示图像和预测结果  
# 在这里,我们只显示第一个预测结果  
cv2.putText(image, f'{decoded_predictions[0][1]} ({decoded_predictions[0][2] * 100:.2f}%)', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)  
cv2.imshow('Image Classification', image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

在这个例子中,我们首先加载了预训练的MobileNetV2模型,该模型在ImageNet数据集上进行了训练。然后,我们使用OpenCV加载要分类的图像,并将其调整到模型所需的输入大小(224x224)。接着,我们使用preprocess_input函数对图像进行预处理,包括归一化和色彩空间转换。预处理后,我们将图像添加到一个批次中(因为模型期望批次输入),并使用模型进行预测。

预测结果是一个概率分布,我们使用decode_predictions函数将其转换为ImageNet数据集的类别名称和对应的概率。最后,我们打印出前3个最可能的类别和它们的概率,并可选地在图像上显示第一个预测结果。

请注意,如果你使用的是其他模型或数据集,你需要相应地调整代码,包括加载不同的模型、调整图像预处理步骤,以及使用适当的解码函数来解析预测结果。

 如何使用OpenCV加载和预处理图像呢

使用OpenCV加载和预处理图像是计算机视觉项目中的常见步骤。以下是一个基本的指南,介绍如何使用OpenCV库来完成这些任务。

安装OpenCV

首先,确保你的环境中已经安装了OpenCV。你可以使用pip来安装:

pip install opencv-python

加载图像

使用OpenCV加载图像非常简单,你可以使用cv2.imread()函数。这个函数接受图像文件的路径作为参数,并返回一个包含图像数据的NumPy数组。

import cv2
# 加载图像
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
# 检查图像是否成功加载
if image is None:
print("Error: Unable to load image.")
else:
print("Image loaded successfully.")

预处理图像

预处理图像的目的是为了将图像数据转换为模型可以接受的格式,并可能包括调整大小、归一化、色彩空间转换等步骤。

调整大小

你可以使用cv2.resize()函数来调整图像的大小。这个函数接受原始图像和新的尺寸(宽度,高度)作为参数。

# 调整图像大小到224x224
image_resized = cv2.resize(image, (224, 224))
归一化

归一化通常是将像素值缩放到一个特定的范围,比如[0, 1]或[-1, 1]。对于某些模型来说,归一化是必要的,因为它们期望输入数据在这个范围内。

# 将像素值归一化到[0, 1]范围
image_normalized = image_resized / 255.0

或者,如果你需要将像素值归一化到[-1, 1]范围:

# 将像素值归一化到[-1, 1]范围
image_normalized = (image_resized / 127.5) - 1
色彩空间转换

有时候,你可能需要将图像从一种色彩空间(比如BGR)转换到另一种色彩空间(比如RGB或Grayscale)。

# 将图像从BGR转换为RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 将图像转换为灰度图
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

示例:完整流程

以下是一个完整的示例,展示了如何加载、调整大小、归一化和转换色彩空间的图像预处理流程。

import cv2  
import numpy as np  
  
# 加载图像  
image_path = 'path_to_your_image.jpg'  
image = cv2.imread(image_path)  
  
# 检查图像是否成功加载  
if image is None:  
    print("Error: Unable to load image.")  
else:  
    # 调整图像大小到224x224  
    image_resized = cv2.resize(image, (224, 224))  
  
    # 将像素值归一化到[-1, 1]范围  
    image_normalized = (image_resized / 127.5) - 1  
  
    # 如果需要,将图像从BGR转换为RGB(在这个例子中,我们假设模型需要RGB输入)  
    # 注意:如果你的图像已经是RGB格式,或者你的模型接受BGR格式,那么这一步是不必要的  
    image_rgb = cv2.cvtColor(image_normalized, cv2.COLOR_BGR2RGB)  # 这里转换的是归一化后的图像,通常不需要这样做,因为色彩空间转换应该在归一化之前完成  
    # 正确的做法应该是先转换色彩空间,然后再归一化:  
    # image_rgb = cv2.cvtColor(image_resized, cv2.COLOR_BGR2RGB)  
    # image_normalized_rgb = image_rgb / 255.0  # 或者使用其他归一化方法  
  
    # 在这里,image_normalized(或image_normalized_rgb,如果你需要RGB输入)就是预处理后的图像,可以作为模型的输入了

请注意,在上面的示例中,色彩空间转换和归一化的顺序是不正确的。通常,你应该先转换色彩空间,然后再进行归一化。我在注释中指出了正确的做法。根据你的模型和输入数据的要求,选择合适的预处理步骤。

 

这是opencv svm图像分类的整个工程代码,在VS2010下打开即可。整个工程文件以及我的所有训练的图片存放在这里,需要的可以下载,自己在找训练图片写代码花了很多时间,下载完后自行解压,训练图片和测试图片可以从这免费下载http://download.csdn.net/detail/always2015/8944959,project data文件夹直接放在D盘就行,里面存放训练的图片和待测试图片,以及训练过程中生成的中间文件,现在这个下载object_classfication_end则是工程文件,我用的是vs2010打开即可,下面工程里有几个要注意的地方: 1、在这个模块中使用到了c++的boost库,但是在这里有一个版本的限制。这个模块的代码只能在boost版本1.46以上使用,这个版本以下的就不能用了,直接运行就会出错,这是最需要注意的。因为在1.46版本以上中对比CsSVM这个类一些成员函数做了一些私有化的修改,所以在使用该类初始化对象时候需要注意。 2、我的模块所使用到的函数和产生的中间结果都是在一个categorizer类中声明的,由于不同的执行阶段中间结果有很多个,例如:训练图片聚类后所得到单词表矩阵,svm分类器的训练的结果等,中间结果的产生是相当耗时的,所以在刚开始就考虑到第一次运行时候把他以文件XML的格式保存下来,下次使用到的时候在读取。将一个矩阵存入文本的时候可以直接用输出流的方式将一个矩阵存入,但是读取时候如果用输入流直接一个矩阵变量的形式读取,那就肯定报错,因为输入流不支持直接对矩阵的操作,所以这时候只能对矩阵的元素一个一个进行读取了。 3、在测试的时候,如果输入的图片太小,或者全为黑色,当经过特征提取和单词构造完成使用svm进行分类时候会出现错误。经过调试代码,发现上述图片在生成该图片的单词的时候所得到的单词矩阵会是一个空矩阵,即该矩阵的行列数都为0,所以在使用svm分类器时候就出错。所以在使用每个输入图片的单词矩阵的时候先做一个判断,如果该矩阵行列数都为0,那么该图片直接跳过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值