Skip to content

Commit 7b38d05

Browse files
committed
修改骨架识别,让骨架识别能够区分出各个部位。
1 parent aff1db4 commit 7b38d05

File tree

4 files changed

+167
-19
lines changed

4 files changed

+167
-19
lines changed

.idea/modules.xml

-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ TensorFlowImageClassifier2 为车道检测之后不规则绘制(因时间仓
2626

2727
TensorFlowImageClassifier3 是用来识别人体骨架的 这个模型是有特定输入和特定输出的 需要经过3层转换 才能使用
2828
接下来准备上线道路障碍物识别...
29+
最新版骨架识别目前支持区分各个身体部位具体情况请看注释
2930

3031
Camera2BasicFragment4
3132
这是一个用检测来识别车道和前车

app/src/main/java/com/tfcamerademo/model/TensorFlowImageClassifier3.java

+166-16
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ public List<Recognition> recognizeImage(final Bitmap bitmap) {
194194
int[] b = new int[46 * 46 * 57];
195195
//取出第一个通道色彩值
196196
float[][] floats5 = new float[(outputs.length / 57) * 19][19];
197+
//转成矩阵把小于0.1的值归0
197198
for (int i = 0, sum = -1; i < outputs.length; i++) {
198199
if (0 <= i % 57 && i % 57 < 19) {
199200
if (0 == i % 57)
@@ -207,32 +208,181 @@ public List<Recognition> recognizeImage(final Bitmap bitmap) {
207208
for (int i = 0; i < floats5.length; i++) {
208209
System.arraycopy(floats5[i], 0, floats2[i], 0, 18);
209210
}
211+
212+
//取出每18个点中的最大的点
210213
float max = 0;
211214
float[] floats3 = new float[(outputs.length / 57) * 19];
212-
for (int i = 0; i < floats2.length; i++) {
215+
for (int i = 0, sum = -1; i < floats2.length; i++) {
213216
for (int j = 0; j < floats2[i].length; j++) {
214-
if (floats2[i][j] > max)
215-
max = floats2[i][j];
217+
sum++;
218+
if (floats2[i][j] > max) {
219+
//这个是设置识别准确度多少以上保留数值越大越精确 同样识别出来的东西越少
220+
if (floats2[i][j] > 0.3f)
221+
switch (sum % 18) {
222+
case 0:
223+
//鼻子
224+
//这里写20的原因是因为 0太多了 如果写0的话 就会和空白处重复
225+
max = 19;
226+
break;
227+
case 1:
228+
//脖子
229+
max = 1;
230+
break;
231+
case 2:
232+
//右上臂
233+
max = 2;
234+
break;
235+
case 3:
236+
//右肘关节
237+
max = 3;
238+
break;
239+
case 4:
240+
//右手腕关节
241+
max = 4;
242+
break;
243+
case 5:
244+
//左肩
245+
max = 5;
246+
break;
247+
case 6:
248+
//左肘关节
249+
max = 6;
250+
break;
251+
case 7:
252+
//左手腕关节
253+
max = 7;
254+
break;
255+
case 8:
256+
//右臀部
257+
max = 8;
258+
break;
259+
case 9:
260+
//右膝关节
261+
max = 9;
262+
break;
263+
case 10:
264+
//右裸关节
265+
max = 10;
266+
break;
267+
case 11:
268+
//左臀部
269+
max = 11;
270+
break;
271+
case 12:
272+
//左膝关节
273+
max = 12;
274+
break;
275+
case 13:
276+
//左裸关节
277+
max = 13;
278+
break;
279+
case 14:
280+
//右眼
281+
max = 14;
282+
break;
283+
case 15:
284+
//左眼
285+
max = 15;
286+
break;
287+
case 16:
288+
//右耳
289+
max = 16;
290+
break;
291+
case 17:
292+
//左耳
293+
max = 17;
294+
break;
295+
case 18:
296+
//背景(因为背景没有识别值 所以自动过滤掉了)
297+
max = 18;
298+
break;
299+
}
300+
}
216301
}
217302
floats3[i] = max;
218303
max = 0;
219304
}
220305

221-
//取出每18个点中最大的点
222-
float[] floats4 = new float[((outputs.length / 57) * 19) * 18];
223-
for (int i = 0, sum = 0; i < floats2.length; i++) {
224-
for (int j = 0; j < floats2[i].length; j++) {
225-
floats4[sum] = floats2[i][j];
226-
sum++;
227-
}
228-
}
229-
230306
//将点颜色显示出来
231307
for (int j = 0; j < floats3.length; j++) {
232-
//这个是设置识别准确度多少以上保留数值越大越精确 同样识别出来的东西越少
233-
if (floats3[j] > 0.3f) {
234-
//识别准确度大于0.3f则显示为绿色
235-
b[j] = 0xff << 24 | 0xff << 8;
308+
//以下为20种颜色值(不保证是否重复,不同颜色值的意义是 告诉大家这是不同部位)
309+
switch ((int) floats3[j]) {
310+
case 1:
311+
//脖子
312+
b[j] = 0xff << 24 | 0xff << 8;
313+
break;
314+
case 2:
315+
//右肩
316+
b[j] = 0xff << 24 | 0xff;
317+
break;
318+
case 3:
319+
//右肘关节
320+
b[j] = 0xff << 24 | 0xff << 8 | 0xff;
321+
break;
322+
case 4:
323+
//右手腕关节
324+
b[j] = 0xff << 24 | 0xff << 16 | 0xff;
325+
break;
326+
case 5:
327+
//左肩
328+
b[j] = 0xff << 24 | 0xff << 16 | 0xff << 8;
329+
break;
330+
case 6:
331+
//左肘关节
332+
b[j] = 0xff << 24 | 0xff << 16 | 0x0f << 8;
333+
break;
334+
case 7:
335+
//左手腕关节
336+
b[j] = 0xff << 24 | 0x0f << 16 | 0x0f << 8;
337+
break;
338+
case 8:
339+
//右臀部
340+
b[j] = 0xff << 24 | 0x0f << 16 | 0x0f << 8 | 0xff;
341+
break;
342+
case 9:
343+
//右膝关节
344+
b[j] = 0xff << 24 | 0xff << 16 | 0x0f << 8 | 0x0f;
345+
break;
346+
case 10:
347+
//右裸关节
348+
b[j] = 0xff << 24 | 0xff << 16 | 0xff << 8 | 0x0f;
349+
break;
350+
case 11:
351+
//左臀部
352+
b[j] = 0xff << 24 | 0x0f << 16 | 0xff << 8 | 0x0f;
353+
break;
354+
case 12:
355+
//左膝关节
356+
b[j] = 0xff << 24 | 0xff << 8 | 0x0f;
357+
break;
358+
case 13:
359+
//左裸关节
360+
b[j] = 0xff << 24 | 0x0f << 8 | 0x0f;
361+
break;
362+
case 14:
363+
//右眼
364+
b[j] = 0xff << 24 | 0x0f << 16 | 0x0f << 8 | 0x0f;
365+
break;
366+
case 15:
367+
//左眼
368+
b[j] = 0xff << 24 | 0x5f << 16;
369+
break;
370+
case 16:
371+
//右耳
372+
b[j] = 0xff << 24 | 0x5f << 8;
373+
break;
374+
case 17:
375+
//左耳
376+
b[j] = 0xff << 24 | 0xff << 16 | 0x0f;
377+
break;
378+
case 18:
379+
//背景(因为背景没有识别值 所以自动过滤掉了)
380+
b[j] = 0xff << 24 | 0x0f;
381+
break;
382+
case 19:
383+
//鼻子
384+
b[j] = 0xff << 24 | 0x0f << 8;
385+
break;
236386
}
237387
}
238388

image/body.gif

-664 KB
Loading

0 commit comments

Comments
 (0)