深度学习目标检测系列:一文弄懂YOLO算法附Python源码

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

YOLO框架(YouOnlyLookOnce)与RCNN系列算法不一样,是以不同的方式处理对象检测。它将整个图像放在一个实例中,并预测这些框的边界框坐标和及所属类别概率。使用YOLO算法最大优的点是速度极快,每秒可处理45帧,也能够理解一般的对象表示。

在本节中,将介绍YOLO用于检测给定图像中的对象的处理步骤。

整个过程是不是很清晰,下面逐一详细介绍。首先需要将标记数据传递给模型以进行训练。假设已将图像划分为大小为3X3的网格,且总共只有3个类别,分别是行人(c1)、汽车(c2)和摩托车(c3)。因此,对于每个单元格,标签y将是一个八维向量:

假设从上面的例子中选择第一个网格:

如前所述,bx、by、bh和bw是相对于正在处理的网格单元计算而言的。下面通过一个例子来说明这一点。以包含汽车的右边网格为例:

这里有一些思考的问题——如何判断预测的边界框是否是一个好结果(或一个坏结果)?单元格之间的交叉点,计算实际边界框和预测的边界框的并集交集。假设汽车的实际和预测边界框如下所示:

如果IoU大于0.5,就可以说预测足够好。0.5是在这里采取的任意阈值,也可以根据具体问题进行更改。阈值越大,预测就越准确。还有一种技术可以显着提高YOLO的效果——非极大值抑制。对象检测算法最常见的问题之一是,它不是一次仅检测出一次对象,而可能获得多次检测结果。假设:

以上就是非极大值抑制的全部内容,总结一下关于非极大值抑制算法的要点:

在上述内容中,每个网格只能识别一个对象。但是如果单个网格中有多个对象呢?这就行需要了解AnchorBoxes的概念。假设将下图按照3X3网格划分:

在本节中,首先介绍如何训练YOLO模型,然后是新的图像进行预测。

训练模型时,输入数据是由图像及其相应的y标签构成。样例如下:

对于每个网格,模型将预测·3X3X16·大小的输出。该预测中的16个值将与训练标签的格式相同。前8个值将对应于AnchorBoxes1,其中第一个值将是该网络中对象的概率,2-5的值将是该对象的边界框坐标,最后三个值表明对象属于哪个类。以此类推。最后,非极大值抑制方法将应用于预测框以获得每个对象的单个预测结果。以下是YOLO算法遵循的确切维度和步骤:

本节中用于实现YOLO的代码来自AndrewNG的[GitHub存储库],需要下载此[zip文件],其中包含运行此代码所需的预训练权重。首先定义一些函数,这些函数将用来选择高于某个阈值的边界框,并对其应用非极大值抑制。首先,导入所需的库:

importosimportmatplotlib.pyplotaspltfrommatplotlib.pyplotimportimshowimportscipy.ioimportscipy.miscimportnumpyasnpimportpandasaspdimportPILimporttensorflowastffromskimage.transformimportresizefromkerasimportbackendasKfromkeras.layersimportInput,Lambda,Conv2Dfromkeras.modelsimportload_model,Modelfromyolo_utilsimportread_classes,read_anchors,generate_colors,preprocess_image,draw_boxes,scale_boxesfromyad2k.models.keras_yoloimportyolo_head,yolo_boxes_to_corners,preprocess_true_boxes,yolo_loss,yolo_body%matplotlibinline然后,实现基于概率和阈值过滤边界框的函数:

defyolo_filter_boxes(box_confidence,boxes,box_class_probs,threshold=.6):box_scores=box_confidence*box_class_probsbox_classes=K.argmax(box_scores,-1)box_class_scores=K.max(box_scores,-1)filtering_mask=box_class_scores>thresholdscores=tf.boolean_mask(box_class_scores,filtering_mask)boxes=tf.boolean_mask(boxes,filtering_mask)classes=tf.boolean_mask(box_classes,filtering_mask)returnscores,boxes,classes之后,实现计算IoU的函数:

defiou(box1,box2):xi1=max(box1[0],box2[0])yi1=max(box1[1],box2[1])xi2=min(box1[2],box2[2])yi2=min(box1[3],box2[3])inter_area=(yi2-yi1)*(xi2-xi1)box1_area=(box1[3]-box1[1])*(box1[2]-box1[0])box2_area=(box2[3]-box2[1])*(box2[2]-box2[0])union_area=box1_area+box2_area-inter_areaiou=inter_area/union_areareturniou然后,实现非极大值抑制的函数:

