用Python的pydicom库搞定DICOM文件:从读取患者信息到三维重建的保姆级教程

news2026/4/8 13:52:37
用Python的pydicom库搞定DICOM文件从读取患者信息到三维重建的保姆级教程医学影像数据在现代医疗诊断中扮演着至关重要的角色而DICOMDigital Imaging and Communications in Medicine作为医学数字成像和通信的国际标准已经成为存储和传输医学影像数据的通用格式。对于Python开发者或医工交叉领域的研究者来说掌握DICOM文件的处理技能不仅能提升工作效率还能为后续的医学图像分析打下坚实基础。本文将带你从零开始通过pydicom这个强大的Python库一步步实现DICOM文件的读取、解析、可视化以及三维重建等核心操作。1. 环境准备与基础概念在开始处理DICOM文件之前我们需要确保开发环境配置正确。推荐使用Python 3.7及以上版本并安装以下必要的库pip install pydicom numpy matplotlib scikit-imageDICOM文件的结构相当复杂它不仅仅包含图像数据还存储了大量与患者和检查相关的元数据。一个典型的DICOM文件由以下几部分组成文件头包含128字节的前导码和4字节的DICM前缀数据集由多个数据元素组成每个元素包含Tag标签标识数据元素的类型如(0010,0010)表示患者姓名VR值表示定义数据的类型和格式值长度数据值的长度值实际的数据内容理解这些基本概念后我们就可以开始实际操作了。2. 读取和解析DICOM文件使用pydicom读取单个DICOM文件非常简单以下是一个基础示例import pydicom # 读取DICOM文件 ds pydicom.dcmread(sample.dcm) # 查看所有可用的数据元素 print(ds.dir()) # 获取特定患者信息 patient_name ds.PatientName patient_id ds.PatientID study_date ds.StudyDate print(f患者姓名: {patient_name}, ID: {patient_id}, 检查日期: {study_date})在实际项目中我们经常需要批量处理多个DICOM文件。以下代码展示了如何遍历文件夹中的所有DICOM文件import os import pydicom def load_dicom_series(folder_path): dicom_files [] for root, _, files in os.walk(folder_path): for file in files: if file.lower().endswith(.dcm): file_path os.path.join(root, file) dicom_files.append(pydicom.dcmread(file_path)) return dicom_files # 使用示例 dicom_series load_dicom_series(/path/to/dicom/folder) print(f共加载 {len(dicom_series)} 个DICOM文件)注意处理真实医疗数据时务必遵守相关隐私法规确保患者信息的安全。3. 图像数据处理与可视化DICOM文件中的像素数据可以通过pixel_array属性访问但直接显示这些数据可能会遇到一些问题比如显示效果不理想或像素值范围异常。以下代码展示了如何正确处理和显示DICOM图像import matplotlib.pyplot as plt import pydicom def display_dicom_image(dicom_file, normalizeTrue): ds pydicom.dcmread(dicom_file) pixel_data ds.pixel_array if normalize: # 将像素值归一化到0-1范围 pixel_data (pixel_data - pixel_data.min()) / (pixel_data.max() - pixel_data.min()) plt.imshow(pixel_data, cmapgray) plt.title(fSlice Location: {ds.get(SliceLocation, N/A)}) plt.axis(off) plt.show() # 使用示例 display_dicom_image(sample.dcm)对于CT图像我们还需要考虑Hounsfield单位HU的转换这能提供更准确的组织密度表示def get_hu_image(dicom_file): ds pydicom.dcmread(dicom_file) pixel_data ds.pixel_array # 检查是否存在必要的属性 if not hasattr(ds, RescaleIntercept) or not hasattr(ds, RescaleSlope): return pixel_data # 转换为HU值 hu_image pixel_data * ds.RescaleSlope ds.RescaleIntercept return hu_image # 显示HU图像 hu_image get_hu_image(ct_scan.dcm) plt.imshow(hu_image, cmapgray, vmin-1000, vmax2000) plt.colorbar() plt.show()4. 三维重建与多平面显示医学影像通常是多层二维切片的集合我们可以将这些切片组合成三维体数据进行可视化。以下是实现三维重建的关键步骤import numpy as np import pydicom import matplotlib.pyplot as plt def load_dicom_volume(folder_path): dicom_files [] for root, _, files in os.walk(folder_path): for file in files: if file.lower().endswith(.dcm): file_path os.path.join(root, file) dicom_files.append(pydicom.dcmread(file_path)) # 按切片位置排序 dicom_files.sort(keylambda x: float(x.SliceLocation)) # 创建三维数组 volume np.stack([d.pixel_array for d in dicom_files], axis-1) # 获取像素间距信息 pixel_spacing [float(dicom_files[0].PixelSpacing[0]), float(dicom_files[0].PixelSpacing[1]), float(dicom_files[0].SliceThickness)] return volume, pixel_spacing # 加载DICOM序列 volume, spacing load_dicom_volume(/path/to/dicom/series) # 显示三个正交平面 def show_orthogonal_views(volume): fig, (ax1, ax2, ax3) plt.subplots(1, 3, figsize(15, 5)) # 轴状面原始切片 ax1.imshow(volume[:, :, volume.shape[2]//2], cmapgray) ax1.set_title(轴状面) ax1.axis(off) # 冠状面 ax2.imshow(volume[:, volume.shape[1]//2, :], cmapgray, aspectspacing[2]/spacing[0]) ax2.set_title(冠状面) ax2.axis(off) # 矢状面 ax3.imshow(volume[volume.shape[0]//2, :, :], cmapgray, aspectspacing[2]/spacing[1]) ax3.set_title(矢状面) ax3.axis(off) plt.tight_layout() plt.show() show_orthogonal_views(volume)在实际应用中我们可能还需要进行更高级的三维可视化。以下代码使用matplotlib的3D功能展示体数据from mpl_toolkits.mplot3d.art3d import Poly3DCollection from skimage import measure def plot_3d_surface(volume, threshold300): # 使用Marching Cubes算法提取等值面 verts, faces, _, _ measure.marching_cubes(volume, threshold) # 创建3D图形 fig plt.figure(figsize(10, 10)) ax fig.add_subplot(111, projection3d) # 创建网格集合 mesh Poly3DCollection(verts[faces], alpha0.3) mesh.set_facecolor([0.45, 0.45, 0.75]) ax.add_collection3d(mesh) # 设置坐标轴范围 ax.set_xlim(0, volume.shape[0]) ax.set_ylim(0, volume.shape[1]) ax.set_zlim(0, volume.shape[2]) plt.tight_layout() plt.show() # 使用示例确保volume是HU值 hu_volume np.stack([get_hu_image(d) for d in dicom_files], axis-1) plot_3d_surface(hu_volume, threshold400)5. 实战技巧与常见问题解决在处理真实世界的DICOM数据时经常会遇到各种问题。以下是一些实用技巧和解决方案1. 处理不一致的DICOM文件不同厂商的设备生成的DICOM文件可能有差异以下代码展示了如何安全地访问可能不存在的属性def safe_get(ds, field, defaultNone): try: return getattr(ds, field) except AttributeError: return default # 使用示例 patient_age safe_get(ds, PatientAge, Unknown) print(f患者年龄: {patient_age})2. 像素值归一化与窗宽窗位调整医学图像通常需要调整窗宽(window width)和窗位(window level)以获得最佳显示效果def apply_window(image, window_center, window_width): window_min window_center - window_width // 2 window_max window_center window_width // 2 windowed np.clip(image, window_min, window_max) return (windowed - window_min) / (window_max - window_min) # 使用示例 hu_image get_hu_image(ct_scan.dcm) lung_window apply_window(hu_image, -600, 1500) # 肺窗 bone_window apply_window(hu_image, 300, 1500) # 骨窗 plt.figure(figsize(10, 5)) plt.subplot(121) plt.imshow(lung_window, cmapgray) plt.title(肺窗) plt.subplot(122) plt.imshow(bone_window, cmapgray) plt.title(骨窗) plt.show()3. 处理缺失的SliceThickness信息有些DICOM文件可能缺少SliceThickness信息我们可以通过计算相邻切片的SliceLocation差值来估算def estimate_slice_thickness(dicom_files): locations [] for ds in dicom_files: if hasattr(ds, SliceLocation): locations.append(float(ds.SliceLocation)) if len(locations) 2: return None locations sorted(locations) differences [abs(locations[i] - locations[i-1]) for i in range(1, len(locations))] return np.mean(differences) # 使用示例 dicom_series load_dicom_series(/path/to/dicom/folder) estimated_thickness estimate_slice_thickness(dicom_series) print(f估算的切片厚度: {estimated_thickness:.2f} mm)4. 性能优化技巧处理大型DICOM序列时内存和性能可能成为问题。以下是一些优化建议只加载需要的元数据不加载像素数据ds pydicom.dcmread(large.dcm, stop_before_pixelsTrue) print(ds.PatientName) # 可以访问元数据 # ds.pixel_array # 这会引发错误因为像素数据未被加载使用生成器处理大型序列def process_large_series(folder_path): for root, _, files in os.walk(folder_path): for file in files: if file.lower().endswith(.dcm): file_path os.path.join(root, file) ds pydicom.dcmread(file_path) yield ds del ds # 显式释放内存 # 使用示例 for ds in process_large_series(/path/to/large/series): print(ds.PatientID)6. 高级应用DICOM文件修改与创建有时我们需要修改现有DICOM文件或创建新的DICOM文件。以下是相关操作的示例修改现有DICOM文件# 读取文件 ds pydicom.dcmread(original.dcm) # 修改患者信息去标识化 ds.PatientName Anonymous ds.PatientID 000000 ds.PatientBirthDate # 修改像素数据例如简单的对比度增强 pixel_data ds.pixel_array enhanced_data np.clip(pixel_data * 1.5, pixel_data.min(), pixel_data.max()) ds.PixelData enhanced_data.tobytes() # 保存修改后的文件 ds.save_as(modified.dcm)创建新的DICOM文件from pydicom.dataset import Dataset, FileDataset from pydicom.uid import generate_uid import numpy as np import datetime # 创建新的DICOM数据集 file_meta Dataset() file_meta.MediaStorageSOPClassUID 1.2.840.10008.5.1.4.1.1.2 # CT Image Storage file_meta.MediaStorageSOPInstanceUID generate_uid() file_meta.ImplementationClassUID generate_uid() ds FileDataset(new_image.dcm, {}, file_metafile_meta, preambleb\0*128) # 添加基本属性 ds.PatientName Test^Patient ds.PatientID 123456 ds.StudyInstanceUID generate_uid() ds.SeriesInstanceUID generate_uid() ds.SOPInstanceUID generate_uid() ds.Modality CT ds.SamplesPerPixel 1 ds.PhotometricInterpretation MONOCHROME2 ds.PixelRepresentation 0 # unsigned ds.HighBit 15 ds.BitsStored 16 ds.BitsAllocated 16 ds.Columns 512 ds.Rows 512 ds.PixelSpacing [0.5, 0.5] # 0.5mm像素间距 ds.SliceThickness 1.0 # 1mm切片厚度 # 创建测试图像数据 image_data np.random.randint(0, 65535, size(512, 512), dtypenp.uint16) ds.PixelData image_data.tobytes() # 设置当前日期和时间 dt datetime.datetime.now() ds.ContentDate dt.strftime(%Y%m%d) ds.ContentTime dt.strftime(%H%M%S) # 保存文件 ds.save_as(new_image.dcm)重要提示在实际应用中修改或创建DICOM文件时务必确保符合DICOM标准和相关医疗法规要求特别是涉及患者隐私信息的部分。7. 与其他医学影像处理工具的集成pydicom可以与其他Python医学影像库配合使用构建更强大的处理流程。以下是一些常见集成示例与SimpleITK集成import SimpleITK as sitk import pydicom # 从DICOM系列创建SimpleITK图像 def dicom_series_to_sitk(folder_path): reader sitk.ImageSeriesReader() dicom_names reader.GetGDCMSeriesFileNames(folder_path) reader.SetFileNames(dicom_names) image reader.Execute() return image # 使用示例 sitk_image dicom_series_to_sitk(/path/to/dicom/series) print(f图像大小: {sitk_image.GetSize()}) print(f图像间距: {sitk_image.GetSpacing()}) # 可视化 sitk.Show(sitk_image[:,:,sitk_image.GetSize()[2]//2], title中间切片)与VTK集成进行高级三维可视化import vtk from vtk.util import numpy_support import numpy as np import pydicom def visualize_with_vtk(volume): # 将numpy数组转换为VTK图像数据 vtk_data numpy_support.numpy_to_vtk(volume.ravel(), deepTrue) vtk_image vtk.vtkImageData() vtk_image.SetDimensions(volume.shape) vtk_image.GetPointData().SetScalars(vtk_data) # 创建渲染器和映射器 mapper vtk.vtkGPUVolumeRayCastMapper() mapper.SetInputData(vtk_image) # 创建体积属性 volume_property vtk.vtkVolumeProperty() volume_property.ShadeOn() volume_property.SetInterpolationTypeToLinear() # 设置颜色和不透明度传输函数 color_transfer vtk.vtkColorTransferFunction() color_transfer.AddRGBPoint(0, 0.0, 0.0, 0.0) color_transfer.AddRGBPoint(500, 1.0, 0.5, 0.3) color_transfer.AddRGBPoint(1000, 1.0, 1.0, 0.9) opacity_transfer vtk.vtkPiecewiseFunction() opacity_transfer.AddPoint(0, 0.0) opacity_transfer.AddPoint(500, 0.1) opacity_transfer.AddPoint(1000, 0.5) volume_property.SetColor(color_transfer) volume_property.SetScalarOpacity(opacity_transfer) # 创建体积 volume_actor vtk.vtkVolume() volume_actor.SetMapper(mapper) volume_actor.SetProperty(volume_property) # 设置渲染器 renderer vtk.vtkRenderer() renderer.AddVolume(volume_actor) renderer.SetBackground(0.1, 0.2, 0.4) # 创建渲染窗口 render_window vtk.vtkRenderWindow() render_window.AddRenderer(renderer) render_window.SetSize(800, 600) # 创建交互式渲染窗口 render_window_interactor vtk.vtkRenderWindowInteractor() render_window_interactor.SetRenderWindow(render_window) # 开始渲染 render_window.Render() render_window_interactor.Start() # 使用示例 volume, _ load_dicom_volume(/path/to/dicom/series) visualize_with_vtk(volume)与MONAI集成进行深度学习import monai from monai.data import Dataset, DataLoader from monai.transforms import Compose, LoadImaged, AddChanneld, ScaleIntensityd # 准备DICOM数据集 dicom_files [{image: f} for f in glob.glob(/path/to/dicom/*.dcm)] # 定义转换 transforms Compose([ LoadImaged(keys[image], readerPydicomReader), AddChanneld(keys[image]), ScaleIntensityd(keys[image]) ]) # 创建数据集和数据加载器 dataset Dataset(datadicom_files, transformtransforms) dataloader DataLoader(dataset, batch_size4, shuffleTrue) # 使用示例 for batch in dataloader: images batch[image] print(f批量大小: {images.shape}) break8. 实际项目中的最佳实践在长期使用pydicom处理医学影像数据的过程中我总结出以下几点经验数据组织规范为每个研究(Study)创建独立文件夹在文件夹内按序列(Series)组织DICOM文件使用描述性命名如PatientID_StudyDate_Modality_SeriesNumber元数据管理提取关键元数据并存储在数据库中以便快速查询为常用查询字段(如PatientID、StudyDate)建立索引定期备份原始DICOM文件和提取的元数据性能优化对于大型DICOM序列考虑使用内存映射文件并行处理多个DICOM文件以利用多核CPU预处理常用数据并缓存结果错误处理与日志记录实现健壮的错误处理机制特别是对于不符合标准的DICOM文件记录详细的处理日志包括成功和失败的操作提供有意义的错误消息帮助快速定位问题质量控制实现自动化的数据质量检查验证关键元数据的完整性和一致性定期检查像素数据的完整性和显示质量以下是一个综合示例展示了如何在实际项目中应用这些最佳实践import os import pydicom import numpy as np from concurrent.futures import ThreadPoolExecutor import logging from typing import List, Dict, Optional class DICOMProcessor: def __init__(self, base_path: str): self.base_path base_path self.logger self._setup_logger() def _setup_logger(self): logger logging.getLogger(DICOMProcessor) logger.setLevel(logging.INFO) formatter logging.Formatter(%(asctime)s - %(levelname)s - %(message)s) # 控制台处理器 ch logging.StreamHandler() ch.setFormatter(formatter) logger.addHandler(ch) # 文件处理器 fh logging.FileHandler(dicom_processor.log) fh.setFormatter(formatter) logger.addHandler(fh) return logger def process_study(self, study_id: str) - Dict: study_path os.path.join(self.base_path, study_id) if not os.path.exists(study_path): self.logger.error(fStudy path not found: {study_path}) return {} result {study_id: study_id, series: []} # 并行处理每个序列 with ThreadPoolExecutor() as executor: series_dirs [d for d in os.listdir(study_path) if os.path.isdir(os.path.join(study_path, d))] futures [executor.submit(self.process_series, study_path, s) for s in series_dirs] for future in futures: series_result future.result() if series_result: result[series].append(series_result) self.logger.info(fProcessed study {study_id} with {len(result[series])} series) return result def process_series(self, study_path: str, series_dir: str) - Optional[Dict]: series_path os.path.join(study_path, series_dir) try: dicom_files [] for root, _, files in os.walk(series_path): for file in files: if file.lower().endswith(.dcm): file_path os.path.join(root, file) dicom_files.append(file_path) if not dicom_files: self.logger.warning(fNo DICOM files found in {series_path}) return None # 读取第一个文件获取元数据 first_ds pydicom.dcmread(dicom_files[0], stop_before_pixelsTrue) series_result { series_dir: series_dir, modality: safe_get(first_ds, Modality, UNKNOWN), series_description: safe_get(first_ds, SeriesDescription, ), number_of_slices: len(dicom_files), slice_thickness: safe_get(first_ds, SliceThickness, 0), pixel_spacing: safe_get(first_ds, PixelSpacing, [0, 0]), representative_image: None } # 处理中间切片作为代表图像 middle_idx len(dicom_files) // 2 try: middle_ds pydicom.dcmread(dicom_files[middle_idx]) pixel_data middle_ds.pixel_array series_result[representative_image] { shape: pixel_data.shape, mean_intensity: float(np.mean(pixel_data)), min_intensity: float(np.min(pixel_data)), max_intensity: float(np.max(pixel_data)) } except Exception as e: self.logger.warning(fFailed to process representative image: {str(e)}) return series_result except Exception as e: self.logger.error(fError processing series {series_dir}: {str(e)}) return None # 使用示例 processor DICOMProcessor(/path/to/dicom/studies) study_data processor.process_study(STUDY_001) print(study_data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2496194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…