计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第12章 计算机视觉与大模型_第1页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第12章 计算机视觉与大模型_第2页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第12章 计算机视觉与大模型_第3页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第12章 计算机视觉与大模型_第4页
计算与人工智能概论-问题求解、科学计算与AI应用方法 课件 第12章 计算机视觉与大模型_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算与人工智能概论问题求解、科学计算与AI应用方法第12章计算机视觉与大模型信息科学与工程学院图像分类

目标检测

大语言模型目录图像分类任务描述:对图像进行分类本任务聚焦图像分类问题,使用预先训练好的GoogLeNet模型(可判断1000个类别),判断输入的图片对应的是哪一种物品。图像分类是计算机视觉的基本任务之一,其目标是让计算机系统能够像人一样,通过视觉特征识别图像所属的类别。在本任务中,输入图像包含一种特定的物品或动植物。系统需提取图像中的关键特征,如轮廓、颜色、纹理、材质等标志性特征并基于这些特征进行分类决策。图像分类相关知识:图像的数字化与输入表示数字图像:一个二维或三维的数值矩阵。最基本的组成单位是像素(Pixel,即“图像元素”)。灰度图像:每个像素对应一个灰度值,通常用0到255之间的整数表示,0代表黑色,255代表白色,中间值表示不同强度的灰色。整个图像可看作二维数组,其大小由图像的宽度(列数)和高度(行数)决定。彩色图像:每个像素由三个数值组成,分别对应红色、绿色和蓝色的强度。一张彩色图像在计算机中被表示为一个三维数组,其维度为“高度*宽度*3”。图像分类相关知识:卷积神经网络卷积神经网络(ConvolutionalNeuralNetwork,CNN):一种专门用于处理具有网格结构数据的深度学习模型,在图像分类、目标检测等计算机视觉任务中表现出卓越的性能。它通过模拟生物视觉系统的感知机制,能够自动从原始图像数据中逐层提取空间特征,从而实现对图像内容的高效理解与判断。结构:主要由卷积层、池化层、全连接层组成。图像分类相关知识:卷积层(ConvolutionalLayer)卷积层:CNN的核心组件,负责从输入图像中提取局部特征。通过一组可学习的滤波器(也称卷积核)在输入数据上滑动,执行逐元素进行加权求和运算,生成特征图(FeatureMap)。图像分类相关知识:卷积层(ConvolutionalLayer)卷积核:用于检测某种特定模式,如垂直边缘、水平线条或颜色对比区域。①边缘检测核:用于突出图像中灰度变化剧烈的区域,常用于识别物体轮廓;②

锐化核:增强图像细节和边缘,使图像看起来更清晰;③

高斯模糊核:通过加权平均平滑图像,减少噪声干扰。传统图像处理领域,卷积核由人类设计(如PS软件)。深度学习领域,卷积核由模型自动学习。图像分类相关知识:池化层(PoolingLayer)池化层:位于卷积层之后,用于降低特征图的空间维度(即宽度和高度),减少后续计算量,并增强模型对微小位移、旋转和形变的鲁棒性。最大池化:取局部区域内的最大值作为输出,能有效保留最显著的特征。平均池化:取平均值,适用于平滑特征响应。池化操作不涉及可学习参数,仅通过滑动窗口进行下采样。图像分类相关知识:全连接层(FullyConnectedLayer)全连接层:在网络末端,经过多次卷积与池化操作提取出的高层特征被展平为一维向量,并送入一个或多个全连接层(FullyConnectedLayer)。全连接层将全局信息整合,最终连接到一个Softmax层,输出各个类别的预测概率分布。图像分类相关知识:预训练模型预训练模型:在大规模数据集(如ImageNet)上预先训练完成的神经网络模型,其参数已经具备了对图像特征的强大提取能力。预训练模型的用途:

直接使用预训练模型进行推理:模型被当作一个“即用型”系统,无需任何参数更新或再训练。输入图像后,模型直接输出分类结果或特征表示。对预训练模型进行微调(Fine-tuning):在预训练模型的基础上,针对特定任务使用新数据集对部分或全部网络参数进行再训练。通过微调,模型能够适应新的数据分布和类别体系,在小样本任务中表现出优异的泛化能力。使用预训练模型能显著降低开发门槛和资源消耗。图像分类设计思路:使用OpenCV进行图像分类OpenCV的DNN(DeepNeuralNetwork)模块:用于直接加载和运行预训练的深度学习模型。必要的模型文件:

