ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代码笔记7 pydensecrf库使用中出现的ValueError: ndarray is not C-contiguous

2022-05-08 22:31:48  阅读:221  来源: 互联网

标签:MAP False annotated contiguous labels ValueError image pydensecrf original


1 源码

 源码来自于github[1],主要是用于对语义分割的结果进行DenseCRF处理,以便进一步增加精度。至于理论,等我弄懂了再来写哈哈哈,感觉写这个的文特别少,大家又都没讲清楚。待我有空去研究一下提出的原文。


"""
Function which returns the labelled image after applying CRF

"""


# Original_image = Image which has to labelled
# Annotated image = Which has been labelled by some technique( FCN in this case)
# Output_image = Name of the final output image after applying CRF
# Use_2d = boolean variable
# if use_2d = True specialised 2D fucntions will be applied
# else Generic functions will be applied

def crf(original_image, annotated_image, output_image, use_2d=True):
    # Converting annotated image to RGB if it is Gray scale
    if (len(annotated_image.shape) < 3):
        annotated_image = gray2rgb(annotated_image).astype(np.uint8)

    cv2.imwrite("testing2.png", annotated_image)
    annotated_image = annotated_image.astype(np.uint32)
    # Converting the annotations RGB color to single 32 bit integer
    annotated_label = annotated_image[:, :, 0].astype(np.uint32) + (annotated_image[:, :, 1] << 8).astype(np.uint32) + (
                annotated_image[:, :, 2] << 16).astype(np.uint32)

    # Convert the 32bit integer color to 0,1, 2, ... labels.
    colors, labels = np.unique(annotated_label, return_inverse=True)

    # Creating a mapping back to 32 bit colors
    colorize = np.empty((len(colors), 3), np.uint8)
    colorize[:, 0] = (colors & 0x0000FF)
    colorize[:, 1] = (colors & 0x00FF00) >> 8
    colorize[:, 2] = (colors & 0xFF0000) >> 16

    # Gives no of class labels in the annotated image
    n_labels = len(set(labels.flat))

    print("No of labels in the Image are ")
    print(n_labels)

    # Setting up the CRF model
    if use_2d:
        d = dcrf.DenseCRF2D(original_image.shape[1], original_image.shape[0], n_labels)

        # get unary potentials (neg log probability)
        U = unary_from_labels(labels, n_labels, gt_prob=0.90, zero_unsure=False)
        d.setUnaryEnergy(U)

        # This adds the color-independent term, features are the locations only.
        d.addPairwiseGaussian(sxy=(3, 3), compat=3, kernel=dcrf.DIAG_KERNEL,
                              normalization=dcrf.NORMALIZE_SYMMETRIC)

        # This adds the color-dependent term, i.e. features are (x,y,r,g,b).
        print(original_image.flags)
        original_image = original_image.copy(order='C')
        d.addPairwiseBilateral(sxy=(80, 80), srgb=(13, 13, 13), rgbim=original_image,
                               compat=10,
                               kernel=dcrf.DIAG_KERNEL,
                               normalization=dcrf.NORMALIZE_SYMMETRIC)

    # Run Inference for 5 steps
    Q = d.inference(5)

    # Find out the most probable class for each pixel.
    MAP = np.argmax(Q, axis=0)

    # Convert the MAP (labels) back to the corresponding colors and save the image.
    # Note that there is no "unknown" here anymore, no matter what we had at first.
    MAP = colorize[MAP, :]
    cv2.imwrite(output_image, MAP.reshape(original_image.shape))
    return MAP.reshape(original_image.shape)

关于代码的解读,一个知乎老哥写的不错[2],我就不多言了。

2 bug

 不知道大家会不会出现这样的问题。我在使用时出现了bug

    d.addPairwiseBilateral(sxy=(80, 80), srgb=(13, 13, 13), rgbim=original_image,
  File "pydensecrf\densecrf.pyx", line 126, in pydensecrf.densecrf.DenseCRF2D.addPairwiseBilateral
  File "stringsource", line 658, in View.MemoryView.memoryview_cwrapper
  File "stringsource", line 349, in View.MemoryView.memoryview.__cinit__
ValueError: ndarray is not C-contiguous

在网上找了许多关于这个报错的问题,不过好像没有与这种情况相关的。

3 解决

 不过我觉得这个是转载的,我也找不到原处了。[3]
大概原因是因为输入的nparray的C_CONTIGUOUS属性为False。这个属性可以通过array.flags进行查看

  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

所以我们只要修改nparray的属性就行

original_image = original_image.copy(order='C')

完美解决

Refrences

[1]https://github.com/Gurupradeep/FCN-for-Semantic-Segmentation
[2]https://zhuanlan.zhihu.com/p/64854535
[3]https://www.manongdao.com/article-2171216.html

标签:MAP,False,annotated,contiguous,labels,ValueError,image,pydensecrf,original
来源: https://www.cnblogs.com/HumbleHater/p/16247287.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有