2019年2月28日木曜日

天下一品のマークを誤認識させてみた。

おじさん、この前ネットで、ホンダの車は天下一品のマークを進入禁止マークと誤認識する記事を読みました。

https://togetter.com/li/1266643
https://ikikuru.com/entertainment/22551/

これ本当に起きるのでしょうか?
もし、本当におきるのであれば、おじさん、この誤認識プログラムも作れる!

やっぱ、技術の平和利用って大切だしなぁ。
という世界平和を願う気持ちを抱きながら、天下一品マークを誤認識するかどうかをたしかめる標識認識プログラムを作ってみました。

まず、前回と同じようにその辺のネットに落ちているOpenCVの標識認識の学習済みデータを持ってきます。
だけど、日本の進入禁止の学習済みデータなんて公開されていない・・・・。
だれか作って公開してくれないかなぁ。
日本の自動車メーカーとかも学習データを無料で公開してくれるくらいの気持ちがないと自動運転作れないと思うんだよなぁ。
こまったなぁ。

でもアメリカの速度制限の標識が似てるからそれで試してみよう!
ということで、ここのサイトから速度制限の標識学習データを取ってきます。

https://github.com/cfizette/road-sign-cascades

このデータ、メロン大学の学生が作ってる?んだ。
このメロン大学の貴重な研究成果を利用して、本当にくだならい天下一品のマークを誤認識させてみます。

プログラムは以前書いた、信号認識と全く同じ。
ただ学習済みデータと入力画像を変えるだけです。
よし、これで準備万端。実験してみました。


この画像を標識認識させてみます。

やっぱり天下一品のマークは道路標識とにているのか。

-------------------------------
#include <stdio.h>
#include <vector>

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

#include "core.hpp"
#include "imgproc.hpp"
#include "objdetect.hpp"

#include "stb_image.h"
#include "stb_image_write.h"

#define X_DIV 10
#define Y_DIV 10



using namespace std;



void changeb_g(unsigned char* p, int x, int y, int c)
{
int ct = x*y;
int i;
unsigned char t;
for (i = 0; i < ct; i++) {
t = p[0];
p[0] = p[2];
p[2] = t;
p[3] = 255;
p += c;
}
}

int main()
{
unsigned char*p;
int x = -1, y = -1;
int n, m;
int i;

//load image
p = stbi_load("stop3.jpg", &x, &y, &n, 4);
if (p == NULL || x < 1 || y < 1)return 1;

// R<-->B
changeb_g(p, x, y, 4);


cv::Mat color = cv::Mat(y, x, CV_8UC4);
cv::Mat gray;


//copy data
memcpy(color.data, p, x * 4 * y);
stbi_image_free(p);


cv::cvtColor(color, gray, CV_BGR2GRAY);

//cv::CascadeClassifier SS_cascade = cv::CascadeClassifier("stopsign_classifier.xml");
//cv::CascadeClassifier SS_cascade = cv::CascadeClassifier("Stopsign_HAAR_19Stages.xml");
cv::CascadeClassifier SS_cascade = cv::CascadeClassifier("Speedlimit_24_15Stages.xml");


vector<cv::Rect> shingou;

SS_cascade.detectMultiScale(gray, shingou, 1.01, 1);
//SS_cascade.detectMultiScale(gray, shingou, 1.3, 1);

for (auto it = shingou.begin(); it != shingou.end(); it++) {
printf("kita!!\n");
cv::rectangle(color, it->tl(), it->br(), cv::Scalar(0, 255, 0), 1, 8, 0);
}

changeb_g(color.data, x, y, 4);
stbi_write_png("result.png", x, y, 4, color.data, 4 * x);

return 0;
}


-------------------------------
ということで、標識認識プログラムは天下一品のマークを道路標識として誤認識します。


0 件のコメント:

コメントを投稿