1. slowsingle

    Posted

    slowsingle
Changes in title
+BetterでFasterでStrongerなYOLOを動かす
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,46 @@
+CVPR2017で登場した[YOLO9000: Better, Faster, Stronger](https://arxiv.org/pdf/1612.08242.pdf)を動かしてみます。
+[プロジェクトページ](https://pjreddie.com/darknet/yolo/)を見れば動かし方があるので簡単かなと思ったのですが、Macの場合ちょっとつまづくポイントがあったので、そこを重点的に述べます。
+
+環境はMac OS X 10.10.5, gccのバージョンは4.8です。まあ、gccはもっと新しいのを使ってもコンパイルは通るんじゃないかなと思います。
+
+Macの場合、makeをしたときにエラーがこんにちはしてきます。お呼びじゃないのに・・・。
+
+```bash:おまたせ
+./src/utils.c:16:19: fatal error: use of undeclared identifier
+ 'CLOCK_REALTIME'
+ clock_gettime(CLOCK_REALTIME, &now);
+```
+
+utils.cのclock_gettime関数なんですが、これはmacにはない関数のようです。というわけで、時間を取得してくれるmac用の代わりの処理を記述する必要があります。
+
+stackoverflowに[どんぴしゃりな回答](https://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x)があるので、これを利用します。
+
+```c:utils.c
+/*** 前略 ***/
+
+#include <mach/clock.h>
+#include <mach/mach.h>
+
+double what_time_is_it_now()
+{
+ struct timespec now;
+ clock_serv_t cclock;
+ mach_timespec_t mts;
+ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
+ clock_get_time(cclock, &mts);
+ mach_port_deallocate(mach_task_self(), cclock);
+ now.tv_sec = mts.tv_sec;
+ now.tv_nsec = mts.tv_nsec;
+ // clock_gettime(CLOCK_REALTIME, &now);
+ return now.tv_sec + now.tv_nsec*1e-9;
+}
+
+/*** 後略 ***/
+```
+
+これでmakeすればコンパイルが通るので、あとは[プロジェクトページ](https://pjreddie.com/darknet/yolo/)に従ってプログラムを実行すれば、以下のような画像が生成されると思います。
+
+![predictions.png](https://qiita-image-store.s3.amazonaws.com/0/72509/28aec5ab-2f43-912e-6206-95d8340c731a.png)
+
+楽しい!
+CPUで動かしてる割には処理が早い印象があります。これがFasterと自称する所以でしょうか。