模型结构文件:bvlc_totxt

模型权重文件:bvlc_googlenet.caffemodel

标签文件:synset_words.txt下载地址:/s/1x93rfSJcilIO6KRssYtwLg?pwd=m6hu中的目录“第12章资源”图像分类设计思路:(1)加载模型#include<opencv2/dnn.hpp>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>#include<iostream>#include<fstream>cv::dnn::Netnet=cv::dnn::readNetFromCaffe("bvlc_totxt",//网络结构"bvlc_googlenet.caffemodel"//训练权重);目标:加载预训练模型的结构和权重图像分类设计思路:(2)加载标签std::vector<std::string>classNames;std::ifstreamlabelfile("synset_words.txt");std::stringline;while(std::getline(labelfile,line)){//提取标签名称(去除编号前缀)intpos=line.find("");if(pos!=std::string::npos){classNames.push_back(line.substr(pos+1));}}目标:将提取标签文件中的物品名,放入一个C++数组(vector)中synset_words.txt文件结构:n01440764tench,Tincatincan01443537goldfish,Carassiusauratusn01484850greatwhiteshark,whiteshark,man-eater,man-eatingshark,Carcharodoncarchariasn01491361tigershark,Galeocerdocuvierin01494475hammerhead,hammerheadshark图像分类设计思路:(3)图像预处理cv::Matimage=cv::imread("input.jpg");//读取输入图像//图像预处理cv::Matblob;cv::dnn::blobFromImage(image,blob,//输出blob1.0f,//缩放因子(scalefactor)cv::Size(224,224),//目标尺寸cv::Scalar(104,117,123),//减去均值true,//是否交换BGR→RGBfalse);//是否裁剪目标:将cv::Mat图像转换为模型可接受的“blob”格式(即四维张量:[batch,channel,height,width])图像分类设计思路:(4)执行推理net.setInput(blob);//设置神经网络的输入cv::Matoutput=net.forward();//执行推理//输出为1x1000x1x1的矩阵,对应1000个类别的置信度cv::Matprobabilities=output.reshape(1,1);//展平为1x1000目标:使用模型进行推理图像分类设计思路:(5)解析结果并分类//获取最大概率的位置doublemaxProb;intclassId;cv::PointmaxLoc;cv::minMaxLoc(probabilities,nullptr,&maxProb,nullptr,&maxLoc);classId=maxLoc.x;//输出分类结果std::cout<<"预测类别:"<<classNames[classId]<<std::endl;std::cout<<"置信度:"<<maxProb*100.0<<"%"<<std::endl;//可视化结果cv::putText(image,classNames[classId],cv::Point(10,30),cv::FONT_HERSHEY_SIMPLEX,1.0,cv::Scalar(0,255,0),2);cv::imshow("ClassificationResult",image);目标:使用模型进行推理图像分类完整代码(1)00#include<opencv2/dnn.hpp>01#include<opencv2/imgproc.hpp>02#include<opencv2/highgui.hpp>03#include<iostream>04#include<fstream>05#include<vector>06intmain(intargc,char**argv){07std::stringimage_path="input.jpg";08//1.加载预训练的GoogLeNet模型09cv::dnn::Netnet=cv::dnn::readNetFromCaffe(10"bvlc_totxt",//网络结构文件11"bvlc_googlenet.caffemodel"//模型权重文件12);13if(net.empty()){14std::cerr<<"错误:无法加载模型文件,请检查路径是否正确!"<<std::endl;15return-1;16}图像分类完整代码(2)17//2.加载ImageNet类别标签18std::vector<std::string>classNames;19std::ifstreamlabelfile("synset_words.txt");20if(!labelfile.is_open()){21std::cerr<<"错误:无法打开类别标签文件synset_words.txt"<<std::endl;22return-1;23}24std::stringline;25while(std::getline(labelfile,line)){26intpos=line.find("");27if(pos!=std::string::npos){28classNames.push_back(line.substr(pos+1));29}30}31labelfile.close();图像分类完整代码(3)32//3.读取并预处理输入图像33cv::Matimage=cv::imread(image_path);34if(image.empty()){35std::cerr<<"错误:无法读取图像文件:"<<image_path<<std::endl;36return-1;37}38//调整图像大小并转换为blob(四维张量)39cv::Matblob;40cv::dnn::blobFromImage(image,blob,411.0,//缩放因子42cv::Size(224,224),//目标尺寸43cv::Scalar(104,117,123),//均值(BGR顺序)44true,//交换B和R通道(BGR→RGB)45false);//不裁剪,仅缩放46//4.设置网络输入并执行前向推理47net.setInput(blob);48cv::Matoutput=net.forward();49//将输出展平为1x1000的向量(对应1000个类别)50cv::Matprobabilities=output.reshape(1,1);图像分类完整代码(4)51//5.解析结果:找到概率最高的类别52doublemaxProb;53intclassId;54cv::PointmaxLoc;55cv::minMaxLoc(probabilities,nullptr,&maxProb,nullptr,&maxLoc);56classId=maxLoc.x;57//输出分类结果58std::cout<<"预测类别:"<<classNames[classId]<<std::endl;59std::cout<<"置信度:"<<maxProb*100.0<<"%"<<std::endl;6061//在图像上绘制预测结果62std::stringlabel=classNames[classId]+"("+std::to_string((int)(maxProb*100))+"%)";63cv::putText(image,label,cv::Point(10,30),64cv::FONT_HERSHEY_SIMPLEX,0.8,cv::Scalar(0,255,0),2);65//显示图像66cv::namedWindow("图像分类结果",cv::WINDOW_AUTOSIZE);67cv::imshow("图像分类结果",image);68std::cout<<"按任意键退出..."<<std::endl;69cv::waitKey(0);70cv::destroyAllWindows();71return0;72}图像分类

