问题记录

opencv python 把图(cv2下)BGR转RGB,且HWC转CHW

    img = cv2.imread("001.jpg")
    img_ = img[:,:,::-1].transpose((2,0,1))

① 在opencv里,图格式HWC,其余都是CHW,故transpose((2,0,1))
② img[:,:,::-1]对应H、W、C,彩图是3通道,即C是3层。opencv里对应BGR,故通过C通道的 ::-1 就是把BGR转为RGB
注: [::-1] 代表顺序相反操作
③ 若不涉及C通道的BGR转RGB,如Img[:,:,0]代表B通道,也就是蓝色分量图像;Img[:,:,1]代表G通道,也就是绿色分量图像;
Img[:,:,2]代表R通道,也就是红色分量图像。
补充:python opencv 中将图像由BGR转换为CHW用于后期的深度训练

多维数组的切片操作

1.0 ::

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[::2]
[0, 2, 4, 6, 8]
>>> l[::3]
[0, 3, 6, 9]
>>> l[::5]
[0, 5]
>>> 

1.1
img[:, :, [2, 1, 0]]啥意思啊

img = cv2.imread(img_path)
 img = img[:, :, [2, 1, 0]]

上面是通道转换:
0 1 2 --> 0 1 2
b g r --> r g b
以下三种等效:

img = img[:, :, [2, 1, 0]]也可以替换成
img = img[...,::-1]也可以替换成
im = cv2.imread(im_fn)[:, :, ::-1]


我仿照图片的像素格式,建立一个2行3列的,每个像素有包含RGB3个元素。

分别进行图中所示的4种运算。

执行a[:-1],移除了后面的一行。对于一维数组,后面的一行其实就是最后一个元素,所以这个运算就是移除最后一个元素。

执行a[::-1],上下两行交换了。同样的看成一维数组的话,一行就是一个元素,这个运算其实就是对一个一维数组内的元素前后对调。多维数组可以理解成对对第一个方括号内的每一个元素前后对调。

执行a[:,::-1],每一行中的元素前后交换了。简单理解就是对第二层反括号内的元素前后对调。

执行a[:,:,::-1],这样就好理解了,肯定是对第三层方括号内的元素对调。这也就解释了,对于一个24位深度的图像执行这个操作的话,是对每个像素的RGB进行对调。

对于图像而言,a[::-1],a[:,::-1],a[:,:,::-1]上述的三种方法分别是X轴的镜像,Y轴的镜像,BGR转换为RGB的操作。

1.2
seg_map_per_image的shape是(512,512,6)

seg_map_per_image = seg_map_per_image[::4, ::4, :].astype(np.float32)
这个操作之后就变成了(128,128,6),神奇吧?

training_mask 是(512,512)
training_mask = training_mask[::4, ::4, np.newaxis]
这个操作之后就变成了(128,128,1),神奇吧?

np.newaxis示例:

In [124]: arr = np.arange(5*5).reshape(5,5)

In [125]: arr.shape
Out[125]: (5, 5)

# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]

In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)

1.3:points = points[:, (1,0)]
points 是ndarray,shape(1652,2)
通过打断点看现象才知道是交换顺序的,(y,x)--> (x,y)

1.4: arr[...,0,1] arr[...,1,0] arr[...,2,1] arr[...,3,0]

>>> import numpy as np
>>> arr = np.arange(40).reshape(1,5,4,2)
>>> arr
array([[[[ 0,  1],
         [ 2,  3],
         [ 4,  5],
         [ 6,  7]],

        [[ 8,  9],
         [10, 11],
         [12, 13],
         [14, 15]],

        [[16, 17],
         [18, 19],
         [20, 21],
         [22, 23]],

        [[24, 25],
         [26, 27],
         [28, 29],
         [30, 31]],

        [[32, 33],
         [34, 35],
         [36, 37],
         [38, 39]]]])
>>> a1 = arr[...,0,1]
>>> a2 = arr[...,1,0]
>>> a3 = arr[...,2,1]
>>> a4 = arr[...,3,0]
>>> print(a1)
[[ 1  9 17 25 33]]
>>> print(a2)
[[ 2 10 18 26 34]]
>>> print(a3)
[[ 5 13 21 29 37]]
>>> print(a4)
[[ 6 14 22 30 38]]
>>> 

1.5 img.shape[1::-1]

import cv2
img = cv2.imread("/data_1/0104_A0916X_LFZBBA5C6BA008939_012133")
print(img.shape)
print(img.shape[1::-1])

#(2550, 3264, 3)
#(3264, 2550)

类中静态成员变量

class A 
{ 
    static int x; 
}; 
CPP文件中这样: 
int A::x; 

如果不在cpp中加int A::x; 这句话,编译会报错 对‘A::x’未定义的引用

深度学习-》训练技巧-1

