🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

2回答

3395閲覧

yolov3 ラベルごとに検出カラーを指定したい

piyomatu

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/10/16 13:03

編集2019/10/16 13:05

・実現したいこと
classesの0,1番目を白色で検出
2~6番目を赤色で検出したい。


オリジナル学習にて検出カラーを指定しようと試みましたが上手く行かなく、どう変更すれば良いのかわからない状態です。

RGBやyolov3のget_colorについても検索しましたが解決いたしませんでした。

get_color()がRGBの red, green, blueを出すことはわかりますが、
float r = (1-ratio) * colors[i][c] + ratio*colors[j][c];
ここの計算の意味もわからない状態です。

ご教授いただければ幸いです。

環境 MacOS

image.c
image.c URL

c

1#include "image.h" 2#include "utils.h" 3#include "blas.h" 4#include "cuda.h" 5#include <stdio.h> 6#include <math.h> 7 8#define STB_IMAGE_IMPLEMENTATION 9#include "stb_image.h" 10#define STB_IMAGE_WRITE_IMPLEMENTATION 11#include "stb_image_write.h" 12 13int windows = 0; 14 15float colors[6][3] = { {1,0,1}, {0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,0,0} }; 16 17float get_color(int c, int x, int max) 18{ 19 float ratio = ((float)x/max)*5; 20 int i = floor(ratio); 21 int j = ceil(ratio); 22 ratio -= i; 23 float r = (1-ratio) * colors[i][c] + ratio*colors[j][c]; 24 //printf("%f\n", r); 25 return r; 26} 27 28image mask_to_rgb(image mask) 29{ 30 int n = mask.c; 31 image im = make_image(mask.w, mask.h, 3); 32 int i, j; 33 for(j = 0; j < n; ++j){ 34 int offset = j*123457 % n; 35 float red = get_color(2,offset,n); 36 float green = get_color(1,offset,n); 37 float blue = get_color(0,offset,n); 38 for(i = 0; i < im.w*im.h; ++i){ 39 im.data[i + 0*im.w*im.h] += mask.data[j*im.h*im.w + i]*red; 40 im.data[i + 1*im.w*im.h] += mask.data[j*im.h*im.w + i]*green; 41 im.data[i + 2*im.w*im.h] += mask.data[j*im.h*im.w + i]*blue; 42 } 43 } 44 return im; 45} 46... 47 48void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b) 49{ 50 //normalize_image(a); 51 int i; 52 if(x1 < 0) x1 = 0; 53 if(x1 >= a.w) x1 = a.w-1; 54 if(x2 < 0) x2 = 0; 55 if(x2 >= a.w) x2 = a.w-1; 56 57 if(y1 < 0) y1 = 0; 58 if(y1 >= a.h) y1 = a.h-1; 59 if(y2 < 0) y2 = 0; 60 if(y2 >= a.h) y2 = a.h-1; 61 62 for(i = x1; i <= x2; ++i){ 63 a.data[i + y1*a.w + 0*a.w*a.h] = r; 64 a.data[i + y2*a.w + 0*a.w*a.h] = r; 65 66 a.data[i + y1*a.w + 1*a.w*a.h] = g; 67 a.data[i + y2*a.w + 1*a.w*a.h] = g; 68 69 a.data[i + y1*a.w + 2*a.w*a.h] = b; 70 a.data[i + y2*a.w + 2*a.w*a.h] = b; 71 } 72 for(i = y1; i <= y2; ++i){ 73 a.data[x1 + i*a.w + 0*a.w*a.h] = r; 74 a.data[x2 + i*a.w + 0*a.w*a.h] = r; 75 76 a.data[x1 + i*a.w + 1*a.w*a.h] = g; 77 a.data[x2 + i*a.w + 1*a.w*a.h] = g; 78 79 a.data[x1 + i*a.w + 2*a.w*a.h] = b; 80 a.data[x2 + i*a.w + 2*a.w*a.h] = b; 81 } 82} 83 84void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b) 85{ 86 int i; 87 for(i = 0; i < w; ++i){ 88 draw_box(a, x1+i, y1+i, x2-i, y2-i, r, g, b); 89 } 90} 91 92void draw_bbox(image a, box bbox, int w, float r, float g, float b) 93{ 94 int left = (bbox.x-bbox.w/2)*a.w; 95 int right = (bbox.x+bbox.w/2)*a.w; 96 int top = (bbox.y-bbox.h/2)*a.h; 97 int bot = (bbox.y+bbox.h/2)*a.h; 98 99 int i; 100 for(i = 0; i < w; ++i){ 101 draw_box(a, left+i, top+i, right-i, bot-i, r, g, b); 102 } 103} 104 105image **load_alphabet() 106{ 107 int i, j; 108 const int nsize = 8; 109 image **alphabets = calloc(nsize, sizeof(image)); 110 for(j = 0; j < nsize; ++j){ 111 alphabets[j] = calloc(128, sizeof(image)); 112 for(i = 32; i < 127; ++i){ 113 char buff[256]; 114 sprintf(buff, "data/labels/%d_%d.png", i, j); 115 alphabets[j][i] = load_image_color(buff, 0, 0); 116 } 117 } 118 return alphabets; 119} 120 121void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabet, int classes) 122{ 123 int i,j; 124 125 for(i = 0; i < num; ++i){ 126 char labelstr[4096] = {0}; 127 int class = -1; 128 for(j = 0; j < classes; ++j){ 129 if (dets[i].prob[j] > thresh){ 130 if (class < 0) { 131 strcat(labelstr, names[j]); 132 class = j; 133 } else { 134 strcat(labelstr, ", "); 135 strcat(labelstr, names[j]); 136 } 137 printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100); 138 } 139 } 140 if(class >= 0){ 141 int width = im.h * .006; 142 143 /* 144 if(0){ 145 width = pow(prob, 1./2.)*10+1; 146 alphabet = 0; 147 } 148 */ 149 150 //printf("%d %s: %.0f%%\n", i, names[class], prob*100); 151 //int offset = class*123457 % classes; 152 /*float red,green,blue; 153 154 if(class < 2){ 155 red = 245; 156 green = 245; 157 blue = 245; 158 } else { 159 red = 255; 160 green = 0; 161 blue = 0; 162 } 163 */ 164 int offset; 165 if(i < 2){ 166 offset = 111; 167 } else { 168 offset = 100; 169 } 170 171 float red = get_color(2,offset,classes); 172 float green = get_color(1,offset,classes); 173 float blue = get_color(0,offset,classes); 174 float rgb[3]; 175 //float rgb[3]; 176 177 //width = prob*20+2; 178 179 rgb[0] = red; 180 rgb[1] = green; 181 rgb[2] = blue; 182 box b = dets[i].bbox; 183 //printf("%f %f %f %f\n", b.x, b.y, b.w, b.h); 184 185 int left = (b.x-b.w/2.)*im.w; 186 int right = (b.x+b.w/2.)*im.w; 187 int top = (b.y-b.h/2.)*im.h; 188 int bot = (b.y+b.h/2.)*im.h; 189 190 if(left < 0) left = 0; 191 if(right > im.w-1) right = im.w-1; 192 if(top < 0) top = 0; 193 if(bot > im.h-1) bot = im.h-1; 194 195 draw_box_width(im, left, top, right, bot, width, red, green, blue); 196 if (alphabet) { 197 image label = get_label(alphabet, labelstr, (im.h*.03)); 198 draw_label(im, top + width, left, label, rgb); 199 free_image(label); 200 } 201 if (dets[i].mask){ 202 image mask = float_to_image(14, 14, 1, dets[i].mask); 203 image resized_mask = resize_image(mask, b.w*im.w, b.h*im.h); 204 image tmask = threshold_image(resized_mask, .5); 205 embed_image(tmask, im, left, top); 206 free_image(mask); 207 free_image(resized_mask); 208 free_image(tmask); 209 } 210 } 211 } 212}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

float red = get_color(2,offset,classes); float green = get_color(1,offset,classes); float blue = get_color(0,offset,classes);

ここでクラスごとのRGB値を求めているので今あるコードは使わずにごっそり入れ替えれば良いのでは?

投稿2019/10/19 04:42

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piyomatu

2019/10/29 06:35

おっしゃる通りでした。
guest

0

自己解決

自己解決できました。
ごっそり変えた方が早かったです。

C

1float red,green,blue; 2 3 if(class < 2){ 4 red = 1.0; 5 green = 1.0; 6 blue = 1.0; 7 } else { 8 red = 1.0; 9 green = 0; 10 blue = 0; 11 }

darknet がupdateされた際は、classを classesに変更するなど必要です。

投稿2019/10/29 06:34

piyomatu

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問