目标检测

大语言模型目录目标检测任务描述:对图像进行分类在任务1完成图像分类的基础上,本任务进一步提升计算机视觉的能力,从“识别图像中是什么”升级为“识别图像中有哪些物体、它们分别是什么、以及它们在什么位置”。这一任务称为目标检测(ObjectDetection),是智能监控、自动驾驶、机器人视觉等实际应用中的核心技术。本任务的目标:使用OpenCV4加载基于ONNX格式的预训练

YOLOv8模型,对输入图像进行目标检测,识别出图像中多个常见物体的类别(如人、汽车、狗、手机等),并用边界框标出它们在图像中的具体位置。目标检测相关知识:什么是目标检测目标检测的任务是,对于给定的一张输入图像,要求输出三个关键信息:类别标签(ClassLabel):表示检测到的物体属于预定义类别中的哪一个,如“人”、“汽车”、“狗”、“椅子”等;置信度分数(ConfidenceScore):表示模型对该检测结果的可信程度,通常是一个介于0到1之间的数值;边界框坐标(BoundingBox):用矩形框标出物体的位置,常见表示方式有(x,y,w,h)(左上角坐标、宽、高)或(x1,y1,x2,y2)(左上角和右下角坐标)。目标检测相关知识:目标检测的基本原理以YOLO为例,检测步骤主要包括特征提取、网格划分、锚框机制、分类与回归以及后处理等关键步骤。(1)特征提取YOLO首先通过一个深层卷积神经网络(CNN)对输入图像进行特征提取。(2)网格划分YOLO将输入图像划分为S×S个网格(例如YOLOv3默认为13×13或更高分辨率)。每个网格负责预测该区域内的物体。(3)锚框机制为了更好地适应不同尺寸和形状的物体,YOLO在每个网格单元中,预先定义若干个不同宽高比和大小的锚框作为初始预测框。(4)分类与回归:对于每个网格单元中的每个锚框,YOLO并行执行两项任务,①分类分支:预测该锚框内物体属于各个类别的概率。②回归分支:预测锚框的位置和大小。(5)后处理:非极大值抑制(NMS)。同一物体可能被多个相邻的锚框检测到。YOLO使用NMS算法按照置信度分数对所有预测框进行排序,选取置信度最高的框作为保留结果。目标检测相关知识:应用领域自动驾驶:车辆依靠目标检测实时识别行人、车辆、交通标志和车道线,实现环境感知与安全决策;智能安防:摄像头通过检测异常行为、统计人流量、识别车牌,提升公共安全与管理效率;智能工业制造:检测模型可自动发现产品表面缺陷、零件缺失或装配错误,显著提高质检精度与生产效率;医疗影像分析:系统能辅助医生定位肿瘤、骨折等病灶区域,提升诊断速度与准确性。目标检测设计思路:使用OpenCV进行目标检测OpenCV的DNN(DeepNeuralNetwork)模块:用于直接加载和运行预训练的深度学习模型。必要的模型文件:

YOLOv8ONNX模型文件:yolov8s.onnx

类别标签文件:s下载地址:/s/1x93rfSJcilIO6KRssYtwLg?pwd=m6hu中的目录“第12章资源”目标检测设计思路:(1)加载类别标签COCO数据集:一个广泛用于目标检测、分割和图像描述的大规模数据集,涵盖80个常见物体类别。std::vector<std::string>classNames;std::ifstreamclassFile("s");std::stringline;while(std::getline(classFile,line)){classNames.push_back(line);}classFile.close();s文件部分内容:personbicyclecarmotorbikeaeroplanebustraintruck......teddybearhairdriertoothbrush目标检测设计思路:(2)加载YOLOv8ONNX模型yolov8模型:ultralytics公司在2023年1月10号开源的YOLOv5的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务。cv::dnn::Netnet=cv::dnn::readNetFromONNX("yolov8s.onnx");目标检测设计思路:(3)读取并预处理图像读取输入图像,并将其转换为适合模型输入的格式cv::Matframe=cv::imread("test.jpg");cv::Matblob;cv::dnn::blobFromImage(frame,blob,1.0/255.0,cv::Size(640,640),cv::Scalar(),true,false);1.0/255.0表示将像素值归一化到[0,1]区间,归一化的核心目的是消除数据量纲差异,提升训练/推理的效率和精度‌目标检测设计思路:(4)执行推理将预处理后的blob设置为网络的输入,并执行前向传播net.setInput(blob);std::vector<cv::Mat>outputs;net.forward(outputs,net.getUnconnectedOutLayersNames());net.setInput(blob)将包含图像数据的矩阵对象blob设置为神经网络的输入。net.getUnconnectedOutLayersNames()返回所有未连接的输出层名称,YOLOv8通常有多个输出层,分别对应不同尺度的特征图。net.forward(outputs,net.getUnconnectedOutLayersNames())执行前向传播,获取网络的输出。outputs是矩阵类型的C++数组,数组中的每个元素对应一张输入图像的输出。目标检测设计思路:(5)解析检测结果YOLOv8模型的输出张量维度为[1,84,8400],其中84表示每个检测框的输出通道数,包含4个边界框坐标(中心点x,y和宽w、高h)以及80个类别的置信度得分;8400是模型生成的候选检测框总数。vector<int>classIds;vector<float>confidences;vector<Rect>boxes;Matoutput=outputs[0];//获取模型输出[1,84,8400]intnumClasses=classNames.size();//类别总数(通常为80)//将输出重塑为[84,8400],便于按列访问每个检测框output=output.reshape(1,84);//新形状:84行,8400列floatx_factor=frame.cols/640.0f;//宽度缩放因子floaty_factor=frame.rows/640.0f;//高度缩放因子目标检测设计思路:(5)解析检测结果(续)//遍历每一列(即每一个候选框)for(inti=0;i<output.cols;++i){//提取第i列(84×1),并重塑为1行84列的行向量Matcolumn=output.col(i).clone().reshape(1,1);float*ptr=column.ptr<float>(0);//解析边界框坐标floatx=ptr[0];//中心xfloaty=ptr[1];//中心yfloatw=ptr[2];//宽度floath=ptr[3];//高度//提取类别得分(从第4个元素开始)Matscores=Mat(1,numClasses,CV_32F,ptr+4);PointclassIdPoint;doubleconfidence;minMaxLoc(scores,nullptr,&confidence,nullptr,&classIdPoint);

//置信度过滤if(confidence>0.5){//将640x640空间中的坐标转换为原始图像上的坐标floatleft=(x-w/2)*x_factor;//转换左上角xfloattop=(y-h/2)*y_factor;//转换左上角yfloatwidth=w*x_factor;//转换宽度floatheight=h*y_factor;//转换高度//添加到结果列表classIds.push_back(classIdPoint.x);confidences.push_back(confidence);

