私は現在、Darknet YOLO ( https://pjreddie.com/darknet/yolo/ ) コンピューター ビジョン パッケージを Unity に統合しようとしています。これは、Hololens デバイスでのリアルタイム オブジェクト検出の速度を研究プロジェクトで調査するためです。 . これまでのところ、YOLO パッケージを DLL ファイルとしてエクスポートし、Unity に関数呼び出しを介して通信させることができました。以下は、YOLO パッケージの一部である yolo_dll.cpp ファイル内に作成したマーシャリングされた関数です。これらは、Unity 側から呼び出す関数です。
extern "C" _declspec(dllexport) Detector* _stdcall Init() {
return new Detector("yolo_write_into.txt", "yolo.weights");
}
extern "C" _declspec(dllexport) void _stdcall DeleteDetector(Detector* detector) {
delete detector;
}
extern "C" _declspec(dllexport) int _stdcall Test(int s) {
return s;
}
extern "C" _declspec(dllexport) int _stdcall OutsideDetect(Detector*
mDetect, bbox_t** results, int* resultSize, int h, int w, float threshold =
0.2f, bool use_mean = false) {
/*image_t newImg;
newImg.data = data;
newImg.h = h;
newImg.w = w;
newImg.c = 3;*/
std::vector<bbox_t> vec = mDetect->detect("Assets/yolo_write_image.jpg",
threshold, use_mean);
//TODO: clean up boxArray
bbox_t* boxArray = new bbox_t[vec.size()];
for (int i = 0; i < vec.size(); i++) {
boxArray[i] = vec[i];
}
*resultSize = vec.size();
*results = boxArray;
return 1;
}
extern "C" _declspec(dllexport) void _stdcall DeleteBArray(bbox_t** results)
{
delete[] results;
}
次に、C++ 側のもののシグネチャと一致する、私が呼び出すマーシャリングされた C# 関数を次に示します。
internal static class YoloDLL
{
[DllImport("yolo_cpp_dll", EntryPoint = "Test")]
public static extern int DLLTest(int s);
[DllImport("yolo_cpp_dll", EntryPoint = "OutsideDetect")]
public static extern int OutsideDetect(IntPtr mDetect, out IntPtr results, out int resultSize, int h, int w, float threshold, bool use_mean);
[DllImport("yolo_cpp_dll", EntryPoint = "Init", CharSet = CharSet.Unicode)]
public static extern IntPtr Init();
[DllImport("yolo_cpp_dll", EntryPoint = "DeleteDetector", CharSet = CharSet.Unicode)]
public static extern void DestroyDetector(IntPtr detector);
[DllImport("yolo_cpp_dll", EntryPoint = "SetDebugFunction", CharSet = CharSet.Unicode)]
public static extern void SetDebugFunction(IntPtr fp);
[DllImport("yolo_cpp_dll", EntryPoint = "DebugLogDLL", CharSet = CharSet.Unicode)]
public static extern void DebugLogDLL(string s);
[DllImport("yolo_cpp_dll", EntryPoint = "DeleteBArray", CharSet = CharSet.Unicode)]
public static extern void DeleteBArray(IntPtr results);
}
PhotoCapture クラスを使用してコンピューターの Web カメラで写真を撮る Unity スクリプトがあり、写真をメモリに保存すると、外部の c++ detect() 関数を呼び出して、最近撮影した写真をメモリから取得し、オブジェクトを検出します。オブジェクトが画像内にある場所を特定するバウンディング ボックスの配列を返します。バウンディング ボックスの配列が返されたら、とりあえず Unity コンソールですべてのログをデバッグし、コンソールに情報が出力されたらすぐに、写真を撮って YOLO detect() を使用するプロセスを繰り返します。 . Unity と YOLO が正常に通信できるようになりました。ただし、平均して、1 つの画像のバウンディング ボックスが表示されてから次の画像が表示されるまでに 10 秒かかります。s バウンディング ボックスが Unity デバッグ コンソールに表示されました。画像を処理してリアルタイム (30 ~ 60 fps) でフィードバックを出力するには、YOLO パッケージが必要で、Unity だけでなく Hololens でも動作する必要があります。これをビルドとして Hololens にエクスポートしようとしましたが、Hololens 内でアプリケーションを開こうとすると、単に開きませんでした。したがって、いくつか質問があります。
- 常に写真を撮って個別に処理するのではなく、Unity のビデオ キャプチャ機能を YOLO に統合することはできますか? これは Hololens で動作しますか?
- YOLO パッケージでは、#ifdef GPU を含むすべてのセクションをコメントアウトする必要がありました。それらのいずれかがアクティブであると、「再生」を押したときに Unity がクラッシュするだけだったからです。これらのセクションをどうにかして Unity で動作させることはできますか? また、処理時間を短縮できますか?
- 画像解析サイクル間の大きな遅延に役割を果たしている DLL を介して YOLO からマーシャリングされた関数を呼び出すことはありますか? これを補う方法はありますか?
- 外部の DLL を使用していることが、アプリケーションが Hololens 内で開かない理由ですか?
YOLO のリアルタイム オブジェクト検出機能を実装できるように、このパッケージを Hololens に統合できるようにするための正しい方向へのステップを大いに感謝します!