2019年7月3日水曜日

高次局所自己相関特徴(HLAC)をする

おじさん、最近暇でよくテレビを見ています。
テレビでよく犯罪者を認識するシステムのことを特集しています。
おじさん、あれ作れる。

でも学習までやるととても時間がかかるし、データがないし、そもそもブログに1回で書ける量じゃないし。
なので、本日は行動認識に使う特徴量、高次局所自己相関特徴(HLAC)を求めるところまでやってみたいと思います。

まず、このサイトで高次局所自己相関特徴について勉強。

Webでいろいろけんさくしてみたら、HLACってCTの画像から病気や癌を判別するとかにも使えるのね。論文では基板検査とかもできると書いてある。
ほんとかよ。すげーなー。


しかも3*3の掛け算して足すだけ。
というか上の図と同じパターンの個数を数えるだけ。
AIって東大生とかがやっているイメージですが、これそこら辺の小学生でも数えられるじゃないか。
なんか来年から小学校でもプログラムの授業があるから、電車の中の日能研の問題とか私立中学校の入試問題とかにできそう。
そうなると小学生でもとけるAIの問題とかをおじさんが解ず、子供に馬鹿にされる日が来るのか。
おー、おじさんかなしい。おじさんピンチ。

なんで論文とかプログラムにすると難しくなるんだ。
うちの会社にいる寝ているおじさんに数えてもらった方が早い気もする。

でもまぁ、いつものように、誰かが作ったプログラムを取ってきます。


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

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

#include "core.hpp"
#include "imgproc.hpp"
#include "imgproc_c.h"

#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;
}
}

void featureExtract(IplImage* input_image,double arrayHLAC[25])
{

int h = input_image->height - 1;
int w = input_image->width - 1;
int wideStep = input_image->widthStep;

for (int i = 0; i < 25; ++i)
arrayHLAC[i] = 0.0;

// 特徴抽出
for (int iy = 1; iy < h; iy++) {
for (int ix = 1; ix < w; ix++) {
uchar p5 = (uchar)input_image->imageData[wideStep*iy + ix];
if (p5 != 0)
{
arrayHLAC[0]++;
uchar p1 = (uchar)input_image->imageData[wideStep*(iy - 1) + (ix - 1)];
uchar p2 = (uchar)input_image->imageData[wideStep*(iy - 1) + ix];
uchar p3 = (uchar)input_image->imageData[wideStep*(iy - 1) + (ix + 1)];
uchar p4 = (uchar)input_image->imageData[wideStep*iy + (ix - 1)];

uchar p6 = (uchar)input_image->imageData[wideStep*iy + (ix + 1)];
uchar p7 = (uchar)input_image->imageData[wideStep*(iy + 1) + (ix + 1)];
uchar p8 = (uchar)input_image->imageData[wideStep*(iy + 1) + ix];
uchar p9 = (uchar)input_image->imageData[wideStep*(iy + 1) + (ix + 1)];


if (p1 != 0) {
arrayHLAC[1]++;
if (p8 != 0) arrayHLAC[13]++;
if (p3 != 0) arrayHLAC[21]++;
if (p7 != 0) arrayHLAC[22]++;
}
if (p2 != 0) {
arrayHLAC[2]++;
if (p8 != 0) arrayHLAC[7]++;
if (p7 != 0) arrayHLAC[11]++;
if (p9 != 0) arrayHLAC[12]++;
if (p6 != 0) arrayHLAC[17]++;
}
if (p3 != 0) {
arrayHLAC[3]++;
if (p7 != 0) arrayHLAC[6]++;
if (p4 != 0) arrayHLAC[9]++;
if (p8 != 0) arrayHLAC[14]++;
}
if (p4 != 0) {
arrayHLAC[4]++;
if (p6 != 0) arrayHLAC[5]++;
if (p9 != 0) arrayHLAC[10]++;
if (p2 != 0) arrayHLAC[18]++;
if (p8 != 0) arrayHLAC[19]++;
}
if (p6 != 0) {
if (p7 != 0) arrayHLAC[15]++;
if (p1 != 0) arrayHLAC[16]++;
if (p8 != 0) arrayHLAC[20]++;
}
if (p9 != 0) {
if (p1 != 0) arrayHLAC[8]++;
if (p7 != 0) arrayHLAC[23]++;
if (p3 != 0) arrayHLAC[24]++;
}
}
}
}

}
int main()
{
unsigned char*p;
int x = -1, y = -1;
int n, m;
int i;
double hlac_feature[25];

//load image
p = stbi_load("ojisan.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);
IplImage bin = gray;

IplImage* bin_img = cvCreateImage(gray.size(), IPL_DEPTH_8U, 1);

cvThreshold(&bin, bin_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//2値化している.

for (int i = 0; i < 25; i++) {
hlac_feature[i] = 0;
}

featureExtract(bin_img, hlac_feature);
for (int i = 0; i < 25; i++) {
printf("HLAC%d:%f\n", i,hlac_feature[i]);
}

cvReleaseImage(&bin_img);


return 0;
}
------


おー、これでHLACを求めることができるのね。
とりあえず、そこらへんのネットに落ちているわるそうなおじさんの顔画像のHLACを計算して見ます。

------

------

------
HLAC0:38204.000000
HLAC1:36372.000000
HLAC2:36964.000000
HLAC3:36096.000000
HLAC4:36678.000000
HLAC5:35413.000000
HLAC6:35181.000000
HLAC7:35841.000000
HLAC8:34865.000000
HLAC9:34945.000000
HLAC10:35215.000000
HLAC11:35407.000000
HLAC12:35407.000000
HLAC13:35471.000000
HLAC14:35141.000000
HLAC15:35974.000000
HLAC16:35196.000000
HLAC17:35901.000000
HLAC18:35809.000000
HLAC19:35974.000000
HLAC20:35789.000000
HLAC21:34999.000000
HLAC22:34865.000000
HLAC23:36372.000000
HLAC24:35181.000000
------

とりあえず、この悪そうなおじさんのHLACの値は求められました。
動画でやるときは画像の枚数増やして、CHLACを計算すれば良いっぽい。
適当に言ってますがなんか植物の成長具合とかもわかりそうな気もします。
だけど実際に画像のどの領域を入力してこれをどう学習させれば癌検出や犯罪者検出できるんだろ。
続く。

0 件のコメント:

コメントを投稿