• [问题求助] UAP9600对接科大ASR参数问题咨询
    【问题来源】中讯网联    【问题简要】UAP9600对接科大ASR参数问题咨询【问题类别】UAP9600【AICC解决方案版本】UAP9600 V1R5C00 SPC102CTI版本:ICDV300R008C25SPC017【期望解决时间】【尽快】【问题现象描述】请问下我这边需要使用UAP9600去对接科大的ASR,其中MRCP的两个参数“SL”和"SVA"应该设置多少合适呢?推荐怎么配置呢?
  • [问题求助] 通话过程中进行通话保持操作,导致通话50分钟只有14分钟的录音文件
    【问题来源】中讯网联    【问题简要】通话过程中进行通话保持操作,导致通话50分钟只有14分钟的录音文件【问题类别】通话录音【AICC解决方案版本】UAP9600 V1R5C00 SPC102CTI版本:ICDV300R008C25SPC017【期望解决时间】【尽快】【问题现象描述】有一通通话时长为50分钟,其中执行了6次通话保持操作,在第三次操作后(14分钟时)录音就结束了,但是查看话单记录和录音记录都是50分钟,只有录音文件是只有14分钟的,检查CC-GateWay日志发现在第三次保持时出现了以下消息显示通话释放,但是其实这个时候通话还在继续通话开始时间:2023-07-27 13:25callID:1690435526-266260通话保持操作记录为下图CC-GateWay日志见附件
  • [其他] HOG特征详解与行人检测
    HOG概述HOG(Histogram of Oriented Gradient)特征在对象检测与模式匹配中是一种常见的特征提取算法,是基于本地像素块进行特征直方图提取的一种算法,对象局部的变形与光照影响有很好的稳定性,最初是用HOG特征来来识别人像,通过HOG特征提取+SVM训练,可以得到很好的效果,OpenCV已经有了。HOG特征提取的大致流程如下:详细解读第一步:灰度化对HOG特征提取来说第一步是对输入的彩色图像转换为灰度图像,图像灰度化的方法有很多,不同灰度化方法之间有一些微小的差异,从彩色到灰度的图像转换可以表示如下:第二步:计算图像梯度计算图像的X方向梯度dx与Y方向梯度dy,根据梯度计算mag与角度,计算梯度时候可以先高斯模糊一下(可选步骤),然后使用sobel或者其它一阶导数算子计算梯度值dx、dy、mag、angle:第三步:Cell分割与Block对于图像来说,分成8乘以8像素块,每个块称为一个Cell,每个2x2大小的Cell称为一个Block,每个Cell根据角度与权重建立直方图,每20度为一个BIN,每个Cell得到9个值、每个Block得到36个值(4x9), 图像如下:每个Block为单位进行L2数据归一化,作用是抵消光照/迁移影响,L2的归一化的公式如下:第四步:生成描述子对于窗口64x128范围大小的像素块,可以得到8x16个Cell, 使用Block在窗口移动,得到输出的向量总数为7x15x36=3780特征向量,每次Block移动步长是八个像素单位,一个Cell大小。使用HOG特征数据HOG特征本身是不支持旋转不变性与多尺度检测的,但是通过构建高斯金字塔实现多尺度的开窗检测就会得到不同分辨率的多尺度检测支持。OpenCV中HOG多尺度对象检测API如下:virtual void cv::HOGDescriptor::detectMultiScale(     InputArray  img,     std::vector< Rect > &   foundLocations,     double  hitThreshold = 0,     Size    winStride = Size(),     Size    padding = Size(),     double  scale = 1.05,     double  finalThreshold = 2.0,     bool    useMeanshiftGrouping = false  ) Img-表示输入图像 foundLocations-表示发现对象矩形框 hitThreshold-表示SVM距离度量,默认0表示,表示特征与SVM分类超平面之间 winStride-表示窗口步长 padding-表示填充 scale-表示尺度空间 finalThreshold-最终阈值,默认为2.0 useMeanshiftGrouping-不建议使用,速度太慢拉使用OpenCV预训练SVM行人HOG特征分类器实现多尺度行人检测的代码如下:import cv2 as cv if __name__ == '__main__':     src = cv.imread("D:/images/pedestrian.png")     cv.imshow("input", src)     hog = cv.HOGDescriptor()     hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())     # Detect people in the image     (rects, weights) = hog.detectMultiScale(src,                                             winStride=(4, 4),                                             padding=(8, 8),                                             scale=1.25,                                             useMeanshiftGrouping=False)     for (x, y, w, h) in rects:         cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)     cv.imshow("hog-detector", src)     cv.waitKey(0)     cv.destroyAllWindows()原图显示如下:运行显示如下:
  • [其他] 直接输出实例的方法
    直接输出实例的方法:VectorMapNet (BEV): 端到端矢量化高精地图学习pipeline, 采用板载传感器观测,并预测BEV视角中一组稀疏的折线基元,以对高精地图的几何形状进行建模。利用折线作为基元来建模复杂的地图元素,并通过两步来解析几何元素:地图元素检测器和折线生成器,分别是sparse cross attention(element query and bev feature)和自回归的点列回归transformer;STSU (BEV): STSU采用基于DETR的方法学习每个object的query,然后基于MLP学习每根线的控制点(贝塞尔曲线表征线)和线之间的拓扑关系;学到的线分段,且有重叠;HRAN (BEV): 它首先迭代找到每条车道线的起点,然后对于每条车道线,迭代地绘制沿该线的下一个顶点。这两个RNN以分层方式进行组织。提出了折线损失的想法(双向最近点距离),以鼓励神经网络输出结构化折线。DagMapper (BEV): 该方法要解决HRAN不能解决的分叉、合并场景,它接受激光雷达强度图并输出DAG(有向无环图)。DAGMapper的核心还有一个循环卷积头,它迭代地关注以最后一个预测点为中心的裁剪特征图补丁,并预测下一个点的位置。变化之处在于它还预测了点的状态为合并,派生或继续。局限:目前还缺少一个能够适用于城区各种类型车道线或者矢量元素的矢量化表征方法
  • [其他] 基于anchor的方法
    Persformer (BEV): 通过关注以摄像机参数作为参考的相关前视图局部区域(deformable cross attention)来生成鲁棒的BEV特征,图像和BEV下的检测头分别采用LaneATT和3D-LaneNet的方法。2D和3D统一anchor设计,图像视角anchor是bev视角投影到图像中生成的;LineCNN: 采用经典的Faster R-CNN作为一级车道线检测器,但推理速度较低(<30 FPS);LaneATT: 采用了更通用的单阶段检测方法,用一条线作为 anchor,并且在整个图片的左右、下面设置了上千个 anchor,对车道线关于 anchor 的 offset 进行回归;3D-LaneNet (BEV): 3D车道线检测的开创性工作,采用spatial transformer network来完成特征的空间投影;在弯曲或挤压转弯的情况下,存在着特征转换不当的问题;Gen-LaneNet (BEV): 建立在3D-LaneNet之上,并设计了一个两阶段的网络来解耦分割器和三维车道预测头,第一阶段首先对 2D 层面进行图像分割,然后利用外参的真值将分割的图像投影到 virtual top view,最终预测得到 3D 下的结果;非端到端,性能很大程度取决于第一阶段二值分割的准确性,不利于极端天气情况。该算法对相机参数要求还是比较高的,当参数出现“些许”不准确时,检测结果会变得较差;CLGO (BEV): 设计了一个两阶段框架,首先预测摄像机姿态,然后利用相机姿态生成俯视图图像,进行精确的三维车道检测;非端到端,不易收敛;EigenLanes: 提出特征车道(eigenlane)的概念,把训练集中的所有车道线利用SVD降维的方法,提取出有代表性的特征车道;每条车道线可以由eigenlane的线性组合近似;在车道线检测时,先筛选出合适的eigenlane,然后基于近似的车道,回归出offset进行车道线的refine;CLRNet: 提出一种coarse-to-fine的机制,利用高层特征检出车道线,利用低层特征调节车道线位置;提出RoIGather模块(attention)获取全局语境信息;局限:需要预定义anchor,不够灵活,anchor很难适应各种复杂的车道线型;Y_ref的匹配,使得在一些复杂场景中的起点很难识别,会丢线。
  • [其他] 基于多项式回归的方法
    基于多项式回归的方法:STSU (BEV): STSU采用基于DETR的方法学习每个object的query,然后基于MLP学习每根线的控制点(贝塞尔曲线表征线)和线之间的拓扑关系;学到的线分段,且有重叠;Rethinking efficient lane detection via curve Curve Modeling: 提出了基于可变形卷积的特征翻转融合,以利用驾驶场景中的对称特性。提出更合理的Bezier曲线采样损失,通过在一组均匀间隔的t值(T)处采样曲线,这意味着曲线长度相等相邻的样本点;先验对称假设过强;PolyLaneNet:直接学习预测具有简单全连接层的多项式系数,速度快,但是由于现有的数据集不均衡,造成一些偏差LSTR: End-to-end Lane Shape Prediction with Transformers : 使用transformer块来预测基于 DETR 的端到端模式中的多项式,速度非常快420 FPS;该方法的多项式表征方式不适用于横向车道线。局限:抽象因子难以优化;基于参数化拟合的方案虽然回归更少的参数,但对于预测的参数较为敏感,如高阶系数的错误预测可能造成车道线形状的变化。尽管基于参数化的方案有更快的推理速度,但在精度上有一定的瓶颈。大曲率弯拟合效果较差。
  • [其他] 基于row-wise的方法
    作者丨wanghy@知乎链接丨https://zhuanlan.zhihu.com/p/551743843行分类方法是一种简单的基于输入图像为网格划分的检测方法。对于每一行,只选择一个最可能的一个网格。Ultra Fast Structure-aware Deep Lane Detection: 对一张图在高度H 上划分为h个row-anchors, 在宽度W上划分为w个griding-cells,并将车道线检测问题变成一个分类问题:分类预测一个三维tensor Ch(w+1),P_i,j代表i_th车道线在j_th row-anchor上的概率分布向量。w+1是分类类别,而不是C。基于分割的方法计算量是HW(C+1),每个像素上都要做一次分类,类别数为C+1; 本文方法计算量是Ch(w+1),需要做C*h次分类,类别数为w+1。计算量下降了两个数量级。CondLaneNet: 利用 conditional convolution,实现了更精细的车道线检测,并且引入了 Recurrent instance module 用于解决车道线分叉场景;局限:不能适用于横向车道线;由于每一行选择一个网格,所以需要对每条可能的车道线都要重复操作,这种方法还需要后处理;
  • [其他] 基于关键点的方法
    作者丨wanghy@知乎链接丨https://zhuanlan.zhihu.com/p/551743843RelayChain: 模型预测一个分割图来对前景和背景区域进行分类。对于前景区域中的每个像素点,通过前向分支和后向分支来恢复整个车道。每个分支解码传输图和距离图以产生移动到下一个点的方向,以及逐步预测relay station(下一个点)的步骤。实际上就是预测三种图:分割图、两侧间隔1m距离点的方向图和距离两个端点的距离图。最后通过分割图得到的关键点生成车道线实例,并通过NMS进行处理得到最终的车道线。FOLOLane: 第一次将车道线检测做成局部的几何建模。模型只需要在受限的空间范围内,关注于比较简单的任务,使估计出来的局部曲线非常精确。输入一张图片,经过CNNs提取特征。把图片沿着高度等距离画线,距离为固定值,这样等分线和车道线曲线的交点就是关键点集合的子集。然后逐像素的预测四个map:key points, 关键点与上一个交点关键点在水平上的坐标偏差、关键点与当前交点关键点在水平上的坐标偏差、关键点与下一个交点关键点在水平上的坐标偏差。最后通过后处理连线。PINet: 经过feature extraction layer,由关键点预测里最常用的2个Hourglass block构成,每个block有三个output branch,分别为confidence branch、offset branch、feature branch。最后通过后处理聚类得到实例车道线;关键点检测方法,相比分割网络而言,模型更小,计算开销也更小。A Keypoint-based Global Association Network for Lane Detection: 提出了一个全局关联网络(GANet)来从一个新的角度描述车道检测问题,其中每个关键点直接回归到车道线的起点,而不是逐点扩展。关键点与其所属车道线的关联是通过预测它们在全局范围内与相应车道起点的偏移量来实现的。还提出了一种车道感知特征聚合器(LFA),它自适应地捕获相邻关键点之间的局部相关性。
  • [其他] 基于分割和辅助实例化信息的方法:
    作者丨wanghy@知乎链接丨https://zhuanlan.zhihu.com/p/551743843基于分割和辅助实例化信息的方法:HDMapNet (BEV): 通过MLP得到视觉bev特征,通过Pointpillar得到激光bev特征,concat得到最终bev feature。在bev feature上学习语义分割、实例分割instance embedding和方向预测direction prediction,并通过后处理得到语义要素;后处理得到的线会出现闭环;3D-LaneNet+ (BEV): 将图像划分成格子,每个格子进行二分类(判断是否有线经过),另外,对有线的格子回归线段的横向偏移、角度(N个bins分类+offset微调)、高度偏移和Embedding vector(用于把曲线小片段聚合成车道线曲线)。在特征学习上,沿用了3D-LaneNet,都是两路的path way。只不过相机外参俯仰角、安装高度直接输入而不是模型预测。LaneAF (Affinity fields): 输出binary seg, 横纵向affinity fields,分别表示:在每行中,每个前景像素位于它所属车道线中心的左边还是右边、当前像素相较于上一行的车道线中心,是在左边还是右边。最后通过这三个预测解码得到车道线实例。Spatial CNN: 将车道线检测问题构建为一个多类别语义分割问题,提出spatial cnn方法来建模空间结构信息(信息向下/向上/向右/向左传播),来学习形状先验。该方法对细长的车道线检测很有效;该方法固定数量、需要聚类等处理、多类别分割模型较大,速度慢;RESA: 这篇文章是SCNN的升级,减少计算量。RESA整体思路和SCNN相同,包含四种OPs:”往上“、”往下“、”往左“、”往右“。区别是每个OPs会重复做K次,每次的stride会逐渐增加。LaneNet:利用实例分割instance embedding管道来处理可变数量的线,但它需要推理后聚类来生成线实例。SAD: 提出基于知识蒸馏(Knowledge Distillation)的车道线检测模型SAD,能增强CNN的特征表达能力。由于SAD只参与模型训练,因此不会增加推断时的计算复杂度。ONCE-3DLanes (BEV): 在图像视图中回归车道的三维坐标,而不将特征地图转换为鸟瞰视图(BEV)。该方法还利用分割分支和空间上下文分支分别预测图像层面分割和像素位置偏移。最后通过几何处理得到3D车道线;分割方法局限:需要后处理,速度慢,实例区分有困难;它们还受到分割任务的局部性的影响,因此它们往往在遮挡或极端光照条件下表现更差。
  • [其他] 使用Python+OpenCV+Tensorflow实现图像聚类
    文章来源于深度学习与计算机视觉 ,作者磐怼怼在不想自己收集数据集的情况,我们如何解决这个问题呢?这就是本文的主要内容,即将深度学习直接应用于测试数据(此处为图像),而无需创建训练数据集并在该数据集上训练神经网络。卷积神经网络作为特征提取器首先我们需要讨论为什么需要特征提取器?以及如何使卷积神经网络(CNN)发挥作用。图像数据的特征提取器:假设算法需要像特征一样需要两只眼睛,一只鼻子和一张嘴来将图像分类为面部,但是在不同的图像中,这些特征存在于不同的像素位置,因此简单地将图像扁平化并将其提供给算法是不起作用的。而解决这个问题刚好是CNN的卷积层发挥作用的地方。卷积层作为我们的特征提取器,并将图像分解为越来越精细的细节,我们来看一下下面的例子:这是一只猫的图像,这是Vgg16的第一个卷积层看到它的样子请注意不同的图像,这些是我们的CNN所学习的特征图,一些特征图着重于轮廓,一些特征着重于纹理,而某些特征则涉及更细微的细节(如耳和嘴),下一阶段的卷积层将这些特征分解得更细的细节。上午我们知道了卷积层可以学习图像的特定功能,那么接下来我们将实现编码。实现CNN的卷积层网络:以下代码显示了如何使用预训练的CNN Vgg16获得以上结果: MyModel = tf2.<a onclick="parent.postMessage({'referent':'.tensorflow.keras'}, '*')">keras.applications.VGG16(    include_top=True, weights='imagenet', input_tensor=None, input_shape=None,    pooling=None, classes=1000, classifier_activation='softmax')MyModel.summary() ## lets Define a Function that can show Features learned by CNN's nth convolusion layerdef ShowMeWhatYouLearnt(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..Image'}, '*')">Image, <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..layer'}, '*')">layer, <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel):<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = img_to_array(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..Image'}, '*')">Image)<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = np.<a onclick="parent.postMessage({'referent':'.numpy.expand_dims'}, '*')">expand_dims(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img, 0)    ### preprocessing for img for vgg16<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img = tf2.<a onclick="parent.postMessage({'referent':'.tensorflow.keras'}, '*')">keras.applications.vgg16.preprocess_input(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img)    ## Now lets define a model which will help us    ## see what vgg16 sees<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..inputs'}, '*')">inputs = <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel.inputs<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..outputs'}, '*')">outputs = <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..MyModel'}, '*')">MyModel.layers[<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..layer'}, '*')">layer].output<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..model'}, '*')">model = Model(inputs=<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..inputs'}, '*')">inputs, outputs=<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..outputs'}, '*')">outputs)<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..model'}, '*')">model.summary()    ## let make predictions to see what the Cnn sees<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..featureMaps'}, '*')">featureMaps = <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..model'}, '*')">model.predict(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..img'}, '*')">img)    ## Plotting Features    for a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..maps'}, '*')">maps in <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..featureMaps'}, '*')">featureMaps:plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.figure'}, '*')">figure(figsize=(20,20))<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..pltNum'}, '*')">pltNum = 1        for <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..a'}, '*')">a in range(8):            for <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..b'}, '*')">b in <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..range'}, '*')">range(8):plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.subplot'}, '*')">subplot(8, 8, <a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..pltNum'}, '*')">pltNum)plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.imshow'}, '*')">imshow(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..maps'}, '*')">maps[: ,: ,<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..pltNum'}, '*')">pltNum - 1], cmap='gray')<a onclick="parent.postMessage({'referent':'.kaggle.usercode.12234793.44545592.ShowMeWhatYouLearnt..pltNum'}, '*')">pltNum += 1plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.show'}, '*')">show()接下来我们将重点介绍如何来创建我们的聚类算法。设计图像聚类算法在本节中,我们使用Kaggle上的 keep-babies-safe 数据集。https://www.kaggle.com/akash14/keep-babies-safe首先,我们创建一个图像聚类模型,来将给定的图像分为两类,即玩具或消费品,以下是来自该数据集的一些图像。以下代码实现我们的聚类算法:##################### Making Essential Imports ############################ import sklearn import os import sys import matplotlib.pyplot as plt import cv2 import pytesseract import numpy as np import pandas as pd import tensorflow as tf conf = r'-- oem 2' ##################################### # Defining a skeleton for our       # # DataFrame                         # ##################################### DataFrame = {     'photo_name' : [],     'flattenPhoto' : [],     'text' : [],     } ####################################################################################### #      The Approach is to apply transfer learning hence using Resnet50 as my          # #      pretrained model                                                               # ####################################################################################### MyModel = tf.keras.models.Sequential() MyModel.add(tf.keras.applications.ResNet50(     include_top = False, weights='imagenet',    pooling='avg', )) # freezing weights for 1st layer MyModel.layers[0].trainable = False ### Now defining dataloading Function def LoadDataAndDoEssentials(path, h, w):     img = cv2.imread(path)     DataFrame['text'].append(pytesseract.image_to_string(img, config = conf))     img = cv2.resize(img, (h, w))     ## Expanding image dims so this represents 1 sample     img = img = np.expand_dims(img, 0)     img = tf.keras.applications.resnet50.preprocess_input(img)     extractedFeatures = MyModel.predict(img)     extractedFeatures = np.array(extractedFeatures)     DataFrame['flattenPhoto'].append(extractedFeatures.flatten()) ### with this all done lets write the iterrrative loop def ReadAndStoreMyImages(path):     list_ = os.listdir(path)     for mem in list_:         DataFrame['photo_name'].append(mem)         imagePath = path + '/' + mem         LoadDataAndDoEssentials(imagePath, 224, 224) ### lets give the address of our Parent directory and start path = 'enter your data's path here' ReadAndStoreMyImages(path) ###################################################### #        lets now do clustering                      # ###################################################### Training_Feature_vector = np.array(DataFrame['flattenPhoto'], dtype = 'float64') from sklearn.cluster import AgglomerativeClustering kmeans = AgglomerativeClustering(n_clusters = 2) kmeans.fit(Training_Feature_vector) A little explanation for the above code:上面的代码使用Resnet50(一种经过预先训练的CNN)进行特征提取,我们只需移除其头部或用于预测类别的神经元的最后一层,然后将图像输入到CNN并获得特征向量作为输出,实际上,这是我们的CNN在Resnet50的倒数第二层学习到的所有特征图的扁平数组。可以将此输出向量提供给进行图像聚类的任何聚类算法。让我向你展示通过这种方法创建的簇。该可视化的代码如下## lets make this a dataFrame import seaborn as sb import matplotlib.pyplot as plt dimReducedDataFrame = pd.DataFrame(Training_Feature_vector) dimReducedDataFrame = dimReducedDataFrame.rename(columns = { 0: 'V1', 1 : 'V2'}) dimReducedDataFrame['Category'] = list (df['Class_of_image']) plt.figure(figsize = (10, 5)) sb.scatterplot(data = dimReducedDataFrame, x = 'V1', y = 'V2',hue = 'Category') plt.grid(True) plt.show()结论本文通过解释如何使用深度学习和聚类将视觉上相似的图像聚在一起形成簇,而无需创建数据集并在其上训练CNN。
  • [其他] 使用YOLOv5模型进行目标检测(4)-- 训练参数解释
     训练参数解释我们打开train.py文件,滑到主函数部分就可以看到需要传入的参数,下面一一介绍一下这些参数:weights:权重文件路径,如果是''则重头训练参数,如果不为空则做迁移学习,----那么权重文件的模型需与cfg参数中的模型对应cfg:存储模型结构的配置文件data:训练、验证数据配置文件hyp:超参数配置文件,其中的参数意义下面会解释epochs:指的就是训练过程中整个数据集将被迭代多少次batch-size:每次梯度更新的批量数,太大会导致显存不足img-size:训练图片的尺寸rect:进行矩形训练resume:恢复最近保存的模型开始训练nosave:仅保存最终checkpointnotest:仅测试最后的epochnoautoanchor:不进行anchors的k-means聚类evolve:进化超参数bucket:gsutil bucketcache-images:缓存图像以加快训练速度image-weights:给图片加上权重进行训练device:cuda device, i.e. 0 or 0,1,2,3 or cpumulti-scale:多尺度训练,img-size +/- 50%single-cls:单类别的训练集adam:使用adam优化器name:重命名results.txt to results_name.txt超参数配置文件./data/hyp.scratch.yaml参数解释:lr0:学习率,可以理解为模型的学习速度lrf:OneCycleLR学习率变化策略的最终学习率系数momentum:动量,梯度下降法中一种常用的加速技术,加快收敛weight_decay:权值衰减,防止过拟合。在损失函数中,weight decay是正则项(regularization)前的一个系数warmup_epochs:预热学习轮数warmup_momentum:预热学习初始动量warmup_bias_lr:预热学习初始偏差学习率giou:GIoU损失收益cls:类别损失收益cls_pw:类别交叉熵损失正类权重obj:是否有物体损失收益obj_pw:是否有物体交叉熵正类权重iou_t:iou阈值anchor_t:多尺度anchor阈值fl_gamma:focal loss gamma系数hsv_h:色调Hue,增强系数hsv_s:饱和度Saturation,增强系数hsv_v:明度Value,增强系数degrees:图片旋转角度translate:图片转换scale:图片缩放shear:图片仿射变换perspec:透视变换mosaic:mosaic数据增强mixup:mixup数据增强由于时间和能力有限,上面的解释没有包含所有参数,读者可以通过阅读源代码进行进一步理解。
  • [其他] 使用YOLOv5模型进行目标检测(3)---训练自己的数据集
    训练自己的数据集3.1 使用labelimg标注图片我们训练模型的第一步就是获取数据集,数据集一般通过拍照、爬虫或直接下载等方式获得,直接下载的数据集如比赛数据集都会有标注,我们可以直接使用所给的数据进行训练,但是通过拍照和爬虫获得的数据需要我们自己进行数据标注。目标检测标注工具有很多,今天主要讲解labelimg的标注步骤(文末附labeling下载地址)。下载并解压完后打开data文件夹中的predefined_classes.txt文件,可以在文件中写入自己要定义的类名,如安全帽检测中有两类:安全帽和人,我们就在predefined_classes.txt文件中的第一行写helmet,第二行写person。标注图片步骤如下:把要标注的数据放在img_whole/datasets文件夹中,打开labelimg.exe,点击“Open Dir”打开img_whole/datasets文件夹,屏幕中就会显示图片,点击“Create RectBox”将需要标注的物体框出来并注明其类别,在标注完所有物体后点击“Save”保存标注文件至img_whole/xml文件夹中,标注文件格式为xml,点击“Next Image”标注下一张图片,然后继续进行步骤3直至标注完全部图片3.2 将xml文件转换为YOLO标注文件我们随便打开一个xml文件,xml文件是DOM树结构,python的xml模块可以解析它。我们需要的信息是图像宽度width、图像高度height、检测框左上角坐标xmin和ymin以及检测框右下角坐标xmax、ymax。我们运行voc_label.py便可在labels文件夹中生成YOLOv5标签文件,标签文件中每一行的数据为class, x, y, w, h,class是该物体的类别,x,y是检测框中心坐标,w,h是检测框的宽和高。voc_label.py代码:import xml.etree.ElementTree as ET import os from os import getcwd from tqdm import tqdm classes = ["helmet", "person"] def convert(size, box):     dw = 1. / size[0]     dh = 1. / size[1]     x = (box[0] + box[1]) / 2.0     y = (box[2] + box[3]) / 2.0     w = box[1] - box[0]     h = box[3] - box[2]     x = x * dw     w = w * dw     y = y * dh     h = h * dh     return (x, y, w, h) def convert_annotation(image_id):     in_file = './xml/%s.xml' % (image_id)     out_file = open('./labels/%s.txt' % (image_id), 'w')     tree = ET.parse(in_file)     root = tree.getroot()     size = root.find('size')     w = int(size.find('width').text)     h = int(size.find('height').text)     for obj in root.iter('object'):         difficult = obj.find('Difficult').text         cls = obj.find('name').text         if cls not in classes or int(difficult) == 1:             continue         cls_id = classes.index(cls)         xmlbox = obj.find('bndbox')         b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),              float(xmlbox.find('ymax').text))         bb = convert((w, h), b)         out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') if __name__ == "__main__":     wd = getcwd()     print(wd)     if not os.path.exists('./labels/'):         os.makedirs('./labels/')     image_ids = os.listdir('./datasets')     for image_id in tqdm(image_ids):         convert_annotation(image_id.split('.')[0])3.3 训练本文的训练数据使用的是开源数据集SHWD,数据已上传开源数据平台Graviti,在文末可下载。当我们数据很多的时候我们可以将数据集划分为训练集、验证集和测试集,比例大致为98:1:1,数据较少划分时比例大概为6:2:2。我们新建一个文件夹datasets,将划分好的图片和标签放入其中,文件夹结构如下:以训练集为例,标签文件名需要与图片对应:然后将datasets文件夹放入yolov5-master中的data文件夹中,数据准备阶段就算完成了。下面需要修改YOLOv5的配置文件,需要修改的配置文件有两个,我们先复制一份data/coco.yaml,这里将其重命名为helmet.yaml,修改图中横线中的参数:在 download前加上一个#注释掉这段代码将train、val、test修改为自己的路径,以train为例   ./data/helmet/images/train将nc修改为数据的类别数,如安全帽检测只检测人和安全帽,故修改为2将names修改自己数据的类名,如['helmet', 'person']修改后的文件如下:下一个需要修改的文件为模型配置文件,在models文件夹中有四个模型的配置文件:yolov5s.yaml、yolov5m.yaml、yolov5l.yaml和yolov5x.yaml,可以根据需要选择相应的模型,这里以yolovx.yaml为例,打开文件,修改文件中的nc为自己的类别数即可。yolov5加入了自动判断是否需要重新k-means聚类anchors的功能,所以该文件中的anchors参数可以不做修改。如果有需要只需将这里anchors修改为自己计算出的即可。在修改完这两个配置文件后就可以开始训练了!我们在cmd中输入(记住在yolov5-master路径下):python train.py --weights weights/yolov5x.pt --cfg models/yolov5x.yaml --data data/helmet.yaml --epoch 50 --batch-size 32如果出现下面界面,说明已经开始训练了:
  • [其他] 使用YOLOv5模型进行目标检测(2)--检测文件参数说明
    检测文件参数说明yolov5的参数是由argparse包传入的,我们可以通过命令行传入参数,也可以直接设置参数默认值。我们打开yolov5-master文件加下的detect.py文件,传参的代码在主函数中,几个关键参数如下:parser.add_argument('--weights', nargs='+', type=str, default='yolov5x.pt', help='model.pt path(s)') parser.add_argument('--source', type=str, default='data/images/happysheep.mp4', help='source') parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')weights参数是我们训练好的权重文件,yolov5共有四种模型:yolov5s、yolov5m、yolov5l、yolov5x,它们的网络主干深度和宽度依次递增,一般情况下检测效果也递增,yolov5x的效果最好,yolov5s最差,但是yolov5s网络参数最少(14MB),yolov5x参数最多(166MB)。官方提供的预训练模型也有四种,大家可以根据需要设置。source参数为检测数据路径。img-size参数为检测时图像大小,最好与训练时相同,默认为640。conf-thres为检测置信度阈值,预测出的置信度高于这个阈值的物体就会显示在图中。iou-thres是NMS的IOU阈值,一般为0.3~0.5。
  • [其他] 使用YOLOv5模型进行目标检测(1)
    文章来源于Datawhale ,作者陈信达目标检测是计算机视觉领域的一大任务,大致分为一阶段目标检测与两阶段目标检测。其中一阶段目标检测模型以YOLO系列为代表。最新的YOLOv5在各个数据集上体现出收敛速度快、模型可定制性强的特点,值得关注。本文主要讲解如何从零训练自己的YOLOv5模型与一些重要参数的含义。本文的训练数据使用的是开源数据集SHWD,已上传开源数据平台Graviti,在文末可下载。在学习或研究目标检测的同学,后台回复“210702”可进群一起交流。一、配置环境1.1 创建虚拟环境俗话说,环境配不对,学习两行泪,首先我们需要安装Anaconda(Anaconda安装非常简单并且百度上有大量资料),然后创建一个专门用来训练YOLOv5的虚拟环境。按win+r打开“运行对话框”,输入“cmd”打开cmd。输入下面代码创建虚拟环境:conda create -n course_yolov5 python==3.8其中“course_yolov5”是虚拟环境的名称,“python==3.8”是虚拟环境的python版本。然后我们需要将Ultralytics开源的YOLOv5代码Clone或下载到本地,可以直接点击Download ZIP进行下载,下载地址:https://github.com/ultralytics/yolov5接下来激活刚刚创建的虚拟环境并解压刚下好的压缩文件,将工作路径切换到解压好的文件夹下:conda activate course_yolov5 cd D:\Study\PyCharm20\PycharmProjects\course_yolov5\yolov5-master d:注意:这里需要将" D:\Study\PyCharm20\PycharmProjects\course_yolov5"替换为自己的路径。1.2 安装模块:在安装模块之前,最好先更换pip源为阿里源或国科大源,然后安装yolov5需要的模块,记住工作路径要在yolov5文件夹下:python -m pip install -r requirements.txt如果没有安装cuda默认安装pytorch-cpu版,如果有gpu可以安装pytorch-gpu版。二、检测2.1 COCO数据集在正确配置好环境后就可以检测自己的图片或视频了。YOLOv5已经在COCO数据集上训练好,COCO数据集一共有80个类别,如果您需要的类别也在其中的话,可以直接用训练好的模型进行检测。这80个类分别是:['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']2.2 用预训练模型进行测试下面我们先演示如何检测图片中的目标。我们一般将要检测的数据放在'./data/images'路径下,其中 '.' 代表当前路径即解压好的yolov5-master文件夹,然后我们在cmd中输入下面代码:python detect.py --source ./data/images/example.jpg --weights weights/yolov5s.pt --conf-thres 0.25如果没有下载预训练模型需要等预训练模型下好,没有报错就说明我们的图像检测成功了!检测好的图片会放在'./runs/detect'下,各个参数的含义下面会有具体的介绍。我们也可以对视频进行检测:python detect.py --source ./data/images/happysheep.mp4 --weights weights/yolov5s.pt --conf-thres 0.25或一个文件夹中的所有图片和视频(图片支持的格式:'bmp', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'dng', 'webp', 'mpo',视频支持的格式:'mov', 'avi', 'mp4', 'mpg', 'mpeg', 'm4v', 'wmv', 'mkv'),检测结果同样放在'./runs/detect'下。python detect.py --source ./data/images/ --weights weights/yolov5s.pt --conf-thres 0.25仔细观察图中,我们可以发现,官方训练好的模型虽然能将物体框出来,但是对物体的分类存在问题。一会儿将那只边牧预测为奶牛,一会儿预测为绵羊。
  • [其他] 通用卷积神经网络CCNN(2)-实验结果
    如下表 1-4 所示,CCNN 模型在所有任务中都表现良好。首先是 1D 图像分类 CCNN 在多个连续基准上获得 SOTA,例如 Long Range Arena、语音识别、1D 图像分类,所有这些都在单一架构中实现的。CCNN 通常比其他方法模型更小架构更简单。然后是 2D 图像分类:通过单一架构,CCNN 可以匹配并超越更深的 CNN。对 ND 进行远程依赖建模的重要性。原则上可以将所有任务视为不考虑 2D 结构的序列任务,该研究只需改变进入核生成器网络的坐标维数,就可以在多维空间上轻松定义 CCNN。有趣的是,该研究观察到,通过在 LRA 基准测试中考虑图像和 Pathfinder 任务的 2D 特性,可以获得更好的结果(上表 3)。在具有 2D 图像的 PathFinder 中,最大的 CCNN 获得了 96.00% 的准确率,比之前 SOTA 高出近 10 个点,并在扁平图像上的表现明显优于 CCNN。此外,在原始 2D 数据上训练的模型显示出比它们的序列对应物更快的收敛(图 3)。具有小卷积核的 2D CNN,例如 ResNet-18,由于中间池化层缺乏细粒度的全局上下文建模,无法解决 Pathfinder。
总条数:7894 到第 页
上滑加载中