defyolo_non_max_suppression(scores,boxes,classes,max_boxes=10,iou_threshold=0.5):max_boxes_tensor=K.variable(max_boxes,dtype='int32')K.get_session().run(tf.variables_initializer([max_boxes_tensor]))nms_indices=tf.image.non_max_suppression(boxes,scores,max_boxes,iou_threshold)scores=K.gather(scores,nms_indices)boxes=K.gather(boxes,nms_indices)classes=K.gather(classes,nms_indices)returnscores,boxes,classes随机初始化下大小为(19,19,5,85)的输出向量:

yolo_outputs=(tf.random_normal([19,19,5,1],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,2],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,2],mean=1,stddev=4,seed=1),tf.random_normal([19,19,5,80],mean=1,stddev=4,seed=1))最后,实现一个将CNN的输出作为输入并返回被抑制的边界框的函数:

defyolo_eval(yolo_outputs,image_shape=(720.,1280.),max_boxes=10,score_threshold=.6,iou_threshold=.5):box_confidence,box_xy,box_wh,box_class_probs=yolo_outputsboxes=yolo_boxes_to_corners(box_xy,box_wh)scores,boxes,classes=yolo_filter_boxes(box_confidence,boxes,box_class_probs,threshold=score_threshold)boxes=scale_boxes(boxes,image_shape)scores,boxes,classes=yolo_non_max_suppression(scores,boxes,classes,max_boxes,iou_threshold)returnscores,boxes,classes使用yolo_eval函数对之前创建的随机输出向量进行预测:

scores,boxes,classes=yolo_eval(yolo_outputs)withtf.Session()astest_b:print("scores[2]="+str(scores[2].eval()))print("boxes[2]="+str(boxes[2].eval()))print("classes[2]="+str(classes[2].eval()))

sess=K.get_session()class_names=read_classes("model_data/coco_classes.txt")anchors=read_anchors("model_data/yolo_anchors.txt")yolo_model=load_model("model_data/yolo.h5")在加载类别信息和预训练模型之后,使用上面定义的函数来获取·yolo_outputs·。

yolo_outputs=yolo_head(yolo_model.output,anchors,len(class_names))之后,定义一个函数来预测边界框并在图像上标记边界框:

defpredict(sess,image_file):image,image_data=preprocess_image("images/"+image_file,model_image_size=(608,608))out_scores,out_boxes,out_classes=sess.run([scores,boxes,classes],feed_dict={yolo_model.input:image_data,K.learning_phase():0})print('Found{}boxesfor{}'.format(len(out_boxes),image_file))#Generatecolorsfordrawingboundingboxes.colors=generate_colors(class_names)#Drawboundingboxesontheimagefiledraw_boxes(image,out_scores,out_boxes,out_classes,class_names,colors)#Savethepredictedboundingboxontheimageimage.save(os.path.join("out",image_file),quality=90)#Displaytheresultsinthenotebookoutput_image=scipy.misc.imread(os.path.join("out",image_file))plt.figure(figsize=(12,12))imshow(output_image)returnout_scores,out_boxes,out_classes接下来,将使用预测函数读取图像并进行预测:

img=plt.imread('images/img.jpg')image_shape=float(img.shape[0]),float(img.shape[1])scores,boxes,classes=yolo_eval(yolo_outputs,image_shape)最后,输出预测结果:

out_scores,out_boxes,out_classes=predict(sess,"img.jpg")