boxes.push_back(Rect(left,top,width,height));}}目标检测设计思路:(6)应用非极大值抑制(NMS)使用NMS算法去除重复的检测框。std::vector<int>indices;cv::dnn::NMSBoxes(boxes,confidences,0.5,0.4,indices);目标检测设计思路:(7)绘制检测结果在原图上绘制边界框和类别标签。for(size_ti=0;i<indices.size();++i){intidx=indices[i];cv::Rectbox=boxes[idx];cv::rectangle(frame,box,cv::Scalar(0,255,0),2);std::stringlabel=classNames[classIds[idx]]+":"+std::to_string(confidences[idx]);cv::putText(frame,label,cv::Point(box.x,box.y-10),cv::FONT_HERSHEY_SIMPLEX,0.5,cv::Scalar(0,255,0),1);}cv::imshow("Detection",frame);cv::waitKey(0);目标检测完整代码(1)00#include<opencv2/opencv.hpp>01#include<opencv2/dnn.hpp>02#include<iostream>03#include<fstream>04#include<vector>05usingnamespacecv;06usingnamespacecv::dnn;07usingnamespacestd;08intmain(){09//==========步骤1:加载类别标签==========10vector<string>classNames;11ifstreamclassFile("s");12if(!classFile.is_open()){13cerr<<"错误:无法打开类别文件s!"<<endl;14return-1;15}16stringline;17while(getline(classFile,line)){18classNames.push_back(line);19}20classFile.close();目标检测完整代码(2)21//==========步骤2:加载ONNX模型==========22dnn::Netnet=dnn::readNetFromONNX("yolov8s.onnx");23if(net.empty()){24cerr<<"错误:无法加载ONNX模型文件!"<<endl;25return-1;26}27//设置推理后端和目标(可选,提高兼容性)28net.setPreferableBackend(DNN_BACKEND_OPENCV);29net.setPreferableTarget(DNN_TARGET_CPU);30//==========步骤3:读取并预处理图像==========31Matframe=imread("test.jpg");32if(frame.empty()){33cerr<<"错误:无法读取图像test.jpg!"<<endl;34return-1;35}36//创建blob:归一化+调整尺寸到640x64037Matblob;38blobFromImage(frame,blob,1.0/255.0,Size(640,640),Scalar(),true,false);目标检测完整代码(3)39//==========步骤4:执行前向推理==========40net.setInput(blob);41vector<Mat>outputs;42net.forward(outputs,net.getUnconnectedOutLayersNames());43//==========步骤5:解析输出==========44vector<int>classIds;45vector<float>confidences;46vector<Rect>boxes;47//YOLOv8s模型的输出大小为[1,84,8400],80类物品+box的4个值=8448Matoutput=outputs[0];49intnumClasses=classNames.size();//类别总数

50//计算x_factor和y_factor,用于后面还原检测框的位置和大小51 floatx_factor=frame.cols/640.0;52 floaty_factor=frame.rows/640.0;53 output=output.reshape(1,84);//将维度从[1,84,8400]改成[84,8400]54float*data=(float*)output.data;//获取原始数据指针目标检测完整代码(4)55for(inti=0;i<output.cols;++i){//每一列数据都包含一个检测框的信息

56//取出第i列数据并将度从[84,1]改成[1,84]57Matcolumn=output.col(i).clone().reshape(1,1);58float*ptr=(float*)column.data;59floatx=ptr[0];//中心x60floaty=ptr[1];//中心y61floatw=ptr[2];//宽度

62floath=ptr[3];//高度

