diff --git a/.gitignore b/.gitignore index fcd441f..e29609b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ result_ssd7_panel_1/ result_ssd7_panel_2/ Train&Test_A/ Train&Test_B/ +Train&Test_C/ result_ssd7_panel/ result_ssd7_panel_cell/ Thermal/ diff --git a/DataFlit2xml.py b/DataFlit2xml.py index d7abe3d..da2c23c 100644 --- a/DataFlit2xml.py +++ b/DataFlit2xml.py @@ -27,9 +27,9 @@ def mkdir(filename): except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise - - + + argparser = argparse.ArgumentParser( @@ -53,69 +53,76 @@ argparser.add_argument( #Examplo 'Train_B/' - + def _main_(args): - + input_path = args.input output_path = args.output thermal_path = args.input_thermal - + mkdir(output_path) mkdir(output_path + 'images/') mkdir(output_path + 'anns/') - - Excel = pandas.read_excel(input_path, sheet_name= 'Lista_Archivos_Fotos', header= 1) - + + Excel = pandas.read_excel(input_path, sheet_name= 'Lista_Archivos_Fotos', header = 1) + for index_path in range(len(Excel.Archivo)): - + if not pandas.notna(Excel.Archivo[index_path]): continue - + + path_Flir = Excel.loc[index_path]['Archivo'] cod_falla = int(Excel.loc[index_path]['Cód. Falla']) sev = Excel.loc[index_path]['Severidad'] - - path_Flir_aux = thermal_path + '/'.join(path_Flir.split('/')[-2:]) - + + ## Junta las mismas fotos con distintos label EJ : + # DJI_0021B ---> DJI_0021 + aux = path_Flir.split('/')[-2:] + if len(aux[1].split('.')[0]) > 8: + aux[1] = aux[1].split('.')[0][:8] + '.' + aux[1].split('.')[1] + + path_Flir_aux = thermal_path + '/'.join(aux) + if not os.path.isfile(path_Flir_aux): print ('No existe la imagen', path_Flir_aux) continue - + flir = flirimageextractor.FlirImageExtractor() - + try: flir.process_image(path_Flir_aux) I = flirimageextractor.FlirImageExtractor.get_thermal_np(flir) w, h = I.shape - + except: print('No se puede leer la imagen Flir', path_Flir_aux) continue - + dic_data = flir.get_metadata(path_Flir_aux) meas = [s for s in dic_data.keys() if "Meas" in s] q_bbox = len(meas)//3 # cada bbox tiene 3 parametros - + param_bbox = [] for num_bbox in range(1, q_bbox + 1): # Se guarda los parametros de los boundibox (xmin, ymin, width, height) width = xmax- xmin param_bbox.append(list(map(int, dic_data['Meas' + str(num_bbox) + 'Params'].split(' ')))) - + ##### Save Image and create XML annotations type of fault - path_save_img = output_path + 'images/' + '_'.join(path_Flir.split('/')[-2:]) - path_save_anns = output_path + 'anns/' + '_'.join(path_Flir.split('/')[-2:]) + path_save_img = output_path + 'images/' + '_'.join(aux) + path_save_anns = output_path + 'anns/' + '_'.join(aux) path_save_anns = path_save_anns[:-4] + '.xml' - + if not os.path.isfile(path_save_img): plt.imsave(path_save_img , I, cmap = 'gray') - + #si el archivo ya existe se agregan mas anotaciones if os.path.isfile(path_save_anns): - + et = ET.parse(path_save_anns) root = et.getroot() for box in param_bbox: - + obj = ET.SubElement(root, "object") ET.SubElement(obj, "name").text = str(cod_falla) ET.SubElement(obj, "pose").text = 'Unspecified' @@ -126,13 +133,13 @@ def _main_(args): ET.SubElement(bx, "ymin").text = str(box[1]) ET.SubElement(bx, "xmax").text = str(box[0] + box[2]) ET.SubElement(bx, "ymax").text = str(box[1] + box[3]) - + tree = ET.ElementTree(root) - tree.write(path_save_anns) - + tree.write(path_save_anns) + ## Si no existe se crea desde cero else: - + root = ET.Element("annotation") ET.SubElement(root, "folder").text = output_path[:-1] ET.SubElement(root, "filename").text = '_'.join(path_Flir.split('/')[-2:]) @@ -144,9 +151,9 @@ def _main_(args): ET.SubElement(size, "height").text = str(h) ET.SubElement(size, "depth").text = str(1) ET.SubElement(root, "segmented").text = '0' - + for box in param_bbox: - + obj = ET.SubElement(root, "object") ET.SubElement(obj, "name").text = str(cod_falla) ET.SubElement(obj, "pose").text = 'Unspecified' @@ -157,26 +164,26 @@ def _main_(args): ET.SubElement(bx, "ymin").text = str(box[1]) ET.SubElement(bx, "xmax").text = str(box[0] + box[2]) ET.SubElement(bx, "ymax").text = str(box[1] + box[3]) - + tree = ET.ElementTree(root) - tree.write(path_save_anns) - - - - - - - - - - + tree.write(path_save_anns) + + + + + + + + + + files = [] # r=root, d=directories, f = files for r, d, f in os.walk(input_path): for file in f: if '.jpg' in file: files.append(os.path.join(r, file)) - + for f in files: flir = flirimageextractor.FlirImageExtractor() print(f) @@ -187,10 +194,10 @@ def _main_(args): I = plt.imread(f) #flir.save_images() #flir.plot() - - - - #img = img.astype(np.int8) + + + + #img = img.astype(np.int8) W = np.where(np.isnan(I)) if np.shape(W)[1] > 0: @@ -199,16 +206,16 @@ def _main_(args): img = I[:ymax,:] else: img = I - + list_string = f.split('/') list_string[-3]+= '_jpg' f_aux = '/'.join(list_string) - + mkdir(f_aux) plt.imsave(f_aux, img, cmap = 'gray') - + if __name__ == '__main__': args = argparser.parse_args() - _main_(args) \ No newline at end of file + _main_(args) diff --git a/Panel_Detector_Fault.ipynb b/Panel_Detector_Fault.ipynb index 9188607..5aec78f 100644 --- a/Panel_Detector_Fault.ipynb +++ b/Panel_Detector_Fault.ipynb @@ -850,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -895,7 +895,82 @@ "\n", "Producing predictions batch-wise: 18%|█▊ | 3/17 [00:59<04:34, 19.60s/it]\u001b[A\u001b[A\n", "\n", - "Producing predictions batch-wise: 24%|██▎ | 4/17 [01:18<04:08, 19.13s/it]\u001b[A\u001b[A" + "Producing predictions batch-wise: 24%|██▎ | 4/17 [01:18<04:08, 19.13s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 29%|██▉ | 5/17 [01:36<03:46, 18.91s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 35%|███▌ | 6/17 [01:55<03:29, 19.09s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 41%|████ | 7/17 [02:16<03:16, 19.68s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 47%|████▋ | 8/17 [02:36<02:57, 19.73s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 53%|█████▎ | 9/17 [02:55<02:36, 19.51s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 59%|█████▉ | 10/17 [03:14<02:14, 19.19s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 65%|██████▍ | 11/17 [03:33<01:54, 19.13s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 71%|███████ | 12/17 [03:53<01:37, 19.42s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 76%|███████▋ | 13/17 [04:13<01:18, 19.53s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 82%|████████▏ | 14/17 [04:31<00:57, 19.25s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 88%|████████▊ | 15/17 [04:51<00:38, 19.40s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 94%|█████████▍| 16/17 [05:09<00:19, 19.12s/it]\u001b[A\u001b[A\n", + "\n", + "Producing predictions batch-wise: 100%|██████████| 17/17 [05:23<00:00, 17.60s/it]\u001b[A\u001b[A\n", + "\n", + " 0%| | 0/13400 [00:00\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0mreturn_recalls\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mreturn_average_precisions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 86\u001b[0;31m verbose=True)\n\u001b[0m\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0mmean_average_precision\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maverage_precisions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprecisions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrecalls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/Rentadrone.cl-ai-test/ssd_keras-master/eval_utils/average_precision_evaluator.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, img_height, img_width, batch_size, data_generator_mode, round_confidences, matching_iou_threshold, border_pixels, sorting_algorithm, average_precision_mode, num_recall_points, ignore_neutral_boxes, return_precisions, return_recalls, return_average_precisions, verbose, decoding_confidence_thresh, decoding_iou_threshold, decoding_top_k, decoding_pred_coords, decoding_normalize_coords)\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;31m#############################################################################################\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 226\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute_precision_recall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 227\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0;31m#############################################################################################\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/Rentadrone.cl-ai-test/ssd_keras-master/eval_utils/average_precision_evaluator.py\u001b[0m in \u001b[0;36mcompute_precision_recall\u001b[0;34m(self, verbose, ret)\u001b[0m\n\u001b[1;32m 765\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Computing precisions and recalls, class {}/{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclass_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_classes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 766\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 767\u001b[0;31m \u001b[0mtp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcumulative_true_positives\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclass_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 768\u001b[0m \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcumulative_false_positives\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclass_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 769\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], diff --git a/command_train b/command_train new file mode 100644 index 0000000..4a05b12 --- /dev/null +++ b/command_train @@ -0,0 +1 @@ + ls images | sed -e 's/\..*$//' > train.txt