THE END
1.如何学习Python的方法和资源?学习Python是一个循序渐进的过程,可以通过多种方法和资源来提高你的技能。一:以下是一些推荐的方法和https://www.zhihu.com/question/3578957040/answer/56422667044
2.人工智能——多算法组合与模型最优,Python开发究竟该如何学习2.1.2 模型参数和超参数的选择 2.2 模型效果优化 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,https://blog.csdn.net/m0_60635321/article/details/137188940
3.python机器学习笔记:深入学习决策树算法原理分类技术(或分类法)是一种根据输入数据建立分类模型的系统方法,分类法的例子包括决策分类法,基于规则的分类法,神经网络,支持向量机和朴素贝叶斯分类法。这些技术都使用一种学习算法(learning algorithm)确定分类模型,该模型能够很好的拟合输入数据中类标号和属性集之间的联系,学习算法得到的模型不仅要很好地拟合输入数据,https://www.flyai.com/article/622
4.如何入门Python与机器学习第三方模型多项式新浪科技如何入门Python与机器学习 编者按:本书节选自图书《Python与机器学习实战》,Python本身带有许多机器学习的第三方库,但本书在绝大多数情况下只会用到Numpy这个基础的科学计算库来进行算法代码的实现。这样做的目的是希望读者能够从实现的过程中更好地理解机器学习算法的细节,以及了解Numpy的各种应用。不过作为补充,本书https://tech.sina.com.cn/roll/2017-10-10/doc-ifymrcmm9916035.shtml
5.python图神经网络,注意力机制Transformer模型目标检测算法Transformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Diffusion Model等)、目标检测算法(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SDD等)、图神经网络(GCN、GAT、GIN等)、强化学习(Q-Learning、DQN等)、深度学习模型可解释性与可视化方法(CAM、Grad-CAM、LIME、t-SNE等)的基本原理及Pythonhttps://blog.sciencenet.cn/blog-3559456-1409752.html
6.[Python从零到壹]十三.机器学习之聚类算法四万字总结(Khttps://github.com/eastmountyxz/Python-zero2one 在过去,科学家会根据物种的形状习性规律等特征将其划分为不同类型的门类,比如将人种划分为黄种人、白种人和黑种人,这就是简单的人工聚类方法。聚类是将数据集中某些方面相似的数据成员划分在一起,给定简单的规则,对数据集进行分堆,是一种无监督学习。聚类集合中,https://cloud.tencent.com/developer/article/1910131
7.python机器学习朴素贝叶斯算法及模型的选择和调优详解这篇文章主要为大家介绍了python机器学习朴素贝叶斯及模型的选择和调优示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步 + 目录 一、概率知识基础 1.概率 概率就是某件事情发生的可能性。 2.联合概率 包含多个条件,并且所有条件同时成立的概率,记作:P(A, B) = P(A) * P(B) https://www.jb51.net/article/229086.htm
8.用Python实现机器学习算法——线性回归算法Python 被称为是最接近 AI 的语言。最近一位名叫Anna-Lena Popkes(德国波恩大学计算机科学专业的研究生,主要关注机器学习和神经网络。)的小姐姐在GitHub上分享了自己如何使用Python(3.6及以上版本)实现7种机器学习算法的笔记,并附有完整代码。所有这些算法的实现都没有使用其他机器学习库。这份笔记可以帮大家对算法以https://www.jianshu.com/p/55483da17424
9.年薪50万!北航合肥创新研究院招募研究员!澎湃号·政务4、了解CV、机器学习、深度学习或强化学习、大数据分析等常用算法及模型,具备较强的编程能力,熟悉Tensorflow等机器学习平台; 5、有重大基础研究和应用研究经验者以及具备产学研合作和科技成果转化经验者优先; 6、能紧跟自身科研领域的发展方向,具有较强的团结协作、拼搏奉献精神,能够协助团队负责人开展科研管理工作。 https://www.thepaper.cn/newsDetail_forward_4985535
10.Python深度学习:生成式模型目标检测算法图神经网络等4、跨模态图像生成DALL.E(什么是跨模态学习?DALL.E模型的基本架构、模型训练过程)。 5、案例演示 6、实操练习 第四章 目标检测算法详解 1、目标检测任务与图像分类识别任务的区别与联系。 2. 两阶段(Two-stage)目标检测算法:R-CNN、Fast R-CNN、Faster R-CNN(RCNN的工作原理、Fast R-CNN和Faster R-CNN的https://www.bilibili.com/read/cv36784137/
11.Python机器学习原理与算法实现同时随着数据存储、数据处理等大数据技术的快速进步,机器学习的各种算法在各行各业得以广泛应用,同样成为高校师生、职场人士迎接数字化浪潮、与时俱进提升专业技能的必修课程。本书将“Python课程学习”与“机器学习课程学习”有机结合,推动数字化人才的培养,提升人才的实践应用能力。全书内容共17章。第1、2章介绍https://baike.baidu.com/item/Python%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%8E%9F%E7%90%86%E4%B8%8E%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0/62769528
12.PythonNLP自然语言处理详解51CTO博客最少切分法是指同时采用多种算法进行分词,然后比较分词结果,哪种方法的分词结果最少,就以哪种方法的结果作为最终结果。 2、基于统计的机器学习方法 在文本中,相邻的字一起出现的概率越高,说明这对字就越可能是一个词。通过大量的文本来训练一个机器学习模型,模型在训练过程中会记录在分词时遇到歧义的情况,随着模https://blog.51cto.com/u_11837698/6081861