同事训一个分类,轮胎规格正反分类,用一直用的分类网络训练,死活准确度上不来,85%左右。后来用之前的网络finetune,之前类别是100+类,现在只有2类,安装网上说法,只要把最后一层层名改一下就可以finetune。
训练测试集可以达到99%准确度,这么神奇!
https://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html
最后输出层是fc8,
1.首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的。
1.调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。
原来是fc8,记得把跟fc8连接的名字都要修改掉

python函数调用传* 与不传区别

>>> import numpy as np
>>> hue_delta = (-36, 36)
>>> random_h = np.random.uniform(hue_delta)
>>> random_h_xing = np.random.uniform(*hue_delta)
>>> print(random_h)
[-23.85894604  31.41364696]
>>> print(random_h_xing)
-1.692048021304906

numpy np.where

>>> a = np.array([[0,1],[0,1],[0,1],[1,0]])
>>> print(a)
[[0 1]
 [0 1]
 [0 1]
 [1 0]]
>>> print(a.shape)
(4, 2)
>>> y = np.where(a!=0)
>>> print(y)
(array([0, 1, 2, 3]), array([1, 1, 1, 0]))
>>> print(y.shape)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'shape'

报错解决“未定义的引用”

/usr/bin/ld: warning: libicui18n.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicuuc.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicudata.so.58, needed by //data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucal_getTimeZoneDisplayName_58’未定义的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucnv_setSubstChars_58’未定义的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucal_clone_58’未定义的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucol_strcoll_58’未定义的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucol_open_58’未定义的引用
//data_1/Yang/software_install/Anaconda1105/lib/libQt5Core.so.5:对‘ucal_open_58’未定义的引用

解决方案:
在cmakelists添加

include_directories("/data_1/Yang/software_install/Anaconda1105/include")
link_directories("/data_1/Yang/software_install/Anaconda1105/lib")

这两句解决

tips:
1.相关函数未定义
a. 需要检查cmake中include_directories是否包含相关路径
b. 能找到头文件,但是头文件里确实没有相关定义,需要看下头文件是否找错,正常头文件都会找3rdparty下的。找到/usr目录下,就可以找错了,最终原因可能是include_directories没有,或者3rdparty下没有对应文件。
undefine symbol
一般是没有指定链接对应的库或者库找错了。
a. 需要link_directories的路径是否正确。
b. target_link 需要添加对应的库名字

报错解决tiff未定义的引用

一般是opencv需要用tiff库,如果优先的anconda路径下找到tiff库就优先用它,然后就会导致报错。应该是用系统路径下的tiff库。
一般的查找问题流程是:
在opencv的lib文件夹下;
grep -r "tiff"
会出来:
pkgconfig/opencv.pc:Libs.private: -L/usr/lib/x86_64-linux-gnu -lpng -lz -ltiff -ljasper -ljpeg -lImath -lIlmImf -lIex -lHalf -lIlmThread -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lgthread-2.0 -ldc1394 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -ldl -lm -lpthread -lrt -L/usr/lib -lopenblas

ldd *so |grep tiff
会出来:
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f605cc00000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fad68c61000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f8607771000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f26f6921000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f850bade000)

编译成功,运行报错  libtorch/lib/libtorch_cuda.so: undefined symbol: _ZN3c104cuda28device_count_ensure_non_zeroEv

就是程序
cmake ..
make -j2
然后生成可执行文件 example-app,没有问题,然后运行 ./example-app报错
libtorch_cuda.so: undefined symbol: _ZN3c104cuda28device_count_ensure_non_zeroEv
找来jiamin,他一波操作:

ldd example-app |grep torch

显示

	libc10.so => /data/3rdparty/libtorch/lib/libc10.so (0x00007f3302e7d000)
	libtorch_cpu.so => /data/3rdparty/libtorch/lib/libtorch_cpu.so (0x00007f32fb780000)
	libtorch_cuda.so => /data/3rdparty/libtorch/lib/libtorch_cuda.so (0x00007f32ecdf8000)
	libtorch.so => /data/3rdparty/libtorch/lib/libtorch.so (0x00007f32ecbf6000)
	libc10_cuda.so => /data/pytorch/build/lib/libc10_cuda.so (0x00007f32e08d6000)

然后ldd了一个可以跑成功的可执行文件

ldd /data//bin/redis_standard |grep torch

显示:

libc10.so => /data/libtorch/lib/libc10.so (0x00007fb508b53000)
	libc10_cuda.so => /data/libtorch/lib/libc10_cuda.so (0x00007fb508699000)
	libtorch_cpu.so => /data/libtorch/lib/libtorch_cpu.so (0x00007fb5003c1000)
	libtorch_cuda.so => /data/libtorch/lib/libtorch_cuda.so (0x00007fb4f1a39000)
	libtorch.so => /data/libtorch/lib/libtorch.so (0x00007fb4f1837000)

所以这里可以看到libc10_cuda.so => /data/pytorch/build/lib/libc10_cuda.so这个找的目录错了。
然后:

export LD_LIBRARY_PATH=/data/libtorch/lib:$LD_LIBRARY_PATH
ldd example-app |grep torch

