readme.txt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. 整体框架来自于:
  2. https://github.com/ultralytics/yolov5#tutorials
  3. 所有基本的都可以查看相关内容
  4. 训练检测模型时:使用默认的main.py文件.
  5. 训练实例分割模型时:使用main-seg.py文件,因为平台需要默认的main文件,需要修改文件名为main.py文件
  6. 默认需要给的yaml文件为:
  7. 1.超参数文件,都在data/hyps中,具体的参数说明可以参考hyp.scratch-low文件
  8. 2.数据文件,都在data/public_data 或者 data/vinno_data中
  9. public_data:
  10. 都是默认数据集的,只有:path train val test names几个参数,默认路径可以修改
  11. vinno_data:
  12. 都是读取AI平台数据集的方式,此时path train val test names几个参数可以不设置
  13. 额外需要给platform_data_args参数,此时需要区分检测和分割,
  14. 检测可以参考:data/vinno_data/Breast-BIRADS-Obj.yaml
  15. 分割可以参考:data/vinno_data/Thyroid-TIRADS-Seg.yaml
  16. 3.模型文件,检测的都在 models/hub中,分割的都在models/segment中
  17. 模型文件中的nc代表类别,去掉背景总共有几类,可以不改,会根据数据确定
  18. depth_multiple和width_multiple涉及模型的大小
  19. anchors 成对出现,默认给1,1的话,会自动调用kmeans获取
  20. 修改部分:
  21. 1.main文件中,给到默认的三个文件即可,然后调节workers和batch-size即可
  22. parser.add_argument("--cfg", type=str, default=ROOT / "models/hub/XXX.yaml", help="model.yaml path")
  23. parser.add_argument("--data", type=str, default=ROOT / "data/XXX.yaml", help="dataset.yaml path")
  24. parser.add_argument("--hyp", type=str, default=ROOT / "data/hyps/XXX.yaml",
  25. help="hyperparameters path")
  26. 在平台上训练改为true即可
  27. parser.add_argument('--is_train_on_platform', type=bool, default=True,
  28. help='True is train on platform,False is train on local')
  29. 2.在utils/dataloaders.py添加了LoadImagesAndLabelsPlatform类,用于制作平台数据Dataset,
  30. 跟默认的相比只是在读取数据yaml中的平台参数,额外添加了DataGenerator类,调用generate函数,用于得到所需要
  31. 的self.labels, self.im_files, self.shapes, self.segments, self.crop_boxes,self.crop_contours 。后续有需求可以修改DataGenerator类,获取自己项目所有的labels和im_files等
  32. 3.在计算评价指标时,添加计算基于c++后处理的评价指标,暂时并没有完全去掉已有的评价指标,
  33. 只是偶尔计算,得到report。如果有需要可以返回评价指标用于存最好的模型。
  34. 计算时,数据根据val_loader中记录的名称重新读取,resize等前处理之后,传入模型,将模型转成onnx,计算report
  35. 并没有直接读取val_loader中前处理的数据,
  36. 因为:yolo训练的resize方式跟平台已有的不是完全一致,重新做一遍前处理可能更加贴合实际。
  37. 注意:
  38. yolo训练的resize方式跟c#那边已有的并不是完全相同。
  39. c#那边有:FitLargeSizeAndPad FitSmallSizeAndCrop Warp三种
  40. 如果完全统一可以:c#那边添加一个yolo一致的resize方式,暂时没有计划。
  41. (之前在dsod的项目中,存在c#中一致的三种resize方式,训练、python测试、c#测试,三种对整体效果差异并不大)
  42. 因此为了尽量弥补resize方式在训练和c#测试中的差异,默认采用的c#中的warp
  43. 默认的LoadImagesAndLabels(Dataset)中的load_image(self, i)
  44. 默认的方式:
  45. h0, w0 = im.shape[:2] # orig hw
  46. r = self.img_size / max(h0, w0) # ratio
  47. if r != 1: # if sizes are not equal
  48. interp = cv2.INTER_LINEAR if (self.augment or r > 1) else cv2.INTER_AREA
  49. im = cv2.resize(im, (math.ceil(w0 * r), math.ceil(h0 * r)), interpolation=interp)
  50. return im, (h0, w0), im.shape[:2] # im, hw_original, hw_resized
  51. 修改后的方式:
  52. h0, w0 = im.shape[:2] # orig hw
  53. r = self.img_size / max(h0, w0) # ratio
  54. if r != 1: # if sizes are not equal
  55. interp = cv2.INTER_LINEAR if (self.augment or r > 1) else cv2.INTER_AREA
  56. # 直接resize成需要的大小,默认的在后面的操作中默认填充边框,暂时没用这样的操作
  57. im = cv2.resize(im, (self.img_size, self.img_size), interpolation=interp)
  58. resize之后的图像已经跟训练图像size一致,后续经过letterbox函数,ratio和pad都为0,
  59. 类似warp,后续有人测试有较大差异,影响结果,可以自行改成默认的。
  60. 4.utils/augmentations.py中Albumentations类,可以根据自己的需求修改,暂时给到了甲状腺病灶检测和乳腺病灶检测的参数
  61. 默认的示例:
  62. 将testdatas文件夹中相应文件夹的数据放到simulater的TestFiles和TrainFiles中,可以本地试用和调试。
  63. 1.乳腺检测模型:
  64. 注意:检测那边一般的负样本较少,低于15%以下最好,如果负样本较多确实影响整体结果。
  65. 因此在data那边添加了class_aug_times,参数根据标签,将该图像重复采集,这样可以将负样本的比例降低。
  66. 因为乳腺那边的负样本较多、都想使用,而且有些恶性的比例较少,因此扩充比例较大。
  67. 训练轮次200-300轮,训练轮次较多,因为之前提到模糊等图像也需要检出,如果整体效果不变的话,宁愿多训练轮次来提高泛化。
  68. 使用
  69. Breast-BIRADS-Obj.yaml
  70. hyp.scratch_breast-birads.yaml
  71. yolov5s-ghost.yaml
  72. 直接训练即可。
  73. 训练时,采用上述的三个文件,超参数中mosaic和mixup有利于提升召回率和减少背景误判,但是一直开的话会导致模型的精确率越来越高,召回越来越低。因此建议前60-80轮,开启这两个数据增强方式,后续resume时关闭mixup,降低或者关闭mosaic。
  74. 操作如下:
  75. 将保存的 xx.pt文件和opt.yaml放到main.py同级的目录下,将opt.yaml中mixup和mosaic设成所需要的。
  76. 在main.py中 default给到相应的模型
  77. parser.add_argument("--resume", nargs="?", const=True, default=ROOT / 'xx.pt', help="resume most recent training")
  78. 也可以自己弄个文件夹路径也可以,给到default那边即可。
  79. 重新训练即可。
  80. 由于分级效果不好,边训练边测试看不出整体变化,为了查看模型效果,可以将模型val_loader中的single_cls改为true,此时训练就是多类别,测试的时候为单类别,只是为了查看csv中的精确率和召回率,并不影响整个收敛。该处并不规范,只是大概看效果而已。
  81. 修改部位为:main.py中的:
  82. 第一处:
  83. val_loader = create_dataloader(
  84. val_path,
  85. imgsz,
  86. batch_size // WORLD_SIZE * 2,
  87. gs,
  88. single_cls = True, #此处修改
  89. hyp=hyp,
  90. cache=None if noval else opt.cache,
  91. rect=True,
  92. rank=-1,
  93. workers=workers * 2,
  94. pad=0.5,
  95. prefix=colorstr("val: "),
  96. )[0]
  97. 第二处:
  98. results, maps, _ = validate.run(
  99. data_dict,
  100. batch_size=batch_size // WORLD_SIZE * 2,
  101. imgsz=imgsz,
  102. half=amp,
  103. model=ema.ema,
  104. single_cls = True, #此处修改
  105. dataloader=val_loader,
  106. save_dir=save_dir,
  107. plots=False,
  108. callbacks=callbacks,
  109. compute_loss=compute_loss,
  110. use_v7_loss=use_v7_loss,
  111. is_train_on_platform=is_train_on_platform,
  112. )
  113. 第三处:
  114. results, _, _ = validate.run(
  115. data_dict,
  116. batch_size=batch_size // WORLD_SIZE * 2,
  117. imgsz=imgsz,
  118. model=attempt_load(f, device).half(),
  119. iou_thres=0.65 if is_coco else 0.60, # best pycocotools at iou 0.65
  120. single_cls = True, #此处修改
  121. dataloader=val_loader,
  122. save_dir=save_dir,
  123. save_json=is_coco,
  124. verbose=True,
  125. plots=plots,
  126. callbacks=callbacks,
  127. compute_loss=compute_loss,
  128. use_v7_loss=use_v7_loss,
  129. is_train_on_platform=is_train_on_platform,
  130. ) # val best model with plots
  131. 2.甲状腺检测模型:
  132. image_weight参数关闭,有利于减少平常图像误判;添加扩充比例,疾病检出无变化,分级那边指标会提高;
  133. 使用
  134. Thyroid-TIRADS-Obj.yaml
  135. hyp.scratch_thyroid-tirads.yaml
  136. yolov8.yaml
  137. 直接训练即可。
  138. 训练时,采用上述的三个文件,训练时前60轮设置mosaic=0.9,mixup=0.9,后20轮关闭该参数,提高分类的置信度
  139. 操作如下:
  140. 将保存的 xx.pt文件和opt.yaml放到main.py同级的目录下,将opt.yaml中mixup和mosaic设成0。
  141. 在main.py中 default给到相应的模型
  142. parser.add_argument("--resume", nargs="?", const=True, default=ROOT / 'xx.pt', help="resume most recent training")
  143. 也可以自己弄个文件夹路径也可以,给到default那边即可。
  144. 重新训练即可。
  145. 由于分级效果不好,边训练边测试看不出整体变化,为了查看模型效果,将模型val_loader中的single_cls改为true,操作如上述乳腺检测一致。
  146. 3.颈部脏器分割模型:
  147. 使用
  148. Neck-Organ-Seg.yaml
  149. hyp.scratch_neck-ogran.yaml
  150. yolov8-seg.yaml
  151. 直接训练即可。
  152. 后续可以降低mosaic和mixup的数据增强。
  153. 4.肝脏检测或者分割模型:
  154. 肝脏模型暂时未上传模型的训练参数和后处理参数,可以拿已有的参数试用。
  155. 数据yaml为:
  156. Liver-Focal-Obj.yaml 或者 Liver-Focal-Seg.yaml
  157. 该模型需要将额外的脏器轮廓裁掉,在裁完图的图像中训练和测试,
  158. 如果有项目类似,相关参数可以参考上述的两个yaml文件。