darknet(YOLOv4)の動画処理結果を欲しいと思ったことはありませんか?
以前めっちゃ伸びた記事の追加検証のために動画を解析する必要があったのですが、darknetの動画処理を行うコマンド./darknet detector demo cfg/coco.data cfg/yolov4-csp.cfg ./yolov4-csp.weights <video file>
は実行結果を保存できません。
↓以前伸びた記事はこちらから
…というわけでこの記事ではdarknetのビデオデモを保存する方法を説明します。
参考issue
私の力で解決したわけではなく、開発者自身が作成方法を示しています。しかし、この当時のdarknetはOpenCV4やYOLOv4に対応していないので、そのまま実装…というわけにはいかないので、少し書き換えました。
↓該当issueは以下から
変更したプログラム
↓私がアップしたGitHubリポジトリのブランチです。以下のプログラムをexport-video
ブランチでチェックアウトしてください(AlexeyAB/darknetのフォークです)
image_opencv.cpp
のshow_image_mat
を書き換えました。
extern "C" void show_image_mat(mat_cv *mat_ptr, const char *name) { static cv::VideoWriter* video; try { if (mat_ptr == NULL) return; cv::Mat &mat = *(cv::Mat *)mat_ptr; cv::namedWindow(name, cv::WINDOW_NORMAL); cv::imshow(name, mat); // ビデオファイルが開かれていない場合はファイルを作成 if(video == NULL){ const char* output_name = "predictions.avi"; video = new cv::VideoWriter(output_name, cv::VideoWriter::fourcc('X','V','I','D'),30, cv::Size(mat.cols,mat.rows)); } video->write(mat); } catch (...) { cerr << "OpenCV exception: show_image_mat \n"; } }
これを実行すると動画を再生してその検出結果を動画として保存します。
インストール
ビルドにはCUDAとcuDNNの環境が必要です。
CPUでの動作はMakefileを編集して
GPU=0
・CUDNN=0
・CUDNN_HALF=0
を設定してください。
また、darknetのリポジトリ以外で追加で以下のファイルを追加してください。
- yolov4-csp.weigts
- 任意の動画ファイル(以下のコマンドでは
~Videos/example.mp4
に動画を配置しています)
git clone https://github.com/Ar-Ray-code/darknet.git -b export-video cd darknet wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-csp.weights make -j$(nproc) ./darknet detector demo cfg/coco.data cfg/yolov4-csp.cfg ./yolov4-csp.weights ~/Videos/example.mp4
このコマンドで動画をdarknetによる物体検出を行いました。出力動画には音がないので、音源のみをffmpegで切り出した後にffmpegコマンドで音源を追加します。
この動画、開始2秒でテディベア判定がめっちゃでていますが、一体どういうことなのでしょうか…👀👀👀