yolov4出来后,简单做下测试,看到结果还是相当给力的。
yolov4.jpg
注意看中间有个被遮挡的马,在yolov3中是检测不到的,yolov4中检测出来了,精度确实提升了。
那再来测试一下速度,测试视频发在b站上了。
yolov4 test
速度也是很给力的。
那这么好的东西,当然要自己试试了,接下来用自己的数据训练测试一下。
实验环境:
Centos 7.0 + 2080Ti +CUDA+CuDNN+ OpenCV + FFmpeg + darknet
安装darknet
git clone [https://github.com/AlexeyAB/darknet](https://github.com/AlexeyAB/darknet)
cd darknet
编译前,修改Makefile
GPU = 1 # 使用GPU加速训练
CUDNN = 1 #使用cudnn加速训练
CUDNN_HALF = 1 # 针对 Titan V / Tesla V100 / DGX-2 and later的优化,能加速检测与训练
OPENCV = 1 #使用opencv ,以允许对视频文件/网络摄像头进行处理
OPENMP = 1 # 使用openmp,以针对多核cpu进行加速
然后运行 make
不出错则说明darknet已编译成功
训练:
进入darknet/build/darknet/x64目录
1.下载pre-train weights文件yolov4.conv.137
2.创建config文件
cp cfg/yolov4-custom.cfg yolov4-obj.cfg
vim yolov4-obj.cfg
batch_size = 64 # batch size
subdivisions=32 #每个batch分多少批,如果内存不足,可以调大此参数
max_batches = 6000 # 最小取6000,设置为 classes_num * 2000
steps = 4800, 5400 # 设置为max_bacthes的80% 和90%
width = 412
height = 412 # 32的倍数,主要也是为了解决显存不足
classes = 1 # 修改三个 [yolo] 层的 classes参数
filters = 18 # 修改【yolo】层前面的[convolutional]中的filters, filters=(classes + 5) * 3
3.创建obj.name文件
vim data/obj.name
waterdrop
4.创建obj.data文件
vim data/obj.data
classes= 1
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
5.将所有的图片和标注文件放入data/obj目标下,并创建classes.txt文件,里面写上classes的数量
6.创建train.txt文件
vim data/train.txt
data/obj/img1.jpg
data/obj/img2.jpg
...
7.创建test.txt文件,此时我们简单用train.txt
cp data/train.txt data/test.txt
8.训练
../../../darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
实验结果:
water_drop_detect.jpg
可以看到,结果还是相当给力的!范围与精度都很不错。
可能遇到的问题与解决办法:
问题1
video stream stopped!
fix: 卸载opencv,通过源码重新编译,编译时将FFmpeg一起编译
- FFmpeg
需要将opencv与FFmpeg一起编译,所以首先要卸载原来的opencv
进入opencv安装目录,
sudo make uninstall
cd .. rm -Rf build
cd /usr find . -name "*opencv*" | xargs sudo rm -rf
yum remove opencv-data python-opencv
运行 pkg-config --modversion opencv,没有则显示卸载完成
git clone [https://git.ffmpeg.org/ffmpeg.git](https://git.ffmpeg.org/ffmpeg.git) ffmpeg
cd source_directory ./configure --enable-shared --disable-static --disable-x86asm
make
sudo make install
sudo vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/ffmpeg/lib
sudo ldconfig
验证:
ffmpeg -version
加入环境变量:
vi /etc/profile
export PATH="/usr/local/ffmpeg/bin:$PATH"
source /etc/profile
安装opencv
安装依赖
sudo yum install epel-release git gcc gcc-c++ cmake3 qt5-qtbase-devel python3 python3-devel python3-pip cmake python3-devel python3-numpy gtk2-devel libpng-devel jasper-devel openexr-devel libwebp-devel libjpeg-turbo-devel libtiff-devel tbb-devel libv4l-devel eigen3-devel freeglut-devel mesa-libGL mesa-libGL-devel boost boost-thread boost-devel gstreamer1-plugins-base
下载源码:
mkdir -p ~/opencv_build && cd ~/opencv_build
git clone [https://github.com/opencv/opencv.git](https://github.com/opencv/opencv.git)
git clone [https://github.com/opencv/opencv_contrib.git](https://github.com/opencv/opencv_contrib.git)
编译
cd ~/opencv_build/opencv && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON ..
make -j8
sudo make install
如果遇到卡顿,可以查看cmakedownloadlog 有可能是因为墙引起的部分资源下载404,可以翻墙后下载,然后放入对应目标下
sudo ln -s /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/
sudo ldconfig
验证
pkg-config --modversion opencv4
问题2
could not find feature2d/test/test_detectors_regression.impl.hpp
cmake中没有包含modules路径导致的,此时修改cmakelists文件的567行,加入对应路径即可。
vim opencv/CMakeLists.txt +567
include_directories("modules")
问题3
opencv2/xfeatures2d.hpp file not found
类似这种问题,都是对应文件中 #include 对应文件的路径是相对路径导致读取时出错,我们改成对应的绝对路径即可。
vim ~/opencv_build/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp + 42
#include"~/opencv_build/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp"
问题4
can't load image ........ Segmentation fault
fix:这个问题是由于Windows下的换行符为 CRLF ,而Linux下是 LF,所以文件从Windows复制到服务器上后格式不匹配导致的,只需在Linux下重新生成对应的train.txt 即可
Update:
由于之前看到大凉山的森林火灾,内心总想着能做点什么,所以从网上找了一些开源的fire detection
相关的数据和资料,处理了一下常识做了几版,结果看上去还是可以的。如果有更多清晰度更高的数据,效果应该能提升不少。希望有机会能为大凉山做点事吧。
下面是完整的测试视频,由于数据全是低分辨率(244*244),所以可以在视频里看到对高清分辨率的视频有很多漏判和误判,所以下一步需要利用更多高分辨率的样本。
火焰与烟雾识别
网友评论