显示:

	libc10.so => /data/bdf/chejian/3rdparty/libtorch/lib/libc10.so (0x00007f2f246e1000)
	libtorch_cpu.so => /data/3rdparty/libtorch/lib/libtorch_cpu.so (0x00007f2f1cfe4000)
	libtorch_cuda.so => /data/3rdparty/libtorch/lib/libtorch_cuda.so (0x00007f2f0e65c000)
	libtorch.so => /data/3rdparty/libtorch/lib/libtorch.so (0x00007f2f0e45a000)
	libc10_cuda.so => /data/pytorch/build/lib/libc10_cuda.so (0x00007f2f0213a000)

可以看到,尝试用export LD_LIBRARY_PATH语句临时修改环境变量,可以还是找其他地方的库

然后:
md5sum /data/pytorch/build/lib/libc10_cuda.so
显示
754b0e0127fa90cb1e5345f0eb06fd3a /data/pytorch/build/lib/libc10_cuda.so

md5sum /data/3rdparty/libtorch/lib/libc10_cuda.so
显示
0e90c109e8661812bdabb3cc9b24e5f8 /data/libtorch/lib/libc10_cuda.so
可见,是不一样的库

然后, mv /data/pytorch/build/lib/libc10_cuda.so /data/pytorch/build/lib/libc10_cuda.so_bak
解决!
这个应该属于把问题规避掉了吧,重命名冲突的那个同名库,应该是环境变量里面他这个目录搜索的优先级比较高,导致一找就先找到了它。现在重命名他!让找不到

运行一个编译好的库报错

运行的是tensorrt yolov3的代码,编译好,一运行但是触发了断言

ldd libyololayer.so 
	linux-vdso.so.1 =>  (0x00007ffeedcde000)
	libcudart.so.10.0 => /usr/local/cuda/lib64/libcudart.so.10.0 (0x00007f62598c0000)
	libnvinfer.so.6 => /usr/local/cuda/lib64/libnvinfer.so.6 (0x00007f624c9df000)
	libopencv_core.so.3.4 => /home/yhl/software_install/opencv3.4.6/lib/libopencv_core.so.3.4 (0x00007f624c39d000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f624c063000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f624be4d000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f624ba83000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f624b87f000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f624b662000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f624b45a000)
	libcudnn.so.7 => /usr/local/cuda/lib64/libcudnn.so.7 (0x00007f6235e3b000)
	libcublas.so.10.0 => /usr/local/cuda/lib64/libcublas.so.10.0 (0x00007f62318a5000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f623159c000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6259d4c000)
	libtbb.so.2 => /usr/lib/x86_64-linux-gnu/libtbb.so.2 (0x00007f623135f000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6231145000)
	liblapack.so.3 => /usr/lib/liblapack.so.3 (0x00007f6230962000)
	libcblas.so.3 => /usr/lib/libcblas.so.3 (0x00007f6230740000)
	libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f622e6ac000)
	libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f622e381000)
	libatlas.so.3 => /usr/lib/libatlas.so.3 (0x00007f622dde3000)
	libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f622dba4000)

其中发现
libnvinfer.so.6 => /usr/local/cuda/lib64/libnvinfer.so.6 (0x00007f624c9df000)
这个应该是tensorrt文件夹下面的,libnvinfer.so.7。
可以看到库找错了,可能cuda下面的优先级高,于是我就在cmakelist里面把tensorrt的写前面,然后重新编译,就可以了

ldd libyololayer.so 
	linux-vdso.so.1 =>  (0x00007ffeedcde000)
	libcudart.so.10.0 => /usr/local/cuda/lib64/libcudart.so.10.0 (0x00007f62598c0000)
	libnvinfer.so.6 => /usr/local/cuda/lib64/libnvinfer.so.6 (0x00007f624c9df000)
	libopencv_core.so.3.4 => /home/yhl/software_install/opencv3.4.6/lib/libopencv_core.so.3.4 (0x00007f624c39d000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f624c063000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f624be4d000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f624ba83000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f624b87f000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f624b662000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f624b45a000)
	libcudnn.so.7 => /usr/local/cuda/lib64/libcudnn.so.7 (0x00007f6235e3b000)
	libcublas.so.10.0 => /usr/local/cuda/lib64/libcublas.so.10.0 (0x00007f62318a5000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f623159c000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6259d4c000)
	libtbb.so.2 => /usr/lib/x86_64-linux-gnu/libtbb.so.2 (0x00007f623135f000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6231145000)
	liblapack.so.3 => /usr/lib/liblapack.so.3 (0x00007f6230962000)
	libcblas.so.3 => /usr/lib/libcblas.so.3 (0x00007f6230740000)
	libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f622e6ac000)
	libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f622e381000)
	libatlas.so.3 => /usr/lib/libatlas.so.3 (0x00007f622dde3000)
	libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f622dba4000)

posted @ 2019-06-21 11:34  无左无右  阅读(1144)  评论(0编辑  收藏  举报