序言
从去年12月份开始用ChatGPT,一直被惊艳到,然后问一些奇怪的问题,到现在助力开发,我发现合适的提示词(Prompt)会很大程度影响到生成的质量,我在开发的过程中也会逐渐完善修改,最终能完美的写出合适的代码。当然进程的时候会发现ChatGPT会犯一些小错误,在有一定知识基础之下,开发还是非常快的。
数据集
首先,我做的是蔬菜分类项目,理所应当的需要一些图片,这里收集了分别三种蔬菜,各30张图片作为训练集。图片大概长这个样子
开始交流
首先我大概说了一下我的需求,就是用SVM做一个物品分类的项目,他给我列了一个示例。
但是呢,我觉得我是需要读取三个文件夹的不同内容,这部分内容百度一下肯定不难,但是捏,本着能偷懒就偷懒的态度,我修改了一下,又提了一个需求。告诉我他我有三个文件夹,也有三种图片,进行三分类。于是他又给了我一串代码
其实这时候看会觉得还不错,就是基本上你设置一下路径名字,和文件类型,然后就能使用了,于是兴致冲冲的复制过去运行,这个时候发现报错了,因为他给我了一个函数extractFeaturesFromImage(imagePath),这个函数实际上是不存在的,我需要设置一下特征提取方法。当然这个时候我是不知道的,于是我又开始询问了
这个时候它有告诉我了一些常用的特征提取方法,这个时候我就觉得哇这个真的好强大,作为一个工具会发现特别好用,然后我让他用HOG方法生成一个特征提取函数,再给我重新生成一下。这个时候代码基本上大致上完成了,但是还是有一些小问题,在运行中报错了,第一个就是报错shape大小不一致,这个错误在图片处理中很常见,我发现代码并没有给我一个图片预处理的部分,不同的图像大小不一致,所以我又要求让他给我做归一化操作。当然,完美解决了。
可是他还是报错了,emmmm好吧,继续问,继续解决。免费的3.5还是有点不太行呀hahhh。
但是他还是给我修复了,这一版代码就可以使用了,而且发现在识别准确率上面还是非常高的,NICE!这个过程开发不到半个小时,就能用matlab这个不太熟悉的语言开发一个简单的应用,换做以前这半个小时查个api都能给我人查晕哈哈哈哈,下面贴出完整版代码吧!
% 物品分类示例 - 读取三个文件夹的图片进行分类% 1. 准备数据
% 假设您有三个文件夹,每个文件夹包含一种类型的图像。
% 在这个示例中,我们假设三种类型的图像分别存储在文件夹A、文件夹B和文件夹C中。% 设置文件夹路径
folderA = './carrot';
folderB = './chili';
folderC = './pumpkin';
% 使用HOG特征进行分类(包括图像大小归一化)% 读取文件夹A中的图像
imageFilesA = dir(fullfile(folderA, '*.png')); % 根据图像文件类型进行修改
numImagesA = numel(imageFilesA);% 读取文件夹B中的图像
imageFilesB = dir(fullfile(folderB, '*.png')); % 根据图像文件类型进行修改
numImagesB = numel(imageFilesB);% 读取文件夹C中的图像
imageFilesC = dir(fullfile(folderC, '*.png')); % 根据图像文件类型进行修改
numImagesC = numel(imageFilesC);% 创建特征矩阵和类别向量
numFeatures = 34596; % HOG特征向量的维度
numImagesTotal = numImagesA + numImagesB + numImagesC;X = zeros(numImagesTotal, numFeatures);
y = strings(numImagesTotal, 1);% 提取特征并标记类别
for i = 1:numImagesAimagePath = fullfile(folderA, imageFilesA(i).name);% 读取图像并进行大小归一化image = imread(imagePath);resizedImage = imresize(image, [256, 256]); % 调整图像大小为256x256% 提取图像的HOG特征并将其存储在特征矩阵中feature = extractHOGFeaturesFromImage(resizedImage); % 调用HOG特征提取函数X(i, :) = feature;% 将类别标签存储在类别向量中y(i) = '胡萝卜;price';
endfor i = 1:numImagesBimagePath = fullfile(folderB, imageFilesB(i).name);% 读取图像并进行大小归一化image = imread(imagePath);resizedImage = imresize(image, [256, 256]); % 调整图像大小为256x256% 提取图像的HOG特征并将其存储在特征矩阵中feature = extractHOGFeaturesFromImage(resizedImage); % 调用HOG特征提取函数X(numImagesA + i, :) = feature;% 将类别标签存储在类别向量中y(numImagesA + i) = '辣椒;price';
endfor i = 1:numImagesCimagePath = fullfile(folderC, imageFilesC(i).name);% 读取图像并进行大小归一化image = imread(imagePath);resizedImage = imresize(image, [256, 256]); % 调整图像大小为256x256% 提取图像的HOG特征并将其存储在特征矩阵中feature = extractHOGFeaturesFromImage(resizedImage); % 调用HOG特征提取函数X(numImagesA + numImagesB + i, :) = feature;% 将类别标签存储在类别向量中y(numImagesA + numImagesB + i) = '南瓜;price';
end% 2. 训练SVM模型
% 使用fitcecoc函数来训练SVM模型,并使用'Linear'作为线性核函数。
svmModel = fitcecoc(X, y, 'Learners', 'svm', 'Coding', 'onevsall', 'Learner', 'linear');% 3. 进行预测
% 假设您有一个新的图像需要进行分类预测。
% 提取新图像的HOG特征并存储在newFeature中
newImagePath = './testPhoto/3.png'; % 根据您的新图像路径进行修改
newImage = imread(newImagePath);
resizedNewImage = imresize(newImage, [256, 256]); % 调整图像大小为256x256
newFeature = extractHOGFeaturesFromImage(resizedNewImage); % 调用HOG特征提取函数
predictedLabel = predict(svmModel, newFeature);% 4. 显示结果
disp(['预测结果:' predictedLabel]);
imshow(imread(newImagePath));
% HOG特征提取函数
function features = extractHOGFeaturesFromImage(image)% 将图像转换为灰度图像grayImage = rgb2gray(image);% 计算HOG特征hogFeatures = extractHOGFeatures(grayImage);% 返回HOG特征向量features = hogFeatures;
end
有代码有注释,结构异常清楚,自愧不如啊,写的比我好太多了!