YOLOv5与骨龄识别 YOLOv5(You Only Look Once version 5)是一种基于深度学习的实时目标检测模型,以其高效性和准确性著称。在骨龄识别场景下,YOLOv5可以被训练用来自动定位X光片中的手部或手腕骨骼结构,作为预处理步骤,以便后续进行骨龄分析。。
图像数据:handbone/data/orignal_data/Image
数据标签:handbone/data/orignal_data/Annotations
标签类别:handbone/data/ImageSets/label_list.txt
代码文件:
handbone/data/orignal_data/ImageSets/get_list.py:
将数据集分为train、trainval以及val,并将对应文件名字存储于handbone/data/orignal_data/ImageSets中:train.txt,trainval.txt,val.txt
handbone/data/create_label.py:将handbone/data/original_data中的数据集转换为适用于目标检测模型训练的标签文件和图像文件,并将文件保存在handbone/data/images和handbone/data/labels,
并将三组数据集对应的文件路径保存在handbone/data/train.txt handbone/data/trainval.txt
handbone/data/val.txt
使用yolo官方训练脚本进行模型的训练,训练好的权重保存在runs/train/exp/weights/best.pt。
使用resnet18进行骨龄预测: (handbone/data/arthrosis中有关于骨龄计算相关内容)
PyQt框架 PyQt是一个Python绑定的图形用户界面应用程序开发框架,基于Qt库构建。在骨龄识别系统中,PyQt可用于构建直观易用的桌面应用程序界面,实现如图像上传、显示、预处理、结果展示等功能。开发者可以通过PyQt编写前后端交互逻辑,使得医生或者其他用户能够方便地导入X光片,运行YOLOv5进行骨龄相关部位的检测,并在界面上实时显示检测结果和最终的骨龄分析报告。
。
handbone/arthrosis_data_util.py:使用自适应直方图均衡化(CLAHE)与随机旋转对图像进行增强处理。
handbone/arthrosis_datalist.py:将图像进行数据划分(9:1),同时将对应文件路径保存在每种类别的文件夹中
handbone/arthrosis_dataset.py:主要训练过程的dataloader,其中统一的输入数据的格式,并进行一定的数据增强
handbone/arthrosis_trainer.py:模型训练的主程序,主要框架网络是resnet18,但将第一层的输入改为(1,244,244),输出改为对应类别数,并将每类最优模型保存在./params中
handbone/common.py:提供了一些计算和处理手骨骨龄相关的功能,包括筛选手骨骨节、计算骨龄、生成报告等功能
由于pytorch在训练过程中的loss函数出现了总线错误,我们将部分代码重新基于keras编写:keras_datasets.py,
keras_trainer.py, keras_common.py
其他部分也是基于keras实现:
handbone/hand_bone_detect.py handbone/hand_view.py handbone/main.py
骨龄分类算法是整个流程的关键部分,它用于对手部骨骼特征进行量化并映射到相应的骨龄阶段。在YOLOv5完成骨骼定位后,提取出的骨骼特征将输入至分类模型,可能是传统的统计学方法或者是深度学习模型,如卷积神经网络(CNN),来进行精细化的骨龄分期预测。
#全部代码--
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.bind_slots()
# 加载yolov5模型(本地训练好的)
self.mode = torch.hub.load('./','custom',path='./runs/train/exp/weights/best.pt',source='local')
self.mode.eval()
self.mode.conf = 0.5 # 置信度
print("yolov5模型加载完成")
# Load other keras models
self.parm = {}
for key, value in keras_common.arthrosis.items():
if value[0] in self.parm:
continue
ResNet18, preprocess_input = Classifiers.get('resnet18')
base_model = ResNet18((224, 224, 1), weights=None, include_top=False)
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(value[1]))
# Load weights
model.load_weights(f"params/{value[0]}")
self.parm[value[0]] = model
print("九个模型加载完成")
# 信号 槽(函数)
def btn_open_img(self):
print("点击按钮")
file_path = QFileDialog.getOpenFileNames(self, dir="handbone/data/images", filter="*.png;*.jpeg;*.jpg")
if file_path[0]:
# 选择图片
print(file_path[0][0])
# 回显手骨x光片
self.label_2.setPixmap(QPixmap(file_path[0][0]))
# 获取性别
sex = 'boy' if self.radioButton.isChecked() else 'girl'
print(sex)
# 侦测
result = hand_bone_detect.detect(self.mode, sex , file_path[0][0], self.parm)
# 显示检测结果
self.label_3.setText(result)
# 绑定槽
def bind_slots(self):
self.pushButton.clicked.connect(self.btn_open_img)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
计算机视觉、图像处理、代码获取,远程协助,代码定制,私聊会回复!
##全部代码code--