えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

darknetの動画処理結果を保存する(ディープラーニング)

darknet(YOLOv4)の動画処理結果を欲しいと思ったことはありませんか?

以前めっちゃ伸びた記事の追加検証のために動画を解析する必要があったのですが、darknetの動画処理を行うコマンド./darknet detector demo cfg/coco.data cfg/yolov4-csp.cfg ./yolov4-csp.weights <video file>は実行結果を保存できません。

↓以前伸びた記事はこちらから

ar-ray.hatenablog.com

…というわけでこの記事ではdarknetのビデオデモを保存する方法を説明します。

参考issue

私の力で解決したわけではなく、開発者自身が作成方法を示しています。しかし、この当時のdarknetはOpenCV4やYOLOv4に対応していないので、そのまま実装…というわけにはいかないので、少し書き換えました。

↓該当issueは以下から

github.com

変更したプログラム

↓私がアップしたGitHubリポジトリのブランチです。以下のプログラムをexport-videoブランチでチェックアウトしてください(AlexeyAB/darknetのフォークです)

github.com

image_opencv.cppshow_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=0CUDNN=0CUDNN_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コマンドで音源を追加します。

youtu.be

この動画、開始2秒でテディベア判定がめっちゃでていますが、一体どういうことなのでしょうか…👀👀👀