63Matscores=Mat(1,numClasses,CV_32F,ptr+4);//获取类别得分(80类)64PointclassIdPoint;65doubleconfidence;66minMaxLoc(scores,nullptr,&confidence,nullptr,&classIdPoint);67if(confidence>0.5){68floatleft=(x-w/2)*x_factor;69floattop=(y-h/2)*y_factor;70floatwidth=w*x_factor;71floatheight=h*y_factor;72classIds.push_back(classIdPoint.x);73confidences.push_back((float)confidence);74boxes.push_back(Rect(left,top,width,height));75}76}目标检测完整代码(5)77//==========步骤6:应用非极大值抑制(NMS)==========78vector<int>indices;79NMSBoxes(boxes,confidences,0.5,0.4,indices);80cout<<"indices.size():"<<indices.size()<<endl;81//==========步骤7:绘制检测结果==========82for(size_ti=0;i<indices.size();++i){83intidx=indices[i];84Rectbox=boxes[idx];85cout<<"box:"<<box<<"confidences:"<<confidences[idx]<<endl;86rectangle(frame,box,Scalar(0,255,0),2);87stringlabel=classNames[classIds[idx]]+":"+to_string(confidences[idx]).substr(0,4);88putText(frame,label,Point(box.x+10,box.y+20),FONT_HERSHEY_SIMPLEX,0.6,Scalar(0,255,0),1);89}90//==========步骤8:显示结果==========91imshow("YOLOv8Detection",frame);92imwrite("result.jpg",frame);//保存结果93waitKey(0);94return0;95}目标检测任务描述:对摄像头捕捉的动态图像进行目标识别在静态图像目标检测的基础上,进一步拓展到实时视频流中的目标检测。程序实现以下功能:①调用本地摄像头(如笔记本内置摄像头或外接USB摄像头);②每秒从视频流中捕获一帧图像;③使用预训练的YOLOV8模型对每一帧进行目标检测;④在图像上实时显示检测结果,并持续输出到屏幕。目标检测设计思路:(1)使用摄像头捕捉动态图像OpenCV的cv::VideoCapture类:访问摄像头设备或视频文件。通过指定设备索引(如0表示第一个摄像头),打开摄像头并逐帧读取图像数据。cv::VideoCapturecap(0);//打开默认摄像头if(!cap.isOpened()){std::cerr<<"错误:无法打开摄像头!"<<std::endl;return-1;}目标检测设计思路:(2)每秒捕捉一次图像并进行识别为了控制识别频率,避免CPU/GPU过载,设定每间隔若干毫秒(例如50毫秒)处理一帧图像,可通过cv::waitKey()配合计时机制实现。具体策略为:①使用cap>>frame读取一帧图像;②每隔约50毫秒执行一次推理;③其余时间仅显示图像,不进行目标检测计算,这样既能保证实时性,又避免资源浪费。目标检测修改的代码(1)032//==========步骤3:打开摄像头==========033VideoCapturecap(0);//默认摄像头034if(!cap.isOpened()){035cerr<<"错误:无法打开摄像头!"<<endl;036return-1;037}038//设置摄像头分辨率(可选)039cap.set(CAP_PROP_FRAME_WIDTH,640);040cap.set(CAP_PROP_FRAME_HEIGHT,480);041Matframe;042booldetectThisFrame=true;043autolastDetectionTime=high_resolution_clock::now();044cout<<"按ESC键退出程序..."<<endl;目标检测修改的代码(1)045while(true){046cap>>frame;//读取一帧047if(frame.empty()){048cerr<<"摄像头读取失败,退出..."<<endl;049break;050}051MatdisplayFrame=frame.clone();//创建显示图像副本052//==========每秒执行一次检测==========053autocurrentTime=high_resolution_clock::now();054autoelapsed=duration_cast<milliseconds>(currentTime-lastDetectionTime).count();055if(elapsed>=50){//每隔50毫秒检测一次056detectThisFrame=true;057lastDetectionTime=currentTime;058}059if(detectThisFrame){060//==========预处理:调整大小并创建blob==========......114detectThisFrame=false;//检测完成115}//==========显示图像==========......122}图像分类

目标检测

