问题记录
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)