diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt index ab45deb..5faab3c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt @@ -1,16 +1,15 @@ package com.casic.br.ar.app.view -import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.lifecycle.lifecycleScope import com.casic.br.ar.app.databinding.ActivityMainBinding import com.casic.br.ar.app.external.YoloStateConst import com.casic.br.ar.app.external.Yolov8ncnn -import com.casic.br.ar.app.service.WebSocketMessageService import com.casic.br.ar.app.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -27,6 +26,7 @@ lateinit var weakReferenceHandler: WeakReferenceHandler } + private val kTag = "MainActivity" private val yolov8ncnn by lazy { Yolov8ncnn() } override fun handleMessage(msg: Message): Boolean { @@ -70,7 +70,7 @@ //初始化OpenCV OpenCVLoader.initLocal() - startService(Intent(this, WebSocketMessageService::class.java)) +// startService(Intent(this, WebSocketMessageService::class.java)) } override fun initViewBinding(): ActivityMainBinding { @@ -87,14 +87,52 @@ } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - return if (keyCode == KeyEvent.KEYCODE_BACK) { - if (System.currentTimeMillis() - clickTime > 2000) { - "再按一次退出程序".show(this) - clickTime = System.currentTimeMillis() - true - } else { - super.onKeyDown(keyCode, event) - } - } else super.onKeyDown(keyCode, event) + Log.d(kTag, "onKeyDown: $keyCode") + return super.onKeyDown(keyCode, event) } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + Log.d(kTag, "onKeyUp: $keyCode") + return super.onKeyUp(keyCode, event) + } + + private var selectedIndex = 1 + +// override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { +// Log.d(kTag, "onKeyUp: $keyCode") +// when (keyCode) { +// KeyEvent.KEYCODE_DPAD_RIGHT -> { +// selectedIndex-- +// } +// +// KeyEvent.KEYCODE_DPAD_LEFT -> { +// selectedIndex++ +// } +// +// KeyEvent.KEYCODE_DPAD_CENTER -> { +// +// } +// } +// +// when (selectedIndex) { +// 1 -> { +// binding.startCheckTagView.visibility = View.VISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 2 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.VISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 3 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.VISIBLE +// } +// } +// return super.onKeyUp(keyCode, event) +// } } \ No newline at end of file diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt index ab45deb..5faab3c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt @@ -1,16 +1,15 @@ package com.casic.br.ar.app.view -import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.lifecycle.lifecycleScope import com.casic.br.ar.app.databinding.ActivityMainBinding import com.casic.br.ar.app.external.YoloStateConst import com.casic.br.ar.app.external.Yolov8ncnn -import com.casic.br.ar.app.service.WebSocketMessageService import com.casic.br.ar.app.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -27,6 +26,7 @@ lateinit var weakReferenceHandler: WeakReferenceHandler } + private val kTag = "MainActivity" private val yolov8ncnn by lazy { Yolov8ncnn() } override fun handleMessage(msg: Message): Boolean { @@ -70,7 +70,7 @@ //初始化OpenCV OpenCVLoader.initLocal() - startService(Intent(this, WebSocketMessageService::class.java)) +// startService(Intent(this, WebSocketMessageService::class.java)) } override fun initViewBinding(): ActivityMainBinding { @@ -87,14 +87,52 @@ } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - return if (keyCode == KeyEvent.KEYCODE_BACK) { - if (System.currentTimeMillis() - clickTime > 2000) { - "再按一次退出程序".show(this) - clickTime = System.currentTimeMillis() - true - } else { - super.onKeyDown(keyCode, event) - } - } else super.onKeyDown(keyCode, event) + Log.d(kTag, "onKeyDown: $keyCode") + return super.onKeyDown(keyCode, event) } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + Log.d(kTag, "onKeyUp: $keyCode") + return super.onKeyUp(keyCode, event) + } + + private var selectedIndex = 1 + +// override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { +// Log.d(kTag, "onKeyUp: $keyCode") +// when (keyCode) { +// KeyEvent.KEYCODE_DPAD_RIGHT -> { +// selectedIndex-- +// } +// +// KeyEvent.KEYCODE_DPAD_LEFT -> { +// selectedIndex++ +// } +// +// KeyEvent.KEYCODE_DPAD_CENTER -> { +// +// } +// } +// +// when (selectedIndex) { +// 1 -> { +// binding.startCheckTagView.visibility = View.VISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 2 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.VISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 3 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.VISIBLE +// } +// } +// return super.onKeyUp(keyCode, event) +// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt index 746655e..61578f1 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt @@ -54,7 +54,7 @@ } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { - yolov8ncnn.setOutputWindow(holder.surface, YoloResult(), mat.nativeObjAddr, this) + yolov8ncnn.setOutputWindow(holder.surface, mat.nativeObjAddr, this) } override fun surfaceDestroyed(holder: SurfaceHolder) { @@ -69,12 +69,30 @@ } - override fun onDetect(output: YoloResult) { + override fun onDetect(output: ArrayList) { lifecycleScope.launch(Dispatchers.Main) { binding.titleView.text = detectedScene } - binding.detectView.updateTargetPosition(output) + //转成泛型集合 + val results = ArrayList() + output.forEach { + val yolo = YoloResult() + + val strings = it.split(" ") + yolo.type = strings.first().toInt() + + val array = FloatArray(4) + array[0] = strings[1].toFloat() + array[1] = strings[2].toFloat() + array[2] = strings[3].toFloat() + array[3] = strings[4].toFloat() + yolo.position = array + + yolo.prob = strings.last() + results.add(yolo) + } + binding.detectView.updateTargetPosition(results) } override fun onResume() { diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt index ab45deb..5faab3c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt @@ -1,16 +1,15 @@ package com.casic.br.ar.app.view -import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.lifecycle.lifecycleScope import com.casic.br.ar.app.databinding.ActivityMainBinding import com.casic.br.ar.app.external.YoloStateConst import com.casic.br.ar.app.external.Yolov8ncnn -import com.casic.br.ar.app.service.WebSocketMessageService import com.casic.br.ar.app.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -27,6 +26,7 @@ lateinit var weakReferenceHandler: WeakReferenceHandler } + private val kTag = "MainActivity" private val yolov8ncnn by lazy { Yolov8ncnn() } override fun handleMessage(msg: Message): Boolean { @@ -70,7 +70,7 @@ //初始化OpenCV OpenCVLoader.initLocal() - startService(Intent(this, WebSocketMessageService::class.java)) +// startService(Intent(this, WebSocketMessageService::class.java)) } override fun initViewBinding(): ActivityMainBinding { @@ -87,14 +87,52 @@ } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - return if (keyCode == KeyEvent.KEYCODE_BACK) { - if (System.currentTimeMillis() - clickTime > 2000) { - "再按一次退出程序".show(this) - clickTime = System.currentTimeMillis() - true - } else { - super.onKeyDown(keyCode, event) - } - } else super.onKeyDown(keyCode, event) + Log.d(kTag, "onKeyDown: $keyCode") + return super.onKeyDown(keyCode, event) } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + Log.d(kTag, "onKeyUp: $keyCode") + return super.onKeyUp(keyCode, event) + } + + private var selectedIndex = 1 + +// override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { +// Log.d(kTag, "onKeyUp: $keyCode") +// when (keyCode) { +// KeyEvent.KEYCODE_DPAD_RIGHT -> { +// selectedIndex-- +// } +// +// KeyEvent.KEYCODE_DPAD_LEFT -> { +// selectedIndex++ +// } +// +// KeyEvent.KEYCODE_DPAD_CENTER -> { +// +// } +// } +// +// when (selectedIndex) { +// 1 -> { +// binding.startCheckTagView.visibility = View.VISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 2 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.VISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 3 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.VISIBLE +// } +// } +// return super.onKeyUp(keyCode, event) +// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt index 746655e..61578f1 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt @@ -54,7 +54,7 @@ } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { - yolov8ncnn.setOutputWindow(holder.surface, YoloResult(), mat.nativeObjAddr, this) + yolov8ncnn.setOutputWindow(holder.surface, mat.nativeObjAddr, this) } override fun surfaceDestroyed(holder: SurfaceHolder) { @@ -69,12 +69,30 @@ } - override fun onDetect(output: YoloResult) { + override fun onDetect(output: ArrayList) { lifecycleScope.launch(Dispatchers.Main) { binding.titleView.text = detectedScene } - binding.detectView.updateTargetPosition(output) + //转成泛型集合 + val results = ArrayList() + output.forEach { + val yolo = YoloResult() + + val strings = it.split(" ") + yolo.type = strings.first().toInt() + + val array = FloatArray(4) + array[0] = strings[1].toFloat() + array[1] = strings[2].toFloat() + array[2] = strings[3].toFloat() + array[3] = strings[4].toFloat() + yolo.position = array + + yolo.prob = strings.last() + results.add(yolo) + } + binding.detectView.updateTargetPosition(results) } override fun onResume() { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt index 333ab62..b4d7a64 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt @@ -21,7 +21,7 @@ private val backgroundPaint by lazy { Paint() } private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } - private var result: YoloResult? = null + private var results = ArrayList() init { textPaint.color = Color.WHITE @@ -39,41 +39,40 @@ borderPaint.isAntiAlias = true } - fun updateTargetPosition(result: YoloResult) { - this.result = result + fun updateTargetPosition(results: ArrayList) { + this.results = results postInvalidate() } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - result?.apply { - val prob = String.format("%.2f", this.prob * 100) - val label = "${LocaleConstant.CLASS_NAMES_ARRAY[this.type]} ${prob}%" + results.forEach { + val label = "${LocaleConstant.CLASS_NAMES_ARRAY[it.type]} ${it.prob}" val textLength = textPaint.measureText(label) //文字背景 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[0].dp2px(context) + textLength).toInt() + 10, - this.position[1].dp2px(context).toInt() - 50 + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[0].dp2px(context) + textLength).toInt() + 10, + it.position[1].dp2px(context).toInt() - 50 ) canvas.drawRect(rect, backgroundPaint) //画文字。数值是文字左右边距,可酌情调整 canvas.drawText( label, - this.position[0].dp2px(context) + (textLength + 10) / 2, - this.position[1].dp2px(context) - 10, + it.position[0].dp2px(context) + (textLength + 10) / 2, + it.position[1].dp2px(context) - 10, textPaint ) //画框 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[2] + this.position[0]).dp2px(context).toInt(), - (this.position[3] + this.position[1]).dp2px(context).toInt() + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[2] + it.position[0]).dp2px(context).toInt(), + (it.position[3] + it.position[1]).dp2px(context).toInt() ) canvas.drawRect(rect, borderPaint) } diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt index ab45deb..5faab3c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt @@ -1,16 +1,15 @@ package com.casic.br.ar.app.view -import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.lifecycle.lifecycleScope import com.casic.br.ar.app.databinding.ActivityMainBinding import com.casic.br.ar.app.external.YoloStateConst import com.casic.br.ar.app.external.Yolov8ncnn -import com.casic.br.ar.app.service.WebSocketMessageService import com.casic.br.ar.app.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -27,6 +26,7 @@ lateinit var weakReferenceHandler: WeakReferenceHandler } + private val kTag = "MainActivity" private val yolov8ncnn by lazy { Yolov8ncnn() } override fun handleMessage(msg: Message): Boolean { @@ -70,7 +70,7 @@ //初始化OpenCV OpenCVLoader.initLocal() - startService(Intent(this, WebSocketMessageService::class.java)) +// startService(Intent(this, WebSocketMessageService::class.java)) } override fun initViewBinding(): ActivityMainBinding { @@ -87,14 +87,52 @@ } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - return if (keyCode == KeyEvent.KEYCODE_BACK) { - if (System.currentTimeMillis() - clickTime > 2000) { - "再按一次退出程序".show(this) - clickTime = System.currentTimeMillis() - true - } else { - super.onKeyDown(keyCode, event) - } - } else super.onKeyDown(keyCode, event) + Log.d(kTag, "onKeyDown: $keyCode") + return super.onKeyDown(keyCode, event) } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + Log.d(kTag, "onKeyUp: $keyCode") + return super.onKeyUp(keyCode, event) + } + + private var selectedIndex = 1 + +// override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { +// Log.d(kTag, "onKeyUp: $keyCode") +// when (keyCode) { +// KeyEvent.KEYCODE_DPAD_RIGHT -> { +// selectedIndex-- +// } +// +// KeyEvent.KEYCODE_DPAD_LEFT -> { +// selectedIndex++ +// } +// +// KeyEvent.KEYCODE_DPAD_CENTER -> { +// +// } +// } +// +// when (selectedIndex) { +// 1 -> { +// binding.startCheckTagView.visibility = View.VISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 2 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.VISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 3 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.VISIBLE +// } +// } +// return super.onKeyUp(keyCode, event) +// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt index 746655e..61578f1 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt @@ -54,7 +54,7 @@ } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { - yolov8ncnn.setOutputWindow(holder.surface, YoloResult(), mat.nativeObjAddr, this) + yolov8ncnn.setOutputWindow(holder.surface, mat.nativeObjAddr, this) } override fun surfaceDestroyed(holder: SurfaceHolder) { @@ -69,12 +69,30 @@ } - override fun onDetect(output: YoloResult) { + override fun onDetect(output: ArrayList) { lifecycleScope.launch(Dispatchers.Main) { binding.titleView.text = detectedScene } - binding.detectView.updateTargetPosition(output) + //转成泛型集合 + val results = ArrayList() + output.forEach { + val yolo = YoloResult() + + val strings = it.split(" ") + yolo.type = strings.first().toInt() + + val array = FloatArray(4) + array[0] = strings[1].toFloat() + array[1] = strings[2].toFloat() + array[2] = strings[3].toFloat() + array[3] = strings[4].toFloat() + yolo.position = array + + yolo.prob = strings.last() + results.add(yolo) + } + binding.detectView.updateTargetPosition(results) } override fun onResume() { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt index 333ab62..b4d7a64 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt @@ -21,7 +21,7 @@ private val backgroundPaint by lazy { Paint() } private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } - private var result: YoloResult? = null + private var results = ArrayList() init { textPaint.color = Color.WHITE @@ -39,41 +39,40 @@ borderPaint.isAntiAlias = true } - fun updateTargetPosition(result: YoloResult) { - this.result = result + fun updateTargetPosition(results: ArrayList) { + this.results = results postInvalidate() } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - result?.apply { - val prob = String.format("%.2f", this.prob * 100) - val label = "${LocaleConstant.CLASS_NAMES_ARRAY[this.type]} ${prob}%" + results.forEach { + val label = "${LocaleConstant.CLASS_NAMES_ARRAY[it.type]} ${it.prob}" val textLength = textPaint.measureText(label) //文字背景 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[0].dp2px(context) + textLength).toInt() + 10, - this.position[1].dp2px(context).toInt() - 50 + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[0].dp2px(context) + textLength).toInt() + 10, + it.position[1].dp2px(context).toInt() - 50 ) canvas.drawRect(rect, backgroundPaint) //画文字。数值是文字左右边距,可酌情调整 canvas.drawText( label, - this.position[0].dp2px(context) + (textLength + 10) / 2, - this.position[1].dp2px(context) - 10, + it.position[0].dp2px(context) + (textLength + 10) / 2, + it.position[1].dp2px(context) - 10, textPaint ) //画框 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[2] + this.position[0]).dp2px(context).toInt(), - (this.position[3] + this.position[1]).dp2px(context).toInt() + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[2] + it.position[0]).dp2px(context).toInt(), + (it.position[3] + it.position[1]).dp2px(context).toInt() ) canvas.drawRect(rect, borderPaint) } diff --git a/app/src/main/res/drawable/ic_selected.xml b/app/src/main/res/drawable/ic_selected.xml new file mode 100644 index 0000000..cef7ec1 --- /dev/null +++ b/app/src/main/res/drawable/ic_selected.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git "a/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" new file mode 100644 index 0000000..2ad76e6 --- /dev/null +++ "b/20240616\345\256\211\345\205\250\345\261\225\344\273\243\347\240\201\345\244\207\344\273\275.zip" Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.bin b/app/src/main/assets/ji-sim-opt.bin new file mode 100644 index 0000000..a2695b4 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.bin Binary files differ diff --git a/app/src/main/assets/ji-sim-opt.param b/app/src/main/assets/ji-sim-opt.param new file mode 100644 index 0000000..1d0e424 --- /dev/null +++ b/app/src/main/assets/ji-sim-opt.param @@ -0,0 +1,183 @@ +7767517 +181 217 +Input images 0 1 images +Convolution Conv_0 1 1 images 128 0=32 1=3 3=2 4=1 5=1 6=864 +Swish Mul_2 1 1 128 130 +Convolution Conv_3 1 1 130 131 0=64 1=3 3=2 4=1 5=1 6=18432 +Swish Mul_5 1 1 131 133 +Convolution Conv_6 1 1 133 134 0=64 1=1 5=1 6=4096 +Swish Mul_8 1 1 134 136 +Slice Split_9 1 2 136 137 138 -23300=2,32,-233 +Split splitncnn_0 1 3 138 138_splitncnn_0 138_splitncnn_1 138_splitncnn_2 +Convolution Conv_10 1 1 138_splitncnn_2 139 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_12 1 1 139 141 +Convolution Conv_13 1 1 141 142 0=32 1=3 4=1 5=1 6=9216 +Swish Mul_15 1 1 142 144 +BinaryOp Add_16 2 1 138_splitncnn_1 144 145 +Concat Concat_17 3 1 137 138_splitncnn_0 145 146 +Convolution Conv_18 1 1 146 147 0=64 1=1 5=1 6=6144 +Swish Mul_20 1 1 147 149 +Convolution Conv_21 1 1 149 150 0=128 1=3 3=2 4=1 5=1 6=73728 +Swish Mul_23 1 1 150 152 +Convolution Conv_24 1 1 152 153 0=128 1=1 5=1 6=16384 +Swish Mul_26 1 1 153 155 +Slice Split_27 1 2 155 156 157 -23300=2,64,-233 +Split splitncnn_1 1 3 157 157_splitncnn_0 157_splitncnn_1 157_splitncnn_2 +Convolution Conv_28 1 1 157_splitncnn_2 158 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_30 1 1 158 160 +Convolution Conv_31 1 1 160 161 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_33 1 1 161 163 +BinaryOp Add_34 2 1 157_splitncnn_1 163 164 +Split splitncnn_2 1 3 164 164_splitncnn_0 164_splitncnn_1 164_splitncnn_2 +Convolution Conv_35 1 1 164_splitncnn_2 165 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_37 1 1 165 167 +Convolution Conv_38 1 1 167 168 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_40 1 1 168 170 +BinaryOp Add_41 2 1 164_splitncnn_1 170 171 +Concat Concat_42 4 1 156 157_splitncnn_0 164_splitncnn_0 171 172 +Convolution Conv_43 1 1 172 173 0=128 1=1 5=1 6=32768 +Swish Mul_45 1 1 173 175 +Split splitncnn_3 1 2 175 175_splitncnn_0 175_splitncnn_1 +Convolution Conv_46 1 1 175_splitncnn_1 176 0=256 1=3 3=2 4=1 5=1 6=294912 +Swish Mul_48 1 1 176 178 +Convolution Conv_49 1 1 178 179 0=256 1=1 5=1 6=65536 +Swish Mul_51 1 1 179 181 +Slice Split_52 1 2 181 182 183 -23300=2,128,-233 +Split splitncnn_4 1 3 183 183_splitncnn_0 183_splitncnn_1 183_splitncnn_2 +Convolution Conv_53 1 1 183_splitncnn_2 184 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_55 1 1 184 186 +Convolution Conv_56 1 1 186 187 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_58 1 1 187 189 +BinaryOp Add_59 2 1 183_splitncnn_1 189 190 +Split splitncnn_5 1 3 190 190_splitncnn_0 190_splitncnn_1 190_splitncnn_2 +Convolution Conv_60 1 1 190_splitncnn_2 191 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_62 1 1 191 193 +Convolution Conv_63 1 1 193 194 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_65 1 1 194 196 +BinaryOp Add_66 2 1 190_splitncnn_1 196 197 +Concat Concat_67 4 1 182 183_splitncnn_0 190_splitncnn_0 197 198 +Convolution Conv_68 1 1 198 199 0=256 1=1 5=1 6=131072 +Swish Mul_70 1 1 199 201 +Split splitncnn_6 1 2 201 201_splitncnn_0 201_splitncnn_1 +Convolution Conv_71 1 1 201_splitncnn_1 202 0=512 1=3 3=2 4=1 5=1 6=1179648 +Swish Mul_73 1 1 202 204 +Convolution Conv_74 1 1 204 205 0=512 1=1 5=1 6=262144 +Swish Mul_76 1 1 205 207 +Slice Split_77 1 2 207 208 209 -23300=2,256,-233 +Split splitncnn_7 1 3 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 +Convolution Conv_78 1 1 209_splitncnn_2 210 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_80 1 1 210 212 +Convolution Conv_81 1 1 212 213 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_83 1 1 213 215 +BinaryOp Add_84 2 1 209_splitncnn_1 215 216 +Concat Concat_85 3 1 208 209_splitncnn_0 216 217 +Convolution Conv_86 1 1 217 218 0=512 1=1 5=1 6=393216 +Swish Mul_88 1 1 218 220 +Convolution Conv_89 1 1 220 221 0=256 1=1 5=1 6=131072 +Swish Mul_91 1 1 221 223 +Split splitncnn_8 1 2 223 223_splitncnn_0 223_splitncnn_1 +Pooling MaxPool_92 1 1 223_splitncnn_1 224 1=5 3=2 5=1 +Split splitncnn_9 1 2 224 224_splitncnn_0 224_splitncnn_1 +Pooling MaxPool_93 1 1 224_splitncnn_1 225 1=5 3=2 5=1 +Split splitncnn_10 1 2 225 225_splitncnn_0 225_splitncnn_1 +Pooling MaxPool_94 1 1 225_splitncnn_1 226 1=5 3=2 5=1 +Concat Concat_95 4 1 223_splitncnn_0 224_splitncnn_0 225_splitncnn_0 226 227 +Convolution Conv_96 1 1 227 228 0=512 1=1 5=1 6=524288 +Swish Mul_98 1 1 228 230 +Split splitncnn_11 1 2 230 230_splitncnn_0 230_splitncnn_1 +Interp Resize_100 1 1 230_splitncnn_1 235 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_101 2 1 235 201_splitncnn_0 236 +Convolution Conv_102 1 1 236 237 0=256 1=1 5=1 6=196608 +Swish Mul_104 1 1 237 239 +Slice Split_105 1 2 239 240 241 -23300=2,128,-233 +Split splitncnn_12 1 2 241 241_splitncnn_0 241_splitncnn_1 +Convolution Conv_106 1 1 241_splitncnn_1 242 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_108 1 1 242 244 +Convolution Conv_109 1 1 244 245 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_111 1 1 245 247 +Concat Concat_112 3 1 240 241_splitncnn_0 247 248 +Convolution Conv_113 1 1 248 249 0=256 1=1 5=1 6=98304 +Swish Mul_115 1 1 249 251 +Split splitncnn_13 1 2 251 251_splitncnn_0 251_splitncnn_1 +Interp Resize_117 1 1 251_splitncnn_1 256 0=1 1=2.000000e+00 2=2.000000e+00 +Concat Concat_118 2 1 256 175_splitncnn_0 257 +Convolution Conv_119 1 1 257 258 0=128 1=1 5=1 6=49152 +Swish Mul_121 1 1 258 260 +Slice Split_122 1 2 260 261 262 -23300=2,64,-233 +Split splitncnn_14 1 2 262 262_splitncnn_0 262_splitncnn_1 +Convolution Conv_123 1 1 262_splitncnn_1 263 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_125 1 1 263 265 +Convolution Conv_126 1 1 265 266 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_128 1 1 266 268 +Concat Concat_129 3 1 261 262_splitncnn_0 268 269 +Convolution Conv_130 1 1 269 270 0=128 1=1 5=1 6=24576 +Swish Mul_132 1 1 270 272 +Split splitncnn_15 1 3 272 272_splitncnn_0 272_splitncnn_1 272_splitncnn_2 +Convolution Conv_133 1 1 272_splitncnn_2 273 0=128 1=3 3=2 4=1 5=1 6=147456 +Swish Mul_135 1 1 273 275 +Concat Concat_136 2 1 275 251_splitncnn_0 276 +Convolution Conv_137 1 1 276 277 0=256 1=1 5=1 6=98304 +Swish Mul_139 1 1 277 279 +Slice Split_140 1 2 279 280 281 -23300=2,128,-233 +Split splitncnn_16 1 2 281 281_splitncnn_0 281_splitncnn_1 +Convolution Conv_141 1 1 281_splitncnn_1 282 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_143 1 1 282 284 +Convolution Conv_144 1 1 284 285 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_146 1 1 285 287 +Concat Concat_147 3 1 280 281_splitncnn_0 287 288 +Convolution Conv_148 1 1 288 289 0=256 1=1 5=1 6=98304 +Swish Mul_150 1 1 289 291 +Split splitncnn_17 1 3 291 291_splitncnn_0 291_splitncnn_1 291_splitncnn_2 +Convolution Conv_151 1 1 291_splitncnn_2 292 0=256 1=3 3=2 4=1 5=1 6=589824 +Swish Mul_153 1 1 292 294 +Concat Concat_154 2 1 294 230_splitncnn_0 295 +Convolution Conv_155 1 1 295 296 0=512 1=1 5=1 6=393216 +Swish Mul_157 1 1 296 298 +Slice Split_158 1 2 298 299 300 -23300=2,256,-233 +Split splitncnn_18 1 2 300 300_splitncnn_0 300_splitncnn_1 +Convolution Conv_159 1 1 300_splitncnn_1 301 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_161 1 1 301 303 +Convolution Conv_162 1 1 303 304 0=256 1=3 4=1 5=1 6=589824 +Swish Mul_164 1 1 304 306 +Concat Concat_165 3 1 299 300_splitncnn_0 306 307 +Convolution Conv_166 1 1 307 308 0=512 1=1 5=1 6=393216 +Swish Mul_168 1 1 308 310 +Split splitncnn_19 1 2 310 310_splitncnn_0 310_splitncnn_1 +Convolution Conv_169 1 1 272_splitncnn_1 311 0=64 1=3 4=1 5=1 6=73728 +Swish Mul_171 1 1 311 313 +Convolution Conv_172 1 1 313 314 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_174 1 1 314 316 +Convolution Conv_175 1 1 316 317 0=64 1=1 5=1 6=4096 +Convolution Conv_176 1 1 272_splitncnn_0 318 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_178 1 1 318 320 +Convolution Conv_179 1 1 320 321 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_181 1 1 321 323 +Convolution Conv_182 1 1 323 324 0=5 1=1 5=1 6=640 +Concat Concat_183 2 1 317 324 325 +Convolution Conv_184 1 1 291_splitncnn_1 326 0=64 1=3 4=1 5=1 6=147456 +Swish Mul_186 1 1 326 328 +Convolution Conv_187 1 1 328 329 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_189 1 1 329 331 +Convolution Conv_190 1 1 331 332 0=64 1=1 5=1 6=4096 +Convolution Conv_191 1 1 291_splitncnn_0 333 0=128 1=3 4=1 5=1 6=294912 +Swish Mul_193 1 1 333 335 +Convolution Conv_194 1 1 335 336 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_196 1 1 336 338 +Convolution Conv_197 1 1 338 339 0=5 1=1 5=1 6=640 +Concat Concat_198 2 1 332 339 340 +Convolution Conv_199 1 1 310_splitncnn_1 341 0=64 1=3 4=1 5=1 6=294912 +Swish Mul_201 1 1 341 343 +Convolution Conv_202 1 1 343 344 0=64 1=3 4=1 5=1 6=36864 +Swish Mul_204 1 1 344 346 +Convolution Conv_205 1 1 346 347 0=64 1=1 5=1 6=4096 +Convolution Conv_206 1 1 310_splitncnn_0 348 0=128 1=3 4=1 5=1 6=589824 +Swish Mul_208 1 1 348 350 +Convolution Conv_209 1 1 350 351 0=128 1=3 4=1 5=1 6=147456 +Swish Mul_211 1 1 351 353 +Convolution Conv_212 1 1 353 354 0=5 1=1 5=1 6=640 +Concat Concat_213 2 1 347 354 355 +Reshape Reshape_219 1 1 325 365 0=-1 1=69 +Reshape Reshape_222 1 1 340 372 0=-1 1=69 +Reshape Reshape_225 1 1 355 379 0=-1 1=69 +Concat Concat_226 3 1 365 372 379 380 0=1 +Permute Transpose_227 1 1 380 output 0=1 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 4195087..41a46db 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -404,7 +404,7 @@ return 0; } -void Yolo::initNativeCallback(JavaVM *vm, jobject input, jlong nativeObjAddr, jobject pJobject) { +void Yolo::initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject) { javaVM = vm; /** @@ -412,9 +412,6 @@ * */ JNIEnv *env; vm->AttachCurrentThread(&env, nullptr); - //此时input转为output - j_output = env->NewGlobalRef(input); - j_mat_addr = nativeObjAddr; j_callback = env->NewGlobalRef(pJobject); @@ -563,51 +560,51 @@ /** * 回调给Java/Kotlin层 * */ - JNIEnv *env; - javaVM->AttachCurrentThread(&env, nullptr); - jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - - jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" - ); - - //获取ArrayList类 - jclass list_clazz = env->FindClass("java/util/ArrayList"); - jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); - jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); - //初始化ArrayList对象 - jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); - - for (auto item: objects) { - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); - float array[4]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); - - //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); - } - //回调 - env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); - - /** - * Mat数据。 - * */ - auto *res = (cv::Mat *) j_mat_addr; - res->create(rgb.rows, rgb.cols, rgb.type()); - memcpy(res->data, rgb.data, rgb.rows * rgb.step); +// JNIEnv *env; +// javaVM->AttachCurrentThread(&env, nullptr); +// jclass callback_clazz = env->GetObjectClass(j_callback); +// jclass output_clazz = env->GetObjectClass(j_output); +// +// jmethodID j_method_id = env->GetMethodID( +// callback_clazz, "onPartition", "(Ljava/util/ArrayList;)V" +// ); +// +// //获取ArrayList类 +// jclass list_clazz = env->FindClass("java/util/ArrayList"); +// jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); +// jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); +// //初始化ArrayList对象 +// jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); +// +// for (auto item: objects) { +// jfieldID type = env->GetFieldID(output_clazz, "type", "I"); +// env->SetIntField(j_output, type, item.label); +// +// jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); +// float array[4]; +// array[0] = item.rect.x; +// array[1] = item.rect.y; +// array[2] = item.rect.width; +// array[3] = item.rect.height; +// jfloatArray rectArray = env->NewFloatArray(4); +// env->SetFloatArrayRegion(rectArray, 0, 4, array); +// env->SetObjectField(j_output, position, rectArray); +// +// jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); +// env->SetFloatField(j_output, prob, item.prob); +// +// //add +// env->CallBooleanMethod(arraylist_obj, arraylist_add, j_output); +// } +// //回调 +// env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); +// +// /** +// * Mat数据。 +// * */ +// auto *res = (cv::Mat *) j_mat_addr; +// res->create(rgb.rows, rgb.cols, rgb.type()); +// memcpy(res->data, rgb.data, rgb.rows * rgb.step); } return 0; } @@ -633,7 +630,7 @@ } ncnn::Mat in = ncnn::Mat::from_pixels_resize( - rgb.data, ncnn::Mat::PIXEL_RGB2BGR, width, height, w, h + rgb.data, ncnn::Mat::PIXEL_RGB, width, height, w, h ); // pad to target_size rectangle @@ -707,54 +704,40 @@ JNIEnv *env; javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); - jclass output_clazz = env->GetObjectClass(j_output); - /** - * I: 整数类型(int) - * J: 长整数类型(long) - * D: 双精度浮点数类型(double) - * F: 单精度浮点数类型(float) - * Z: 布尔类型(boolean) - * C: 字符类型(char) - * B: 字节类型(byte) - * S: 短整数类型(short) - *
-----------------------------------------------
- * Ljava/lang/Object;: 表示 Object 类型的引用 - * Ljava/lang/String;: 表示 String 类型的引用 - * L包名/类名;: 表示特定包名和类名的引用 - *
-----------------------------------------------
- * 例如: - * int add(int a, int b): (II)I - * - * String concat(String str1, String str2): (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - *
-----------------------------------------------
- * [Ljava/lang/String;: 表示 String 类型的一维数组 - * */ + jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onDetect", "(Lcom/casic/br/ar/app/external/YoloResult;)V" + callback_clazz, "onDetect", "(Ljava/util/ArrayList;)V" ); + //获取ArrayList类 + jclass list_clazz = env->FindClass("java/util/ArrayList"); + jmethodID arraylist_init = env->GetMethodID(list_clazz, "", "()V"); + jmethodID arraylist_add = env->GetMethodID(list_clazz, "add", "(Ljava/lang/Object;)Z"); + //初始化ArrayList对象 + jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); + for (int i = 0; i < count; i++) { auto item = objects[i]; - jfieldID type = env->GetFieldID(output_clazz, "type", "I"); - env->SetIntField(j_output, type, item.label); - - jfieldID position = env->GetFieldID(output_clazz, "position", "[F"); float array[4]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; - jfloatArray rectArray = env->NewFloatArray(4); - env->SetFloatArrayRegion(rectArray, 0, 4, array); - env->SetObjectField(j_output, position, rectArray); - jfieldID prob = env->GetFieldID(output_clazz, "prob", "F"); - env->SetFloatField(j_output, prob, item.prob); + char text[256]; + sprintf( + text, + "%d %f %f %f %f %.1f%%", + item.label, + array[0], array[1], array[2], array[3], + item.prob * 100 + ); //回调 - env->CallVoidMethod(j_callback, j_method_id, j_output); + env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); } + env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 1874609..f9dcb87 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -59,7 +59,7 @@ const float *norm_values, bool use_gpu = false); - void initNativeCallback(JavaVM *vm, jobject result, jlong nativeObjAddr, jobject pJobject); + void initNativeCallback(JavaVM *vm, jlong nativeObjAddr, jobject pJobject); /** * 分类 @@ -96,8 +96,6 @@ * 全局引用 * */ JavaVM *javaVM; - //输出结果类 - jobject j_output; //Java传过来的Mat对象内存地址 jlong j_mat_addr; //回调类 diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 4e0e2d3..09b80ee 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -241,14 +241,15 @@ } JNIEXPORT jboolean JNICALL -Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, jobject surface, - jobject input, jlong nativeObjAddr, - jobject native_callback) { +Java_com_casic_br_ar_app_external_Yolov8ncnn_setOutputWindow(JNIEnv *env, jobject thiz, + jobject surface, + jlong nativeObjAddr, + jobject native_callback) { ANativeWindow *win = ANativeWindow_fromSurface(env, surface); g_camera->set_window(win); - g_yolo->initNativeCallback(javaVM, input, nativeObjAddr, native_callback); + g_yolo->initNativeCallback(javaVM, nativeObjAddr, native_callback); return JNI_TRUE; } diff --git a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt index 73c483b..012e149 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/INativeCallback.kt @@ -14,5 +14,5 @@ /** * 检测 */ - fun onDetect(output: YoloResult) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java index db9fbb0..be9d419 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/ar/app/external/YoloResult.java @@ -3,7 +3,7 @@ public class YoloResult { private int type; private float[] position; - private float prob; + private String prob; public int getType() { return type; @@ -21,11 +21,11 @@ this.position = position; } - public float getProb() { + public String getProb() { return prob; } - public void setProb(float prob) { + public void setProb(String prob) { this.prob = prob; } } diff --git a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt index 4f94a1b..70509b4 100644 --- a/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/ar/app/external/Yolov8ncnn.kt @@ -26,7 +26,7 @@ external fun closeCamera(): Boolean external fun setOutputWindow( - surface: Surface, input: YoloResult, nativeObjAddr: Long, callBack: INativeCallback + surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean external fun updateYoloState(@YoloStateConst yoloState: Int): Boolean diff --git a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt index ab45deb..5faab3c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/MainActivity.kt @@ -1,16 +1,15 @@ package com.casic.br.ar.app.view -import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.KeyEvent import android.view.View import androidx.lifecycle.lifecycleScope import com.casic.br.ar.app.databinding.ActivityMainBinding import com.casic.br.ar.app.external.YoloStateConst import com.casic.br.ar.app.external.Yolov8ncnn -import com.casic.br.ar.app.service.WebSocketMessageService import com.casic.br.ar.app.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -27,6 +26,7 @@ lateinit var weakReferenceHandler: WeakReferenceHandler } + private val kTag = "MainActivity" private val yolov8ncnn by lazy { Yolov8ncnn() } override fun handleMessage(msg: Message): Boolean { @@ -70,7 +70,7 @@ //初始化OpenCV OpenCVLoader.initLocal() - startService(Intent(this, WebSocketMessageService::class.java)) +// startService(Intent(this, WebSocketMessageService::class.java)) } override fun initViewBinding(): ActivityMainBinding { @@ -87,14 +87,52 @@ } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - return if (keyCode == KeyEvent.KEYCODE_BACK) { - if (System.currentTimeMillis() - clickTime > 2000) { - "再按一次退出程序".show(this) - clickTime = System.currentTimeMillis() - true - } else { - super.onKeyDown(keyCode, event) - } - } else super.onKeyDown(keyCode, event) + Log.d(kTag, "onKeyDown: $keyCode") + return super.onKeyDown(keyCode, event) } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + Log.d(kTag, "onKeyUp: $keyCode") + return super.onKeyUp(keyCode, event) + } + + private var selectedIndex = 1 + +// override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { +// Log.d(kTag, "onKeyUp: $keyCode") +// when (keyCode) { +// KeyEvent.KEYCODE_DPAD_RIGHT -> { +// selectedIndex-- +// } +// +// KeyEvent.KEYCODE_DPAD_LEFT -> { +// selectedIndex++ +// } +// +// KeyEvent.KEYCODE_DPAD_CENTER -> { +// +// } +// } +// +// when (selectedIndex) { +// 1 -> { +// binding.startCheckTagView.visibility = View.VISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 2 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.VISIBLE +// binding.libraryTagView.visibility = View.INVISIBLE +// } +// +// 3 -> { +// binding.startCheckTagView.visibility = View.INVISIBLE +// binding.checkHistoryTagView.visibility = View.INVISIBLE +// binding.libraryTagView.visibility = View.VISIBLE +// } +// } +// return super.onKeyUp(keyCode, event) +// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt index 746655e..61578f1 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/StartCheckActivity.kt @@ -54,7 +54,7 @@ } override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { - yolov8ncnn.setOutputWindow(holder.surface, YoloResult(), mat.nativeObjAddr, this) + yolov8ncnn.setOutputWindow(holder.surface, mat.nativeObjAddr, this) } override fun surfaceDestroyed(holder: SurfaceHolder) { @@ -69,12 +69,30 @@ } - override fun onDetect(output: YoloResult) { + override fun onDetect(output: ArrayList) { lifecycleScope.launch(Dispatchers.Main) { binding.titleView.text = detectedScene } - binding.detectView.updateTargetPosition(output) + //转成泛型集合 + val results = ArrayList() + output.forEach { + val yolo = YoloResult() + + val strings = it.split(" ") + yolo.type = strings.first().toInt() + + val array = FloatArray(4) + array[0] = strings[1].toFloat() + array[1] = strings[2].toFloat() + array[2] = strings[3].toFloat() + array[3] = strings[4].toFloat() + yolo.position = array + + yolo.prob = strings.last() + results.add(yolo) + } + binding.detectView.updateTargetPosition(results) } override fun onResume() { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt index 333ab62..b4d7a64 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/YoloTargetDetectView.kt @@ -21,7 +21,7 @@ private val backgroundPaint by lazy { Paint() } private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } - private var result: YoloResult? = null + private var results = ArrayList() init { textPaint.color = Color.WHITE @@ -39,41 +39,40 @@ borderPaint.isAntiAlias = true } - fun updateTargetPosition(result: YoloResult) { - this.result = result + fun updateTargetPosition(results: ArrayList) { + this.results = results postInvalidate() } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - result?.apply { - val prob = String.format("%.2f", this.prob * 100) - val label = "${LocaleConstant.CLASS_NAMES_ARRAY[this.type]} ${prob}%" + results.forEach { + val label = "${LocaleConstant.CLASS_NAMES_ARRAY[it.type]} ${it.prob}" val textLength = textPaint.measureText(label) //文字背景 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[0].dp2px(context) + textLength).toInt() + 10, - this.position[1].dp2px(context).toInt() - 50 + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[0].dp2px(context) + textLength).toInt() + 10, + it.position[1].dp2px(context).toInt() - 50 ) canvas.drawRect(rect, backgroundPaint) //画文字。数值是文字左右边距,可酌情调整 canvas.drawText( label, - this.position[0].dp2px(context) + (textLength + 10) / 2, - this.position[1].dp2px(context) - 10, + it.position[0].dp2px(context) + (textLength + 10) / 2, + it.position[1].dp2px(context) - 10, textPaint ) //画框 rect.set( - (this.position[0].dp2px(context)).toInt(), - (this.position[1].dp2px(context)).toInt(), - (this.position[2] + this.position[0]).dp2px(context).toInt(), - (this.position[3] + this.position[1]).dp2px(context).toInt() + (it.position[0].dp2px(context)).toInt(), + (it.position[1].dp2px(context)).toInt(), + (it.position[2] + it.position[0]).dp2px(context).toInt(), + (it.position[3] + it.position[1]).dp2px(context).toInt() ) canvas.drawRect(rect, borderPaint) } diff --git a/app/src/main/res/drawable/ic_selected.xml b/app/src/main/res/drawable/ic_selected.xml new file mode 100644 index 0000000..cef7ec1 --- /dev/null +++ b/app/src/main/res/drawable/ic_selected.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7a427f7..d3c4ef7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -27,79 +27,116 @@ + android:orientation="vertical"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/dp_10" + android:orientation="horizontal"> + android:id="@+id/startCheckTagView" + android:layout_width="@dimen/dp_150" + android:layout_height="@dimen/dp_30" + android:gravity="center" + android:src="@drawable/ic_selected" /> - + + + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal"> - + - - + - + + - + - + + + + + + + + + + + \ No newline at end of file