大语言模型目录大语言模型任务描述:基于大模型的场景描述设计一个融合大模型的智能语义描述系统,以任务2目标检测输出的检查框位置以及物品类型为输入,利用大语言模型,将该输入转换为一个描述场景的句子,要求语义清晰、语法正确、表达自然,允许进行一定程度的想象。例如,输入为:根据以下目标检测结果生成场景描述:-猫(置信度0.95)位于(0.10,0.20)到(0.40,0.50)-狗(置信度0.87)位于(0.60,0.30)到(0.80,0.70)大模型的输出为:在一家温馨的公寓里,一只活泼可爱的小猫正蜷缩在柔软的沙发上,眼睛亮晶晶地盯着前方,一副专注又好奇的模样。另一只忠诚的狗狗正蜷缩在柔软的床上,紧紧地抱住了它的主人,仿佛在主人身上留下了一丝温暖。大语言模型相关知识:大语言模型的历史与现状大语言模型相关知识:大语言模型原理简述训练大模型:用于训练的自然语言文本-->用分词器切分为多个词元(Token)-->转换为高维向量输入模型-->自注意力机制分析词元之间的关联程度-->提取语义特征-->调整内部参数用大模型推理:用于推理的自然语言文本-->用分词器切分为多个词元(Token)-->转换为高维向量输入模型-->根据输入上下文逐个预测下一个最可能的词元-->该词元为新的输入-->一直循环直到输出全部结果大语言模型相关知识:大语言模型应用场景智能客服与虚拟助手:理解用户意图,提供精准的问答服务,显著提升响应效率与用户体验;内容创作与办公辅助:协助撰写新闻稿、公文、邮件、营销文案,生成代码、PPT大纲和表格;教育领域:智能答疑、个性化学习推荐、作文批改和语言学习辅导;医疗健康:辅助医生进行病历分析、文献检索、诊断建议生成,提升诊疗效率;工业领域:故障智能诊断、维修方案推荐、生产异常预警和操作规程自动生成。大语言模型设计思路:部署大模型账号注册访问AIStudio官网,点击“注册”按钮,支持手机号或第三方账号快速登录。平台登录进入个人工作台,顶部导航栏提供“模型库”、“数据集”、“开发环境”等核心功能入口。部署预训练大模型在“模型库”中选择目标模型(如ERNIE4.5),然后点击“一键部署”。在弹出的选择框中保持默认的FastDeploy部署,点击右边的箭头。在弹出的确认框中点击“确定”按钮,完成大模型的部署。大语言模型设计思路:选用支持UTF8编码的开发工具UTF-8编码支持:调用大模型API时,必须使用UTF-8编码处理请求和响应数据,DevC++不支持UTF-8,建议选用VSCode等开发工具。大语言模型设计思路:获取大模型APIKEY找到APIKEY:点击模型名称,进入模型详情页面,在调用示例中可以找到该服务的APIKEY。APIKEY的用途:用户调用大模型服务的唯一身份凭证,用于验证请求合法性并控制接口访问权限与使用配额。大语言模型设计思路:安装核心库libcurl和jsonlibcurl:跨平台HTTP客户端库,与大模型的通信可通过libcurl完成;下载编译好的库文件并在VSCode中进行配置。nlohmann/json:C++JSON处理库,是一个单一头文件的库,使用时将json.hpp拷贝到代码所在目录即可使用。json:一种开放标准的文件格式和数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。下载地址:/s/1x93rfSJcilIO6KRssYtwLg?pwd=m6hu大语言模型设计思路:调用大模型之(1)初始化HTTP客户端初始化底层的libcurl通信库;创建独立的请求句柄(句柄是用于处理某项事物的专用对象)。curl_global_init(CURL_GLOBAL_DEFAULT);//初始化CURL全局环境(支持HTTPS)CURL*curl=curl_easy_init();//创建本次请求的CURL句柄大语言模型设计思路:调用大模型之(2)

构造请求头请求头:用于向大模型声明请求的元信息,包括数据格式(如JSON)和认证方式(如APIKey)等。curl_slist_append():将多个请求头字段添加到链表中structcurl_slist*headers=nullptr;//创建空链表存储请求头headers=curl_slist_append(headers,"Content-Type:application/json");//数据类型headers=curl_slist_append(headers,"Authorization:BearerYOUR_API_KEY");//认证信息curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);//将请求头关联到CURL对象大语言模型设计思路:调用大模型之(3)

构造请求体请求体:发送给大模型的核心数据,包含提示词(Prompt)、生成参数等。请求体内容:采用JSON格式

-messages数组:传递多轮对话内容(示例中仅包含用户输入)

-max_tokens:限制生成文本的最大长度(防止超时或费用过高)

