安装依赖,可以进入cmd后,进入requirements.txt所在地址,然后 pip install -r requirements.txt
报错1:
解决方法:
报错2:
报错3:
解决方法:
迷,我又运行了一次pip install -r requirements.txt,结果这次没报错,也不知道是不是ok了。
报错4:import cv2
pip install opencv-python 可能有用
其实我解决方法是重启vscode,我认为应该是刚刚安装完依赖后没有更新,所以显示cv2仍然没好的状态,重启解决一切。
报错5:
代码理解:
Pytorch 搭建自己的YOLO3目标检测平台(Bubbliiiing 深度学习 教程)_哔哩哔哩_bilibili
1、首先是特征提取的代码
对着这张图来看,基本上都能理解:
代码在nets中的yolo.py
关键理解,初始化中并没有进行向量拼接,而last_layer0中前五个为卷积5次的结果,后两个为最终两次卷积后的结果,在forward中会把它分成两部分,out0和out_branch,一个是输出结果,另一个是去拼接。
然后就是初始化中只是定义每一层的操作,并不是实际意义上进行操作,真正操作还是在forward中完成拼接后再进行真正的last_layer操作,那么一切就如上图所示了。
2、然后是先验框处理的代码(预测结果的解码):
代码在utils中的utils_bbox.py,那个config实在是找不着了。
关键我还没理解的是如何进行预测。
大致流程就是前面已经得到了三个维度的特征,然后根据三个维度的特征进行预测,接下来根据预测的数据对先验框进行调整。其中先验框的预测中心在一个grid cell的左上角,然后先验框长和宽是自己预设的。我们根据预测得到的中心点调整参数和长宽调整参数来对先验框进行调整,得到我们最终的预测框。然后的话,一共有三个维度的特征数据,每个维度都会有三个先验框进行调整。后面的话其实也好说,就是去计算IOU去得到IOU最大的预测框。
那么这个阶段最大的问题就是:它是怎么预测的???
我好像知道了,应该是这部分代码输入预测结果,然后进行操作,所以没能体现出是怎么进行预测的。
3、预测代码
在predict.py中,然后包括外面的yolo中的def的detect_image,归一化在utils下的utils.py内,我感觉这是一个写项目的小技巧,可以学学。
事实上这个视频还是没有解释怎么预测,而是讲述了预测流程。
1、把图片转成RGB图像、并给图片加上灰条(resize成416×416),添加上batch_size维度
2、将图像输入网络当中进行预测,将预测框堆叠并进行非极大抑制
3、设置边框字体等,进行图片裁剪(去掉灰条),然后图像绘制(预测类别、边框、置信度)
——————————————————
接下来我想办法弄清楚我没搞懂的问题:怎么预测?
我又看了一遍程序,这个detect_image中outputs=self.net(images)在上面生成模型中,net被定义成YoloBody,而YoloBody的输出就是前面特征提取的三个尺度的特征。然后就在detect_image下一步就是调用bbox_util.decode_box(outputs),这说明预测就是在decode_box中完成的。
——————————————————
我突然理解了,但开始后怕了。
前面这输出的并不是特征信息,而是最终结果。
我理解通的是:实际上这里已经输出了13×13个网格,每个网格三个先验框×(4+1+20)的参数,这个1决定有没有物体,这个4就是坐标偏移量,20是用来判别目标类别的。
我后怕的是:我根本无法理解为什么这样卷积就能得到正确的最终结果。我理解不了这个网络内部实际的工作原理。我只知道它在卷积、batch normalization和relu激活。
我回想到最基本的神经元,那时候做的事无非就是输入一些参数,然后通过拟合分类回归等(即神经元)来得到需要的输出。而现在做的无非就是类比成拟合一条更为复杂的曲线,所以用了更多参数、更复杂的方法,但这真能解释的清楚吗?如果解释不清楚,那么又该如何去做出创新和改进呢?我在做的事情不会就是在排列组合试凑吧?
但话说回来,至少我终于明白了这个模型是怎样去进行预测,已经模型结构了。那接下来要做的就是去训练模型得到适合我的任务的参数。
训练过程解析——损失函数计算:
在utils下的utils_fit.py里还有nets下的yolo_training.py里