-temperature:控制生成结果的随机性(值越高创意越强,值越低确定性越高)。{"max_tokens":100,"messages":[{"content":"请求内容","role":"user"}],"temperature":0.7}//用户消息对象jsonmessage={{"role","user"},{"content",prompt}};jsonrequest_body={{"messages",json::array({message})},//消息列表{"max_tokens",100},//最大生成token数{"temperature",0.7}//随机性参数(0.0~1.0)};//序列化为JSON字符串std::stringrequest_body_str=request_body.dump();大语言模型设计思路:调用大模型之(4)

发送HTTP请求配置请求的各种参数:-CURLOPT_URL:指定API端点地址;

-CURLOPT_POSTFIELDS设置请求体内容;

-CURLOPT_POSTFIELDSIZE明确数据长度;

-CURLOPT_WRITEFUNCTION注册回调函数,用于接收大模型返回的响应数据;执行请求:调用curl_easy_perform(),若返回非CURLE_OK则表示请求失败,需根据错误码排查问题(如网络超时、认证失败)。需要将YOUR_BASE_URL设置成部署大模型的地址。curl_easy_setopt(curl,CURLOPT_URL,YOUR_BASE_URL);//部署的大模型的API地址curl_easy_setopt(curl,CURLOPT_POSTFIELDS,request_body_str.c_str());//请求体数据curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,request_body_str.length());//数据长度curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,WriteCallback);//响应回调函数std::stringread_buffer;//存储响应数据的缓冲区curl_easy_setopt(curl,CURLOPT_WRITEDATA,&read_buffer);//绑定缓冲区到回调函数CURLcoderes=curl_easy_perform(curl);//执行请求if(res!=CURLE_OK){std::cerr<<"请求失败:"<<curl_easy_strerror(res)<<std::endl;//输出错误信息}大语言模型设计思路:调用大模型之(5)解析响应数据响应数据的格式:

{"choices":[{"finish_reason":"length","index":0,"message":{

"content":"大模型返回的结果信息","reasoning_content":null,"role":"assistant","tool_calls":null}}],"created":1755180893,"id":"chatcmpl-ad18b525-320c-4933-a56e-ff623a2a556f",

"model":"default","object":"pletion","usage":{"completion_tokens":100,"prompt_tokens":18,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":118}}大语言模型设计思路:调用大模型之(5)解析响应数据解析响应中的关键字段:

使用JSON库(如nlohmann/json)将响应字符串转换为对象,通过choices数组获取模型生成的文本内容(如response_json["choices"][0]["message"]["content"])。若响应结构不符合预期(如缺少choices字段),需捕获异常并提示错误,避免程序崩溃。try{jsonresponse_json=json::parse(read_buffer);//解析JSON响应if(response_json.contains("choices")){std::cout<<"模型响应:"<<response_json["choices"][0]["message"]["content"]<<std::endl;}else{std::cerr<<"响应格式错误:"<<response_json<<std::endl;}}catch(json::parse_error&e){std::cerr<<"JSON解析失败:"<<e.what()<<"\n原始响应:"<<read_buffer<<std::endl;}大语言模型设计思路:调用大模型之(6)清理资源释放CURL占用的系统资源,避免内存泄漏:

在程序退出或不再需要网络请求时,调用curl_slist_free_all()释放请求头链表;调用curl_easy_cleanup()销毁CURL句柄;调用curl_global_cleanup()关闭CURL全局环境。curl_slist_free_all(headers);//释放请求头链表curl_easy_cleanup(curl);//销毁CURL句柄curl_global_cleanup();//关闭CURL全局环境大语言模型完整代码(1)00#include<iostream>01#include<string>02#include<curl/curl.h>03#include"json.hpp"04usingjson=nlohmann::json;05//回调函数,用于处理HTTP响应数据06staticsize_tWriteCallback(void*contents,size_tsize,size_tnmemb,std::string*userp){07userp->append((char*)contents,size*nmemb);08returnsize*nmemb;09}10std::stringcall_model(conststd::string&api_url,conststd::string&api_key,11conststd::string&prompt,intmax_tokens=100,floattemperature=0.7){12CURL*curl;13CURLcoderes;14std::stringread_buffer;15curl_global_init(CURL_GLOBAL_DEFAULT);//初始化curl16curl=curl_easy_init();//创建CURL句柄大语言模型完整代码(2)17if(curl){1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论